====== 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 [[linux:bonding-bridge]] 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
* ''bond0'' will use the master MAC
* ''allow-bond0'' will bring ''wlan1'' and ''eth1'' up when ''bond0'' gets up
* Bringing up one of the slaves interfaces will bring up bond0 BUT not the other slaves
* ''wpa-psk'' can be set to a hashed value, obtained with ''$ wpa_passphrase ''
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'').
* FIXME Can module loading/unloading be hooked to an rfkill event?
====== 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