2009年9月11日金曜日

OpenWrt with usb Modem

http://nuwiki.openwrt.org/oldwiki/MobileAPHowTo2

Vincent Fox, Feb 26 2006

Objective

Mobile WiFi!

Soon after receiving the new Linksys WRTSL54GS (SL for short) and getting OpenWRT running on it (thanks Kaloz), my first thought was “what an awkward product-name!”. Second thought was the the many uses for the USB port. One obvious one was using a cellular phone to attach to the internet, for mobile WiFi! Not a new idea, but much easier to implement now.

I should say up front that all cellular data networks have latency that just blows. Pings of 500+ms are the norm and may bounce up to 2000ms. So don't expect it to replace your landline. But there are certain good uses for it, like setting up quick connectivity for a few people at an event. Or mounted in a vehicle for a totally mobile hotspot! Once you do get a response, throughput can be pretty good. But you definitely want to use dnsmasq, and any other caching mechanism you can get your hands on, to keep things as local as possible.

Items used

 Linksys WRTSL54GS with OpenWRT [[oldwiki:whiterussian|WhiteRussian]] RC5
 Nokia 6230 cellphone with Cingular EDGE/GPRS "Media Net" package with unlimited data
 Nokia DKU-2 USB data cable that connects to POP-port on phone

Basic connectivity to phone

USB modules

Install USB-serial module

First we need to install (and load) some kernel modules.

root@OpenWrt:~# ipkg install kmod-usb-ohci 
root@OpenWrt:~# ipkg install kmod-usb-serial 
root@OpenWrt:~# insmod usb-ohci usbserial 

Verify that cellular phone is recognized

root@OpenWrt:~# logread | tail 
Jan  1 00:33:01 (none) kern.info kernel: hub.c: new USB device 01:02.0-1, assigned address 2 
Jan  1 00:33:01 (none) kern.warn kernel: usb.c: USB device 2 (vend/prod 0x421/0x40f) is not claimed by any active driver. 
Jan  1 00:39:01 (none) kern.info kernel: usb.c: registered new driver serial 
Jan  1 00:39:01 (none) kern.info kernel: usbserial.c: USB Serial support registered for Generic 
Jan  1 00:39:01 (none) kern.info kernel: usbserial.c: USB Serial Driver core v1.4 

Those vendor and product numbers, we must do something with them…..

Modify usb-serial options

root@OpenWrt:~# vi /etc/modules.d/*-usb-serial usbserial vendor=0x421 product=0x40f 
root@OpenWrt:~# reboot 

Install microcrom so we can check things out

root@OpenWrt:~# ipkg install microcom 

Verify we can talk to phone, by typing AT to modem, see if it responds OK

root@OpenWrt:~# microcom -D/dev/usb/tts/0 AT  OK  

:)

Hit ~x to get out of microcom

PPP conectivity

Install PPP

root@OpenWrt:~# ipkg install kmod-ppp 
root@OpenWrt:~# ipkg install ppp 
root@OpenWrt:~# ipkg install chat root@OpenWrt:~# reboot 

PPP config file

This part took some Googling. Finally I found a good page that I used as the basis: http://www.advantedgecomputing.com/opensource/gc83linux.html

root@OpenWrt:~# mkdir /etc/ppp/peers 
root@OpenWrt:~# vi /etc/ppp/peers/cingular 
# information about your device 
/dev/usb/tts/0 # device file assigned to Nokia 6230 
115200 # DTE speed 
# Initial authentication 
user ISPDA@CINGULARGPRS.COM # username (data acceleration) 
password CINGULAR1 # a common GPRS/EDGE password 
defaultroute # use cellular network's gateway 
noipdefault # force peer to specify local IP (GC83 only) 
usepeerdns # use DNS servers from remote host remotename attws # assume 'attws' as name of remote system 
ipparam attws # add 'attws' to ip-up & ip-down script 
crtscts # enable hardware flow control 
lock # lock the serial port when in use 
noauth # don't expect peer to authenticate 
persist # re-dial connection if dial fails  
# Uncomment next 2 lines for debugging 
#debug 
#nodetach  
ipcp-max-configure 20 # increase the maximum IPCP config requests 
maxfail 0 # do not stop retrying connection  
# Move on to the chat script after connection 
connect '/usr/sbin/chat -v -V -t3 -f /etc/ppp/peers/chat-cingular' 

