Having received my Dell OEM "Reinstallation DVD" for "Windows Vista Ultimate 64BIT SP1", I began the upgrade process. Considering that the system came with an apparently complete set of recovery DVDs and CDs, I wasn't too concerned about wiping the hard drive and starting from scratch. However, as a precaution, I pulled the hard drive and imaged the first 2 partitions, "Diagnostic - DellUtility" and "Recovery".
The recovery partition looked rather interesting. The original partition was somewhere between 1-2 GB, but wasn't even half-full. The copied, compressed image is only 383 MB. According to Dell's documentation, "Dell Factory Image Restore (Microsoft Windows Vista only) returns your hard drive to the operating state it was in when your purchased the computer.". 383 MB seems rather impossible for that task, and probably not enough enough to reinstall Windows, much less any of the Dell drivers or applications. To no surprise, manually searching through the recovery partition didn't yield anything Dell-specific.
I was able to reinstall all the drivers with minimal issues, except one. The main issue is that I don't know what it is! There is one remaining device in the Windows Device Manager that simply lists as "Unknown device", as shown:
All this really shows is that the mysterious device is connected via USB.
Before I reformatted, I worked with the pre-installed image for a bit just to see how things originally were. In hindsight, I wish I would have imaged the whole drive, or for this particular issue, at least taken some "before" screenshots from the Device Manager. The one thing that I do remember, which was a bit of a surprise, was that my system apparently has Wireless USB support, as was indicated by an applet in the notification area (system tray).
As I no longer see this after the reinstall, and since I only have the one unknown device, it would seem that this unknown device must be related to the Wireless USB. Additionally, the Dell Bluetooth device is a "Dell Wireless 410 Bluetooth Module with UWB", where UWB is Ultra-wideband, which Wireless USB is based on.
However, none of the Dell Wireless 410 Bluetooth drivers (specifically R197543.exe) are recognized as valid for the unknown device.
Looking at the details tab of the device properties in Device Manager, the following details are shown:
- Hardware Ids
USB\VID_413C&PID_8149&REV_0100
USB\VID_413C&PID_8149
Compatible Ids
USB\Class_FE&SubClass_01&Prot_02
USB\Class_FE&SubClass_01
USB\Class_FE
The only Google result after searching for the above VID and PID to date is a forum post by "Justin77" on 2008-10-16, where he seems to have the same question: http://forum.notebookreview.com/showpost.php?p=4041896&postcount=599. (I'm guessing this will quickly become 1 of 2 Google results for the search!)
The Linux USB Project has a the most comprehensive list of USB Vendor IDs and Product IDs I've seen at http://www.linux-usb.org./usb.ids. This clearly shows that the 413C Vendor ID belongs to "Dell Computer Corp.". While it doesn't currently list a match for the Product ID of 8149, it does show that PID 8140 is "Wireless 360 Bluetooth", and that PID 8142 is "Mobile 360 in DFU". If Dell has any method to assigning their Product IDs, it would seem that PID 8149 should be related to the Dell Bluetooth device.
The listed Compatible IDs, however, seem to hint away from Wireless USB. http://www.usb.org/developers/defined_class lists Class FE as "Application Specific", and SubClass 01 as "Device Firmware Upgrade" - though it lists this next to Protocol 01, where mine is is 02. This also seems to relate to the above 8142 PID - "Mobile 360 in DFU", or "Device Firmware Upgrade".
However, another forum post by "somms" on 2008-11-08, seems to confirm that I should have a "Dell Wireless 410 Wireless USB Device", as shown in the included screenshot at http://forum.notebookreview.com/showpost.php?p=4133796&postcount=21.
Just in case this was an issue with the 64-bit version of Windows, I dual-booted another install of the 32-bit version, and had exactly the same issue. None of the drivers installed there resolved this unknown device, either.
I'm starting to wonder if this whole issue is at all related to "USB mode switching", as was the case with my Alltel UM175AL USB EVDO device.
That's all I have for now. I have an escalated support request open with Dell. Hopefully I'll hear something back during the next week after the holiday weekend is over. Besides resolving this "Unknown device" issue, I hope to find out what the situation was with the recovery partition. I'll add an update here with anything I find out.
In the meantime, time to give Ubuntu Linux a try on the Latitude E6500...
Update (2008-11-30):
This "Unknown device" is definitely a "Dell Wireless 410 Bluetooth & UWB Mini-card". User "somms" posted a response at http://forum.notebookreview.com/showthread.php?t=297416&page=3, containing a link to a torrent containing a WiQuest driver. After a lengthy download, I found that "Drivers\Wiquest\Vista\Delwusb.inf" contained the following:
;.------------------------------------------------------------------.
;| Dell Wireless 410 Bluetooth & UWB Mini-card |
;'------------------------------------------------------------------'
; Dell MO9 WUSB HWA
%LOADER_HWA_BT_DESC_DELL% = WQ_LDRHWA.Dev, USB\VID_413C&PID_8149
%UWB_HWA_BT_DESC_DELL% = WQ_USBUWB.Dev, USB\VID_413C&PID_8150
%HWA_GENERIC_BT_DESC_DELL% = WQ_USBHWA.Dev, USB\VID_413C&PID_8150&MI_00
After loading the driver, anything with "PID_8149" no longer appears in the Device Manager. Instead, there are the following devices:
- "Dell Wireless 410 Wireless USB Device"
- "Dell Wireless 410 Wireless USB Host Wire Adapter"
So it definitely seems that there is some sort of USB mode switching in effect.
Now, I'd just like to find the official source of these drivers. I can't find anything on Dell's website. While the drivers are listed as from "WiQuest Communications, Inc.", they are Dell-branded - both in the installer and in the application.
Note that WiQuest folded at the end of October (PC Magazine 2008-11-4, EE Times 2008-10-31), which should make things interesting.
The installation provided by "somms" contained the drivers and applet for the WUSB as well as the Bluetooth. However, the driver version for the Bluetooth was 6.1.0.4500 (2008-03-07), where the latest provided by Dell is 6.1.0.4100 (2008-01-31). This makes me wonder if there is a slightly newer version of the WUSB driver available as well.
Regardless, at least now I have the functionality working that was shipped with the laptop, whether or not WUSB is "dead". At least now I can disable the WUSB radio with some certainty and maybe save some power and battery life!
I'm pleased to see that the details of a PMR I had opened with IBM over 3 months ago now are now publicly acknowledged as PK70653: XSLT TRANSFORMATION IN DEBUG MODE FAILS ON AN EMPTY INPUT XML DOCUMENT WITH MESSAGE [FATAL ERROR] PREMATURE END OF FILE.
There are some details which seem to have been left out of the above APAR / PK that may be useful:
- No application
Throwable is ever thrown. The described error is generated only to stderr.
- The transformation is aborted and nothing is ever set on the result. If passing in a DOMResult as the "
requestResult" listed in the APAR, setNode(...) is never called, and getNode() will return null - potentially leading to additional application errors, probably as a NullPointerException if unchecked.
- As documented in the
Transformer's transform(...) method, passing in an empty Source is explicitly allowed by the API.
- There is a temporary work-around. Follow the instructions at http://www-01.ibm.com/support/docview.wss?uid=swg21258865 to disable the XSLT Debug Adapter, either by setting the "
com.ibm.debug.attach.agent.xslt.enabled" JVM custom property to "false", or by modifying a preference in Rational Application Developer (RAD) if using the WebSphere Application Server (WAS) Test Environment.
Finally, just for reference purposes, here is the error that may be seen in stderr if experiencing this issue (also as shown in the APAR):
[Fatal Error] :-1:-1: Premature end of file.
SystemId Unknown;Line #-1; Column #-1; Premature end of file.
Kudos to Dorine, Bruce, Samantha, and the others involved at IBM for taking attention to and resolving this issue!
(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
(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.
(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.
(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.
(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.
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.
|