Wifi roaming on the move redux

It has been nearly six years with a netbook and five since I last wrote about wifi roaming from the bus to stay on irc without a costly celluar link during the daily commute.  Since then, some readers have asked me to share my refinements to the method in a followup post. So here it is.

The software

On the server:

  • openssh-server
  • screen
  • irssi

On the client:

  • screen
  • wpasupplicant
  • isc-dhcp-client
  • openssh-client
  • openbox
  • sudo & gksudo (optional)
  • urxvt
  • wavemon (optional)
  • three shell scripts (provided below)

Putting it together: on the client

Make sure if you have a wireless manager installed (such as NetworkManager) it is configured to skip your wireless interface, disabled entirely, or if possible, removed. Set up /etc/wpa_supplicant/wpa_supplicant.conf and /etc/network/interfaces for roaming, as per the instructions in /usr/share/doc/wpasupplicant/README.modes.gz. Don’t forget to add yourself to the netdev group if you are not in it already.

In /etc/wpa_supplicant/wpa_supplicant.conf, list common names of open networks. Normally the catch-all network that associates with any essid, i.e. the first stanza below, works well. However, occasionally the strongest signal is neither one of the common networks nor an easily accessible network (e.g. web portals), so having a list of common open networks helps to quickly select from among those instead. The more you travel, the more of these will discover and add. Just use reconfigure from wpa_cli to reload your edited list each time you add a new one.

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

Since you’ll be using ssh repeatedly to connect and it has to be fast, make sure your server is set up to accept your key and use ssh-add so that you only have to enter your ssh key password once.

You can tweak isc-dhcp-client to make connections faster. In /etc/dhcp/dhclient.conf, use:

backoff-cutoff 1;
initial-interval 1;

Here are a few scripts I wrote to facilitate quick roaming from one open AP to another and reconnect to irssi running in screen, to break a connection and try the next one, and to recover from occasional lockups (more about that later).


This is a script to reconnect continuously via ssh to a screen session:

while ! ssh -t 'screen -UDr' 2>/dev/null ; do echo -n "." ; sleep .1 ; done

Just substitute the IP of your own server here. Using an IP instead of domain name makes the connection faster because a DNS lookup is not required.


This script closes any open ssh sessions and informs wpa_supplicant to attempt to connect again.

/sbin/wpa_cli rea
killall ssh >/dev/null 2>&1


This optional, somewhat ugly script addresses an issue I hope you never have. On my ASUS Eee PC 1001PX, occasionally scanning stops. When this happens, and I have never figured out why, apparently ACPI events are blocked. At this point wifi becomes unusable and ACPI sleep is inhibited. By trial and error I found that if you bring down the interface, kill all network-related processes, and bring it up again, ACPI events are unblocked and wifi is usable once more (and any pending request to sleep will finally happen). The script requires sudo, and to use the openbox key binding, gksudo.

sudo ifdown wlan0
# in case any of these are hung
sudo killall dhclient3
sudo killall wpa_cli
sudo killall wpa_action
sudo killall wpa_supplicant
# in case any of these are *really* hung
sleep 1
sudo killall -9 dhclient3
sudo killall -9 wpa_cli
sudo killall -9 wpa_action
sudo killall -9 wpa_supplicant
sudo dhclient -r
sudo ifup wlan0


Since certain actions need to be performed repeatedly and quickly, it is useful to have hotkeys bound in your window manager to the scripts. In ~/.config/openbox/rc.xml, key bindings for <alt>-r to reassociate and <alt>-d to disconnect a hung connection would look like:

  <!-- My keybindings -->
  <keybind key="A-R">
    <action name="Execute">
  <keybind key="A-D">
    <action name="Execute">
        <execute>gksudo /home/synrg/bin/wifi_killall</execute>

Putting it together: on the server

There is very little to do here. Just start screen, and start irssi in screen. Running screen on the client as well as the server means you should either bind the screen meta keys to a different key sequence on each system, or else learn to press meta twice to pass through meta to the server screen as needed. I use the latter approach. Alternatively, you could use a tabbed terminal on the client, or separate terminals per client process instead of screen. This is a matter of personal taste.

Ready to roam

Here is a typical setup for roaming on the bus:

In a terminal (I use urxvt), first ssh-add, then start screen with these three processes running in separate virtual terminals:

  • /sbin/wpa_cli
  • screen_reconnect
  • wavemon (optional)

March of the dots

Most of the commute, just enjoy watching the dots march by, waiting for a new connection. If you estimate a connection is unusable, press <alt>-r to reassociate immediately, giving the next network a chance. If the connection is already firmly established, this might not work on the first try. If the dots don’t resume immediately, wait a bit and press it again. This might take a few tries.

Changing selected networks on the fly

Use wpa_cli when you need to do some fine-tuning of network selections on the fly. While normally you can just watch the march of the dots until a connection is acquired, sometimes you can improve your chances of connecting to a good network by manually controlling the selected candidate networks here.

For example, by watching the speed of the bus relative to known “good” APs, you can predict which networks are more likely to succeed. Rather than connect to any arbitrary network, you might select a specific one by id, and then later when it goes out of range, revert to the original configuration, e.g.

> select_network 5
> reconfigure

You can use tab-completion in wpa_cli to type these commands quickly or else just abbreviate the commands.

Another common scenario is when you pass through a business area with many captive portal hotspots. These rarely make good choices because they either require a password not known to you or else you can’t click through “I agree” in time before the bus moves on. In this case, you might just disable the catch-all stanza and let the common open network stanzas you listed (“default”, “linksys”, etc.) do the work:

> disable_network 1

Become a type ahead wizard

While running, a continuous stream of periods fills the screen, which provides you with a highly visible cue that no available APs are in range. When the movement stops, you know a connection is being attempted.

While waiting to connect, you can type ahead any comments you want to make in the current irssi window (taking care to remember which one you are in!) While having periods interspersed in what you type may be disorienting at first, you get used to it.

There is a point when a connection is first established and ssh is accepting input, but anything you type can no longer be seen while you’re typing. Depending on whether the connection was completely successful or not, what you type now may or may not finally be sent. For best results, only type ahead before the dots stop moving.

Eventually you can become skilled enough at this to type ahead a comment in one channel, switch channels with /win # and continue typing ahead in the new channel, all buffered until the next few seconds (or even fraction of a second) of connection time.

Fine-tune antenna direction with wavemon

When the bus has come to a standstill, you may find wavemon useful to pull in a weak signal. Because wavemon has continuously updated signal level and link quality bars, you can use it to fine-tune the antenna position. Just turn your laptop until the bars are at their maximum.

Captive portals

I have not figured out how to do any automation for this, so it really is a crapshoot, as it is likely the bus has moved on by the time you’ve managed to manually navigate the login through a captive portal. But in rush hour, you may have the luxury of time to connect to these as you pass them. I have recently learned about the CoovaFX Firefox plugin which automates logins to captive portals. I’m going to give it a try to see if it helps. Update: I can’t recommend this plugin, as it is not compatible with Iceweasel >= 23.0. Also, the standard it is based on, WISPr, appears to have an uncertain future. That, coupled with the fact that the plugin appears to not be open source means I’m still looking for alternatives.


If all of this sounds a bit nuts to you, well, it probably is. But after half a decade enjoying free access to irc from the bus, it all seems perfectly natural to me! If you try this method and like it, please let me know in the comments. Likewise, if you have any improvements to the process or scripts, please share them!


Bits from the Eee PC team, Spring 2009

Lenny well supported

We’re pleased that Lenny released with good support for the Eee PC and are now turning our efforts to make Squeeze even better, while continuing to provide support for our Lenny user base.  The standard Lenny installer can install Debian on all models of Eee and our custom installer provides the ability to install over wireless for almost every model (more about this later) from a very small image.  The latter continues to be our recommended install method, since in addition to being wireless-ready, the custom installer also handles a few other small eee-specific configuration chores to make as much as possible “just work” right after the install.

Solid mainstream support

We’ve made good on our promise to make Debian work on the Eee PC, not a derivative, many of which use a custom kernel instead of the stock kernel as we do and use a special desktop instead of our users’ favourites.  While we agree that some intriguing things can be done in these areas, it is no substitute for mainstream support.  Our users are better served by a solid foundation than specialised modifications that limit their choices.  We want them to be able to enjoy the freedom to mold Debian, the universal OS, into whatever suits them best.

Squeeze support started

Work is well underway on supporting all Eee models in Squeeze.  For months, several team members have been experimenting with new kernels, producing support for them in eeepc-acpi-scripts.  The current release of this key package (version 1.1.0) supports Linux 2.6.29 and contains enhancements for wifi, sound hotkeys, bluetooth, external displays and OSD.

Squeeze will support wired & wifi on all current models

With the appearance of 2.6.29 in Sid, all ethernet and wifi cards used in all models of Eee today are supportable without the need for out-of-kernel or non-free drivers.  Madwifi is replaced by the free ath5k driver, the non-free rt2860 package is replaced by mainstream kernel support, (though it still requires non-free firmware provided separately by firmware-linux — for now in 2.6.29, the firmware is included in the kernel, but that is a bug fixed in 2.6.30,) rtl8187se is included, making it possible now for us to support the model 701SD, and ath9k is included, making full support for newer models such as the 1000HE possible.

Lenny backports and live demo

All of these changes can be enjoyed today by Lenny users.  Just add Daniel Baumann’s Lenny kernel backport repository and then install the 2.6.29 kernel and an updated acpid.  See our upgrade howto for details.  You can try a small (less than 256M) demo of this configuration by downloading beta 2 of our Live USB image.


Late last year, we discussed how to make it easier for the blind to install Debian unassisted on their Eee PCs.  As it was a simple change, we now include brltty in the custom installer, but we understand that some users also need software synthesized text-to-speech, something for which there is no support yet in the standard Debian-installer.  We understand this isn’t an easy thing to fix, but hope someone will rise to the challenge.

Growing team of developers

We welcome Darren Salt and Raphael Geissert to the team this year.  Both have been actively making contributions to the eeepc-acpi-scripts package over the past months, fixing some outstanding bugs and readying it to handle changes in more recent kernel releases.

Moved eeepc.debian.net to new hosting

Nico Golde, who hosted eeepc.debian.net for the first year development, has turned his focus to other areas of Debian.  Glenn Saberton has stepped in to provide a new home for it.  We thank them both for their efforts and for a smooth, uneventful transition from one host to the other.

Size of user community

Speaking of the move, earlier this year, Glenn shared with us some interesting archive traffic statistics that give us a rough idea how many users we have.  For the months of December and January, after factoring out bot hits, we were seeing about 300,000 hits from 15,000 unique users per month.  The site handles roughly 60G of traffic per month, most of that from thousands of downloads of our custom installer image.  It’s hard to draw any firm conclusions about the size of our user base from these stats, as many users may be on dynamic IP numbers, inflating the numbers, but we can conservatively say we have at least 5000 users.  Other interesting statistics are that we have anywhere up to 80 users at any given time on our irc channel and over 250 users on the mailing list.

Help wanted

The Asus Eee PC line continues to expand, with 24 models listed so far.  It is a challenge to keep up support for all of them.  We’re encouraged to see Asus choose a new b/g/n wifi chipset for their 1002HA that is supported by a DFSG free driver — ath9k in this case.  It appears that the new Atom N280-based 1000HE uses the same chipset as well (though be careful: I know of at least one user who bought a 1000HE in Argentina expecting it to have this chipset and was disappointed to find it had the Ralink chipset instead, we guess because of availability).  If this trend continues, we’ll be that much closer to our goal of full support for Squeeze main.  As it stands, we’re already as close as we can get given the state of rt2860 and no prospect on the horizon for replacing the non-free firmware.

If you would like to help us out in any way, whether by testing, debugging, patching, or improving our documentation, get in touch with our team.  We rely on your feedback to keep Lenny in good shape and work towards making Squeeze even better for all users of Debian on the Eee PC.


Install Debian on your Eee PC over wireless

Installing Debian on your Eee PC is even easier now, as the option to install over wireless is now present in our custom debian-installer image. Also, the new installer automates installation of many more things than prior releases, so wireless, acpi hotkeys and suspend all ‘just work’ out of the box.

Two barriers remain to including wireless support for the Eee in Debian main. The first is the lack of wireless support in the official d-i installer. The second is the dependency on the non-free madwifi driver. I have no illusions about this being ready for Lenny, but I hope in Lenny + 1 this will be realized.

The good news is that Nick Kossifidis is working on getting support for the Eee into ath5k. For patches, see: http://kernel.org/pub/linux/kernel/people/mickflemm.

I have created a stub page FreeYourEee in our wiki about making a completely DFSG free install of Debian on the Eee. I encourage anyone going this route to contribute.