PPP Chat script

root@OpenWrt:~# vi /etc/ppp/peers/chat-cingular 
# 
SAY 'Starting GPRS connect script...\n' SAY '\n' # ispauth CHAP # define auth method (optional)  
SAY 'Setting the abort string\n' 
SAY '\n'  
# Abort String ---------------------------------  
#ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' 
ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED 
#TIMEOUT 10 
#ABORT 'BUSY' ABORT 'NO ANSWER' ABORT 'NO CARRIER'  
# ---------------------------------------------- 
SAY 'Initializing modem\n'  
# Modem Initialization ------------------------- 
#'' ATZ 
# Eo=No echo, V1=English result codes 
#OK 'ATE0V1' 
'' AT+cfun=1 
OK AT+cfun=1 
OK AT+cgreg=1 
OK AT #TIMEOUT 40 
# ----------------------------------------------  
# Additional initialization (optional) --------- 
# /begin att 
OK AT&F&D2&C1E0V1S0=0 OK AT+IFC=2,2 OK ATS0=0 OK AT OK AT&F&D2&C1E0V1S0=0 OK AT+IFC=2,2 # /end att #AT&FE0S0=0 #AT&F0&D2+IFC=2,2V1Q0XIS0=0S7=50+CMEE=1  # ----------------------------------------------  SAY '\n' SAY 'Setting APN\n'  # Set Access Point Name (APN) ------------------ # Incorrect APN or CGDCONT variable is a # frequent cause of peer LCP TermReqs # So try each setting at least once! =)  #REG:\s1 AT+cgdcont=1,"IP","proxy" #OK 'AT+CGDCONT=0,"IP","proxy"' #OK 'AT+CGDCONT=1,"IP","proxy"' #OK 'AT+CGDCONT=2,"IP","proxy"' #OK 'AT+CGDCONT=0,"IP","isp.cingular"' OK 'AT+CGDCONT=1,"IP","isp.cingular"' #OK 'AT+CGDCONT=2,"IP","isp.cingular"'  # ----------------------------------------------  SAY '\n' SAY 'Dialing...\n' # Dial the ISP --------------------------------- # a few different dial commands are shown # the default should work fine  #REG:\s1 'ATD*99***1#' OK ATDT*99***1# #OK ATD*99***1# #OK ATD*99# #OK 'ATD*##***##' #OK CONNECT ' ' 

PPP device setup

First attempt to use our setup will give an error, unless we fix it.

root@OpenWrt:~# pppd call cingular pppd: pppd is unable to open the /dev/ppp device. You need to create the /dev/ppp device node by executing the following command as root:         mknod /dev/ppp c 108 0 root@OpenWrt:~# mkdir /var/lock root@OpenWrt:~# vi /etc/modules.d/70-ppp slhc ppp_generic ppp_async 

Lock file directory creation

If we are going to have the “lock” option in the config file, we need the /var/lock directory created. By nature OpenWRT recreates /var on each boot. So add a startup script that ensures it is created on each boot.

root@OpenWrt:~# vi /etc/init.d/S80ppp #!/bin/sh mkdir -p /var/lock root@OpenWrt:~# chmod +x /etc/init.d/S80ppp 

WAN interface change

Time to cut the umbilical cord. Unplug the WAN port ethernet line used for all this setup work.

