Copied from https://atr2.ath.cx/~jayjwa/documents/LGVX8300-ACM-linux-dialup.txt which had Certificate problems. Thanks to jayjwa <jayjwa AT vdrl.ath.cx> Connecting With Linux to Verizon's vzw3g Network with the LG VX8300 cell phone as a modem. After a LONG battle and hours on Google I finally got this working. I thought I'd write a few notes since almost all of the stuff I saw was missing a piece of needed info here or there, which, of course, caused the whole thing to fail. What you need: ------------------- 1. LG VX8300 (tested) or another phone that has an ACM modem built-in. 2. A competent Linux sysadmin. I'm assuming you realize you need to be root here, and you know how to edit files, change configs, etc. Modern utilities for networking (sorry, no 'ifconfig' or 'route' ) will be used. 3. Support for usb, hotplug-ng, cdc-adm support, ppp support, pppd & frineds. I'm using a 2.6.23.13 kernel. If you forgot to build in cdc-acm (I did) just jump in /usr/src/linux and recompile your kernel. 4. A USB cable that fits your phone to your computer. This might be possible using Bluetooth. I didn't try. 5. Verizon account. The method I have is the "1X" network one, which I (hope!) only charges your minutes. There is a fast one that you have to add on to your plan if you want it. I didn't ask for any special plan to get the 1X stuff. Update: Evidently you're not supposed to do this :) It's OK if you signed up for a Verizon Internet service, but if you didn't then I guess you could consider it stealing as you're getting a service you are supposed to pay for but didn't. You'd think they'd just deny you access, but this wasn't the case. Note however that using your phone to connect to your own ISP is of course OK. Set up the phone: Go to the phone and hit Menu. Hit 0 (zero). Secret service menu ;) Enter all zero's for the service code. You'll see a new menu you probably didn't see before. Go to #3 Network Select. Go to #1 Mode Preference. On that menu you are probably set at the top option. Scroll down and select "1x only". Remember how you did this to put this back after you're done. Set up Linux: -------------- Connect the USB - Computer - Phone. If your system is setup with module autoload (or cdc-acm support is built-in) and hotplug, that is enough to get the phone set with the computer. 'lsusb' should show something like this at this point: Bus 004 Device 001: ID 0000:0000 Bus 003 Device 004: ID 1004:6000 LG Electronics, Inc. VX4400/VX6000 Cellphone Bus 003 Device 001: ID 0000:0000 Bus 002 Device 001: ID 0000:0000 Bus 001 Device 001: ID 0000:0000 Syslog should contain something like: Jan 18 22:41:36 vdrl kernel: usb 3-2: new full speed USB device using uhci_hcd and address 4 Jan 18 22:41:36 vdrl kernel: usb 3-2: Product: LG CDMA USB Modem Jan 18 22:41:36 vdrl kernel: usb 3-2: Manufacturer: LG CDMA USB Modem Jan 18 22:41:36 vdrl kernel: usb 3-2: configuration #1 chosen from 1 choice Jan 18 22:41:36 vdrl kernel: cdc_acm 3-2:1.0: ttyACM0: USB ACM device Jan 18 22:41:36 vdrl kernel: usbcore: registered new interface driver cdc_acm Jan 18 22:41:36 vdrl kernel: drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapts (I can't remember if I had USB debugging on here or not, yours might say less if that was the case because then the above would only be that chatty due to the USB debugging. The point is, it should say something about cdma, usb, and acm ). 'procinfo -m' should show you now have an ttyACM device (it's number 166 on mine) Character Devices: Block Devices: 1 mem 89 i2c 1 ramdisk 2 pty 108 ppp 2 fd 3 ttyp 116 alsa 3 ide0 4 /dev/vc/0 128 ptm 7 loop 4 tty 136 pts 22 ide1 4 ttyS 166 ttyACM 254 pktcdvd 5 /dev/tty 180 usb 5 /dev/console 189 usb_device 5 /dev/ptmx 202 cpu/msr 6 lp 203 cpu/cpuid 7 vcs 216 rfcomm 10 misc 226 drm 13 input 253 usb_endpoint 14 sound 254 rtc 29 fb If you don't have that showing, you likely don't have all the kernel support needed. The module is called cdc_acm. Make sure the actual device files exist: lrwxrwxrwx 1 root root 12 2008-01-05 23:05 /dev/ttyACM -> /dev/ttyACM0 crw-rw-r-- 1 root root 166, 0 2008-01-18 23:19 /dev/ttyACM0 crw-rw-r-- 1 root root 166, 1 2008-01-05 16:21 /dev/ttyACM1 Note that I symlinked ttyACM to point to the actual first ACM device, ttyACM0. If you're using udev, you're on your own here. I deny its existance :) Else pull out mknode if you need to and create those two character device files (see 'mknode --help' if you need to or try the man page. ) Note that mine are character major number 166 and then the first ACM is 0, then 1 and so on. On your system that might be, but make sure it's actually what is listed in 'procinfo -m' (or look in /proc/devices) that you use instead of 166. Set up pppd and friends: ------------------------------ To call Verizon, we will dial #777 on the phone. It looks like they wanted chap or a version of, but we want to do PAP authentication. The user is just your areacode + phone number, then "@vzw3g.com". Example: 8888675309@xxxxxxxxx The password will be 'vzw'. Their server doesn't seem to like compression, so we'll kill it. 'chat' will do the dialing bit, as usual. We'll turn on debugging and leave a log to aid in getting this set up correctly. Let's not add a default route, because you probably already have one now. We can quickly replace the default one to test. Scripts: ---------- There are three. These I worked out from ones found on the web. One to connect, one to disconnect, and one that holds all the Verizon options. We're not using an 'options' file. It should be blank or else contain stuff that won't interfere with what we're doing. Connect script, "verizon-connect": # Chat script to talk to the ACM modem # and have it call Verizon. TIMEOUT 10 ABORT 'BUSY' ABORT 'NO ANSWER' ABORT 'NO CARRIER' SAY 'Initializing ACM modem ... \n' '' 'ATZ' # E0=No echo, V1=English result codes OK 'ATE1V1' # Dial the special Verizon service number, #777 SAY 'Calling #777 and waiting on CONNECT ...\n' OK 'ATD#777' CONNECT '' Disconnect script, "verizon-disconnect": # "" "\K" "" "+++ATH0" SAY "CDMA disconnected." Place those in /etc/ppp as-named. If you change the names, you must also change the names in the other file below. Verizon options for pppd, file "verizon". Place this one in /etc/ppp/peers. Create the 'peers' directory if it's not there yet. Obviously replace the 'xxxxxxxxxx' with your 10-digit areacode+phone number, both here and in the PAP file. ## Verizon ACM USB Modem ## (via LGVX8300) ## ktune /dev/ttyACM0 115200 crtscts modem user xxxxxxxxxx@xxxxxxxxx remotename verizon updetach lock passive noauth refuse-chap refuse-mschap refuse-mschap-v2 deflate 0 bsdcomp 0 debug # For debugging only, so I can see if it's being sent or not show-password logfile /var/log/pppd.log record /var/log/pppd.dump connect "/usr/sbin/chat -v -f /etc/ppp/verizon-connect" disconnect "/usr/sbin/chat -v -f /etc/ppp/verizon-disconnect" Look in pppd's man page if you want to see what the options are. I'm not have pppd request DNS nameservers, because I'm assuming you have some (or use opendns/free public dns servers). You could add the option for requesting nameservers. "ktune" lets pppd tweak the kernel (so says the manpage); /dev/ttyACM0 is the device we got from plugging in the phone; user xxxxxxxxxx@xxxxxxxxx tells what user in the PAP file to pick; deflate 0, etc. turns off compression; speed I tried at 115200. /var/log/pppd.dump will be a dump of the traffic (requires 'pppdump' to read); Here's Google trying to cookie me: rcvd "HTTP/1.1 200 OK\0d\0a" rcvd "Cache-Co" rcvd "ntrol: private\0d\0aC" rcvd "ontent-Type: text" rcvd "/html; c" time 0.1s rcvd "harset=UTF-8\0d\0aSet" rcvd "-Cookie: PREF=ID=" time 0.1s rcvd "771e4259" rcvd "31954957:TM=12007" rcvd "16334:LM=12007163" rcvd "34:S=oxK" rcvd "FHypbPagQbap5; expires=Mon, 18-Jan-2010 04:18:54 GMT; path=/; domain=.g oogle.com\0d\0aContent-Encoding: gzip\0d\0aServer: gws\0d\0aContent-Len gth: 2545\0d\0aDate: Sat, 19 Jan 2008 04:18:54 GMT\0d\0a\0d\0a\1f\8b\08 \00\00\00\00\00" Last you need a PAP file, /etc/ppp/pap-secrets. Set the right mode on this file if it contains secret passwords, so other users don't spy them. If there's more than one entry, pppd gets which one to use from its 'user' and 'remotename' options we gave it earlier. ## PAP authentication file ## ## /etc/ppp/pap-secrets ## ## Username Server Password IP addresses xxxxxxxxxx@xxxxxxxxx verizon vzw * Connecting: --------------- With everything set up, and the kernel and hotplug to load the modules see we don't have to modprobe stuff, you can now do: pppd call verizon It should call and connect, then detach from the terminal. Check out syslog again to see what happend. You can look on the phone's screen too. Jan 18 23:16:45 vdrl pppd[5293]: pppd 2.4.4 started by root, uid 0 Jan 18 23:16:45 vdrl kernel: PPP generic driver version 2.4.2 Jan 18 23:16:46 vdrl chat[5301]: timeout set to 10 seconds Jan 18 23:16:46 vdrl chat[5301]: abort on (BUSY) Jan 18 23:16:46 vdrl chat[5301]: abort on (NO ANSWER) Jan 18 23:16:46 vdrl chat[5301]: abort on (NO CARRIER) Jan 18 23:16:46 vdrl chat[5301]: send (ATZ^M) Jan 18 23:16:46 vdrl chat[5301]: expect (OK) Jan 18 23:16:47 vdrl chat[5301]: ATZ^M^M Jan 18 23:16:47 vdrl chat[5301]: OK Jan 18 23:16:47 vdrl chat[5301]: -- got it Jan 18 23:16:47 vdrl chat[5301]: send (ATE1V1^M) Jan 18 23:16:47 vdrl chat[5301]: expect (OK) Jan 18 23:16:47 vdrl chat[5301]: ^M Jan 18 23:16:47 vdrl chat[5301]: ATE1V1^M^M Jan 18 23:16:47 vdrl chat[5301]: OK Jan 18 23:16:47 vdrl chat[5301]: -- got it Jan 18 23:16:47 vdrl chat[5301]: send (ATD#777^M) Jan 18 23:16:47 vdrl chat[5301]: expect (CONNECT) Jan 18 23:16:47 vdrl chat[5301]: ^M Jan 18 23:16:55 vdrl chat[5301]: ATD#777^M^M Jan 18 23:16:55 vdrl chat[5301]: CONNECT Jan 18 23:16:55 vdrl chat[5301]: -- got it Jan 18 23:16:55 vdrl chat[5301]: send (^M) Jan 18 23:16:55 vdrl pppd[5293]: Serial connection established. Jan 18 23:16:55 vdrl pppd[5293]: Using interface ppp0 Jan 18 23:16:55 vdrl pppd[5293]: Connect: ppp0 <--> /dev/pts/0 Jan 18 23:16:57 vdrl pppd[5293]: PAP authentication succeeded Jan 18 23:16:57 vdrl pppd[5293]: local IP address 70.200.28.247 Jan 18 23:16:57 vdrl pppd[5293]: remote IP address 66.174.10.4 Or, check out our pppd.log to see some more detail: Initializing ACM modem ... Calling #777 and waiting on CONNECT ... Serial connection established. using channel 1 Using interface ppp0 Connect: ppp0 <--> /dev/pts/0 rcvd [LCP ConfReq id=0x1 <mru 1500> <asyncmap 0x0> <auth chap MD5> <magic 0xfd8f7b89> <pcomp> <accomp>] sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x1fad6109> <pcomp> <accomp>] sent [LCP ConfNak id=0x1 <auth eap>] rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x1fad6109> <pcomp> <accomp>] rcvd [LCP ConfReq id=0x2 <mru 1500> <asyncmap 0x0> <auth pap> <magic 0xfd8f7b89> <pcomp> <accomp>] sent [LCP ConfAck id=0x2 <mru 1500> <asyncmap 0x0> <auth pap> <magic 0xfd8f7b89> <pcomp> <accomp>] sent [PAP AuthReq id=0x1 user="xxxxxxxxxx@xxxxxxxxx" password="vzw"] rcvd [PAP AuthAck id=0x1 ""] PAP authentication succeeded sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 192.168.10.76>] rcvd [IPCP ConfReq id=0x1 <addr 66.174.10.4>] sent [IPCP ConfAck id=0x1 <addr 66.174.10.4>] rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>] sent [IPCP ConfReq id=0x2 <addr 192.168.10.76>] rcvd [IPCP ConfNak id=0x2 <addr 70.200.28.247>] sent [IPCP ConfReq id=0x3 <addr 70.200.28.247>] rcvd [IPCP ConfAck id=0x3 <addr 70.200.28.247>] local IP address 70.200.28.247 remote IP address 66.174.10.4 Script /etc/ppp/ip-up started (pid 5309) Script /etc/ppp/ip-up finished (pid 5309), status = 0x0 You'll notice it DID try a compression format, I forgot to list in the 'verizon' file 'novj' but it doesn't matter as they refuse it anyway. The hostname I ended up with would be 247.sub-70-200-28.myvzw.com. There's nothing special in my ip-up/ip-down scripts. You could use those if you see the need to. You check the link and address with 'ip link show ppp0' and 'ip addr show ppp0'. If you had already a ppp0, then you know it would be ppp1, and so on. Let's replace our default route to use the ppp0 link. I'm using Ethernet at the moment, so eth0 should be replaced by ppp0: ip route replace default via 66.174.10.4 dev ppp0 The format is 'ip route replace default via' (how to get to the world, through which IP) 'dev' (the device that will get us there, here its ppp0). Try some network command: 'links http://www.google.com' When you're done you need to shutdown pppd: 'pkill -SIGTERM pppd' or whatever your fav way to send a SIGTERM to pppd is. It runs the disconnect script, and closes: Modem hangup Connect time 2.4 minutes. Sent 1233 bytes, received 3389 bytes. Script /etc/ppp/ip-down started (pid 5329) Connection terminated. Script /etc/ppp/ip-down finished (pid 5329), status = 0x0 Waiting for 1 child processes... script pppd (charshunt), pid 5300 Terminating on signal 15 sending SIGTERM to process 5300 Put the route back now that ppp0 is gone. Example for my setup, replace with your address or whatever your default route was: 'ip route replace default via 192.168.10.75 dev eth0' Don't forget to reset your phone's network pref. I didn't use the link much, as I'm still not sure about usage costs. As you can't believe all you hear, I"m waiting on a bill to see what it looks like before I use it with any frequency. If it does in fact only use your minutes on the 1X network, that would seem to me that you could get free 'Net when you have free time, since some plans have free nights and weekends. Still, that seems TOO good to be true. Watching the phone's screen out of the corner of my eye while watching the PC, it looks like the phone tries/did disconnect after it's been dormat for awhile. I'm not sure, as this wasn't reported by pppd in the log files. However, pppd doesn't always seem to announce when the peer drops its end. ============ Disclaimer: The usual stuff; you're on your own here, don't come after me if you blow up your phone/computer/sister, etc. If Verizon gets pissed about this info or because you accessed their super-secret agent zero-menu and turns the last 5 years of your phone conversations over to the NSA -I know nothing-. Document Copyright, WTFPL Version 2.