OpenWRT with Huawei E367 and TP-Link TL-WR1043ND
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:0×1446, 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.