root@OpenWrt:~# nvram set wan_device=ppp0 root@OpenWrt:~# nvram set wan_ifname=ppp0 root@OpenWrt:~# nvram commit root@OpenWrt:~# reboot 

Time for test drive!

root@OpenWrt:~# pppd call cingular debug nodetach (output) 

Hopefully you made WOO-HOO noises at this point as you watched it successfully connect.

Check connectivity

root@OpenWrt:~# ifconfig ppp0 ppp0      Link encap:Point-Point Protocol           inet addr:166.172.48.113  P-t-P:10.6.6.6  Mask:255.255.255.255           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1           RX packets:4 errors:0 dropped:0 overruns:0 frame:0           TX packets:4 errors:0 dropped:0 overruns:0 carrier:0           collisions:0 txqueuelen:3           RX bytes:64 (64.0 B)  TX bytes:82 (82.0 B) root@OpenWrt:~# netstat -nr Kernel IP routing table Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface 10.6.6.6        0.0.0.0         255.255.255.255 UH        0 0          0 ppp0 192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 br0 0.0.0.0         10.6.6.6        0.0.0.0         UG        0 0          0 ppp0 root@OpenWrt:~# ping -c 4 www.gatech.edu PING www.gatech.edu (130.207.165.120): 56 data bytes 64 bytes from 130.207.165.120: icmp_seq=0 ttl=243 time=836.0 ms 64 bytes from 130.207.165.120: icmp_seq=1 ttl=243 time=676.3 ms 64 bytes from 130.207.165.120: icmp_seq=2 ttl=243 time=738.1 ms 64 bytes from 130.207.165.120: icmp_seq=3 ttl=243 time=680.0 ms  --- www.gatech.edu ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 676.3/732.6/836.0 ms 

Usage

All you should need to do is ssh in, and execute:

root@OpenWrt:~# pppd call cingular 

I am adding this last few lines of text, using the Nokia PPP connection :)

Misc

How about a little script to monitor the SES button and connect?

root@OpenWrt:~# vi /usr/sbin/dialmon #!/bin/sh junk=0 until [ $junk -eq 1 ] do         sleep 1         read junk  /proc/sys/diag /usr/sbin/pppd call cingular root@OpenWrt:~# chmod +x /usr/sbin/dialmon 

Let's use SES amber to show connect status. Add echo to these files:

root@OpenWrt:~# cd /etc/ppp root@OpenWrt:~# rm ip-up ip-down root@OpenWrt:~# cp /rom/etc/ppp/ip-up . root@OpenWrt:~# cp /rom/etc/ppp/ip-down . root@OpenWrt:~# vi ip-up #!/bin/sh [ -z "$6" ] |  env -i ACTION="ifup" INTERFACE="$6" PROTO=ppp /sbin/hotplug "iface" echo 33 > /proc/sys/diag root@OpenWrt:~# vi ip-down #!/bin/sh [ -z "$6" ] |  env -i ACTION="ifdown" INTERFACE="$6" PROTO=ppp /sbin/hotplug "iface" echo 0 >/proc/sys/diag 

Now just run “dialmon &”, and push the button!

I have this setup in my automobile, with the dialmon script set to run on boot. I suppose I should recode dialmon to also perform disconnect on another button-press, but I usually just cut power to the unit when I am done.

HotPlug

We can use hotplug capability to do the connection. A script like this:

echo 1 | /usr/sbin/pppd $TTY $SPEED \              lock \              modem \              name $ISP \              user zapp \              debug kdebug 3 \              connect '/usr/sbin/chat -v -s -f /etc/ppp/chat-sprintpcs' 

Notes

  1. This document for the SL was inspired by Nate True's page: http://devices.natetrue.com/mobileap/

2. Would be nice to have a local clock source, as the SL has no clock and comes up with wrong time at boot. PPP does note the large time disparity in the logs. You can sync after connecting with rdate or ntpclient, obvious place to append this is in /etc/ppp/ip-up.

0 件のコメント: