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/09/13 14:55]
tipsy observations on RSSI value
doc:recipes:3gdongle [2016/05/06 00:37] (current)
tmomas
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** or **mbim** protocol for connection instead of legacy ppp protocol. For more information about qmi and mbim, see [[doc:​recipes:​ltedongle|How To Use LTE modem in QMI mode for WAN connection]] section of this wiki.
 +
 +===== 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 [[https://​wiki.openwrt.org/​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
 +
 +==== 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>​
 +References: ​ ¹²
 +4. Reboot
 +<​code>​reboot</​code>​
 +
 +¹ http://​www.techytalk.info/​disable-virtu … m-devices/
 +² https://​www.semanticlab.net/​index.php/​UMTS_with_OpenWRT
 +=== TP-Link MA260/​Attitude Adjustment ===
 +This workaround is valid for Attitude Adjustment, but has been obsoleted by [[https://​dev.openwrt.org/​changeset/​36812|r36812]] and newer builds, such as Barrier Breaker 14.07.
 +
 +If you plug the MA260 into the USB port of a compatible OpenWRT device running Attitude Adjustment, you will notice certain issues, similar to those described in the Ubuntu forum: [TP Link MA260, Ubuntu 12.04 LTS[http://​ubuntuforums.org/​showthread.php?​t=2197164]],​ e.g. missing modeswitch routines missing hotplug etc.
 +
 +Create and edit the file /​etc/​hotplug.d/​usb/​21-tplink_ma260 with the following content:
 +
 +<​code>​
 +#​!/​bin/​sh ​                                                                                                                                      
 +BINARY="/​usr/​bin/​usb_modeswitch" ​                                                                                                               ​
 +                                                                                                                                                ​
 +TPLINKMA260_PRODID1="​2357/​f000/​0" ​                                                                                                              
 +TPLINKMA260_PRODID2="​2357/​9000/​0" ​                                                                                                              
 +                                                                                                                                                ​
 +# switch from storage mode to modem mode                                                                                                        ​
 +if [ "​${PRODUCT}"​ = "​${TPLINKMA260_PRODID1}"​ ]; then                                                                                            ​
 +        if [ "​${ACTION}"​ = "​add"​ ]; then                                                                                                        ​
 +                # give the storage some time to finish mounting ​                                                                                
 +                sleep 15                                                                                                                        ​
 +                # issue the modeswitch and change the product id.                                                                               
 +                ${BINARY} -v 2357 -p f000 -V 2357 -P 9000 -W -I -n \                                                                            ​
 +                -M '​5553424312345678000000000000061e000000000000000000000000000000'​ \                                                           
 +                -2 '​5553424312345678000000000000061b000000020000000000000000000000' ​                                                            
 +                logger -t HOTPLUG "​${TPLINKMA260_PRODID1} plugged in." ​                                                                         ​
 +        fi                                                                                                                                      ​
 +        if [ "​${ACTION}"​ = "​remove"​ ]; then                                                                                                     
 +                logger -t HOTPLUG "​${TPLINKMA260_PRODID1} was removed." ​                                                                        
 +        fi                                                                                                                                      ​
 +fi                                                                                                                                              ​
 +                                                                                                                                                ​
 +if [ "​${PRODUCT}"​ = "​${TPLINKMA260_PRODID2}"​ ]; then                                                                                            ​
 +        if [ "​${ACTION}"​ = "​add"​ ]; then                                                                                                        ​
 +                #register usbserial and option device driver with the modem mode id:                                                            ​
 +                echo '2357 9000 ff' > /​sys/​bus/​usb-serial/​drivers/​option1/​new_id ​                                                               ​
 +                logger -t HOTPLUG "​${TPLINKMA260_PRODID2} plugged in." ​                                                                         ​
 +        fi                                                                                                                                      ​
 +        if [ "​${ACTION}"​ = "​remove"​ ]; then                                                                                                     
 +                logger -t HOTPLUG "​${TPLINKMA260_PRODID2} was removed." ​                                                                        
 +        fi                                                                                                                                      ​
 +fi
 +</​code>​
 +Similar workaround may apply to TP-Link MA180.
 +
 +In order to work correctly the package usb_modeswitch needs to be installed.
 +
 +=== TP-Link MA260/​Barrier Breaker ===
 +The device works out of the box.
 +If you update from Attitude Adjustment, you should probably remove old config files, since they are no longer used since [[https://​dev.openwrt.org/​changeset/​36812|r36812]].
 +
 +The //usbmode// binary has been replaced by the //​usb_modeswitch//​ binary to do modeswitching tasks.
 +A JSON-style 3g-dongle database now prepares all necessary information for initialization.
 +You will find more information on how this works in [[:​doc:​recipes:​3gdongle|3G-Dongle recipes]].
 +===== Devices using qmi and mbim protocol =====
 +
 +Some new 3G/4G dongles use **qmi** and **mbim** protocol to establish connection to ISP.
 +For your information,​ [[https://​blogs.gnome.org/​dcbw/​2010/​04/​15/​mobile-broadband-and-qualcomm-proprietary-protocols/​|qmi protocol]] is proprietary protocol by Qualcomm. In contrast to qmi, [[http://​compliance.usb.org/​mbim/​|mbim]] is more standardized protocol for 3G/4G dongles.
 +
 +=== QMI Protocol Configuration ===
 +
 +To make use of qmi protocol, package **kmod-usb-net-qmi-wwan** and **uqmi** are needed. **uqmi** is available on both **barrier breaker** and **bleeding edge** repository.
 +
 +Here is a brief help about **uqmi** command line usage.
 +
 +<code sh>
 +No device given
 +Usage: uqmi <​options|actions>​
 +Options:
 +  --single, -s:                     Print output as a single line (for scripts)
 +  --device=NAME,​ -d NAME:           Set device name to NAME (required)
 +  --keep-client-id <​name>: ​         Keep Client ID for service <​name>​
 +  --release-client-id <​name>: ​      ​Release Client ID after exiting
 +
 +Services: ​                          dms, nas, pds, wds, wms
 +
 +Actions:
 +  --get-versions: ​                  Get service versions
 +  --set-client-id <​name>,<​id>: ​     Set Client ID for service <​name>​ to <id>
 +                                    (implies --keep-client-id)
 +  --get-client-id <​name>: ​          ​Connect and get Client ID for service <​name>​
 +                                    (implies --keep-client-id)
 +  --start-network <​apn>: ​           Start network connection (use with options below)
 +    --auth-type pap|chap|both|none:​ Use network authentication type
 +    --username <​name>: ​             Use network username
 +    --password <​password>: ​         Use network password
 +    --autoconnect: ​                 Enable automatic connect/​reconnect
 +  --stop-network <​pdh>: ​            Stop network connection (PDH should be 4294967295),​ (use with option below)
 +    --autoconnect: ​                 Disable automatic connect/​reconnect
 +  --get-data-status: ​               Get current data access status
 +  --set-autoconnect <​val>: ​         Get current data access status (disabled, enabled, paused)
 +  --get-pin-status: ​                Get PIN verification status
 +  --verify-pin1 <​pin>: ​             Verify PIN1
 +  --verify-pin2 <​pin>: ​             Verify PIN2
 +  --get-imsi: ​                      Get International Mobile Subscriber ID
 +  --reset-dms: ​                     Reset the DMS service
 +  --set-device-operating-mode <​m> ​  Set the device operating mode
 +                                    (modes: online, low_power, factory_test,​ offline
 +                                     ​reset,​ shutting_down,​ persistent_low_power,​
 +                                     ​mode_only_low_power)
 +  --set-network-modes <​modes>: ​     Set usable network modes (Syntax: <​mode1>​[,<​mode2>,​...])
 +                                    Available modes: all, lte, umts, gsm, cdma, td-scdma
 +  --set-network-preference <​mode>: ​ Set preferred network mode to <​mode>​
 +                                    Available modes: auto, gsm, wcdma
 +  --set-network-roaming <​mode>: ​    Set roaming preference:
 +                                    Available modes: any, off, only
 +  --network-scan: ​                  ​Initiate network scan
 +  --network-register: ​              ​Initiate network register
 +  --get-signal-info: ​               Get signal strength info
 +  --get-serving-system: ​            Get serving system info
 +  --list-messages: ​                 List SMS messages
 +  --get-message <​id>: ​              Get SMS message at index <id>
 +  --get-raw-message <​id>: ​          Get SMS raw message contents at index <id>
 +  --send-message <​data>: ​           Send SMS message (use options below)
 +    --send-message-smsc <​nr>: ​      SMSC number (required)
 +    --send-message-target <​nr>: ​    ​Destination number (required)
 +    --send-message-flash: ​          Send as Flash SMS
 +
 +</​code>​
 +
 +[[doc:​uci|UCI]] has supported **qmi** network protocol configuration. The detailed explanation about qmi network configuration is explained [[doc:​uci:​network#​protocol.qmi.usb.modems.using.qmi.protocol|here]].
 +
 +Currently, there is no such thing as **<​del>​luci-proto-qmi</​del>​** yet to make use of [[doc:​techref:​luci | Luci]] for qmi configuration. You need to configure UCI manually using [[doc:​techref:​uci|uci command line]] or [[doc:​howto:​user.beginner.cli#​editing.files| text editor]].
 +
 +=== MBIM Protocol configuration ===
 +
 +Currently, there is not enough information about mbim protocol as it's being actively developed. If you are curious about setting up mbim protocol, you may ask [[https://​lists.openwrt.org/​cgi-bin/​mailman/​listinfo | OpenWrt users/devel mailing lists]] or [[https://​forum.openwrt.org | OpenWrt forum]]
 +
 +Here is a brief help about **umbim** command line.
 +<code sh>
 +umbim help
 +Usage: mbim <​caps|pinstate|unlock|connect|disconnect>​ [options]
 +Options:
 +    -d <​device>​ the device (/​dev/​cdc-wdmX)
 +    -t <​transaction> ​   the transaction id
 +    -n          no close
 +
 +    -v          verbose
 +</​code> ​ - Ordered List Item
 +
 +===== Setting up RNDIS-based dongles =====
 +
 +(This section is based on experience with Bleeding Edge r47548 from December of 2015 on a wt3020 and connecting to an Alcatel Onetouch L850.).
 +
 +For rndis devices, only a limited subset of packages are necessary (besides the base USB packages, that are most likely already contained in the base image):
 +
 +<​code>​
 +opkg update
 +opkg install kmod-usb-net-rndis usb-modeswitch
 +</​code>​
 +
 +kmod-usb-net-rndis will also install kmod-mii, kmod-usb-net,​ kmod-usb-net-cdc-ether and kmod-usb-net-rndis as dependencies.
 +
 +After installing the packages and connecting the USB stick, the following should appear in dmesg:
 +
 +<​code>​
 +[  847.390000] usb 1-1: new high-speed USB device number 3 using ehci-platform
 +[  847.590000] usb 1-1: no of_node; not parsing pinctrl DT
 +[  847.610000] rndis_host 1-1:1.0: no of_node; not parsing pinctrl DT
 +[  847.620000] rndis_host 1-1:1.0 usb0: register '​rndis_host'​ at usb-101c0000.ehci-1,​ RNDIS device, 72:​4d:​eb:​bb:​e2:​60
 +</​code>​
 +
 +You can verify the interface details on the new usb0 network interface by running ''​ifconfig usb0''​.
 +
 +If the USB stick will be your only WAN connection, then the easiest way to set up the automatic connection is to change /​etc/​config/​network to be something like: 
 +
 +<​code>​
 +config interface '​wan'​
 +        option ifname '​usb0'​
 +        option proto '​dhcp'​
 +</​code>​
 +
 +(you need to reboot or restart the network subsystem with ''/​etc/​init.d/​network restart''​ afterwards)
 +
 +Since RNDIS-based sticks create their own NATted IP subnet, it is important that OpenWRT'​s local IP range is different from the 4G stick'​s IP range. In the case of the Alcatel L850, the default range is 192.168.1.1,​ which clashes with OpenWRT'​s default. Therefore OpenWRT'​s LAN IP should be changed to something else, such as:
 +
 +<​code>​
 +config interface '​lan'​
 +        option ipaddr '​10.10.10.1'​
 +</​code>​
 +
 +If auto-connect is disabled, or PIN-request is enabled on the 4G stick, you may have to visit the dongle'​s admin web interface (typically 192.168.1.1) to enter the PIN or initiate the 4G connection. You can do this from your PC connected to the OpenWRT wifi.
 +
 +=== RNDIS Troubleshooting ===
 +
 +If you only see the usb messages, but not the rndis_host messages, then modesetting may be at fault.
 +
 +Checking /​sys/​kernel/​debug/​usb/​devices , the device should look like this:
 +
 +<​code>​
 +
 +T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  3 Spd=480 ​ MxCh= 0
 +D:  Ver= 2.01 Cls=00(>​ifc ) Sub=00 Prot=00 MxPS=64 #​Cfgs= ​ 1
 +P:  Vendor=1bbb ProdID=0195 Rev= 2.28
 +S:  Manufacturer=Alcatel
 +S:  Product=MobileBroadBand
 +S:  SerialNumber=0123456789ABCDEF
 +C:* #Ifs= 3 Cfg#= 1 Atr=80 MxPwr=500mA
 +A:  FirstIf#= 0 IfCount= 2 Cls=e0(wlcon) Sub=01 Prot=03
 +I:* If#= 0 Alt= 0 #EPs= 1 Cls=e0(wlcon) Sub=01 Prot=03 Driver=rndis_host
 +E:  Ad=82(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
 +I:* If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host
 +E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +I:* If#= 2 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none)
 +E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=125us
 +E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +</​code>​
 +
 +and not like this:
 +
 +<​code>​
 +T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480 ​ MxCh= 0
 +D:  Ver= 2.01 Cls=00(>​ifc ) Sub=00 Prot=00 MxPS=64 #​Cfgs= ​ 1
 +P:  Vendor=1bbb ProdID=f000 Rev= 2.28
 +S:  Manufacturer=Alcatel
 +S:  Product=MobileBroadBand
 +S:  SerialNumber=0123456789ABCDEF
 +C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
 +I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none)
 +E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=125us
 +E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 +</​code>​
 +
 +(note the number of interfaces "#​Ifs="​ and the "​ProdID="​)
 +
 +
 +=== RNDIS Security Note ===
 +
 +:!: Leaving your RNDIS-based dongle admin web interface available to LAN users might not be something you would like to do, as there is usually no authentication mechanism there.
 +To protect it, you can add the following rule to Network->​Firewall->​Custom Rules:
 +
 +<​code>​
 +iptables -A forwarding_lan_rule -d 192.168.1.0/​24 -m comment --comment "no access to USB dongle from LAN" -j DROP
 +</​code>​
 +
 +Now, if you need to access your dongle web interface, log in to your OpenWRT box with:
 +
 +<​code>​
 +ssh -L 8080:​192.168.1.1:​80 root@your-openwrt-ip
 +</​code>​
 +
 +and point your browser to http://​localhost:​8080.