Friday, October 31, 2008

Configuring LAN DCHP and Dynamic DNS under Ubuntu Linux

(This post is the 6th part of my Ubuntu Linux Router Upgrade Project.)

After configuring routing and NAT in my last post, while the Internet access may be shared, other clients won't know about it unless manually configured, requiring at least an IP address and subnet, local gateway, and one or more DNS servers for proper access.

DHCP

As DHCP is used to retrieve IP configuration information for the router from the Internet, it can also be served from the router to the LAN, and is probably the easiest way to configure networking within a LAN.

In OpenWrt, Dnsmasq was used for this purpose. However, it is relatively simple, and part of this project was to learn other Linux standards. For this project, I chose ISC's DHCP Distribution (a.k.a. "dhcpd", "dhcp3-server"), which seems to be the most popular and full-featured choice for a DHCP server under Linux. (See also dhcp3-server on help.ubuntu.com.)

ISC's DHCP Distribution is available as an Ubuntu-maintained package, "dhcp3-server". See "InstallingSoftware" on help.ubuntu.com for notes on installing software. A good write-up on installing and configuring dhcp3-server in particular is available at http://www.howtoforge.com/dhcp_server_linux_debian_sarge.

One of the main prerequisites is to have a static IP address on the interface that dhcp3-server will be bound to and serving IP addresses on. For this project, this was already done as part disabling NetworkManager in Configuring Persistent PPP.

The server then needs to be configured, using "/etc/dhcp3/dhcpd.conf". Shown below is mine:

# option definitions common to all supported networks...
option domain-name "lan.ziesemer.com";

default-lease-time 691200; #600;
max-lease-time 691200; #7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

subnet 192.168.###.0 netmask 255.255.255.0 {
 range 192.168.###.### 192.168.###.###;
 option routers 192.168.###.1;
 option domain-name-servers 192.168.###.1; 
 ddns-domainname "lan.ziesemer.com.";
}

host static-host-name {
 hardware ethernet xx:xx:xx:xx:xx:xx;
 fixed-address 192.168.###.###;
}

DNS

In order for clients to resolve domain names to IP addresses, DNS Servers need to be defined. For many ISP consumers, DNS servers provided by the ISP are used. Unfortunately, more and more ISPs, including Charter Communications, feel obliged to break standard Internet protocol (RFC 2308) and hijack these requests, posing security and other implications. (See also "DNS hijacking" on Wikipedia.) As such, running a local resolver becomes rather desirable, which can also offer performance advantages, and the ability to offer DNS services for the local domain.

As with DHCP, in OpenWrt, Dnsmasq was also used for this purpose. Again, I chose something a bit more "heavy-weight" and popular, BIND (a.k.a. "named"). (See also: http://en.wikipedia.org./wiki/BIND and https://help.ubuntu.com/community/BIND9ServerHowto.) Again, "bind9" will have to be installed.

There are 3 main files for configuring BIND: "/etc/bind/named.conf", "/etc/bind/named.conf.options", and "/etc/bind/named.conf.local", the later two of which are both included by the first.

There is really nothing needed for a basic configuration. However, adding the RFC 1918 zones into named.conf.local as commented in the file is recommended. However, as I'm using 192.168.###.###, I didn't want to uncomment the line to include the entire file. Instead, I did a "literal" include by copying in the contents of the "/etc/bind/zones.rfc1918" file, except for the last line that contained zone "168.192.in-addr.arpa".

Making this DNS server known to the LAN was already accomplished in the dhcpd configuration above by "option domain-name-servers".

Local DNS and Dynamic Updates

Now for the advanced part - configuring a local domain with dynamic updates. Two other posts I reviewed were http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/ and http://www.debian-administration.org/articles/343, neither of which seemed completely correct, comprehensive, or up-to-date - though this post isn't exactly meant to be completely comprehensive, either.

The first thing is to generate a secure key used to allow dhcpd to send updates to named. "/usr/sbin/rndc-confgen" can be used to generate this key context. Running it without any arguments will output 2 sections that are meant to be copied and pasted into the named files, "rndc.conf" and "named.conf". Alternatively, running it with the "-a" argument will generate just the "key" clause, and write it to the default key file ("(/etc/bind/rndc.key", run with sudo). It seems that I needed all 3 parts, but running both versions would result in separate keys. I used the "-a" argument, then copied out the key for manually updating the other 2 files. This assumes that both dhcpd and named are running on the same server, which isn't necessary.

Assume the following was output to "/etc/bind/rndc.key" using "sudo /usr/sbin/rndc-confgen -a":

key "rndc-key" {
 algorithm hmac-md5;
 secret "hp83n+fUOC2LdoDF9S12wg==";
};

The following should then be added to "/etc/bind/named.conf" (at no particular location):

include "/etc/bind/rndc.key";
controls {
 inet 127.0.0.1 allow {
  localhost;
 }
 keys {
  rndc-key;
 };
};

Next, the following should then be added to "/etc/dhcp3/dhcpd.conf" (at no particular location):

ddns-update-style interim;

key "rndc-key" {
 algorithm hmac-md5;
 secret hp83n+fUOC2LdoDF9S12wg==;
};

Note that quotes around the secret are not allowed here. Including quotes will produce errors.

At this point, both dhcpd and named now share a "secret" key used to authenticate dhcpd to named for updating DNS entries.

Now, we need to define a DNS zone in "/etc/bind/named.conf.local" for the LAN:

zone "lan.ziesemer.com" {
 type master;
 file "/var/lib/bind/lan.ziesemer.com.zone";
 allow-update {
  key "rndc-key";
 };
 notify yes;
};

zone "##.168.192.in-addr.arpa" {
 type master;
 file "/var/lib/bind/##.168.192.in-addr.arpa.zone";
 allow-update {
  key "rndc-key";
 };
 notify yes;
};

The "allow-update" sections with the "key" are references to the key defined in "/etc/bind/rndc.key" (and included from "/etc/bind/named.conf") that is allowed to make updates for the zones.

Note the location of the zone files. Originally, I had these in "/etc/bind" as well, but ran into "permission denied" errors whenever updates were attempted, even after editing permissions on the files. It seems that even with opened permissions, the files are protected by AppArmor. This is further described in the "bind / dhcp jnl failure - permission denied" thread on ubuntuforums.org.

The referenced zone files then need to be created, the process of which is outside the scope of this post. Refer to the above linked articles for further reference. For the purpose of dynamically updated zones, these files should be chmod'd to 755, with both the user and group set to "bind". (I don't recall doing this, so they may be automatically set at some point?)

Finally, the following should be included in the subnet block declared in "/etc/dhcp3/dhcpd.conf" (above):

subnet 192.168.###.0 netmask 255.255.255.0 {
 zone lan.ziesemer.com. {
  primary 127.0.0.1;
  key "rndc-key";
 }

 zone ##.168.192.in-addr.arpa. {
  primary 127.0.0.1;
  key "rndc-key";
 }
}

Restart the services for a fully functional LAN:

sudo /etc/init.d/dhcp3-server restart
sudo /etc/init.d/bind9 restart

Enabling routing and NAT with iptables

(This post is the 5th part of my Ubuntu Linux Router Upgrade Project.)

After my last post, I now have a persistent Internet connection configured through PPP. Now it's time to make the connection available to the rest of my Local Area Network.

Enabling Routing

IPv4 (and also IPv6) routing is already built-in to the Linux kernel (at least under Ubuntu Hardy Heron), and simply needs to be enabled. The easiest way to do this is to edit "/etc/sysctl.conf", which like many of the other configuration changes made in this project, needs to be edited as root. (Use sudo.)

At least under Ubuntu Hardy Heron, a sysctl.conf file already exists with a few default options, and many other commented and documented options. The option that needs to be enabled is "net.ipv4.ip_forward=1", either by removing the prefixed "#" comment character, or by adding the line somewhere in the file.

