Autoswitching network interfaces
Since I’m a lazy git, I want my laptop to automatically switch back & forth between my wired and wireless interfaces. Seems that stuff like Network Manager can do that for you, but it’s not really my thing. I don’t like stuff where you need a GUI to configure it, a duplicaton of network configuration, and it also tends to hang my machine. No idea why, though.
After an afternoon of fiddling around with several things, I came up with the recipe:
1 portion ifplugd, a good mix of ifupdown configuration with guessnet mappings, and some home-grown scripts. Mix well, and let simmer over a hot stove for half an hour. ;)
The details (tailored to Debian Sid):
- Install ifplugd and guessnet:
apt-get install ifplugd guessnet - Configure the interface you want ifplugd to monitor. For me, this is eth0 (wired ethernet). You can do this by editing
/etc/default/ifplugdand adding eth0 in theINTERFACESfield.
Restart ifplugd (/etc/init.d/ifplugd restart) - Edit your
/etc/network/interfacesfile the way you like it. I’m using multiple wireless entries with guessnet:
mapping ath0 script guessnet-ifupdown map verbose: false map debug: false map autofilter: true iface ath0-work inet dhcp test wireless essid WORK wpa-ssid WORK wpa-key-mgmt WPA-PSK wpa-proto WPA wpa-psk "***" wpa-driver wext iface ath0-home inet dhcp test wireless essid HOME wpa-ssid HOME wpa-key-mgmt WPA-PSK wpa-proto WPA wpa-psk "***" wpa-driver wextFor syntax info, see
man guessnet - Replace the script in
/etc/ifplugd/action.dwith something more usable. The installed script only calls ifup or ifdown depending on what’s happening. What we want is to ifdown the interface, and ifup the other.Something like this:
#!/bin/sh set -e WIRED_INTERFACE="eth0" WIFI_INTERFACE="ath0" WIFI_MODULE="ath_pci" IFUPDOWN_STATE="/etc/network/run/ifstate" if [ $# -ne 2 ]; then echo "Incorrect usage!" echo "$0:" exit 1 fi case "$2" in up) if [ "$1" = $WIRED_INTERFACE ]; then # Wired interface is going up, bring wireless down # if it is active. WIFI_MODULE_LOADED=$(lsmod | grep ^$WIFI_MODULE | wc -l) if [ $WIFI_MODULE_LOADED -eq 1 ]; then /sbin/ifdown $WIFI_INTERFACE /sbin/rmmod $WIFI_MODULE fi /sbin/ifup $WIRED_INTERFACE else /sbin/ifup $1 fi ;; down) if [ "$1" = $WIRED_INTERFACE ]; then # Wired interface is going down, bring up the # wireless one. /sbin/ifdown $WIRED_INTERFACE /sbin/modprobe $WIFI_MODULE /sbin/ifconfig $WIFI_INTERFACE up sleep 5 /sbin/ifup $WIFI_INTERFACE WIFI_CONFIGURED=$(grep ^$WIFI_INTERFACE $IFUPDOWN_STATE | wc -l) if [ $WIFI_CONFIGURED -eq 0 ]; then # Interface was not configured, bring it back down # to save power /sbin/rmmod $WIFI_MODULE fi else /sbin/ifdown $1 fi ;; esac
Now, every time ifplugd configures up eth0, ath0 is automatically deconfigured, and vice versa.
The actual configuration of the interfaces is still in /etc/network/interfaces, so you can still handle it by hand if you want to.
As always, it works fine for me, but YMMV, and TIMTOWTDI!
Tags: autoswitch network interfaces, debian, guessnet, ifplugd, ifupdown