User Tools

Site Tools


doc:recipes:3gdongle

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
doc:recipes:3gdongle [2012/12/08 22:49]
ajo
doc:recipes:3gdongle [2017/06/18 12:05] (current)
tmomas Link changed from external to internal (internal ones are automatically adjusted when pages are moved, external ones are not)
Line 1: Line 1:
 +====== Use 3g/UMTS USB Dongle for WAN connection ======
  
 +This recipe explains how to setup and configure OpenWrt for using a USB 3g/​UMTS-modem for WAN connection. You may want to checkout the ''​[[doc:​uci:​multiwan]]''​ package to use this simultaneously with other connections to the internet. Another way to do multiwan is described in [[doc:​howto:​wired.wan.with.3g.dongle]]. The information there can be considered outdated.
 +
 +Please use OpenWrt 10.03.1-rc3 '​Backfire'​ or newer image.
 +
 +:!: You are advised to inform yourself on how easily cellular mobile telephony can be intercepted. Remember this is a wireless connection. ​ Also, some providers block certain ports: do not forget to inform yourself about that, too
 +
 +:!: If you've got a Huawei E367 (which will work), or a Huawei E585 (which does not currently work), you may want to read the following tutorial (which includes info on why you may not be able to get the on-board micro-SD card to function):
 +[[http://​www.draisberghof.de/​usb_modeswitch/​bb/​viewtopic.php?​t=836]]
 +
 +:!: If you have the Leadtek FlashOFDM card (Flarion) from T-Mobile in Slovakia and the Asus WL-500g Premium, you may use the image on [[http://​www.accalio.com/​index.php?​id=301]]. If you wish to get more information,​ or another distribution with the driver, please contact Accalio [[http://​www.accalio.com]]
 +
 +:!: Some modem sticks provide an usb-ethernet-device (e.g. Huawei "​HiLink"​ - device numbers with '​h',​ but also other manufacturers like ZTE has such products MF823, MF831, ...) In that case usb-modeswitch and [[doc:​howto:​usb.tethering|usb tethering]] will help. Please keep in mind, that tethering will in most cases add an additional NAT layer, that may or may not desireable. If you prefer to let OpenWRT care about dialing in, routing, NATting, firewalling or if your provider assigns you an external IPv4 (which is most useful for setups, that need port forwarding),​ you will most likely want to modeswitch your 3g/4g modem to act as a serial device.
 +
 +:!: Serial device modes: If a dongle in permanently configured for serial mode, it is advised not to install usb-modeswitch onto your wrt device. Modem sticks are commonly equipped with a flash space containing drivers and software and/or provide a slot for a micro-SD-card. These features (like the '​NO-CD'​ feature) can be configured in various ways. These configurations may be stored permanently. In that case a modeswitch will behave in an unpredictable way.
 +A modem stick, that was previously configured as a modem will show up as serial devices (typically /​dev/​ttyUSB0-2). A default setting in combination with modeswitch may additionally show the sd-card reader. See the Troubleshooting section in this document for further information.
 +
 +:!: Some high speed usb modems provide **qmi**, **mbim**, **ncm**, **rndis** protocol for connection instead of legacy **ppp** protocol. For more information:​
 +  * **qmi** and **mbim**, see [[doc:​recipes:​ltedongle|How To Use LTE modem in QMI mode for WAN connection]]
 +  * **ncm**, see [[doc:​recipes:​ethernetoverusb_ncm|How To Use LTE modem in NCM mode for WAN connection]]
 +  * **rndis**, see [[doc:​recipes:​ethernetoverusb_rndis|How To Use LTE modem in RNDIS mode for WAN connection]]
 +
 +===== Preparations =====
 +==== Required Packages ====
 +First install required packages:
 +  *//comgt// [[http://​dev.man-online.org/​man1/​comgt/​|manpage for comgt]]
 +  *Appropriate host controller interface for your USB hardware (precompiled images will most likely already contain the correct one)
 +    *//​kmod-usb2//​ (aka EHCI)
 +    *//​kmod-usb-ohci//​
 +    *//​kmod-usb-uhci//​ (for example VIA chips)
 +  *Support for serial communication;​ needed to send control commands to the dongle and receive its responses. ​
 +  *//​kmod-usb-serial//,​ and
 +  *//​kmod-usb-serial-option//,​ and
 +  *//​kmod-usb-serial-wwan//,​ or
 +  *//​kmod-usb-acm//​ i.s.o. the last two, depending on dongle/​phone hardware. ​
 +    *//​kmod-usb-serial-option//​ is not available for 2.4 kernel, install //​kmod-usb-serial//​ and put a line equivalent to "​usbserial vendor=0x12d1 product=0x1003 maxSize=2048"​ in /​etc/​modules.d/​60-usb-serial)
 +  *modeswitching tools, if your modem initially presents itself as a storage device - one of the following, depending on your modem:
 +    *//​usb-modeswitch//​ and //​usb-modeswitch-data//​ (//​recommended//​) A mode switching tool for controlling "flip flop" (multiple device) USB gear.
 +
 +**Note**: as of [[https://​dev.openwrt.org/​changeset/​36812|r36812]],​ usb-modeswitch package ​ had been under major overhaul from ordinary draisberghof usb_modeswitch found in many linux distributions. **usb-modeswitch-data is included in the package**, with the new json format.\\
 +**Note**: if you plan to use dongle'​s card-reader for [[doc:​howto:​extroot#​extroot_to_a_card_in_a_slot_of_an_usb-dongle|extroot]] - usb-modeswitch will most probably cause problems.\\
 +    *//sdparm// - utility to send SCSI commands (needed on Ovation MC935D)
 +  * //​luci-proto-3g//​ for proper support in luci in RC6 and later
 +
 +==== Dependencies ===
 +If you are doing an offline installation,​ you might need some of these packages handy
 +  *//​kmod-usb-core//,​ already in 10.03 RC3 Image
 +  *//chat//, dependency of //comgt//
 +  *//ppp//, dependency of //chat//, already in 10.03 RC3 Image
 +  *//​kmod-usb-serial//,​ dependency of //​kmod-usb-serial-option//​
 +  *//libusb// [[http://​www.draisberghof.de/​usb_modeswitch/#​download|or the "​compatible"​ library]] from //​libusb-1.0//,​ dependency of //​usb-modeswitch//​
 +
 +===== Installation =====
 +First install needed packages:
 +<​code>​
 +opkg update
 +opkg install comgt kmod-usb-serial kmod-usb-serial-option kmod-usb-serial-wwan usb-modeswitch usb-modeswitch-data
 +</​code>​
 +
 +Now plug your USB Dongle to the USB port and restart the router.
 +
 +Check dmesg for:
 +<​code>​
 +USB Serial support registered for generic
 +usbserial_generic 1-1:1.0: generic converter detected
 +USB Serial support registered for generic
 +usbserial_generic 1-1:1.0: generic converter detected
 +usb 1-1: generic converter now attached to ttyUSB0
 +usbserial_generic 1-1:1.1: generic converter detected
 +usb 1-1: generic converter now attached to ttyUSB1
 +...
 +usbcore: registered new interface driver usbserial_generic
 +usbserial: USB Serial Driver core
 +USB Serial support registered for GSM modem (1-port)
 +usbcore: registered new interface driver option
 +option: v0.7.2:USB Driver for GSM modems
 +</​code>​
 +
 +If above lines do not appear in dmesg, but instead you see something like:
 +
 +<​code>​
 +scsi1 : SCSI emulation for USB Mass Storage devices
 +usb-storage:​ device found at 4
 +usb-storage:​ waiting for device to settle before scanning
 +scsi 1:0:0:0: CD-ROM ​           Novatel ​ Mass Storage ​    2.31 PQ: 0 ANSI: 0
 +scsi 1:0:0:0: Attached scsi generic sg1 type 5
 +usb-storage:​ device scan complete
 +</​code>​
 +
 +then, depending on your modem, you have to switch device mode (described below).
 +
 +If you still can't see ''​usbserial_generic''​ in dmesg, try loading the usbserial module (<​vid>​ and <pid> are Vendor and Product ID of your device):
 +<​code>​
 +rmmod usbserial #optional
 +insmod /​lib/​modules/​`uname -r`/​usbserial.ko vendor=0x<​vid>​ product=0x<​pid>​
 +</​code>​
 +Alternatively,​ you can also use option GSM driver on your dongle. Option driver is more reliable, as it can distinguish between serial port and storage port.
 +<​code>​
 +insmod option #skip this if option driver is loaded already
 +echo '<​vid>​ <pid> ff' > /​sys/​bus/​usb-serial/​drivers/​option1/​new_id
 +</​code>​
 +
 +To automate the process of attaching option serial driver on boot, just edit ''/​etc/​rc.local''​ and place
 +<​code>​
 +echo '<​vid>​ <pid> ff' > /​sys/​bus/​usb-serial/​drivers/​option1/​new_id
 +</​code>​
 +before the exit code
 +<​code>​
 +exit 0
 +</​code>​
 +
 +Adding the above to hotplug instead of rc.local:
 +You can easily integrate this into hotplug in the following way - in this example we will use a fictional "3G Dongie HSPA+" Dongle:
 +
 +
 +Create and edit the file /​etc/​hotplug.d/​usb/​22-dongie_hspaplus:​
 +<​code>​
 +#​!/​bin/​sh ​                                                                      
 +...
 +                                                                                ​
 +DONGIEHSPAPLUS_PRODID="​0815/​9000/​0" ​                                               ​
 +if [ "​${PRODUCT}"​ = "​${DONGIEHSPAPLUS_PRODID}"​ ]; then                             
 +        if [ "​${ACTION}"​ = "​add"​ ]; then                           
 +...             
 +                echo '0815 9000 ff' > /​sys/​bus/​usb-serial/​drivers/​option1/​new_id
 +...
 +</​code>​
 +
 +If your modem'​s switched product id is 0815:9000, the above will work.
 +So for your modem you will have to replace all appearances of the variable DONGIEHSPAPLUS_PRODID and all appearance of "​0815"​ and "​9000"​ in the above example with your matching product'​s name, vendor and product id.
 +
 +Check dmesg again for:
 +<​code>​
 +usbcore: registered new interface driver usbserial
 +USB Serial support registered for generic
 +usbserial_generic 1-1.3:1.0: generic converter detected
 +usb 1-1.3: generic converter now attached to ttyUSB0
 +usbserial_generic 1-1.3:1.1: generic converter detected
 +usb 1-1.3: generic converter now attached to ttyUSB1
 +usbcore: registered new interface driver usbserial_generic
 +usbserial: USB Serial Driver core
 +</​code>​
 +Also check kernel USB debug for loaded drivers
 +<​code>​
 +root@OpenWrt:​~#​ cat /​sys/​kernel/​debug/​usb/​devices
 +
 +T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  3 Spd=480 ​ MxCh= 0
 +D:  Ver= 2.00 Cls=00(>​ifc ) Sub=00 Prot=00 MxPS=64 #​Cfgs= ​ 1
 +P:  Vendor=1c9e ProdID=9800 Rev= 0.00
 +S:  Manufacturer=USB Modem
 +S:  Product=USB Modem
 +S:  SerialNumber=1234567890ABCDEF
 +C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
 +I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
 +E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
 +I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
 +E:  Ad=82(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
 +E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
 +I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
 +E:  Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
 +I:* If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
 +E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +</​code>​
 +
 +==== switching USB mode ====
 +=== usb-modeswitch method ===
 +
 +Install and use the ''​usb-modeswitch''​ **and** ''​usb-modeswitch-data''​ packages with the correct hardware ID's for your USB Dongle in order to switch the USB dongle from CDROM file system to Modem mode (-> flip flop). Read on [[http://​www.draisberghof.de/​usb_modeswitch/​|here]] how to use this package.
 +
 +Now your USB Dongle should create logs in dmesg. If it doesn'​t,​ try <​code>​usb_modeswitch -c /​etc/​usb_modeswitch.d/<​file></​code>​ where ''<​file>''​ represents the modem'​s combined vendor/​product id, e.g. 19d2:0083 for a ZTE MF190. Obviously, that file must exist in the forementioned directory. This will show syntax errors in <​file>​ , if any.
 +<​code>​usb_modeswitch -l -c /​etc/​usb_modeswitch.d/<​file></​code>​ will list switchable devices.
 +<​code>​usb_modeswitch -s -c /​etc/​usb_modeswitch.d/<​file></​code>​ will actually execute the custom modeswitch.
 +Add <​code>​-v</​code>,​ if you need more information.
 +
 +For instance, with the DX 7.2M HSDPA 3G SIM Card USB Item# 80032, the reported scsi ID is 12d1:1001; running "​usb_modeswitch ​ -v 12d1 -p 1001" results in 4 ttyUSB devices:
 +<​code>​
 +[426955.836000] option 1-1.2:1.0: GSM modem (1-port) converter detected
 +[426955.844000] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0
 +[426955.860000] option 1-1.2:1.1: GSM modem (1-port) converter detected
 +[426955.868000] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1
 +[426955.884000] option 1-1.2:1.2: GSM modem (1-port) converter detected
 +[426955.892000] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2
 +[426955.908000] option 1-1.2:1.3: GSM modem (1-port) converter detected
 +[426955.916000] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB3
 +[426955.936000] scsi17 : usb-storage 1-1.2:1.4
 +[426956.940000] scsi 17:0:0:0: CD-ROM ​           HSDPA    CDROM Storage ​   2.31PQ: 0 ANSI: 2
 +[426956.948000] scsi 17:0:0:0: Attached scsi generic sg0 type 5
 +[426956.960000] scsi 17:0:0:1: Direct-Access ​    ​HSDPA ​   MMC Storage ​     2.31PQ: 0 ANSI: 2
 +[426956.968000] sd 17:0:0:1: Attached scsi generic sg1 type 0
 +[426956.992000] sd 17:0:0:1: [sda] Attached SCSI removable disk
 +</​code>​
 +
 +**NOTE:** As of [[https://​dev.openwrt.org/​changeset/​36812|r36812]],​ OpenWrt made significant changes with ''​usb-modeswitch''​ as part of ''​procd''​ system init daemon. The new ''​usb-modeswitch''​ package includes binary usbmode with json-based configuration instead of classic usb_modeswitch binary. Supported modems should switch automatically as long as usbmode service is active.
 +The ''/​etc/​usb-mode.json''​ configuration file looks partially like below.
 +<code json>
 +{
 + "​messages"​ : [
 + "​555342431234567800000000000006d0000000000000000000000000000000",​
 + "​5553424312345678000000000000061b004600000000000000000000000000",​
 +],
 +"​devices"​ : {
 + "​03f0:​002a":​ {
 + "​*":​ {
 + "​t_class":​ 7,
 + "​msg":​ [ 0 ],
 + "​response":​ true
 + }
 + },
 + "​0408:​f000":​ {
 + "​*":​ {
 + "​t_vendor":​ 1032,
 + "​t_product":​ [ 53257 ],
 + "​msg":​ [ 1 ]
 + }
 + },
 + }
 +}
 +</​code>​
 +
 +''​03f0:​002a''​ is default vendor and product in hexadecimal neotation, as it appears on executition of ''​lsusb''​ or kernel usb debug, while ''​msg''​ is the message content array. These messages issue the commands, that will either allow for media eject and/or eject the virtual CD-ROM, ... in order to switch the device into 3G modem mode. ''​t_vendor''​ is target vendor in decimal notation, ''​t_product''​ is target product in decimal notation. ​
 +Depending to the recognized vendor and product id, you may send one of the messages to the dongle by just using the message array index
 +If you want to know more, look at the file /​etc/​usb-mode.json.
 +
 +The above usbmode-json example will send this message code
 +<​code>​
 +"​555342431234567800000000000006d0000000000000000000000000000000"​
 +</​code>​
 +to the usb device with the vendor id **03f0** and product id **002a**. After modeswitching,​ the usb device will stay with the same vendor id and product id, but with target device class number of 7.
 +
 +In addition, it will send message code
 +<​code>​
 +"​5553424312345678000000000000061b004600000000000000000000000000"​
 +</​code>​
 +to the usb device with the vendor id and the product id of 0408:f000. After modeswitching,​ the usb device will switch to decimal vendor id and product id of 1032:53257, which you can convert to hexadecimal notation of 0408:D009 (You need decimal to hexadecimal converter such as your computer'​s calculator in '​programmer'​s mode'​.). The device vendor id and product id after modeswitch as show on //lsusb// and ''/​sys/​kernel/​debug/​usb/​devices''​ is 0408:D009.
 +
 +Note: the json file is generated automaticallly from ordinary usb_modeswitch data files during build process using perl script named ''​convert-modeswitch.pl''​.
 +For diagnostics purpose, you can create ''​usb-mode-custom.json''​ with defined message and devices part and launch the command
 +<​code>​
 +usbmode -l
 +usbmode -s -v -c /​path/​to/​usb-mode-custom.json
 +</​code>​
 +Converting the standard usb-modeswitch file to json format can be done in a simple way.
 +The standard usb-modeswitch file (0408:f000) content.
 +<code shell>
 +# Yota Router (Quanta 1QDLZZZ0ST2)
 +TargetVendor=0x0408
 +TargetProduct=0xd009
 +MessageContent="​5553424312345678000000000000061b004600000000000000000000000000"​
 +</​code>​
 +Target vendor (0x0408) is converted to decimal notation to fill //​t_vendor//​ value (1032) and target product (0xd009) is converted to decimal notation to fill //​t_product//​ (53257). There is only one message content, so the message index is zero (0). The resulting usb-mode-custom.json content is as follows.
 +<code json>
 +{
 + "​messages"​ : [
 + "​5553424312345678000000000000061b004600000000000000000000000000",​
 +],
 +"​devices"​ : {
 + "​0408:​f000":​ {
 + "​*":​ {
 + "​t_vendor":​ 1032,
 + "​t_product":​ [ 53257 ],
 + "​msg":​ [ 0 ]
 + }
 + },
 + }
 +}
 +</​code>​
 +
 +Based on this example, you can make another usb-mode-custom.json file to perform modeswitching on unsupported dongles for diagnostic purpose.
 +
 +If your device doesn'​t work with usb_modeswitch,​ try the sdparm method.
 +
 +=== sdparm method ===
 +
 +This method uses ''​sdparm''​ to issue SCSI eject command to the emulated CDROM device. This is enough to put some modems into modem mode (tested on Ovation MC935D).
 +
 +Before you start, make note of your modem'​s vendor and product ID:
 +<​code>​
 +# cat /​proc/​bus/​usb/​devices
 +...
 +P:  Vendor=1410 ProdID=5020 Rev= 0.00
 +S:  Manufacturer=Novatel Wireless, Inc.
 +...
 +</​code>​
 +
 +First, find out your device address - in this example it's going to be ''​sg0''​. Then issue the following:
 +
 +<​code>​
 +sdparm --eject /dev/sg0
 +</​code>​
 +
 +For Attitude Adjustment try:
 +<​code>​
 +sdparm --command=eject /dev/sg0
 +</​code>​
 +
 +Then, check for changes of your product ID:
 +
 +<​code>​
 +# cat /​proc/​bus/​usb/​devices
 +...
 +P:  Vendor=1410 ProdID=7001 Rev= 0.00
 +S:  Manufacturer=Novatel Wireless, Inc.
 +S:  Product=Qualcomm Configuration
 +...
 +I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
 +...
 +</​code>​
 +
 +===== Configuration =====
 +The shown configuration replaces the WAN line, so no further changes are needed to the firewall/​other configuration. Note that if you also want to use the WAN port, you have to define it as WAN2 in the configuration. If you define the 3g connection as WAN2, you have to do more changes to other parts, like firewall and so on.
 +
 +==== Network configuration =====
 +Edit your '/​etc/​config/​[[doc:​uci:​network]]'​ file: (see [[doc:​uci:​network#​protocol.3g.ppp.over.ev-do.cdma.umts.or.grps|network 3G section]] for more details)
 +
 +| ''​config interface wan
 +#        option ifname ​ ppp0 # on some carriers enable this line
 +        option pincode 1234
 +        option device ​ /​dev/​ttyUSB0
 +        option apn     ​your.apn
 +        option service umts
 +        option proto   ​3g''​ |
 +
 +Replace '​pincode'​ with the correct pincode of your SIM card. Note that an disabled pincode on the SIM card is problematic,​ please enable it.
 +If you are connecting to a phone where the pincode has already been entered, there if no need for this.
 +
 +Replace '​device'​ with the correct USB port of your modem. On a phone this might for example be /​dev/​ttyACM0.
 +
 +Replace '​apn'​ with the correct APN of your 3g/umts provider.
 +
 +Note in case your APN also requires an username/​password,​ you can configure this too, just add to the network configuration file:
 +| '' ​       option username yourusername
 +        option password yourpassword''​ |
 +
 +Replace '​username'​ and '​password'​ with the correct username/​password you received from your 3g provider. You can also look for this information (apn, username and password) in the [[http://​git.gnome.org/​browse/​mobile-broadband-provider-info/​tree/​serviceproviders.xml|mobile-broadband-provider-info database]] from the Gnome project.
 +
 +For some providers, apperently it is neccessary to add '​noipdefault'​ to '​pppd_options'​. If logread shows that the connection was established and CHAP authentication was successful, but the connection was immediately dropped after, then try:
 +         ​option '​pppd_options'​ '​noipdefault'​
 +
 +If your provider supports PAP authentication only then you need to disable all other protocols via these added options:
 +         ​option '​pppd_options'​ '​noipdefault refuse-chap refuse-mschap refuse-mschap-v2 refuse-eap' ​
 +
 +Now you have configured the network interface.
 +
 +==== Chat configuration =====
 +
 +Now we need to check if the default chatscript does work with your 3g provider or not.
 +
 +You can find it here '/​etc/​chatscripts/​3g.chat',​ it looks like this:
 +<​code>​
 +ABORT   BUSY
 +ABORT   '​NO CARRIER'​
 +ABORT   ERROR
 +REPORT ​ CONNECT
 +TIMEOUT 12
 +"" ​     "​AT&​F"​
 +OK      "​ATE1"​
 +OK      '​AT+CGDCONT=1,"​IP","​$USE_APN"'​
 +ABORT   '​NO CARRIER'​
 +TIMEOUT 15
 +OK      "​ATD*99***1#"​
 +CONNECT ' '
 +</​code>​
 +
 +If your modem needs a special AT command, your can add it to this file.
 +You may have to edit the dial number of the ATD command to fit in with your provider'​s settings (for example "​*99#"​ instead of "​%%*99***11#​%%"​). ​
 +
 +
 +===== Establishing connection =====
 +
 +Just type on console 'ifup wan'
 +
 +Now check <​del>​dmesg</​del>​ logread for successful connect:
 +<​code>​
 +pppd 2.4.4 started by root, uid 0
 +abort on (BUSY)
 +abort on (ERROR)
 +report (CONNECT)
 +timeout set to 12 seconds
 +send (AT&​F^M)
 +expect (OK)
 +AT&​F^M^M
 +OK
 + -- got it
 +send (ATE1^M)
 +expect (OK)
 +^M
 +ATE1^M^M
 +OK
 + -- got it
 +send (AT+CGDCONT=1,"​IP","​your.apn"​^M)
 +abort on (NO CARRIER)
 +timeout set to 15 seconds
 +expect (OK)
 +^M
 +AT+CGDCONT=1,"​IP","​your.apn"​^M^M
 +OK
 + -- got it
 +send (ATD*99***1#​^M)
 +expect (CONNECT)
 +^M
 +ATD*99***1#​^M^M
 +CONNECT
 + -- got it
 +send ( ^M)
 +Serial connection established.
 +Using interface 3g-wan
 +Connect: 3g-wan <--> /​dev/​ttyUSB0
 +Could not determine remote IP address: defaulting to x.x.x.x
 +local  IP address x.x.x.x
 +remote IP address ​ x.x.x.x
 +primary ​  DNS address ​ x.x.x.x
 +secondary DNS address ​ x.x.x.x
 +adding wan (3g-wan) to firewall zone wan
 +</​code>​
 +
 +That's it, now you should be connected.
 +
 +If you want an permanent connect from startup, add 'ifup wan' command to '/​etc/​rc.local'​ file.
 +
 +===== Debugging signal strength issues =====
 +For troubleshooting or locating the best position for the USB Dongle, you can use <​code>​gcom info -d /​dev/​ttyUSBx</​code>​ from the console. This tool will report signal strength, but also network registration and SIM status. If it returns a port-in-use error because your connection is already up, try <​code>​gcom -d /​dev/​ttyUSBx</​code>​ where ''​x''​ represents a port number not used by the wan connection itself.
 +
 +''​gcom''​ returns the signal quality in RSSI ([[wp>​Received signal strength indication]]) and in BER ([[wp>​Bit error rate]], reported in percent). A higher RSSI value represents a stronger signal - scale is from 0 to 99, where 1 is the lowest detectable signal and 31 a very good signal. Don't expect your signal to go all the way up to 99, though. If BER returns 99 it means not known or not detectable.
 +
 +If your 3G modem is e.g. a ZTE K3565-Z featuring a LED SSI indicator to show it's status (Not Connected, GPRS, UMTS) you may be mislead to believe, that a strong signal strength of e.g. 17 may be better, while you only get GPRS, but a value of 4 allows for UMTS access. This is owed to the circumstance,​ that the device may switch over to another cell. The only method to prevent a handover between a GPRS and an UMTS station during the process of optimizing, is to initiate the device to use 'UMTS only' in the first place.
 +
 +You can also add the AT command ​
 +<​code>​
 +"" ​     "​AT+CSQ"​
 +</​code>​
 +to your [[doc/​recipes/​3gdongle#​chat.configuration|chat script]] to check signal quality. ​
 +
 +Command return is "+CSQ: <​rssi>,<​ber>"​ and looks like this in ''​logread'':​
 +<​code>​
 +send (AT+CSQ^M)
 +expect (OK)
 +^M
 +AT+CSQ^M^M
 ++CSQ: 11,99^M
 +^M
 +OK
 +-- got it
 +</​code>​
 +
 +If you have problems establishing a connection and multiple modem devices (''/​dev/​ttyUSB0'',​ ''/​dev/​ttyUSB1'',​ ...) are present, try **all** of them. Some may not work at all while others seem to work at first, but will give a ''​NO CARRIER''​ during the connection process.
 +
 +===== AICCU interaction =====
 +''/​etc/​hotplug.d/​iface/​30-aiccu''​ starts aiccu when the WAN connection is established. It seems however that, in the case of 3G connections,​ the start scripts are started just a bit too early and the start of aiccu fails. I have butchered the script a bit:
 +
 +<​code>​
 +#!/bin/sh
 +
 +[ "​$ACTION"​ = "​ifup"​ -a "​$INTERFACE"​ = "​wan"​ ] && /​etc/​init.d/​aiccu enabled && sleep 15; /​etc/​init.d/​aiccu restart
 +</​code>​
 +
 +Note that sixxs really frowns upon quick re-re-restarts of aiccu, it may get your account blocked for unjust use of resources. Be careful with these scripts.
 +
 +===== Installing multiple 3G dongles =====
 +
 +You can use many usb 3G dongles easily by using an active USB hub.
 +
 +Prepare for the next steps:
 +We assume you have at least one 3g dongle configured. You will need an active internet connection in order to install modules for 3g support. Check [[:​doc:​recipes:​3gdongle]] for more information.
 +
 +1. Connect an active USB hub to the OpenWrt router. You need to assure, that the power supply will deliver sufficent power for all of your 3g dongles. A proper estimation is, that you will need 500+ mA per one 3g dongle. Remember that modem can slightly exceed its declared power consumption in HDSPA+ modes. Be generous and pick USB hub with some power source overhead.
 +
 +2. Connect all 3g dongles and start.
 +
 +3. Browse through logread to check if modems are properly recognized and /ttyUSB ports are assigned.
 +
 +4. Usually a 3g modem has a few "modem ports" - one for connection and others are service types. Exeplum gratum: A Huawei E1750 has three ports. The first in is a communication port and last is a service port. If you only have one modem, it will be recognized as /ttyUSB0, /ttyUSB1 and /ttyUSB2. You need to configure interface using /ttyUSB0 (first one). A Huawei E372 has five ports, but similar to other Huawei devices, the communication port is the first one.
 +
 +5. You need to configure interfaces. An example of "/​etc/​config/​network"​ could look like this: 
 +<​code>​
 +config '​interface'​ '​wan'​
 + option '​proto'​ '​3g'​
 + option '​service'​ '​umts'​
 + option '​device'​ '/​dev/​ttyUSB0'​
 + option '​apn'​ '​internet'​
 + option '​pincode'​ ''​
 + option '​username'​ ''​
 + option '​password'​ ''​
 +</​code>​
 +Usually you need to provide an APN name in "​option '​apn'​ '​Name-Of-APN-HERE'"​.
 +If your sim card is locked with a PIN, or if your porvider requires to use a username and/or pass, add it accordingly.
 +
 +6. Check in log read next /ttyUSB[X] ports. In my case I have second modem starting with /ttyUSB3 (previous one use /ttyUSB0 to /ttyUSB2) so second interface looks like this:
 +<​code>​
 +config '​interface'​ '​wan2'​
 + option '​proto'​ '​3g'​
 + option '​service'​ '​umts'​
 + option '​maxwait'​ '​0'​
 + option '​device'​ '/​dev/​ttyUSB3'​
 + option '​apn'​ '​internet'​
 + option '​pincode'​ ''​
 + option '​username'​ ''​
 + option '​password'​ ''​
 +</​code>​
 +7. remember to add second interface to the zone "​wan"​ in the firewall'​s config file "/​etc/​config/​firewall"​ (it may differ in your case): ​
 +<​code>​
 +config '​zone'​
 + option '​name'​ '​wan'​
 + option '​input'​ '​REJECT'​
 + option '​output'​ '​ACCEPT'​
 + option '​forward'​ '​REJECT'​
 + option '​masq'​ '​1'​
 + option '​mtu_fix'​ '​1'​
 + option '​network'​ 'wan wan2'
 +</​code>​
 +Look at last line - there is wan2 added.
 +
 +8. Now you have both interfaces configured and they should work.
 +
 +9. You can use both interfaces as 
 +failover ​
 +
 +==== LOADBALANCER/​ MULTIWAN ====
 +
 +| FIXME: This section needs a complete rewrite to fix spelling and grammar errors. |
 +loadbalncer - [[https://​forum.openwrt.org/​viewtopic.php?​id=23904]]
 +
 +Note: It seems multiwan isn't perfectly suited for 3G modems in terms of stability. Modems don't reconnect automatically by HealthMonitor. Also, after a manual modem restart, multiwan doesn'​t use the newly reattached interface until it's restarted.
 +
 +Configuration files for two 3G modems paired in multiwan:
 +
 +Network (default route to 0 and peerdns to 0):
 +<​code>​
 +config '​interface'​ '​loopback'​
 + option '​ifname'​ '​lo'​
 + option '​proto'​ '​static'​
 + option '​ipaddr'​ '​127.0.0.1'​
 + option '​netmask'​ '​255.0.0.0'​
 +
 +config '​interface'​ '​lan'​
 + option '​ifname'​ '​eth0.1'​
 + option '​type'​ '​bridge'​
 + option '​proto'​ '​static'​
 + option '​ipaddr'​ '​192.168.1.1'​
 + option '​netmask'​ '​255.255.255.0'​
 +
 +config '​interface'​ '​wan'​
 + option '​proto'​ '​3g'​
 + option '​service'​ '​umts'​
 + option '​device'​ '/​dev/​ttyUSB0'​
 + option '​apn'​ '​vpn'​
 + option '​pincode'​ ''​
 + option '​username'​ '​vpn'​
 + option '​password'​ '​vpn'​
 + option '​maxwait'​ '​20'​
 + option '​defaultroute'​ '​0'​
 +
 +config '​interface'​ '​wan2'​
 + option '​proto'​ '​3g'​
 + option '​service'​ '​umts'​
 + option '​device'​ '/​dev/​ttyUSB3'​
 + option '​apn'​ '​erainternet'​
 + option '​pincode'​ ''​
 + option '​username'​ '​erainternet'​
 + option '​password'​ '​erainternet'​
 + option '​maxwait'​ '​10'​
 + option '​defaultroute'​ '​0'​
 +
 +config '​switch'​
 + option '​name'​ '​rtl8366s'​
 + option '​reset'​ '​1'​
 + option '​enable_vlan'​ '​1'​
 + option '​blinkrate'​ '​2'​
 +
 +config '​switch_vlan'​
 + option '​device'​ '​rtl8366s'​
 + option '​vlan'​ '​1'​
 + option '​ports'​ '0 1 2 3 5t'
 +
 +config '​switch_port'​
 + option '​device'​ '​rtl8366s'​
 + option '​port'​ '​1'​
 + option '​led'​ '​6'​
 +
 +config '​switch_port'​
 + option '​device'​ '​rtl8366s'​
 + option '​port'​ '​2'​
 + option '​led'​ '​9'​
 +
 +config '​switch_port'​
 + option '​device'​ '​rtl8366s'​
 + option '​port'​ '​5'​
 + option '​led'​ '​2'​
 +
 +
 +</​code>​
 +
 +Firewall ​ - add second wan zones
 +<​code>​
 +
 +config '​defaults'​
 + option '​syn_flood'​ '​1'​
 + option '​input'​ '​ACCEPT'​
 + option '​output'​ '​ACCEPT'​
 + option '​forward'​ '​REJECT'​
 + option '​drop_invalid'​ '​1'​
 +
 +config '​zone'​
 + option '​name'​ '​lan'​
 + option '​network'​ '​lan'​
 + option '​input'​ '​ACCEPT'​
 + option '​output'​ '​ACCEPT'​
 + option '​forward'​ '​REJECT'​
 +
 +config '​zone'​
 + option '​name'​ '​wan'​
 + option '​input'​ '​REJECT'​
 + option '​output'​ '​ACCEPT'​
 + option '​forward'​ '​REJECT'​
 + option '​masq'​ '​1'​
 + option '​mtu_fix'​ '​1'​
 + option '​network'​ '​wan'​
 +
 +config '​rule'​
 + option '​src'​ '​wan'​
 + option '​proto'​ '​udp'​
 + option '​dest_port'​ '​68'​
 + option '​target'​ '​ACCEPT'​
 + option '​family'​ '​ipv4'​
 +
 +config '​rule'​
 + option '​src'​ '​wan'​
 + option '​proto'​ '​icmp'​
 + option '​icmp_type'​ '​echo-request'​
 + option '​family'​ '​ipv4'​
 + option '​target'​ '​ACCEPT'​
 +
 +config '​rule'​
 + option '​src'​ '​wan'​
 + option '​proto'​ '​icmp'​
 + list '​icmp_type'​ '​echo-request'​
 + list '​icmp_type'​ '​destination-unreachable'​
 + list '​icmp_type'​ '​packet-too-big'​
 + list '​icmp_type'​ '​time-exceeded'​
 + list '​icmp_type'​ '​bad-header'​
 + list '​icmp_type'​ '​unknown-header-type'​
 + list '​icmp_type'​ '​router-solicitation'​
 + list '​icmp_type'​ '​neighbour-solicitation'​
 + option '​limit'​ '​1000/​sec'​
 + option '​family'​ '​ipv6'​
 + option '​target'​ '​ACCEPT'​
 +
 +config '​rule'​
 + option '​src'​ '​wan'​
 + option '​dest'​ '​*'​
 + option '​proto'​ '​icmp'​
 + list '​icmp_type'​ '​echo-request'​
 + list '​icmp_type'​ '​destination-unreachable'​
 + list '​icmp_type'​ '​packet-too-big'​
 + list '​icmp_type'​ '​time-exceeded'​
 + list '​icmp_type'​ '​bad-header'​
 + list '​icmp_type'​ '​unknown-header-type'​
 + option '​limit'​ '​1000/​sec'​
 + option '​family'​ '​ipv6'​
 + option '​target'​ '​ACCEPT'​
 +
 +config '​include'​
 + option '​path'​ '/​etc/​firewall.user'​
 +
 +config '​forwarding'​
 + option '​dest'​ '​wan'​
 + option '​src'​ '​lan'​
 +
 +config '​rule'​
 + option '​target'​ '​ACCEPT'​
 +
 +config '​zone'​
 + option '​name'​ '​wan2'​
 + option '​forward'​ '​REJECT'​
 + option '​output'​ '​ACCEPT'​
 + option '​network'​ '​wan2'​
 + option '​input'​ '​REJECT'​
 + option '​masq'​ '​1'​
 + option '​mtu_fix'​ '​1'​
 +
 +config '​forwarding'​
 + option '​dest'​ '​wan2'​
 + option '​src'​ '​lan'​
 +
 +
 +
 +
 +</​code>​
 +
 +Multiwan - Additionally add //option '​health_monitor'​ '​serial'//​ at the beggining to help healthmonitor check for dropped ppp interface (Proposed by Jolouis).
 +
 +<​code>​
 +
 +
 +config '​multiwan'​ '​config'​
 + option '​health_monitor'​ '​serial'​
 + option '​default_route'​ '​fastbalancer'​
 + option '​debug'​ '​1'​
 +
 +config '​interface'​ '​wan'​
 + option '​health_fail_retries'​ '​3'​
 + option '​health_recovery_retries'​ '​5'​
 + option '​failover_to'​ '​fastbalancer'​
 + option '​timeout'​ '​10'​
 + option '​dns'​ '​8.8.8.8 8.8.4.4'​
 + option '​weight'​ '​10'​
 + option '​health_interval'​ '​120'​
 + option '​icmp_hosts'​ '​gateway'​
 +
 +config '​interface'​ '​wan2'​
 + option '​timeout'​ '​3'​
 + option '​health_fail_retries'​ '​3'​
 + option '​health_recovery_retries'​ '​5'​
 + option '​failover_to'​ '​fastbalancer'​
 + option '​dns'​ '​208.67.222.222 208.67.220.220'​
 + option '​weight'​ '​10'​
 + option '​health_interval'​ '​120'​
 + option '​icmp_hosts'​ '​gateway'​
 +
 +config '​mwanfw'​
 + option '​src'​ '​192.168.1.150'​
 + option '​wanrule'​ '​wan2'​
 +
 +config '​mwanfw'​
 + option '​wanrule'​ '​fastbalancer'​
 +
 +</​code>​
 +
 +
 +I had issues with auto reconnecting modems so I've modified script for checking if modems are up. This script checks modems separately.
 +I've based this on a great tutorial found at http://​eko.one.pl/?​p=openwrt-3g#​automatycznyrestartpoczenia
 +
 +Create file
 +<​code>​
 +# touch /​bin/​tester.sh
 +# chmod 755 /​bin/​tester.sh
 +</​code>​
 +
 +Put this into file:
 +
 +<​code>#​!/​bin/​sh
 +if ! ping -q -c 1 -W 10 -I 3g-wan 8.8.8.8 > /dev/null; then
 +        (ifup wan; sleep 5; /​etc/​init.d/​multiwan restart) &
 +    fi
 +
 +if ! ping -q -c 1 -W 10 -I 3g-wan2 8.8.8.8 > /dev/null; then
 +        (ifup wan2; sleep 5; /​etc/​init.d/​multiwan restart) &
 +    fi</​code>​
 +
 +Create CRON job:
 +<​code>​
 +# /​etc/​init.d/​cron stop
 +# echo "*/2 * * * * /​bin/​tester.sh"​ >> /​etc/​crontabs/​root
 +# /​etc/​init.d/​cron enable
 +# /​etc/​init.d/​cron start</​code>​
 +
 +This will ping through two wans: 3g-wan and 3g-wan2 and restarts the interface in case of no replies.
 +Additionally,​ It will wait 5 seconds and force a multiwan restart as it seems wouldn'​t recognize the new wan interfaces.
 +Restart of multiwan should take care of this situation.
 +
 +===== Additional DNS configuration =====
 +==== Advertising public DNS to clients ====
 +If local clients are unable to resolve DNS names DNS, you can advertise external name servers to them.
 +That comes in handy, if you don't want to relay on dnsmasq as a local resolver. ​
 +Of course, **if you are already running dnsmasq as a resolver on your WRT (default), you should rather make use of [[#​Using_DNS_forwarding|DNS forwarding]]**. Your WRT will then act as a local resolver to your local clients and forward requests to configured nameservers.
 +
 +For the first method just add
 +<​code>'​list '​dhcp_option'​ '​6,​208.67.222.222,​208.67.220.220'</​code>​ into the dhcp section e.g.
 +<​code>​config dhcp '​lan'</​code>​ of etc/​config/​dhcp.
 +
 +
 +<​code>​
 +
 +config '​dnsmasq'​
 + option '​domainneeded'​ '​1'​
 + option '​boguspriv'​ '​1'​
 + option '​filterwin2k'​ '​0'​
 + option '​localise_queries'​ '​1'​
 + option '​rebind_protection'​ '​1'​
 + option '​rebind_localhost'​ '​1'​
 + option '​local'​ '/​lan/'​
 + option '​domain'​ '​lan'​
 + option '​expandhosts'​ '​1'​
 + option '​nonegcache'​ '​0'​
 + option '​authoritative'​ '​1'​
 + option '​readethers'​ '​1'​
 + option '​leasefile'​ '/​tmp/​dhcp.leases'​
 + option '​resolvfile'​ '/​tmp/​resolv.conf.auto'​
 +
 +config '​dhcp'​ '​lan'​
 + option '​interface'​ '​lan'​
 + option '​start'​ '​100'​
 + option '​limit'​ '​150'​
 + option '​leasetime'​ '​12h'​
 + list '​dhcp_option'​ '​6,​208.67.222.222,​208.67.220.220'​
 +
 +config '​dhcp'​ '​wan'​
 + option '​interface'​ '​wan'​
 + option '​ignore'​ '​1'​
 +
 +</​code>​
 +
 +It could be made to work as described [[https://​forum.openwrt.org/​viewtopic.php?​pid=139499#​p139499|here]] in our Forum.
 +
 +==== Using DNS forwarding ====
 +
 +Please note that instead of advertising public dns servers((Some of public DNS servers are OpenDNS:​208.67.222.222,​208.67.220.220 and Google DNS:​8.8.8.8,​8.8.4.4)) for clients, it's better to just add server forwarding for dnsmasq, so that client dns requests are handled by dnsmasq and forwarded to appropriate dns servers. This example is using [[doc:​techref:​uci|uci cli]] to configure dnsmasq to forward public dns requests to Google public dns servers((Google public dns doesn'​t hijack NXDOMAIN response, unlike OpenDNS)).
 +<​code>​
 +uci add_list dhcp.@dnsmasq[-1].server=8.8.8.8
 +uci add_list dhcp.@dnsmasq[-1].server=8.8.4.4
 +uci commit dhcp
 +</​code>​
 +
 +If you prefer to edit /​etc/​config/​dhcp configuration manually:
 +
 +<​code>​
 +
 +config '​dnsmasq'​
 + option '​domainneeded'​ '​1'​
 + option '​boguspriv'​ '​1'​
 + option '​filterwin2k'​ '​0'​
 + option '​localise_queries'​ '​1'​
 + option '​rebind_protection'​ '​1'​
 + option '​rebind_localhost'​ '​1'​
 + option '​local'​ '/​lan/'​
 + option '​domain'​ '​lan'​
 + option '​expandhosts'​ '​1'​
 + option '​nonegcache'​ '​0'​
 + option '​authoritative'​ '​1'​
 + option '​readethers'​ '​1'​
 + option '​leasefile'​ '/​tmp/​dhcp.leases'​
 + option '​resolvfile'​ '/​tmp/​resolv.conf.auto'​
 + option '​server'​ '​8.8.8.8'​
 + option '​server'​ '​8.8.4.4'​
 +
 +config '​dhcp'​ '​lan'​
 + option '​interface'​ '​lan'​
 + option '​start'​ '​100'​
 + option '​limit'​ '​150'​
 + option '​leasetime'​ '​12h'​
 +
 +config '​dhcp'​ '​wan'​
 + option '​interface'​ '​wan'​
 + option '​ignore'​ '​1'​
 +
 +</​code>​
 +
 +If you prefer to ignore DNS servers obtained via PPP negotiation:​
 +<code shell>
 +uci add dhcp.@dnsmasq[-1].noresolv=1
 +uci commit dhcp
 +</​code>​
 +
 +File /​etc/​config/​dhcp
 +<​code>​
 +config '​dnsmasq'​
 + option '​domainneeded'​ '​1'​
 + option '​boguspriv'​ '​1'​
 + option '​filterwin2k'​ '​0'​
 + option '​localise_queries'​ '​1'​
 + option '​rebind_protection'​ '​1'​
 + option '​rebind_localhost'​ '​1'​
 + option '​local'​ '/​lan/'​
 + option '​domain'​ '​lan'​
 + option '​expandhosts'​ '​1'​
 + option '​nonegcache'​ '​0'​
 + option '​authoritative'​ '​1'​
 + option '​readethers'​ '​1'​
 + option '​leasefile'​ '/​tmp/​dhcp.leases'​
 + option '​resolvfile'​ '/​tmp/​resolv.conf.auto'​
 + option '​server'​ '​8.8.8.8'​
 + option '​server'​ '​8.8.4.4'​
 + option '​noresolv'​ '​1'​
 +</​code>​
 +
 +This configuration is better, because clients will be able to resolve local hostnames, while utilizing dnsmasq to cache client dns requests.
 +
 +More dnsmasq tweaks are available [[doc:​uci:​dhcp#​all.options| here]] and [[doc:​howto:​dhcp.dnsmasq| here]].
 +
 +===== Easy Configuration Using Luci Web Interface =====
 +
 +[[doc:​howto:​luci.essentials|Luci]] has supported 3G configuration. Be sure to have **luci** and **luci-proto-3g** installed. If you want to do multiwan configuration,​ make sure that **luci-apps-multiwan** is installed and optionally, **luci-app-mwan3**.
 +
 +To create a new 3g connection, go to Luci web interface. Navigate to Network => interfaces. Click on **Add new interface** button. Give a simple name to the interface, for example **3g** and choose **UMTS/​GPRS/​EVDO** as its protocol.
 +
 +Here is basic configuration to get the connection working.
 +<​code>​
 +# General Setup
 +Protocol : UMTS/​GPRS/​EVDO
 +Modem device : /​dev/​ttyUSB0
 +Service type : UMTS only (You may prefer UMTS/GPRS if you wish)
 +APN : internet (Not needed for CDMA/EVDO)
 +PIN : 1234 (Leave it blank if you don't use pin)
 +PAP/CHAP username : <ask your 3G provider>​
 +PAP/CHAP password : <ask your 3G provider> ​
 +
 +# Advanced Settings (leave them as default)
 +
 +# Firewall Settings
 +Create / Assign firewall zone : wan
 +</​code>​
 +
 +===== Obtaining IPv6 address =====
 +If you want to enable IPv6 on 3G connection, make sure that your dongle supports PDPv6((To check if your dongle support PDPv6, open up serial terminal (Putty, screen, minicom, microcom, or picocom), and type **AT+CGDCONT=?​**. If the response shows a line containing "​IPV6",​ for example **+CGDCONT: (1-11),"​IPV6",,,​(0-2),​(0-3)**,​ your dongle supports PDPv6. Otherwise, your dongle is stuck with IPv4.)) and your 3G provider is providing IPv6 service.
 +
 +To enable IPv6 negotiation on the PPP link, issue the following command.
 +<​code>​
 +uci set network.3g.ipv6=1
 +uci commit network.3g
 +</​code>​
 +Be sure to replace //3g// with the correct name of 3G interface.
 +
 +In addition, be sure to edit file ''/​etc/​chatscripts/​3g.chat''​ for PDPv6 configuration as currently there is no [[doc:​techref:​uci|UCI]] entry for PDPv6.
 +<​code>​
 +ABORT   BUSY
 +ABORT   '​NO CARRIER'​
 +ABORT   ERROR
 +REPORT ​ CONNECT
 +TIMEOUT 10
 +"" ​     "​AT&​F"​
 +OK      "​ATE1"​
 +OK      '​AT+CGDCONT=1,"​IPV6","​$USE_APN"'​
 +SAY     "​Calling UMTS/​GPRS"​
 +TIMEOUT 30
 +OK      "​ATD$DIALNUMBER"​
 +CONNECT ' '
 +</​code>​
 +
 +You may use the following chatscript for PDPv4v6 configuration. Make sure that your dongle supports PDv4v6((See previous note.)) before attempting to modify the chatscript.
 +<​code>​
 +ABORT   BUSY
 +ABORT   '​NO CARRIER'​
 +ABORT   ERROR
 +REPORT ​ CONNECT
 +TIMEOUT 10
 +"" ​     "​AT&​F"​
 +OK      "​ATE1"​
 +OK      '​AT+CGDCONT=1,"​IPV4V6","​$USE_APN"'​
 +SAY     "​Calling UMTS/​GPRS"​
 +TIMEOUT 30
 +OK      "​ATD$DIALNUMBER"​
 +CONNECT ' '
 +</​code>​
 +
 +If you are using Luci, be sure to check //Enable IPv6 negotiation on the PPP link// and optionally //Use builtin IPv6-management//​ on the //Advanced settings// section of the 3G interface configuration page. Also, be sure to modify /​etc/​chatscripts/​3g.chat file for PDPv6 as explained above.
 +
 +Of course you can use other methods to obtain IPv6 instead of relying on PPP negotiation. [[doc:​uci:​network6|Go to this page]] for more explanation.
 +
 +===== Compile things yourself =====
 +If you want to build an own firmware containing support for a UMTS Modem, maybe this BuildHowTo will help you: [[doc:​howtobuild:​wireless-router-with-a-3g-dongle|Wireless router with a 3G dongle and multiwan for failover on Wired, Wireless client (routed) and 3G]]
 +
 +{{tag>​USBrelated}}
 +
 +===== Troubleshooting =====
 +
 +==== Howto activate serial mode through web browser on CDC-Ethernet devices ====
 +WARNING - this will deactivate WEB-GUI access on these devices!!!
 +You need to know howto submit AT commands to a modem in order to restore the GUI.
 +=== Huawei ===
 +Browse to http://​192.168.1.1/​html/​switchProjectMode.html with JavaScript enabled browser.
 +=== ZTE ===
 +Browse to http://​192.168.0.1/​goform/​goform_process?​goformId=MODE_SWITCH&​switchCmd=FACTORY with JavaScript enabled browser.
 +
 +==== Howto restore CDC mode on CDC-Ethernet capable devices====
 +=== Huawei ===
 +AT^U2DIAG=255 or AT+U2DIAG=276 see [[http://​www.3g-modem-wiki.com/​page/​Huawei+AT-commands]]
 +=== ZTE ===
 +AT+ZCDRUN=9
 +AT+ZCDRUN=F
 +Sources: ((http://​www.techytalk.info/​disable-virtu … m-devices/​))((https://​www.semanticlab.net/​index.php/​UMTS_with_OpenWRT))
 +
 +==== Workarounds for specific devices ====
 +=== General information on modeswitching ===
 +Modeswitching issues can occur especially on devices, in fallback modes (Huawei).
 +It is advisable to install usbutils
 +<​code>​opkg update && opkg install usbutils</​code>​
 +You can look for the usb ids from <​code>​lsusb</​code>​ in /​etc/​usb-mode.json,​ to see what modeswitch actions are being taken.
 +
 +If you prefer to permantently switch a modem to serial/​fallback mode, see
 +[[http://​www.3g-modem-wiki.com/​page/​Huawei+AT-commands]] and take actions to deactivate the json-based modeswitch for that specific product id. The following section will go into details on how to do this for the ancient E220. The following sections for MA260 explain, how such workarounds have looked like before the introduction of OpenWRT Chaos Calmer.
 +It may in some cases be easier to delete the file /​etc/​usb-mode.json with a custom modeswitch file, if necessary. A previously configured serial modem, that is unknown to the kernel can be manually associated with it's driver by assigning it the manufacturer and product id as shown by lsusb as follows:
 +e.g. for E220 in fallback mode:
 +<​code>​echo '12d1 1001 ff' > /​sys/​bus/​usb-serial/​drivers/​option1/​new_id</​code>​
 +=== Huawei E220/Chaos Calmer ===
 +If you encounter problems with an undetected Huawei E220, you can try the following - 
 +this resets the E220 to its factory defaults, so it can again be handled by the new JSON-based modeswitch.
 +This will reenable the CD-ROM Mode.
 +
 +1. Make the modem work once, by manually telling the kernel to use generic (option) drivers.
 +<​code>​echo '12d1 1003 ff' > /​sys/​bus/​usb-serial/​drivers/​generic/​new_id</​code>​
 +2. Shutdown WWAN (necessary only if WWAN was previously configured)
 +<​code>​ifdown WWAN</​code>​
 +3. Modes of the E220
 +Modem + PC UI
 +<​code>​echo ​ "​AT^U2DIAG=0"​ >/​dev/​ttyUSB0</​code>​
 +Modem + CD
 +<​code>​echo ​ "​AT^U2DIAG=1"​ >/​dev/​ttyUSB0</​code>​
 +4. Reboot
 +<​code>​reboot</​code>​