This setting can then be immediately placed into effect without rebooting, etc., by executing "/sbin/sysctl -p".

Note that there are many related pages on the web that refer to echoing a "1" into "/proc/sys/net/ipv4/ip_forward". While this may work temporarily, it will most likely be set during reboot, so the above method should almost always be used instead.

The case for NAT

At this point, assuming there is both a public / WAN (Internet) interface and a private / LAN interface, Linux will route between them. However, assuming the LAN is configured with RFC1918 non-routable addresses e.g. 192.168.*.* (see also Private network on Wikipedia), these addresses aren't recognized on the Internet, and Linux shouldn't (and probably doesn't) even try to forward traffic from them. Even if this wasn't the case and traffic from the LAN destined for the Internet was forwarded, no other router on the Internet would know where to send the responses back to, without having configured routing rules back to the local router.

Most ISP consumers only receive one public IP address, which is typically dynamic and changes regularly. NAT, or Network Address Translation is the most commonly used method to allow multiple computers / devices on a LAN to share this one address. (This is the same method that is used by almost all SOHO routers, e.g. Linksys, Netgear, and D-Link.)

Configuring iptables and NAT

NAT is commonly implemented in Linux within iptables. At least under Ubuntu Hardy Heron, iptables is already installed and running, just using a default set of rules that effectively allows everything. (This is not necessarily an issue for a new installation as there are no services installed and running to connect to that can be compromised.)

iptables is typically configured using the "iptables" command (which is actually located at "/sbin/iptables"). Usually several steps are needed for a desired configuration, and are typically entered as separate calls to iptables. These are typically consolidated into a shell script.

Here is the simplest configuration using iptables necessary to enable sharing from a WAN to a LAN:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Again, since this alters the configuration of the system, the commands or script containing the commands need to be run with sudo. If forgotten, an error containing "Permission denied (you must be root)" should be displayed.

At least under the default iptables configuration in Ubuntu Hardy Heron, this is all that is needed as the default policy for everything is ACCEPT. This command basically changes the source address of any outgoing packets (in this case, on ppp0) to the outgoing interface's address, so return packets are sent to the router's public / WAN address. This is really the only valid option, as the original private / LAN addresses are invalid, as described above. These masqueraded connections are then tracked, such that when a response is received, the process can be reversed, and the response is sent to the original requesting device.

Here is a more comprehensive example, one that I saved as "/etc/iptables.conf":

#!/bin/sh

logger -i $0 Starting...
iptables -F
iptables -F -t nat

#LAN_IF=eth0
WAN_IF=ppp0

if [ -d "/proc/sys/net/ipv4/conf/$WAN_IF" ]; then

 #WAN_IP=$(ifconfig $WAN_IF | sed -n 's/ *inet addr:\([0-9.]*\).*/\1/p')

 iptables -t nat -A POSTROUTING -o $WAN_IF -j MASQUERADE

fi

logger -i $0 Complete.
  • This version first flushes all existing rules ("iptables -F"), ensuring a consistent configuration.
  • The WAN-dependent portions run only if the WAN interface exists.
  • It also logs to the system logger using logger, for future diagnosis.
  • Variables e.g. "WAN_IF" are used for maintainability, making it easier to update when the configuration changes. "WAN_IP" and "LAN_IF" are currently not used, but shown for example.

This is not the most secure configuration by any means, but it's a simple solution for solving the immediate need that can be extended upon. Some additional details are available in the "Masquerading Made Simple HOWTO".

Making it Automatic

So far, everything configured with iptables will be lost on reboot. The best way I found to handle this is by placing a link to the above "/etc/iptables.conf" in "/etc/network/if-up.d". Use "ln -s" to do this, or write a new script that calls the above. The same may be desirable for capturing when the interface goes down, using "/etc/network/if-down.d". As documented in run-parts, ensure that any desired files are marked executable, and follow the proper naming (consist entirely of upper and lower case letters, digits, underscores, and hyphens - no periods!).

For connections that utilize IP leases using DHCP, and if utilizing a DHCP IP address within iptables, it is probably also necessary to make sure that the rules are updated by re-running iptables when a lease is renewed. Similar to the above, scripts can be put in or linked to from the "dhclient-enter-hooks.d" and/or "dhclient-exit-hooks.d" directories, which executed by the default "/sbin/dhclient-script" script when using dhclient.

As I'm currently using a PPP connection which doesn't utilize DHCP, this wasn't necessary for me. Instead, I tied into the PPP connection process by linking to "/etc/iptables.conf" in "/etc/ppp/ip-up.d", same as described above.

To be continued...

Next up: Configuring LAN DHCP and Dynamic DNS.

Sunday, October 19, 2008

Configuring Persistent PPP under Ubuntu

(This post is the 4th part of my Ubuntu Linux Router Upgrade Project.)

After my last post, Alltel UM175AL USB EVDO under Ubuntu Hardy Heron, I now have a usable serial device to connect to with PPP.

Initial Trials

At this point, Jason Costomiris's instructions at HOWTO: Verizon UM175 USB EVDO Card under Ubuntu Hardy work perfectly. The only difference is that being on Alltel instead of Verizon, the username is "<Modem'sPhoneNumber>@alltel.net", and the password is "alltel".

Disabling NetworkManager

The next improvement is to upgrade the NetworkManager utility that is part of the ubuntu-desktop package, in order for it to recognize and work with the CDMA connection. This is detailed in Jason's next post, Using NetworkManager with Pantech UM175 under Ubuntu Hardy, and allows NetworkManager to respond with the proper connection status when queried by other applications. This also makes it easier to establish the connection automatically.

Unfortunately, NetworkManager does not play well with the goals of a server or router configuration. As listed on its package page at http://packages.ubuntu.com/hardy/base/network-manager:

NetworkManager attempts to keep an active network connection available at all times. It is intended only for the desktop use-case, and is not intended for usage on servers. The point of NetworkManager is to make networking configuration and setup as painless and automatic as possible. If using DHCP, NetworkManager is _intended_ to replace default routes, obtain IP addresses from a DHCP server, and change nameservers whenever it sees fit.

As suggested, I disabled NetworkManager. There are instructions at https://help.ubuntu.com/community/NetworkManager#Disabling%20NetworkManager. However, at least under 8.10 (Intrepid Ibex), placing the "exit" scripts in "/etc/default" didn't have any effect. Instead, I just disabled the startup scripts, by calling "update-rc.d -f NetworkManager remove" (again, using sudo).

The next step is to manually configure the network settings in "/etc/network/interfaces". (See "man interfaces" for details.) Primarily, ensure that the desired interfaces are brought up automatically on startup (using the "auto" stanza), and for the purposes of a router, assigning the internal interface a static IP address:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.###.1
netmask 255.255.255.0

pppd Configuration

This is fully documented in the pppd man page. You could even use pppconfig to help with the initial setup, but I opted to work with the actual configuration files directly.

Here is what I saved as "/etc/ppp/peers/Alltel":

/dev/ttyACM0
lock

persist
#debug
hide-password

noauth
user ##########@alltel.net

defaultroute
#usepeerdns #Using bind9 instead.

init "/usr/bin/logger -i /etc/ppp/peers/Alltel Calling..."
connect "/usr/sbin/chat -Vf /etc/chatscripts/Alltel 2>/var/log/Alltel.log"

Here is what I saved as "/etc/chatscripts/Alltel":

ABORT 'BUSY'
ABORT 'NO CARRIER'
ABORT 'ERROR'
'' 'AT'
'OK' 'ATQ0V1E0'
'OK' 'ATZ'
'OK' 'AT&F'
'OK' 'AT+CSQ'
'OK' 'ATDT#777'
CONNECT CLIENT

This and other chatscripts are used by and documented in chat.

Finally, the password for the user identified in the peers file needs to be added to "/etc/ppp/pap-secrets":

"##########@alltel.net" Alltel "alltel"

The connection can then manually be initiated using "pppd call <name>", where "<name>" is one of the scripts configured under "/etc/ppp/peers". Note that the "nodetach debug" options are only to diagnose the initial connection, and the "nodetach" option will prevent the call from returning. (Closing the terminal window will disconnect the connection.) Note also that this needs to be run with "sudo" otherwise pppd won't have access to the above configured scripts, which should also be saved with restricted permissions to "root" (or another restricted user account).

$ sudo pppd call Alltel nodetach debug
Serial port initialized.
Serial connection established.
using channel 34
Using interface ppp0
Connect: ppp0 <--> /dev/ttyACM0
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x63dc86e0> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x63dc86e0> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MD5> <magic 0xfd80aab9> <pcomp> <accomp>]
sent [LCP ConfNak id=0x1 <auth pap>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x63dc86e0> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x2 <asyncmap 0x0> <auth pap> <magic 0xfd80aab9> <pcomp> <accomp>]
sent [LCP ConfAck id=0x2 <asyncmap 0x0> <auth pap> <magic 0xfd80aab9> <pcomp> <accomp>]
sent [LCP EchoReq id=0x0 magic=0x63dc86e0]
sent [PAP AuthReq id=0x1 user="##########@alltel.net" password=<hidden>]
rcvd [LCP EchoRep id=0x0 magic=0xfd80aab9]
rcvd [PAP AuthAck id=0x1 ""]
PAP authentication succeeded
sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0>]
rcvd [IPCP ConfReq id=0x1 <addr ###.###.###.###>]
sent [IPCP ConfAck id=0x1 <addr ###.###.###.###>]
rcvd [LCP ProtRej id=0x4 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>]
sent [IPCP ConfReq id=0x2 <addr 0.0.0.0>]
rcvd [IPCP ConfNak id=0x2 <addr ###.###.###.###>]
sent [IPCP ConfReq id=0x3 <addr ###.###.###.###>]
rcvd [IPCP ConfAck id=0x3 <addr ###.###.###.###>]
Cannot determine ethernet address for proxy ARP
local  IP address ###.###.###.###
remote IP address ###.###.###.###
Script /etc/ppp/ip-up started (pid 12340)
Script /etc/ppp/ip-up finished (pid 12340), status = 0x0

Once the connection is successfully established without "nodetach", there doesn't appear to be a "hangup" option to pair with "call". It seems that using "kill" to kill the associated pppd process is the most common approach. The "pon" and "poff" scripts may also be used, but internally, "poff" just calls "kill" as well.

Integrating with /etc/network/interfaces

By adding a reference to the above pppd configuration in "/etc/network/interfaces", the connection can be easily managed like any of the other interfaces with commands like "ifup" and "ifdown" (both of which are actually the same program, but called with different names).

auto ppp0
iface ppp0 inet ppp
 provider Alltel

Bringing up the connection then yields an error:

$ sudo ifup ppp0
ppp0: ERROR while getting interface flags: No such device

While this doesn't look good, the connection is actually successfully established. This can be verified by seeing a connection for "ppp0" using "ifconfig". Calling ifup with the "-v" flag for verbose mode shows some detail as to where the error is occurring:

$ sudo ifup -v ppp0
Configuring interface ppp0=ppp0 (inet)
run-parts --verbose /etc/network/if-pre-up.d
run-parts: executing /etc/network/if-pre-up.d/vlan
run-parts: executing /etc/network/if-pre-up.d/wireless-tools
ppp0: ERROR while getting interface flags: No such device
run-parts: executing /etc/network/if-pre-up.d/wpasupplicant
pon Alltel
run-parts --verbose /etc/network/if-up.d
run-parts: executing /etc/network/if-up.d/avahi-autoipd
run-parts: executing /etc/network/if-up.d/avahi-daemon
run-parts: executing /etc/network/if-up.d/ip
run-parts: executing /etc/network/if-up.d/mountnfs
run-parts: executing /etc/network/if-up.d/wpasupplicant

It is actually due to the "wireless-tools" script, apparently on line #11 where it calls "$IFCONFIG "$IFACE"" up". It seems that "$IFACE" resolves to "" at this point, as the "/etc/network/if-*up.d/" scripts are called before pppd actually brings up the connection's interface. The entire script could probably be selectively disabled, but it isn't hurting anything for now.

At another point, I added a link to an iptables script in "/etc/network/if-up.d/". Similar to the above situation, "ppp0" isn't yet available at this point. The script called ifconfig to determine ppp0's IP address, which resulted in the following error:

ppp0: error fetching interface information: Device not found

That's it. At this point, I have a functional, persistent Internet connection over PPP for the local computer.

To be continued...

Next up: Enabling routing and NAT with iptables.

Saturday, October 4, 2008

Alltel UM175AL USB EVDO under Ubuntu Hardy Heron

(This post is the 3rd part of my Ubuntu Linux Router Upgrade Project.)

Note that all Linux commands here assume use of Ubuntu Linux 8.04 ("Hardy Heron"), with all updates installed as of 2008-09-30.

The device I purchased for Alltel's Wireless Internet service (3G 1xEV-DO) was a UTStarcom UM175, purchased for $100 before a $100 mail-in rebate on a 2-year contract.

Some specs as printed on the box and from Alltel's website:

  • USB modem with swivel connector
  • Compatible with Windows XP, Vista, Mac OS X
  • 1xRTT/EVDO Rev 0 and Rev A Ready
  • CDMA 800/1900MHz

Also Known As

The "Alltel Part#" listed on the box label is "UM175ALA". The P/N on the device label is "UM175AL". (I'm assuming the "AL"/"ALA" suffixes are specific to Alltel?) The FCC ID is PP4PX-700. Also listed on the device label: "Distributed by UTStarcom Personal Communications. Made in Korea by PANTECH. QUALCOMM 3G CDMA."

When connected to Windows before installing the drivers, the following "Hardware Ids" are listed in Device Manager where it is recognized as a "USB Mass Storage Device", with a vendor ID of 0x106c and a product ID of 0x3b03:

USB\Vid_106c&Pid_3b03&Rev_0100
USB\Vid_106c&Pid_3b03

And here is the output of "/usr/sbin/lsusb -l" under Linux:

Bus 001 Device 006: ID 106c:3b03 Curitel Communications, Inc.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x106c Curitel Communications, Inc.
  idProduct          0x3b03
  bcdDevice            1.00
  iManufacturer           1 PANTECH
  iProduct                2 USB MMC Storage
  iSerial                 3 000000000002
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk (Zip)
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x05  EP 5 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
Device Status:     0x0001
  Self Powered

Note that the above shows a vendor ID of 0x106c ("Curitel Communications, Inc.") and a product ID of 0x3b03.

Should be Easy (or not)

Even before I made the purchase, I ran across a blog post by Jason Costomiris, "HOWTO: Verizon UM175 USB EVDO Card under Ubuntu Hardy". Reading it gave me a good vote of confidence that my plan should work. He had success using the "same" device under the same distribution of Linux that I was planning on. Verizon and Alltel use the same CDMA technology (and Verizon is buying Alltel). The instructions made it almost appear as simple as "plug & play".

Unfortunately, this is where things got tricky. The device is not even shipped with drivers, at least not on a CD. Instead, the device doubles as a USB mass storage device (USB MCS / UMS), and is recognized as an Autorun-enabled CD-Rom with drivers for Windows and Mac OS. Under Windows, after the drivers are installed, the device is listed as a "PANTECH UM175AL Composite Device", a "UM175AL CD-ROM USB Device", a "PANTECH UM175AL Diagnostic Port", and a "PANTECH UM175AL" modem.

By default, Linux only sees this device as a USB CD-Rom. As such, no serial port (e.g. /dev/ttyACM0) is ever created, leaving PPP nothing to connect to.

I need to thank Jason for responding to the comment I left on his post asking for help. Unfortunately, it appears that my "UM175AL" is a slightly different revision than what Jason used with so few issues.

As a sidenote, be aware of this CD-Rom emulation functionality while trying to boot from a real CD/DVD. At least under my Shuttle K-4500-N2, while my UM175 was connected, an external USB DVD-RW that was also connected wasn't given the chance to be used as a boot device. Instead, a boot attempt was made only on the UM175, which of course failed as there is nothing to boot from.

lsusb Note

Many pages I found while researching this issue referenced the output of "/proc/bus/usb/devices". This does not exist under recent versions of Ubuntu Linux. lsusb appears to be one of the preferred replacements. Some details are available in Ubuntu bug #156085 on launchpad.

USB_ModeSwitch

The closest I found to anyone having a similar issue was a post by "theosib" on the Ubuntu Forums with a post less than a month old, "Total disaster trying to set up Verizon EVDO device". I replied with some details of my issue, after which "theosib" replied with what would turn out to be my solution - USB_ModeSwitch.

Be sure to read the main content on USB_ModeSwitch's main page at http://www.draisberghof.de/usb_modeswitch/, as it is a pretty good summary of the issue.

Note that in my response on the UbuntuForums, I stated that when the device is properly recognized by Windows, the Vendor ID was 0x3715, compared to the current 0x3b03. So the goal is getting this to "switch" to 0x3715, at which point it should be (and is) properly recognized as a USB modem by Linux.

The download of USB_ModeSwitch comes with a precompiled executable, but I'm guessing it was compiled for 32-bit, as it wasn't recognized on my system. I recompiled it from the included source without any issues. Just make sure the "build-essential" and "libusb-dev" packages are installed, as this isn't mentioned on the page. Following the notes on the USB_ModeSwitch page, I placed a copy of the output in "/sbin" as "/sbin/usb_modeswitch" using sudo.

Given the about output from "lsusb", I already had the "DefaultVendor" and "DefaultProduct" values needed to configure USB_ModeSwitch. Using these successfully detached the storage driver, but didn't have any effect on the Vendor ID or any apparent change on the output listed by lsusb. Following the documentation, this most likely meant that I still needed to send an additional special command to make the device "switch", using the "MessageEndpoint" and "MessageContent" parameters.

The preferred tool to use to find these parameters mentioned in the USB_ModeSwitch documentation is "SniffUSB". The link is for version 1.8. For me, it would constantly and uncontrollably refresh the screen, making it impossible to scroll the device list and pretty much making it unusable. Fortunately, I found an updated version 2.0, based on the same source, at http://www.pcausa.com/Utilities/UsbSnoop/default.htm. (Source code is readily available for both versions.)

To sniff the necessary commands from this device, I found the VID/PID with the "unswitched" ID's. Specifically, "USB\Vid_106c&Pid_3b03&Rev_0100" ("PANTECH UM175AL Composite Device"). I then installed the filter, then removed and reinserted the device. The following is my captured "UsbSnoop.log", with the necessary message portions highlighted:

[3 ms] UsbSnoop - FilterAddDevice(9a47f748) : DriverObject 89773a48, pdo 8992a9d8
[3 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
[3 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
[4 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
[4 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
[4 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
[4 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
[4 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_START_DEVICE)
[4 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_START_DEVICE)
[5 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_SYSTEM_CONTROL
[8 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[8 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[8 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[8 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=888c49d0, IRQL=0
[8 ms]  >>>  URB 1 going down  >>> 
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
  TransferBufferLength = 00000012
  TransferBuffer       = 89a098f8
  TransferBufferMDL    = 00000000
  Index                = 00000000
  DescriptorType       = 00000001 (USB_DEVICE_DESCRIPTOR_TYPE)
  LanguageId           = 00000000
[11 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=888c49d0, Context=89951008, IRQL=2
[11 ms]  <<<  URB 1 coming back  <<< 
-- URB_FUNCTION_CONTROL_TRANSFER:
  PipeHandle           = 89673020
  TransferFlags        = 0000000b (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 00000012
  TransferBuffer       = 89a098f8
  TransferBufferMDL    = 8979e558
    00000000: 12 01 10 01 00 00 00 40 6c 10 03 3b 00 01 01 02
    00000010: 03 01
  UrbLink              = 00000000
  SetupPacket          =
    00000000: 80 06 00 01 00 00 12 00
[11 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[11 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=888c49d0, IRQL=0
[11 ms]  >>>  URB 2 going down  >>> 
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
  TransferBufferLength = 00000009
  TransferBuffer       = 896cab78
  TransferBufferMDL    = 00000000
  Index                = 00000000
  DescriptorType       = 00000002 (USB_CONFIGURATION_DESCRIPTOR_TYPE)
  LanguageId           = 00000000
[15 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=888c49d0, Context=89951008, IRQL=2
[15 ms]  <<<  URB 2 coming back  <<< 
-- URB_FUNCTION_CONTROL_TRANSFER:
  PipeHandle           = 89673020
  TransferFlags        = 74f06e2f (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 00000009
  TransferBuffer       = 896cab78
  TransferBufferMDL    = 8898c160
    00000000: 09 02 20 00 01 01 00 c0 32
  UrbLink              = 00000000
  SetupPacket          =
    00000000: 80 06 00 02 00 00 09 00
[15 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[15 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=888c49d0, IRQL=0
[15 ms]  >>>  URB 3 going down  >>> 
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
  TransferBufferLength = 00000020
  TransferBuffer       = 89873cc8
  TransferBufferMDL    = 00000000
  Index                = 00000000
  DescriptorType       = 00000002 (USB_CONFIGURATION_DESCRIPTOR_TYPE)
  LanguageId           = 00000000
[19 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=888c49d0, Context=89951008, IRQL=2
[19 ms]  <<<  URB 3 coming back  <<< 
-- URB_FUNCTION_CONTROL_TRANSFER:
  PipeHandle           = 89673020
  TransferFlags        = 74f06e2f (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 00000020
  TransferBuffer       = 89873cc8
  TransferBufferMDL    = 8898c160
    00000000: 09 02 20 00 01 01 00 c0 32 09 04 00 00 02 08 06
    00000010: 50 00 07 05 83 02 40 00 00 07 05 05 02 40 00 00
  UrbLink              = 00000000
  SetupPacket          =
    00000000: 80 06 00 02 00 00 20 00
[19 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[19 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=888c49d0, IRQL=0
[19 ms]  >>>  URB 4 going down  >>> 
-- URB_FUNCTION_SELECT_CONFIGURATION:
  ConfigurationDescriptor = 0x89873cc8 (configure)
  ConfigurationDescriptor : bLength             = 9
  ConfigurationDescriptor : bDescriptorType     = 0x00000002
  ConfigurationDescriptor : wTotalLength        = 0x00000020
  ConfigurationDescriptor : bNumInterfaces      = 0x00000001
  ConfigurationDescriptor : bConfigurationValue = 0x00000001
  ConfigurationDescriptor : iConfiguration      = 0x00000000
  ConfigurationDescriptor : bmAttributes        = 0x000000c0
  ConfigurationDescriptor : MaxPower            = 0x00000032
  ConfigurationHandle     = 0x00000000
  Interface[0]: Length            = 56
  Interface[0]: InterfaceNumber   = 0
  Interface[0]: AlternateSetting  = 0
[57 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=888c49d0, Context=89951008, IRQL=0
[57 ms]  <<<  URB 4 coming back  <<< 
-- URB_FUNCTION_SELECT_CONFIGURATION:
  ConfigurationDescriptor = 0x89873cc8 (configure)
  ConfigurationDescriptor : bLength             = 9
  ConfigurationDescriptor : bDescriptorType     = 0x00000002
  ConfigurationDescriptor : wTotalLength        = 0x00000020
  ConfigurationDescriptor : bNumInterfaces      = 0x00000001
  ConfigurationDescriptor : bConfigurationValue = 0x00000001
  ConfigurationDescriptor : iConfiguration      = 0x00000000
  ConfigurationDescriptor : bmAttributes        = 0x000000c0
  ConfigurationDescriptor : MaxPower            = 0x00000032
  ConfigurationHandle     = 0x888d14d0
  Interface[0]: Length            = 56
  Interface[0]: InterfaceNumber   = 0
  Interface[0]: AlternateSetting  = 0
  Interface[0]: Class             = 0x00000008
  Interface[0]: SubClass          = 0x00000006
  Interface[0]: Protocol          = 0x00000050
  Interface[0]: InterfaceHandle   = 0x88bcece0
  Interface[0]: NumberOfPipes     = 2
  Interface[0]: Pipes[0] : MaximumPacketSize = 0x00000040
  Interface[0]: Pipes[0] : EndpointAddress   = 0x00000083
  Interface[0]: Pipes[0] : Interval          = 0x00000000
  Interface[0]: Pipes[0] : PipeType          = 0x00000002 (UsbdPipeTypeBulk)
  Interface[0]: Pipes[0] : PipeHandle        = 0x88bcecfc
  Interface[0]: Pipes[0] : MaxTransferSize   = 0x00001000
  Interface[0]: Pipes[0] : PipeFlags         = 0x00000000
  Interface[0]: Pipes[1] : MaximumPacketSize = 0x00000040
  Interface[0]: Pipes[1] : EndpointAddress   = 0x00000005
  Interface[0]: Pipes[1] : Interval          = 0x00000000
  Interface[0]: Pipes[1] : PipeType          = 0x00000002 (UsbdPipeTypeBulk)
  Interface[0]: Pipes[1] : PipeHandle        = 0x88bced1c
  Interface[0]: Pipes[1] : MaxTransferSize   = 0x00001000
  Interface[0]: Pipes[1] : PipeFlags         = 0x00000000
[57 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[57 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=88da7770, IRQL=0
[57 ms]  >>>  URB 5 going down  >>> 
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
  PipeHandle           = 88bced1c [endpoint 0x00000005]
  TransferFlags        = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 0000001f
  TransferBuffer       = 88c4b790
  TransferBufferMDL    = 00000000
    00000000: 55 53 42 43 90 4e d6 8a 24 00 00 00 80 00 08 ff
    00000010: 02 44 45 56 43 48 47 00 00 00 00 00 00 00 00
  UrbLink              = 00000000
[57 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[57 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[58 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE)
[58 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE)
[58 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[58 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[58 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=88da7770, Context=89951008, IRQL=2
[58 ms]  <<<  URB 5 coming back  <<< 
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
  PipeHandle           = 88bced1c [endpoint 0x00000005]
  TransferFlags        = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 0000001f
  TransferBuffer       = 88c4b790
  TransferBufferMDL    = 8979e558
  UrbLink              = 00000000
[165 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[165 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[165 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[165 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[166 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_SURPRISE_REMOVAL)
[166 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_SURPRISE_REMOVAL)
[240 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_REMOVE_DEVICE)

Given the above information, I then saved the following as "/etc/usb_modeswitch.conf":

DefaultVendor = 0x106c
DefaultProduct = 0x3b03

MessageEndpoint = 0x05
MessageContent = "55534243904ed68a24000000800008ff024445564348470000000000000000"

The following command can then be used to "switch" the mode of the device so that it is recognized as a USB modem. Note that as documented on the USB_ModeSwitch page, most programs using libusb need to be run as root:

sudo /sbin/usb_modeswitch -c /etc/usb_modeswitch.conf

Here is the updated output of "/usr/sbin/lsusb -l":

Bus 001 Device 006: ID 106c:3715 Curitel Communications, Inc.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            2 Communications
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x106c Curitel Communications, Inc.
  idProduct          0x3715
  bcdDevice            1.00
  iManufacturer           1 PANTECH
  iProduct                2 PANTECH USB MODEM
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          113
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              0
      CDC Header:
        bcdCDC               1.09
      CDC Call Management:
        bmCapabilities       0x03
          call management
          use DataInterface
        bDataInterface          1
      CDC ACM:
        bmCapabilities       0x0f
          connection notifications
          sends break
          line coding and serial state
          get/set/clear comm features
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0010  1x 16 bytes
        bInterval              32
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0
      iInterface              3 Data Interface
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk (Zip)
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x05  EP 5 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
Device Status:     0x0001
  Self Powered

At this point, I was finally able to establish a connection using PPP. This setting appears to even persist across reboots, as long as the USB device doesn't loose power. Following the examples on the USB_ModeSwitch page, I saved the following as "/etc/udev/rules.d/99-usb_modeswitch.rules" which will automatically run the above command whenever the device is detected:

SUBSYSTEM=="usb", ATTR{idProduct}=="3b03", ATTR{idVendor}=="106c", \
        RUN+="/sbin/usb_modeswitch -c /etc/usb_modeswitch.conf"

Note that there is a "README" file in the "/etc/udev/rules.d" directory. Additional information can be found in the man page for udev ("man udev").

Accessing the Modem

The "cdc_acm" kernel module should now detect a connected device, and connect it to "/dev/ttyACM0".

Before making the Internet connection with PPP, the modem can be communicated with as a serial device. I'm not sure what the preferred method is for doing this under Linux, but the "screen" command (located in "/usr/bin") worked for me:

/usr/bin/screen /dev/ttyACM0
AT
OK
AT+GMM
UM175AL

OK
ATI
Manufacturer: UTStarcom communication Inc.
Model: UM175AL
Revision: D0700ALM01_5.226  1  [Mar 21 2008 06:00:00] [Jul 29 2008 15:10:28]
ESN: 0x83AF77E
+GCAP: +CIS707-A, CIS-856, CIS-856-A

OK
AT+CSQ
31, 0

OK

(If you don't recognize the above, the Hayes command set on Wikipedia may be a good starting reference.)

Signal Strength

The "AT+CSQ" returns the current signal strength as a value between 0-31, with higher being better. According to Ken Kinder, this number indicates the signal strength above -109 dBm in 2 dBm increments.

I know the Windows client software displays a regularly updated signal strength indicator, even while the connection is active. It would be nice to have this functionality available under Linux, too, but it doesn't look easy, if even possible.

I found one forum thread with one response on the topic: http://fixunix.com/ppp/62263-commad-mode-gprs-same-time.html. Pretty much, it seems that the data stream would have to be paused, the modem dropped to command mode, the "AT+CSQ" command issued and the value retrieved, then sending "ATO" to go back online. The forum response suggested that a modified pppd would be needed. I'm wondering if a "wrapper" tty couldn't be written that would be passed to pppd, and query the signal strength whenever the connection is idle. Alternatively, I'd be curious if the "diagnostic port" as shown in Windows would provide similar functionality without having to interrupt the data line? Maybe this is available by one of the other interface descriptors shown in the lsusb output (above)? Maybe "bInterfaceClass 10 CDC Data"?

Update (2008-10-08): Sysinternal's Portmon shows that under Windows, the The Alltel "QuickLink Mobile" Wireless Connection Manager communicates with the "diagnostic port". Unfortunately, unlike the text-based "AT" commands used above, this communication looks completely binary. It also doesn't look to be easily decipherable, or to use any known standard. I've sent an email to UTStarcom, and can only hope for an unlikely helpful response.

Here's the output from about 5 seconds of communication with QuickLink Mobile and the "diagnostic port" using Portmon:

0  0.00000000  QuickLink Mobil  IRP_MJ_CREATE  PTDLserd0  Options: Open 
0  0.00584593  SUCCESS  
1  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_DTR  PTDLserd0  
1  0.00000206  SUCCESS  
2  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_PROPERTIES  PTDLserd0  
2  0.00000052  SUCCESS  
3  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
3  0.00000072  SUCCESS  
4  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
4  0.00000064  SUCCESS  
5  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
5  0.00000048  SUCCESS  
6  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
6  0.00000046  SUCCESS  
7  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_QUEUE_SIZE  PTDLserd0  InSize: 4096 OutSize: 4096
7  0.00000044  SUCCESS  
8  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_TIMEOUTS  PTDLserd0  RI:-1 RM:0 RC:0 WM:0 WC:0
8  0.00000109  SUCCESS  
9  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_MODEMSTATUS  PTDLserd0  
9  0.00000130  SUCCESS  
10  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_PROPERTIES  PTDLserd0  
10  0.00000053  SUCCESS  
11  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
11  0.00000093  SUCCESS  
12  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
12  0.00000112  SUCCESS  
13  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
13  0.00000051  SUCCESS  
14  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
14  0.00000045  SUCCESS  
15  0.00000000  QuickLink Mobil  IOCTL_SERIAL_PURGE  PTDLserd0  Purge: TXABORT TXCLEAR 
15  0.00000196  SUCCESS  
16  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_QUEUE_SIZE  PTDLserd0  InSize: 4096 OutSize: 4096
16  0.00000096  SUCCESS  
17  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_TIMEOUTS  PTDLserd0  RI:-1 RM:0 RC:0 WM:0 WC:0
17  0.00000124  SUCCESS  
18  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_MODEMSTATUS  PTDLserd0  
18  0.00000117  SUCCESS  
19  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_PROPERTIES  PTDLserd0  
19  0.00000065  SUCCESS  
20  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
20  0.00000109  SUCCESS  
21  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
21  0.00000061  SUCCESS  
22  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
22  0.00000050  SUCCESS  
23  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
23  0.00000045  SUCCESS  
24  0.00000000  QuickLink Mobil  IOCTL_SERIAL_PURGE  PTDLserd0  Purge: TXABORT TXCLEAR 
24  0.00000186  SUCCESS  
25  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_QUEUE_SIZE  PTDLserd0  InSize: 4096 OutSize: 4096
25  0.00000181  SUCCESS  
26  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
26  0.00000140  SUCCESS  
27  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
27  0.00000083  SUCCESS  
28  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
28  0.00000087  SUCCESS  
29  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
29  0.00000065  SUCCESS  
30  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_BAUD_RATE  PTDLserd0  Rate: 115200
30  0.00000137  SUCCESS  
31  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_DTR  PTDLserd0  
31  0.00000072  SUCCESS  
32  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_LINE_CONTROL  PTDLserd0  StopBits: 1 Parity: NONE WordLength: 8
32  0.00000115  SUCCESS  
33  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_CHAR  PTDLserd0  EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
33  0.00000053  SUCCESS  
34  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_HANDFLOW  PTDLserd0  Shake:9 Replace:80 XonLimit:8192 XoffLimit:51200
34  0.00000224  SUCCESS  
35  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_TIMEOUTS  PTDLserd0  RI:-1 RM:0 RC:0 WM:0 WC:0
35  0.00000049  SUCCESS  
36  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_MODEMSTATUS  PTDLserd0  
36  0.00000088  SUCCESS  
37  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_PROPERTIES  PTDLserd0  
37  0.00000040  SUCCESS  
38  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
38  0.00000070  SUCCESS  
39  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
39  0.00000048  SUCCESS  
40  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
40  0.00000045  SUCCESS  
41  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
41  0.00000044  SUCCESS  
42  0.00000000  QuickLink Mobil  IOCTL_SERIAL_PURGE  PTDLserd0  Purge: TXABORT TXCLEAR 
42  0.00000182  SUCCESS  
43  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_QUEUE_SIZE  PTDLserd0  InSize: 2048 OutSize: 2048
43  0.00000203  SUCCESS  
44  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
44  0.00000223  SUCCESS  
45  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
45  0.00000106  SUCCESS  
46  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
46  0.00000066  SUCCESS  
47  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
47  0.00000069  SUCCESS  
48  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_BAUD_RATE  PTDLserd0  Rate: 115200
48  0.00000098  SUCCESS  
49  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_DTR  PTDLserd0  
49  0.00000127  SUCCESS  
50  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_LINE_CONTROL  PTDLserd0  StopBits: 1 Parity: NONE WordLength: 8
50  0.00000107  SUCCESS  
51  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_CHAR  PTDLserd0  EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
51  0.00000052  SUCCESS  
52  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_HANDFLOW  PTDLserd0  Shake:9 Replace:80 XonLimit:8192 XoffLimit:51200
52  0.00000193  SUCCESS  
53  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_TIMEOUTS  PTDLserd0  RI:-1 RM:0 RC:0 WM:0 WC:0
53  0.00000049  SUCCESS  
54  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_MODEMSTATUS  PTDLserd0  
54  0.00000090  SUCCESS  
55  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0D C8 D0 7E 
56  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
56  0.00000087  SUCCESS  
55  0.00074312  SUCCESS  
57  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
57  0.00000118  SUCCESS  
58  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
58  0.00000049  SUCCESS  
59  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
59  0.00000169  SUCCESS  Length 9: C8 0D 00 00 00 00 D0 AD 7E 
60  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
60  0.00000082  SUCCESS  
61  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
61  0.00000311  SUCCESS  
62  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
63  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
63  0.00000173  SUCCESS  
62  0.00034797  SUCCESS  
64  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
64  0.00000113  SUCCESS  
65  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
65  0.00000077  SUCCESS  
66  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
66  0.00000048  SUCCESS  
67  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
67  0.00000255  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
68  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
69  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
69  0.00000084  SUCCESS  
68  0.00111850  SUCCESS  
70  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
70  0.00000095  SUCCESS  
71  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
71  0.00000076  SUCCESS  
72  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
72  0.00000048  SUCCESS  
73  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
73  0.00000207  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
74  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
75  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
75  0.00000127  SUCCESS  
74  0.00036960  SUCCESS  
76  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
76  0.00000076  SUCCESS  
77  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
77  0.00000085  SUCCESS  
78  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
78  0.00000047  SUCCESS  
79  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
79  0.00000188  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
80  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
81  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
81  0.00000095  SUCCESS  
80  0.00067287  SUCCESS  
82  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
82  0.00000109  SUCCESS  
83  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
83  0.00000071  SUCCESS  
84  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
84  0.00000212  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
85  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0A 77 A4 7E 
86  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
86  0.00000263  SUCCESS  
85  0.00083082  SUCCESS  
87  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
87  0.00000139  SUCCESS  
88  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
88  0.00000059  SUCCESS  
89  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 25
89  0.00000212  SUCCESS  Length 25: C8 0A 60 8B 00 00 F1 83 00 00 0F 21 00 00 76 0B 00 00 04 C0 0B 00 01 A0 7E 
90  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0B FE B5 7E 
91  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
91  0.00000176  SUCCESS  
90  0.00071377  SUCCESS  
92  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
92  0.00000117  SUCCESS  
93  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
93  0.00000082  SUCCESS  
94  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 75
94  0.00000291  SUCCESS  Length 75: C8 0B 07 00 00 00 09 01 D8 07 0A 00 13 00 0D 00 0A 00 37 00 41 03 D4 FE FF FF 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 00 00 00 02 00 00 00 E4 3C 7E 
95  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
96  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
96  0.00000122  SUCCESS  
95  0.00088541  SUCCESS  
97  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
97  0.00000116  SUCCESS  
98  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
98  0.00000075  SUCCESS  
99  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
99  0.00000256  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
100  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 01 00 00 00 00 0F 8D 7E 
101  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
101  0.00000119  SUCCESS  
100  0.00042567  SUCCESS  
102  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
102  0.00000094  SUCCESS  
103  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
103  0.00000047  SUCCESS  
104  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
104  0.00000161  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
105  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 02 00 00 00 00 C3 90 7E 
106  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
106  0.00000114  SUCCESS  
105  0.00036322  SUCCESS  
107  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
107  0.00000118  SUCCESS  
108  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
108  0.00000067  SUCCESS  
109  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
109  0.00000213  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
110  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 03 00 00 00 00 87 9B 7E 
111  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
111  0.00000094  SUCCESS  
110  0.00046675  SUCCESS  
112  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
112  0.00000155  SUCCESS  
113  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
113  0.00000062  SUCCESS  
114  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
114  0.00000206  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
115  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 04 00 00 00 00 5B AB 7E 
116  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
116  0.00000120  SUCCESS  
115  0.00061533  SUCCESS  
117  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
117  0.00000103  SUCCESS  
118  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
118  0.00000078  SUCCESS  
119  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
119  0.00000175  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
120  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 05 00 00 00 00 1F A0 7E 
121  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
121  0.00000125  SUCCESS  
120  0.00081854  SUCCESS  
122  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
122  0.00000147  SUCCESS  
123  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
123  0.00000050  SUCCESS  
124  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
124  0.00000193  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
125  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 09 00 00 00 00 2F D7 7E 
126  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
126  0.00000104  SUCCESS  
125  0.00089310  SUCCESS  
127  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
127  0.00000126  SUCCESS  
128  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
128  0.00000069  SUCCESS  
129  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
129  0.00000203  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
130  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0B 00 00 00 00 A7 C1 7E 
131  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
131  0.00000117  SUCCESS  
130  0.00108786  SUCCESS  
132  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
132  0.00000096  SUCCESS  
133  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
133  0.00000047  SUCCESS  
134  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
134  0.00000125  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
135  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0D 00 00 00 00 3F FA 7E 
136  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
136  0.00000093  SUCCESS  
135  0.00020632  SUCCESS  
137  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
137  0.00000208  SUCCESS  
138  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
138  0.00000050  SUCCESS  
139  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
139  0.00000217  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
140  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0E 00 00 00 00 F3 E7 7E 
141  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
141  0.00000094  SUCCESS  
140  0.00032217  SUCCESS  
142  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
142  0.00000114  SUCCESS  
143  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
143  0.00000047  SUCCESS  
144  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
144  0.00000144  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
145  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0F 00 00 00 00 B7 EC 7E 
146  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
146  0.00000116  SUCCESS  
145  0.00047807  SUCCESS  
147  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
147  0.00000118  SUCCESS  
148  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
148  0.00000047  SUCCESS  
149  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
149  0.00000209  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
150  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0C 41 C1 7E 
151  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
151  0.00000103  SUCCESS  
150  0.00036696  SUCCESS  
152  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
152  0.00000161  SUCCESS  
153  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
153  0.00000049  SUCCESS  
154  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 10
154  0.00000218  SUCCESS  Length 10: C8 0C 02 00 00 00 00 FB 34 7E 
155  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 9: C8 11 01 00 00 00 1B 72 7E 
156  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
156  0.00000077  SUCCESS  
155  0.00070517  SUCCESS  
157  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
157  0.00000151  SUCCESS  
158  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
158  0.00000047  SUCCESS  
159  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
159  0.00000209  SUCCESS  Length 9: C8 11 00 00 00 00 A0 6E 7E 
160  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
161  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
161  0.00000263  SUCCESS  
160  0.00093037  SUCCESS  
162  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
162  0.00000083  SUCCESS  
163  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
163  0.00000048  SUCCESS  
164  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
164  0.00000199  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
165  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
165  0.00000216  SUCCESS  
166  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
166  0.00000051  SUCCESS  
167  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 150
167  0.00000215  SUCCESS  Length 150: C8 0B 01 00 00 00 09 01 D8 07 0A 00 13 00 0D 00 0A 00 38 00 04 03 D4 FE FF FF 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 00 00 00 02 00 00 00 9C 7C 7E C8 0B 01 00 00 00 09 01 D8 07 
168  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
168  0.00000056  SUCCESS  
169  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
169  0.00000154  SUCCESS  
170  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0A 77 A4 7E 
171  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
171  0.00000186  SUCCESS  
170  0.00085352  SUCCESS  
172  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
172  0.00000127  SUCCESS  
173  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
173  0.00000048  SUCCESS  
174  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 25
174  0.00000177  SUCCESS  Length 25: C8 0A D1 92 00 00 62 8B 00 00 3E 22 00 00 76 0B 00 00 04 C0 0B 00 21 42 7E 
175  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
176  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
176  0.00000227  SUCCESS  
175  0.00058334  SUCCESS  
177  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
177  0.00000230  SUCCESS  
178  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
178  0.00000237  SUCCESS  
179  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
179  0.00000075  SUCCESS  
180  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
180  0.00000325  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
181  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
181  0.00000379  SUCCESS  
182  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
182  0.00000275  SUCCESS  
183  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0A 77 A4 7E 
184  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
184  0.00000208  SUCCESS  
185  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
185  0.00000094  SUCCESS  
186  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 101
186  0.00000292  SUCCESS  Length 101: C8 0B 07 00 00 00 09 01 D8 07 0A 00 13 00 0D 00 0A 00 39 00 7D 5E 01 D4 FE FF FF 5F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 66 00 00 00 02 00 00 00 A7 07 7E C8 0A 4D 9A 00 00 DE 92 00 
183  0.00095781  SUCCESS  
187  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
187  0.00000205  SUCCESS  
188  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
188  0.00000049  SUCCESS  
189  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 100
189  0.00000220  SUCCESS  Length 100: C8 0A 84 9A 00 00 15 93 00 00 AD 25 00 00 76 0B 00 00 04 C0 0B 00 35 18 7E C8 0B 07 00 00 00 09 01 D8 07 0A 00 13 00 0D 00 0A 00 3A 00 0C 00 D4 FE FF FF 5F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
190  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
190  0.00000074  SUCCESS  
191  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
191  0.00000094  SUCCESS  
192  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
192  0.00000077  SUCCESS  
193  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
193  0.00000217  SUCCESS  
194  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
194  0.00000090  SUCCESS  
195  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
195  0.00000060  SUCCESS  
196  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
196  0.00000264  SUCCESS  
197  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0A 77 A4 7E 
198  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
198  0.00000227  SUCCESS  
197  0.00051973  SUCCESS  
199  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
199  0.00000158  SUCCESS  
200  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
200  0.00000071  SUCCESS  
201  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 25
201  0.00000228  SUCCESS  Length 25: C8 0A 44 A6 00 00 D5 9E 00 00 AD 25 00 00 76 0B 00 00 04 C0 0B 00 A8 53 7E 
202  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
202  0.00000346  SUCCESS  
203  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
203  0.00000115  SUCCESS  
204  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
204  0.00000070  SUCCESS  
205  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
205  0.00000235  SUCCESS  
206  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 01 00 00 00 01 86 9C 7E 
207  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
207  0.00000220  SUCCESS  
206  0.00100681  SUCCESS  
208  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
208  0.00000202  SUCCESS  
209  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
209  0.00000049  SUCCESS  
210  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
210  0.00000179  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
211  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 02 00 00 00 01 4A 81 7E 
212  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
212  0.00000091  SUCCESS  
211  0.00057449  SUCCESS  
213  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
213  0.00000101  SUCCESS  
214  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
214  0.00000074  SUCCESS  
215  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
215  0.00000172  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
216  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
216  0.00000103  SUCCESS  
217  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 03 00 00 00 01 0E 8A 7E 
217  0.00063347  SUCCESS  
218  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
218  0.00000171  SUCCESS  
219  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
219  0.00000050  SUCCESS  
220  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
220  0.00000160  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
221  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 04 00 00 00 01 D2 BA 7E 
222  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
222  0.00000117  SUCCESS  
221  0.00093368  SUCCESS  
223  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
223  0.00000107  SUCCESS  
224  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
224  0.00000048  SUCCESS  
225  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
225  0.00000138  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
226  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 05 00 00 00 01 96 B1 7E 
227  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
227  0.00000096  SUCCESS  
226  0.00111167  SUCCESS  
228  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
228  0.00000141  SUCCESS  
229  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
229  0.00000048  SUCCESS  
230  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
230  0.00000194  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
231  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 09 00 00 00 01 A6 C6 7E 
232  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
232  0.00000139  SUCCESS  
231  0.00120009  SUCCESS  
233  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
233  0.00000169  SUCCESS  
234  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
234  0.00000048  SUCCESS  
235  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
235  0.00000194  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
236  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0B 00 00 00 01 2E D0 7E 
237  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
237  0.00000143  SUCCESS  
236  0.00095763  SUCCESS  
238  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
238  0.00000110  SUCCESS  
239  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
239  0.00000076  SUCCESS  
240  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
240  0.00000349  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
241  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0D 00 00 00 01 B6 EB 7E 
242  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
242  0.00000091  SUCCESS  
241  0.00039045  SUCCESS  
243  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
243  0.00000138  SUCCESS  
244  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
244  0.00000047  SUCCESS  
245  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
245  0.00000172  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
246  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0E 00 00 00 01 7A F6 7E 
247  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
247  0.00000095  SUCCESS  
246  0.00057285  SUCCESS  
248  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
248  0.00000123  SUCCESS  
249  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
249  0.00000048  SUCCESS  
250  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
250  0.00000158  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
251  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0F 00 00 00 01 3E FD 7E 
252  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
252  0.00000136  SUCCESS  
251  0.00070754  SUCCESS  
253  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
253  0.00000132  SUCCESS  
254  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
254  0.00000046  SUCCESS  
255  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
255  0.00000192  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
256  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0E 53 E2 7E 
257  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
257  0.00000095  SUCCESS  
256  0.00084635  SUCCESS  
258  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
258  0.00000123  SUCCESS  
259  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
259  0.00000072  SUCCESS  
260  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
260  0.00000206  SUCCESS  Length 9: C8 0E 66 00 00 00 62 62 7E 
261  0.00000000  QuickLink Mobil  IOCTL_SERIAL_PURGE  PTDLserd0  Purge: TXABORT TXCLEAR 
261  0.00000271  SUCCESS  
262  0.00000000  QuickLink Mobil  IOCTL_SERIAL_CLR_DTR  PTDLserd0  
262  0.00000225  SUCCESS  
263  0.00000000  QuickLink Mobil  IRP_MJ_CLEANUP  PTDLserd0  
263  0.00265768  SUCCESS  
264  0.00000000  QuickLink Mobil  IRP_MJ_CLOSE  PTDLserd0  
264  0.00000111  SUCCESS  

To be continued...

Next up: Configuring Persistent PPP under Ubuntu.

Shuttle K-4500-N2

(This post is the 2nd part of my Ubuntu Linux Router Upgrade Project.)

I chose Shuttle's KPC4500 model, purchased from Newegg as the K-4500-N2 (#N82E16883104036) for about $210.

Surprisingly, I currently have the only posted customer review for this product on Newegg.

Caution / Update (2009-12-02): I am quickly loosing my confidence in Shuttle, Inc.'s computers. View my post on Shuttle's hardware forum for the details. Power supply failed and was exchanged under RMA in July 2009. Not even 5 months later, and not much more than a year since I purchased the system, it is now unusable.

Specs

While the K4500 certainly isn't a top-of-the-line system, it's definitely suitable for this task. Included is a 2.0 GHz 64-bit processor, 160 GB SATA hard drive, 10/100/1000 Mbps Ethernet, and integrated video & audio. It has 4 USB ports, as well as COM/serial, LPT/parallel and PS/2. Internally, there is room for a 2nd HD, with an 1 additional SATA and 1 IDE port available, as well as some extra USB headers.

The K-4500-N2 came configured with 512 MB RAM, which is shared by the on-board video card. The sharing can be configured in the BIOS for a dynamic (using DVMT) or fixed partition. While this should be plenty for the setup, maxing out the supported memory is relatively cheap - so I decided to do it right away instead of later. I couldn't find a common product with appropriate specs that was in the memory support list for the K45 on Shuttle's web site and that Newegg carried, but a Kingston 2x1 GB pair (Newegg # N82E16820134117, ~$30) is working well. While this required removing the supplied 512 MB chip, this had the added benefit of enabling dual-channel mode.

With a largest dimension of 11", it is space-saving. Though I haven't measured A/C usage, it also seems that it is also rather energy efficient - with only a 100W power supply, and very few extra components to power.

One peripheral to note as missing is an optical drive, though there is one available on the K4800 model. However, short of reinstalling the operating system, I rarely expect a need for one. It does support an external USB DVD drive I have without any apparent issues, and worked well for reinstalling Linux.

Operating System

I was not impressed with the supplied installation of Foresight Linux. Several menu options only produced errors - not a good first impression. Fortunately, it's free to begin with, so I had nothing to loose by simply doing a clean install of the latest Ubuntu x64 - which works great.

Other Thoughts

Especially without optimal viewing conditions, the power button on the front can easily be mistaken for a USB port. Considering how there are already spare USB headers on the motherboard and available space on the front panel, at least one USB port on the front panel would be nice for connecting flash drives, etc.

There's a clear spot on the back plate for a 2nd Ethernet jack, which could have been nice for use as a router. However, it's nothing that VLAN support and/or an external USB adapter can't resolve.

To be continued...

Next up: Alltel UM175AL USB EVDO under Ubuntu Hardy Heron.

Friday, October 3, 2008

Ubuntu Linux Router Upgrade Project

As much as I've enjoyed using OpenWrt for my home networking, I've decided to "upgrade" to a fuller Linux distribution running on a more "traditional" computer rather than an embedded device.

Internet via Cell Phone

One factor encouraging this transition is that there is currently no cable or DSL Internet service to my current residence. To remain connected, I'm using Alltel's Wireless Internet service (3G 1xEV-DO). Unfortunately, the associated access devices are essentially modems that connect by either USB, PCMCIA, or ExpressCard - none of which can be directly connected to the standard Ethernet ports on my OpenWrt-enabled Linksys router.

There are a number of devices available to bridge mobile broadband to a home or other small LAN, otherwise known as cellular routers. One such device is the Linksys WRT54G3G. However, it seems specifically targeted towards Sprint/Nextel, and none of the listed supported data cards are offered by Alltel. Also, retailing at ~$130, it costs almost twice as much as my existing WRT54GL while not even offering the same quality 802.11 wireless.

Linux opportunity

While I don't consider myself a stranger to Linux, my use of it at home has been limited to OpenWrt and virtual machines. This will be an opportunity for me to run it natively and have an always-on instance to utilize as needed.

My choice of distribution for this project is the latest version of Ubuntu, 8.04 ("Hardy Heron"), based on its release schedule, stability, features, popularity, and availability of online community support. Version 8.10 ("Intrepid Ibex") is due at the end of the month (2008-10-30). Rather than waiting, I'll utilize the remainder of the month to experiment and polish my setup. My plan is to then hopefully repeat the same success with minimal effort after a clean install of 8.10 once released.

New Hardware

I considered using an old laptop for the task. Even though the screen has serious issues, I'd usually just have it connected to my KVM switch or use SSH. However, considering that I have a Gigabit network switch and matching link to my primary desktop, I wanted a device that would also match speeds.

To be continued...

I'll be following up with a number of posts. To be included: