Use 3g/UMTS USB Dongle for WAN connection

FIXME: REDUNDANT with wired.wan.with.3g.dongle

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 multiwan package to use this simultaneously with other connections to the internet.

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

:!: You | FIXME: need not | must not install usb-modeswitch onto your wrt device if you cure your 3g-usb modem from the so called 'NO-CD' feature. Plug it into a desktop PC with usb-modeswitch and have a look at http://www.3g-modem-wiki.com/page/Huawei+AT-commands. I was able to fix 3 modems with a simple AT-command. Plugged in, they just show up the serial lines (ttyUSB0-2) and the sd-card reader. Very nice!

:!: Some sticks provide an usb-ethernet-device. (E.g. E303) In that case usb-modeswitch and usb tethering will help.

:!: 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 Devices using qmi and mbim protocol section of this wiki.

Preparations

Required Packages

First install required packages:

  • 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 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.

  • 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 or the "compatible" library from libusb-1.0, dependency of usb-modeswitch

Installation

First install needed packages:

opkg update
opkg install comgt kmod-usb-serial kmod-usb-serial-option kmod-usb-serial-wwan usb-modeswitch usb-modeswitch-data

Now plug your USB Dongle to the USB port and restart the router.

Check dmesg for:

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

If above lines do not appear in dmesg, but instead you see something like:

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

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):

rmmod usbserial #optional
insmod /lib/modules/`uname -r`/usbserial.ko vendor=0x<vid> product=0x<pid>
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.
insmod option #skip this if option driver is loaded already
echo '<vid> <pid> ff' > /sys/bus/usb-serial/drivers/option1/new_id

To automate the process of attaching option serial driver on boot, just edit /etc/rc.local and place

echo '<vid> <pid> ff' > /sys/bus/usb-serial/drivers/option1/new_id
before the exit code
exit 0

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:

#!/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
...

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:

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
Also check kernel USB debug for loaded drivers
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

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 here how to use this package.

Now your USB Dongle should create logs in dmesg. If it doesn't, try

usb_modeswitch -c /etc/usb_modeswitch.d/<file>
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.

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:

[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

NOTE: As of 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.

{
	"messages" : [
		"555342431234567800000000000006d0000000000000000000000000000000",
		"5553424312345678000000000000061b004600000000000000000000000000",
],
"devices" : {
		"03f0:002a": {
			"*": {
				"t_class": 7,
				"msg": [ 0 ],
				"response": true
			}
		},
		"0408:f000": {
			"*": {
				"t_vendor": 1032,
				"t_product": [ 53257 ],
				"msg": [ 1 ]
			}
		},
	}
}

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

"555342431234567800000000000006d0000000000000000000000000000000"
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

"5553424312345678000000000000061b004600000000000000000000000000"
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

usbmode -l
usbmode -s -v -c /path/to/usb-mode-custom.json
Converting the standard usb-modeswitch file to json format can be done in a simple way. The standard usb-modeswitch file (0408:f000) content.
# Yota Router (Quanta 1QDLZZZ0ST2)
TargetVendor=0x0408
TargetProduct=0xd009
MessageContent="5553424312345678000000000000061b004600000000000000000000000000"
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.
{
	"messages" : [
		"5553424312345678000000000000061b004600000000000000000000000000",
],
"devices" : {
		"0408:f000": {
			"*": {
				"t_vendor": 1032,
				"t_product": [ 53257 ],
				"msg": [ 0 ]
			}
		},
	}
}

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:

# cat /proc/bus/usb/devices
...
P:  Vendor=1410 ProdID=5020 Rev= 0.00
S:  Manufacturer=Novatel Wireless, Inc.
...

First, find out your device address - in this example it's going to be sg0. Then issue the following:

sdparm --eject /dev/sg0

For Attitude Adjustment try:

sdparm --command=eject /dev/sg0

Then, check for changes of your product ID:

# 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)
...

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/network' file: (see 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 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:

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 ' '

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 dmesg logread for successful connect:

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

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.

Troubleshooting

For troubleshooting or locating the best position for the USB Dongle, you can use

gcom info -d /dev/ttyUSBx
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
gcom -d /dev/ttyUSBx
where x represents a port number not used by the wan connection itself.

gcom returns the signal quality in RSSI (Received signal strength indication) and in BER (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

""      "AT+CSQ"
to your chat script to check signal quality.

Command return is "+CSQ: <rssi>,<ber>" and looks like this in logread:

send (AT+CSQ^M)
expect (OK)
^M
AT+CSQ^M^M
+CSQ: 11,99^M
^M
OK
-- got it

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:

#!/bin/sh

[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && /etc/init.d/aiccu enabled && sleep 15; /etc/init.d/aiccu restart

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 http://wiki.openwrt.org/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:

config 'interface' 'wan'
	option 'proto' '3g'
	option 'service' 'umts'
	option 'device' '/dev/ttyUSB0'
	option 'apn' 'internet'
	option 'pincode' ''
	option 'username' ''
	option 'password' ''
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:

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' ''
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):
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'
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 isnt perfectly suit for 3G modems in terms of stability. Modems dont reconnect automatically by HealthMonitor. Also after Mobem being manually restarted, multiwan dont use newly restarted interface until multiwan restart is restarted.

Configuration files for two 3G modems paired in multiwan:

Network (default route to 0 and peerdns to 0):

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'


Firewall - add second wan zones


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'




Multiwan - Additionally add option 'health_monitor' 'serial' at the beggining to help healthmonitor check for dropped ppp interface (Proposed by Jolouis).



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'

I have issues with auto reconnecting modems so Ive modified script for checking if modems are up. Script check modems separately. Ive based this on great tutorial found at http://eko.one.pl/?p=openwrt-3g#automatycznyrestartpoczenia

Create file

# touch /bin/tester.sh
# chmod 755 /bin/tester.sh

Put this into file:

#!/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

Create CRON:

# /etc/init.d/cron stop
# echo "*/2 * * * * /bin/tester.sh" >> /etc/crontabs/root
# /etc/init.d/cron enable
# /etc/init.d/cron start

Script will ping through two wans: 3g-wan and 3g-wan2 and if not recieving ping restart interface respectively. Additionally, It will wait 5 sec and force restart multiwan as it seems restarting modem wasnt recognized by multiwan automatically and it wasnt add to routing table. Restart of multiwan should take care of this situation.

Additional DNS configuration

Advertising public DNS to clients

NOTE: Advertising public DNS to clients is not recommended. Use DNS forwarding instead of this method.
FIXME: This subsection needs rewrite to fix spelling and grammar errors

Additionally in case of DNS being not resolved by local clients put 'list 'dhcp_option' '6,208.67.222.222,208.67.220.220' More here: https://forum.openwrt.org/viewtopic.php?id=17316 ' code into etc/config/dhcp


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'

It could be made to work as described here in our Forum.

Using DNS forwarding

Please note that instead of advertising public dns servers1) 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 uci cli to configure dnsmasq to forward public dns requests to Google public dns servers2).

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

If you prefer to edit /etc/config/dhcp configuration manually:


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'

If you prefer to ignore DNS servers obtained via PPP negotiation.

uci add dhcp.@dnsmasq[-1].noresolv=1
uci commit dhcp

File /etc/config/dhcp

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'

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 here and here.

Easy Configuration Using Luci Web Interface

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.

# 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

Obtaining IPv6 address

If you want to enable IPv6 on 3G connection, make sure that your dongle supports PDPv63) and your 3G provider is providing IPv6 service.

To enable IPv6 negotiation on the PPP link, issue the following command.

uci set network.3g.ipv6=1
uci commit network.3g
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 UCI entry for PDPv6.

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 ' '

You may use the following chatscript for PDPv4v6 configuration. Make sure that your dongle supports PDv4v64) before attempting to modify the chatscript.

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 ' '

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. 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: Wireless router with a 3G dongle and multiwan for failover on Wired, Wireless client (routed) and 3G

Workarounds

TP-Link MA260/Attitude Adjustment

This workaround is valid for Attitude Adjustment, but has been obsoleted by 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:

#!/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
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

FIXME: The device should work out of the box. If you update from Attitude Adjustment, you should remove old config files, since they are no longer used since 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 3G-Dongle recipes.

FIXME: If you still encounter problems, you may need to figure out how to submit the following messages to your dongle: allow eject: 5553424312345678000000000000061e000000000000000000000000000000 eject: 5553424312345678000000000000061b000000020000000000000000000000

Devices using qmi and mbim protocol

Some new 3G/4G dongles use qmi and mbim protocol to establish connection to ISP. For your information, qmi protocol is proprietary protocol by Qualcomm. In contrast to qmi, 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.

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 (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

UCI has supported qmi network protocol configuration. The detailed explanation about qmi network configuration is explained here.

Currently, there is no such thing as luci-proto-qmi yet to make use of Luci for qmi configuration. You need to configure UCI manually using uci command line or text editor.

A sample configuration that works with a TP-Link TL-MA260 on Barrier Breaker looks like this (part of /etc/config/network):

config interface 'wan'
    option device '/dev/cdc-wdm0'
    option apn 'YOUR_APN'
    option proto 'qmi'
    option ifname 'wwan0'

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 OpenWrt users/devel mailing lists or OpenWrt forum

Here is a brief help about umbim command line.

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
- Ordered List Item

1) 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
2) Google public dns doesn't hijack NXDOMAIN response, unlike OpenDNS
3) 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.
4) See previous note.

Back to top

doc/recipes/3gdongle.txt · Last modified: 2014/11/19 14:08 by andyboeh