The ability to connect a 3G modem to a wireless router to form a Internet connected ad-hoc network of machines is very powerful. I’ve done this many times and have written about it before (e.g., see my OpenWRT writeup page) but I recently did it with modern hardware again. Here I will use the TP-Link TL-WR1043ND wireless router (available here for around $50) together with the Huawei E367 3G UMTS/HSDPA modem. Other wireless routers and modem should work fine. The software is OpenWRT 10.03 although I hope to redo this with LibreWRT eventually. My writeup is mostly focused around what is happening around the prompt, so it is mostly a cut’n’paste terminal session with a comment interlined.
The first step is to flash the firmware with OpenWRT. The OpenWRT wiki page for the TL-WR1043ND covers this in detail, and for any other hardware you should find what you need in the OpenWRT wiki. If you have already installed OpenWRT on the TL-WR1043ND, and want to wipe it out and start from scratch (like I did for this writeup) here is how to do it:
root@choco:~# cd /tmp root@choco:/tmp# wget http://downloads.openwrt.org/backfire/10.03/ar71xx/openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin Connecting to downloads.openwrt.org (78.24.191.177:80) openwrt-ar71xx-tl-wr 100% |*******************************| 2688k 00:00:00 ETA root@choco:/tmp# md5sum openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin 9927973ba5da65d0d52e255397452b87 openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin root@choco:/tmp# mtd -r write /tmp/openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin firmware Unlocking firmware ... Writing from /tmp/openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin to firmware ... Rebooting ...
The device will reboot automatically when it is done. After say 30 seconds, try to connect to it using the default IPv4 address 192.168.1.1. I have connected the WAN port to the Internet and connect to the router over local network connected to the router’s LAN1 input. Let’s configure OpenWRT, I’m calling the host ‘choco’ and giving it the IPv4 address 192.168.1.46. I’ll also set a good root password to disable telnet, and add some SSH keys to simplify remote login.
jas@latte:~$ telnet 192.168.1.1 Trying 192.168.1.1... Connected to 192.168.1.1. Escape character is '^]'. === IMPORTANT ============================ Use 'passwd' to set your login password this will disable telnet and enable SSH ------------------------------------------ BusyBox v1.15.3 (2010-04-06 03:14:11 CEST) built-in shell (ash) Enter 'help' for a list of built-in commands. _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M Backfire (10.03, r20728) -------------------------- * 1/3 shot Kahlua In a shot glass, layer Kahlua * 1/3 shot Bailey's on the bottom, then Bailey's, * 1/3 shot Vodka then Vodka. --------------------------------------------------- root@OpenWrt:/# passwd Changing password for root New password: Retype password: Password for root changed by root root@OpenWrt:/# sed -i -e 's/OpenWrt/choco/' /etc/config/system root@OpenWrt:/# sed -i -e 's/192.168.1.1/192.168.1.46/' /etc/config/network root@OpenWrt:/# cat>/etc/dropbear/authorized_keys ssh-rsa AAAAB3NzaC1yc2... ^D root@OpenWrt:/# dropbearkey -y -f /etc/dropbear/dropbear_rsa_host_key Public key portion is: ssh-rsa AAAA... root@OpenWrt Fingerprint: md5 45:fd:62... root@OpenWrt:/#
You could reboot the machine here to switch from telnet to SSH, but I’ll install a bunch of packages while I’m at it. Run ‘opkg update’ to update the package list, and then install the wireless modules for the TL-WR1043ND.
root@OpenWrt:/# opkg update Downloading http://downloads.openwrt.org/backfire/10.03/ar71xx/packages/Packages.gz. Inflating http://downloads.openwrt.org/backfire/10.03/ar71xx/packages/Packages.gz. Updated list of available packages in /var/opkg-lists/packages. root@OpenWrt:/# opkg install kmod-ath9k wpad-mini ... Configuring iw. Configuring kmod-crypto-core. Configuring kmod-crypto-arc4. Configuring kmod-crypto-aes. Configuring wireless-tools. Configuring kmod-cfg80211. Configuring kmod-mac80211. Configuring kmod-ath. Configuring kmod-ath9k. Configuring crda. Configuring wpad-mini. root@OpenWrt:/#
Next I’ll install some packages that will are needed for the modem.
root@OpenWrt:/# opkg install comgt kmod-usb-serial kmod-usb2 kmod-usb-uhci kmod-usb-ohci usb-modeswitch ... Configuring kmod-nls-base. Configuring kmod-usb-core. Configuring chat. Configuring kmod-usb-ohci. Configuring kmod-usb2. Configuring comgt. Configuring usb-modeswitch. Configuring kmod-usb-serial. Configuring kmod-usb-uhci. root@OpenWrt:/#
Now let’s reboot the machine and try to get things to really work.
root@OpenWrt:/# sync root@OpenWrt:/# reboot
Use SSH to connect to the router, and don’t forget the use its new IPv4 address!
3G modems are notoriously known for not acting as a modem directly. Instead they often simulate a CD-ROM that will install device driver software, for inferior operating systems. Fortunately the usb_modeswitch tool “fixes” the hardware for us. My Huawei E367 start up with the USB vendor/product IDs 0x12d1:0x1446, you normally find this out by looking in /proc/bus/usb/devices. Here is the output on my device:
root@choco:~# cat /proc/bus/usb/devices ... T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=12d1 ProdID=1446 Rev= 0.00 S: Manufacturer=Huawei Technologies S: Product=HUAWEI Mobile C:* #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=500mA I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none) E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none) E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms root@choco:~#
This means I have to go find a usb-modeswitch configuration for this device. Fortunately, I found it on my Debian Squeeze box in /etc/usb_modeswitch.d/12d1:1446 (from the usb-modeswitch-data package). There was a slight problem with the file, it didn’t specify the correct USB vendor/product ID of the device after it has been “switched”. My Huawei E367 switches to 12d1:1506, so I add ‘1506’ to the ‘TargetProductList’ list. Here is the final configuration:
root@choco:~# cat>/etc/usb-modeswitch.conf EnableLogging=1 DefaultVendor= 0x12d1 DefaultProduct=0x1446 TargetVendor= 0x12d1 TargetProductList="1001,1406,140b,140c,1412,141b,14ac,1506" CheckSuccess=20 MessageContent="55534243123456780000000000000011062000000100000000000000000000" root@choco:~#
Now you should be able to run usb_modeswitch to perform the “switch”:
root@choco:~# usb_modeswitch Looking for target devices ... No devices in target mode or class found Looking for default devices ... Found default devices (1) Accessing device 002 on bus 001 ... Using endpoints 0x01 (out) and 0x81 (in) Inquiring device details; driver will be detached ... Looking for active driver ... No driver found. Either detached before or never attached SCSI inquiry data (for identification) ------------------------- Vendor String: HUAWEI Model String: Mass Storage Revision String: 2.31 ------------------------- USB description data (for identification) ------------------------- Manufacturer: Huawei Technologies Product: HUAWEI Mobile Serial No.: not provided ------------------------- Setting up communication with interface 0 ... Trying to send the message to endpoint 0x01 ... OK, message successfully sent Checking for mode switch (max. 20 times, once per second) ... Waiting for original device to vanish ... Original device can't be accessed anymore. Good. Searching for target devices ... Searching for target devices ... Searching for target devices ... Searching for target devices ... Searching for target devices ... Found correct target device Mode switch succeeded. Bye. root@choco:~#
The /proc/bus/usb/devices file will now contain information about the real device:
root@choco:~# cat /proc/bus/usb/devices ... T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=12d1 ProdID=1506 Rev= 0.00 S: Manufacturer=Huawei Technologies S: Product=HUAWEI Mobile C:* #Ifs= 7 Cfg#= 1 Atr=c0 MxPwr=500mA A: FirstIf#= 1 IfCount= 2 Cls=02(comm.) Sub=00 Prot=00 I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none) E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=2ms E: Ad=82(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= 1 Cls=ff(vend.) Sub=01 Prot=09 Driver=(none) E: Ad=83(I) Atr=03(Int.) MxPS= 64 Ivl=2ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=08 Driver=(none) E: Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms I:* If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=03 Driver=(none) E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms I:* If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=02 Driver=(none) E: Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms I:* If#= 5 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none) E: Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 6 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none) E: Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=88(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms root@choco:~#
Let’s put that command in /etc/rc.local so that it will be run on every boot.
root@choco:~# cat /etc/rc.local # Put your custom commands here that should be executed once # the system init finished. By default this file does nothing. /usr/bin/usb_modeswitch exit 0 root@choco:~#
We are not quite ready, the “usbserial” module needs to be told which USB vendor/product to use. The /etc/modules.d/60-usb-serial file is used during boot to set the right parameters. You can also run ‘rmmod’ followed by ‘insmod’ with the proper parameters to avoid a reboot. You can use the “gcom info” tool to find some information about the modem. Normally you use /dev/ttyUSB0 but for some reason it does not work for me and instead I had to use /dev/ttyUSB3.
root@choco:~# cat>/etc/modules.d/60-usb-serial usbserial vendor=0x12d1 product=0x1506 maxSize=4096 root@choco:~# rmmod usbserial root@choco:~# insmod usbserial vendor=0x12d1 product=0x1506 maxSize=4096 root@choco:~# gcom -d /dev/ttyUSB3 info ##### Wireless WAN Modem Configuration ##### Product text: ==== Manufacturer: huawei Model: E367 Revision: 11.807.05.00.00 IMEI: 353613040739180 +GCAP: +CGSM,+DS,+ES OK ==== Manufacturer: huawei IMEI and Serial Number: 353613040739180 Manufacturer's Revision: 11.807.05.00. Hardware Revision: NOT Network Locked: ERROR: Customisation: NOT SUPPORT Band settings: (NOT) APN: ERROR: ##### END ##### root@choco:~#
Let’s configure network and wireless. The configurations files are /etc/config/network and /etc/config/wireless. Edit them using your favorite editor, or vi. I’m setting up a PSK2 encrypted WLAN and I have a WDS to connect two wireless routers. Note that you need to use the correct PIN for your SIM card (here I’m using 8328) and set the APN correctly (I’m using ‘bredband.tre.se’). Reboot after making these changes.
root@choco:~# cat /etc/config/network 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.46' option 'netmask' '255.255.255.0' #config 'interface' 'wan' # option 'ifname' 'eth0.2' # option 'proto' 'dhcp' config 'switch' option 'name' 'rtl8366rb' option 'reset' '1' option 'enable_vlan' '1' config 'switch_vlan' option 'device' 'rtl8366rb' option 'vlan' '1' option 'ports' '1 2 3 4 5t' config 'switch_vlan' option 'device' 'rtl8366rb' option 'vlan' '2' option 'ports' '0 5t' config interface wan option ifname ppp0 option proto 3g option device /dev/ttyUSB0 option apn bredband.tre.se option pincode 8328 root@choco:~# cat /etc/config/wireless config wifi-device radio0 option type mac80211 option channel 5 option macaddr 00:27:19:fc:87:b2 option hwmode 11ng option htmode HT20 list ht_capab SHORT-GI-40 list ht_capab DSSS_CCK-40 config wifi-iface option device radio0 option network lan option mode ap option ssid Grisslan option encryption psk2 option key notforyoutosee config wifi-iface option device radio0 option network lan option mode wds option bssid 00:1F:C6:60:D3:11 option ssid GrisslanWDS option encryption psk2 option key thisisalsosecret root@choco:~# reboot root@choco:~#
Once the machine have rebooted, you can bring up the 3G connection by using “ifup wan”. Look at the log by using “logread” and tail the log in the background by doing “logread -f &”.
root@choco:~# ifup wan Trying to set PIN PIN set successfully root@choco:~# logread |tail -20 May 21 13:41:20 choco local2.info chat[2419]: send (ATD*99***1#^M) May 21 13:41:20 choco local2.info chat[2419]: expect (CONNECT) May 21 13:41:20 choco local2.info chat[2419]: ^M May 21 13:41:20 choco local2.info chat[2419]: ATD*99***1#^M^M May 21 13:41:20 choco local2.info chat[2419]: CONNECT May 21 13:41:20 choco local2.info chat[2419]: -- got it May 21 13:41:20 choco local2.info chat[2419]: send ( ^M) May 21 13:41:20 choco daemon.info pppd[2412]: Serial connection established. May 21 13:41:20 choco daemon.info pppd[2412]: Using interface ppp0 May 21 13:41:20 choco daemon.notice pppd[2412]: Connect: ppp0 <--> /dev/ttyUSB0 May 21 13:41:24 choco daemon.warn pppd[2412]: Could not determine remote IP address: defaulting to 10.64.64.64 May 21 13:41:24 choco daemon.notice pppd[2412]: local IP address 95.209.96.115 May 21 13:41:24 choco daemon.notice pppd[2412]: remote IP address 10.64.64.64 May 21 13:41:24 choco daemon.notice pppd[2412]: primary DNS address 80.251.201.177 May 21 13:41:24 choco daemon.notice pppd[2412]: secondary DNS address 80.251.201.178 May 21 13:41:24 choco daemon.info dnsmasq[1028]: reading /tmp/resolv.conf.auto May 21 13:41:24 choco daemon.info dnsmasq[1028]: using nameserver 80.251.201.178#53 May 21 13:41:24 choco daemon.info dnsmasq[1028]: using nameserver 80.251.201.177#53 May 21 13:41:24 choco daemon.info dnsmasq[1028]: using local addresses only for domain lan May 21 13:41:25 choco user.notice rdate: Synced with ptbtime1.ptb.de root@choco:~#
Hooray!
Or almost so… usually the first time you connect, I often get incorrect DNS servers from the server. It shows up like this in the log:
May 21 12:25:04 choco daemon.notice pppd[1157]: primary DNS address 10.11.12.13 May 21 12:25:04 choco daemon.notice pppd[1157]: secondary DNS address 10.11.12.14
The exact reason why this happens is beyond me. There are patches floating around for pppd, but I haven’t tried them. A common workaround is to hardcode static DNS servers (like Google DNS or OpenDNS). I have come up with my own workaround, based on the observation that when the problem has occurred it will not happen again if I disconnect and reconnect. Thus I have written a small script which is invoked whenever an interface is brought up (typically the WAN interface).
# Written by Simon Josefsson May 2011. root@choco:~# cat> /etc/hotplug.d/iface/01-reconnect-if-dns-is-broken case "${ACTION:-ifup}" in ifup) if grep -q 10.11.12.13 /tmp/resolv.conf.auto; then (sleep 30 && ifdown wan && ifup wan) & fi ;; esac root@choco:~# chmod +x /etc/hotplug.d/iface/01-reconnect-if-dns-is-broken root@choco:~#
That’s it! If you found this writeup useful, please flattr it.
This is great! That’s something I’ll definitely try too. Awesome! I just wrote a German installation instruction for non-technical people to get backfire 10.03 on the wr1043nd: http://www.kammerath.net/openwrt-tp-link-wr1043nd-installieren.html
Tried to write it as simple as possible and maybe you also like it. At least people googling for it will find it if you allow me to drop it here…
Let’s keep the community alive!
great writeup. if you could only post a single customized file for this configuration, then it would make configuration a snap for newbies 🙂 but thanks anyway!
Thank you sooo much! This was the end of DD-WRT and the beginning of OpenWRT and that I finally got my Huawei E812e 3G modem working. Thank you soo much!
I am trying to connect using openwrt and the E367, everything here is very helpful, but could you provide me with a chat script to use? I am failing to connect with the chat script.
Thanks
Thanks for the great guide. I used this with latest OpenWRT on a Netgear WNDR3700 and a Huawei E353 to great success!
What is your reasoning behind redoing this with LibreWRT?
Pingback: KiwiBird » TP-Link tl-wr1043nd, openwrt, zte mf626 ? 3G-????????
Hello!
First thanke you for nice presentation, but I have a problem with configuration my Asus 500gp v2 and 3g modem.
First which verison of openWRT i must install?
Which program can i used for paste you code? (root@choco:~# cd /tmp…)? Terminal?
Thanke you for help!
Hello!
Thanks for your help. I am writing some tutorials about Openwrt and I wanted to write about 3g modems as part of them. You can find them in my web page. I did not publish the 3g modem part but I wanted to include the reference to this post because I consider this post the best I have ever read about 3g modem configuration. Could you give me permission to do so through e-mail?
Thanks a lot!
David.
thanks for your guide,
i have a question: how do you know that vendor/product ID of the USB device after it has been “switched” is 12d1:1506 , how do you find that numbers (1506).?
thanks for your replay
Dear All,
I am new to OpenWrt and want to connect a 3g modemto my openwrt router,I have follwed the steps you have mentioned in the forum but can not get success.
I am using huawei datacard having model number EC1261
can you please help me with the steps to be followed
Thanks
Maxe
did u try ever try using this tplink with usb hub…so it can connect both usb 3g modem and usb storage (sata 2.5″ external hdd 500gb)….
or what kind of tplink can do those scenario ?
please answer….
thx
Haris: Use ‘lsusb’. You may need to install the usbutils package with ‘opkg update; opkg install usbutils’.
Thanks Simon, for a clear explanation. I’ll be trying it out with a WRT160NL and A Huawei E353.
From this site:
https://sites.google.com/site/variousopenwrt/huawei-e3267
You can find protocol support and luci setup+status that can be used with e3267. And guide too..
Hi Simon,
It seems to me that your explanations could be part of the solution to a problem I have. Over a period of a week or so I’ve been trying to piece together information from the OpenWrt wiki and other forums to achieve OpenWrt running on a TP-Link 841n router, on a wireless network to a modem that would ultimately be Huawei 3G E5330.
I’ve just realised by downloading the image in this post that you put your USB modem directly into a USB on the router. Is the 841n’s lack of usb port a deal-breaker, or is there a way connecting router and dongle wirelessly?
As an absolute novice with little experience on the command line, I started trying to figure this out but hit some obstacles very early on in the process. Though I got OpenWRT onto the router, I couldn’t even get the router to connect (through LuCI) to a wired internet connection. (I uploaded the original firmware, and did autosetup just fine).
Do you have any advice you would be willing to offer? I’d love to try and solve this, but I’m wondering if it may be beyond me and whether to find a local expert!
Rob
This article was written in 2011 so most if not everything is a bit outdated — I suggest you retrace the steps I did with more modern OpenWRT releases. Or find someone local to give you a hand.
I have only used 3G USB dongles, so you will need a USB port on your router.
Good luck!
/Simon