I’ve made two new interesting discoveries about wpa_supplicant since
writing my last blog post on the subject. (Actually, I pretty much
made both of them while reading documentation in order to write it,
and have been lame about writing them up).
Using wpa_gui 🔗︎
It turns out that wpa_gui not only allows you to select existing
networks, but also to scan for and add new networks to your
configuration file. In addition, you can run it as yourself, without
needing to sudo it. In order to do so, you need to add two lines to
/etc/wpa_supplicant/wpa_supplicant.conf:
ctrl_interface_group=netdev
update_config=1
ctrl_interface_group selects a UNIX group that will be given
permission to read/write the control socket. I chose netdev because
it seems like it’s supposed to be networking-related, and my login
user was already in it on my Ubuntu machine.
update_config allows wpa_supplicant to write back to its conf file
if instructed to configure new networks by a UI (wpa_cli or
wpa_gui). Note that this will squash any comments you have in the
file.
wpa_action — a mostly-baked roaming solution 🔗︎
The setup I described in the previous post causes wpa_supplicant to
manage associating with access points, while Debian’s ifupdown
request DHCP independently. There’s no communication between the
layer, so if you switch networks, or associate sometime after we
bring up the interface, nothing tells dhclient to request a new
lease. It turns out we can turn this picture inside-out, and make
wpa_supplicant responsible for bringing up and down a virtual
interface, whenever it associates or loses association.
To make this work, we’re going to need to edit
/etc/network/interface again. Our wpa_supplicant.conf can stay
unchanged; Debian’s wrapper scripts do all the magic. Replace your
ath0 block and add a virtual default interface as follows:
iface ath0 inet manual
wpa-driver wext
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
The way this is going to work is that, whenever wpa_supplicant
associates to a network, it will bring up the virtual default
interface, causing ifupdown to spawn dhclient and request
DHCP. When it loses association, it brings it down, killing the DHCP
daemon.
Furthermore, we can associate different virtual interfaces with
different networks. Suppose that I usually want DHCP, but at home
(essid nelhage) I don’t run a DHCP server, and just want my laptop
to always grab 10.0.1.100. I can add an interface to
wpa_supplicant.conf:
network={
ssid="nelhage"
id_str="nelhage"
key_mgmt=NONE
}
And then I add a new virtual interface to interfaces, corresponding
to the id_str:
iface nelhage inet static
address 10.0.1.100
netmask 255.255.255.0
network 10.0.1.0
gateway 10.0.1.1
Now, if wpa_supplicant associates to the nelhage network, it will
bring up the nelhage interface, binding ath0 to the static
configuration there listed.
For documentation, check out the third section of
/usr/share/doc/wpasupplicant/README.modes.gz on your Debian or
Ubuntu machine.
In conclusion… 🔗︎
This setup actually seems pretty close to the correct design for a
roaming wifi architecture, to me. Unfortunately, my experience is that
it hasn’t worked well for me; For some reason, when I put it in
roaming mode, it fails to associate with networks that it otherwise
works fine with. I suspect that this is related to madwifi suckage
as much as wpa_supplicant suck, though, so I’d encourage everyone
else who’s been fighting with wifi to try it out and report back if it
works for them.