Table of Contents

Channel Bonding to share the same IP for Wired & Wireless interfaces

Unlike when using NetworkManager or Wicd this setup allows uninterrupted switching between wired and wireless, no connections will be interrupted in the switch.

As of this writing (Summer 2012) neither NetworkManager nor Wicd handle this kind of setup.
See also Channel Bonding to share the same IP for Bridged wired & Wireless interfaces for a setup that replaces ethX with a bridge (brX).

Required: ifenslave

Create bond0, enslave lan and wifi interfaces. (Nowadays usually optional) Tell wpa_supplicant packets enter through bond0.

Manually

Up:

# modprobe -v bonding
# ifenslave bond0 wlan1
# ifconfig wlan1 up
# ifconfig bond0 up
# wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan1 -b bond0 
# ifenslave bond0 eth1
# ifconfig eth1 up
# echo eth1 > /sys/class/net/bond0/bonding/primary
# dhclient -v bond0

Down:

# dhclient -v -r bond0
# ifconfig bond0 down
# ifconfig eth1 down
# ifconfig wlan1 down
# killall wpa_supplicant    # Is there a "clean" way?
# ifenslave -d bond0 eth1
# ifenslave -d bond0 wlan1
# modprobe -v -r bonding

Debian-style

In Debian this can be achieved directly through /etc/network/interfaces:

allow-hotplug bond0 # or "auto bond0"
iface bond0 inet dhcp
	bond-primary eth1
	bond-slaves eth1 wlan1
	bond-mode active-backup    # or bond-mode 1
	bond-miimon 150

allow-bond0 wlan1
#allow-hotplug wlan1
iface wlan1 inet manual
        bond-master bond0
        bond-primary eth1
        bond-mode active-backup
        bond-miimon 150
        # Usually optional: set wlan1 as active temporarily, tell wpa_supplicant to use bond0
	#bond-give-a-chance 10
	#wpa-bridge bond0
        #
	# Single Wireless location/access point:
        #wpa-ssid "#MY SSID#"
	#wpa-psk #MY KEY#
        # Multiple wireless locations
        wpa-roam /etc/wpa_supplicant/wpa-roam.conf   # And set-up wpa-roam.conf with SSIDs and Keys

allow-bond0 eth1
#allow-hotplug eth1
iface eth1 inet manual
        bond-master bond0
        bond-primary eth1
        bond-miimon 150
        bond-mode active-backup

Enable with # ifup bond0. Release a enslaved interface with # ifdown interface.

With cable connected, eth1 is used. Without, wlan1 is used.
See status with $ cat /proc/net/bonding/bond0:

Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth1
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 150
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth1
MII Status: up
Link Failure Count: 1
Permanent HW addr: 00:aa:bb:cc:dd:ee

Slave Interface: wlan1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:11:22:33:44:55

FIXME Disabling wifi through rfkill (using laptop's switch or touch-sensitive button) removes it from the bond *BUT* re-enabling it won't re-add it. Re-inserting the module after enabling it does add it (e.g. switch on, run # rmmod iwlagn ; modprobe iwlagn).

Possible troubles

I set up a new computer recently and had to use a couple tricks to get it working. Both the wireless and wired interfaces only worked when the bond was configured to their respective MAC address. My solution was to use the wireless MAC for the bond and put the wired interface in promiscuous mode.

# ifconfig bond0 hw ether 00:11:22:33:44:55
# ifconfig eth1 promisc

Debian's way:

iface bond0 inet dhcp
        # ...
        pre-up ifconfig bond0 hw ether 00:11:22:33:44:55
        pre-up ifconfig eth1 promisc
        post-down ifconfig eth1 -promisc