Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Bonding wireless (wpa_supplicant) + ethernet the Gentoo way
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Networking & Security
View previous topic :: View next topic  
Author Message
VinzC
Advocate
Advocate


Joined: 17 Apr 2004
Posts: 4672
Location: Theux (Belgium)

PostPosted: Sun Mar 29, 2009 4:07 pm    Post subject: Bonding wireless (wpa_supplicant) + ethernet the Gentoo way Reply with quote

Hi.

I'd like to bond my wireless (wlan0, iwl3945 driver) and my ethernet interfaces. I've tried to setup bonding manually first (ip link set bond0 up && ifenslave bond0 wlan0 && ifenslave bond0 eth0 && dhcpcd bond0). Unfortunately I get no network connection with the wireless interface alone (i.e. if the ethernet device is not plugged in).

I'm using wpa_supplicant and WPA/PSK at home. Are there some recommendations for bonding wireless devices?

EDIT:The following link gave me an answer on what I did wrong the manual way.
This code works:
Code:
VIF=bond0

[ -d /proc/net/bonding ] || modprobe bonding
ip link set $VIF up
ifenslave $VIF eth0 wlan0 || exit 1
wpa_supplicant -Dwext -c /etc/wpa_supplicant/wpa_supplicant.conf -W -B -i wlan0 -b $VIF -P /var/run/wpa_supplicant-wlan0.pid
wpa_cli -a /etc/wpa_supplicant/wpa_cli.sh -p /var/run/wpa_supplicant -i wlan0 -P /var/run/wpa_cli-wlan0.pid -B
dhcpcd -F both -A -L -m 2004 bond0

The trick is to provide interface bond0 with -b. What's the Gentoo way to chain these instructions?

EDIT: I've read net.lo thoroughly and here are my conclusions.
  1. I can't use a preup() function for bond0 to start wpa_supplicant because the slaves must be added to interface bond0 first. Slaves get added only when bonding_pre_start() is executed, which occurs *after* preup().
  2. I can't use a postup function for bond0 because it happens too late (i.e. after adding the IP addresses or running dhcpcd and wpa_supplicant must start beforehand).
  3. I can't use a preup() function for wlan0 to start net.bond0 because interface bond0 would get its IP *before* wpa_supplicant starts.

So I need a script to do something but I don't know what nor where to start it.

In all cases it turns up I'd need to completely rewrite either a) the code to start wpa_supplicant or b) the code to start bonding, which would mean Gentoo network init scripts are not of much use as soon as wireless is involved... There must be a better way! I'd like not to have to write my own network scripts again...
_________________
Gentoo addict: tomorrow I quit, I promise!... Just one more emerge...
GNU/Linux user #369763
“Wow! I feel root”


Last edited by VinzC on Sun Mar 29, 2009 9:41 pm; edited 1 time in total
Back to top
View user's profile Send private message
VinzC
Advocate
Advocate


Joined: 17 Apr 2004
Posts: 4672
Location: Theux (Belgium)

PostPosted: Wed Apr 15, 2009 3:24 pm    Post subject: Reply with quote

Well? No candidate? :cry:
_________________
Gentoo addict: tomorrow I quit, I promise!... Just one more emerge...
GNU/Linux user #369763
“Wow! I feel root”
Back to top
View user's profile Send private message
ppurka
Advocate
Advocate


Joined: 26 Dec 2004
Posts: 3205

PostPosted: Wed Apr 15, 2009 4:32 pm    Post subject: Reply with quote

I don't know anything about bonding, but /usr/share/doc/openrc/net.example says
Quote:
#-----------------------------------------------------------------------------
# Bonding
# For link bonding/trunking on 2.4 kernels, or kernels without sysfs
# emerge net-misc/ifenslave

# To bond interfaces together
#slaves_bond0="eth0 eth1 eth2"
#config_bond0="null" # You may not want to assign an IP the the bond

# You can also configure the bond here, which must be done via sysfs on 2.6
# kernels or newer. See the kernel bonding documention for a description of
# these options.
#arp_ip_target_bond0="+26.0.0.0"

# If any of the slaves require extra configuration - for example wireless or
# ppp devices - we need to depend function on the bonded interfaces
#rc_need_bond0="net.eth0 net.eth1"

_________________
emerge --quiet redefined | E17 vids: I, II
Back to top
View user's profile Send private message
VinzC
Advocate
Advocate


Joined: 17 Apr 2004
Posts: 4672
Location: Theux (Belgium)

PostPosted: Wed Apr 15, 2009 5:19 pm    Post subject: Reply with quote

Yes, I know about bonding and how to bind two Ethernet interfaces together in general. The issue comes with wpa_supplicant. It *must* take an additional argument -b <controlling_interface_name> that is up before wpa_supplicant is called. In this case, it's -b bond0. The issue is all about the sequence of operations:
  1. set bond0 up (but don't get an IP address yet :!: ) and add the wireless and wired interfaces
  2. start and associate the wireless interface, wlan0 and wait till it's associated
  3. when and only when the slave interfaces are up and ready, get an IP address for bond0
So you see: bond0 must be available and bonding be ready before wpa_supplicant uses it to associate wlan0 through bond0.

If I use the described method, net.bond0 fails because it attempts to set an IP address, which fails because the slave interfaces are not ready yet. At most the sequence is as follows with Gentoo net scripts:
  1. start bond0, add the slaves and get an IP address
  2. start and associate wlan0
  3. optionally start eth0

This is bound to fail already at the first step because no IP address can be set. Next I fear that the script for wireless interface wlan0 fails to start because the interface is already brought up beforehand, having the whole process fail to start.

Hence my initial post...
_________________
Gentoo addict: tomorrow I quit, I promise!... Just one more emerge...
GNU/Linux user #369763
“Wow! I feel root”
Back to top
View user's profile Send private message
VinzC
Advocate
Advocate


Joined: 17 Apr 2004
Posts: 4672
Location: Theux (Belgium)

PostPosted: Wed Apr 15, 2009 9:10 pm    Post subject: Hack found! Reply with quote

I've finally found a hack -- at least that's what I think it is. Here's the related network configuration.
/etc/conf.d/net:
#
# Link aggregation (eth0, wlan0)
#
wpa_supplicant_wlan0="-Dwext -b bond0"

config_wlan0="null"
config_eth0="null"

# First slave MAC address will be used for bond0
slaves_bond0="wlan0 eth0"
config_bond0="null"
depend_wlan0()
{
        need net.bond0
}

postup()
{
        # Start DHCP against bond0 when wlan0 gets up
        [ "$IFACE" == "wlan0" ] && (IFACE="bond0"; IFVAR="bond0"; dhcpcd_start)
}

Setting config_bond0 to null prevents the network script from assigning an IP address, which is now deferred and must be done "manually". The IP address however must be assigned only after wlan0 started, hence the postup function and the test against $IFACE. Since /lib/rc/net/dhcpcd.sh uses $IFACE and $IFVAR internally as an argument to dhcpcd, both variables must be overriden for dhcpcd to run against bond0 instead of wlan0.

The only remaining issue is this one:
Code:
net.bond0          |/lib64/rc/net/bonding.sh: line 48: echo: write error: Operation not permitted

It occurs as /lib/rc/net/bonding.sh tries to add slaves. But I don't know what slave produces that error.
_________________
Gentoo addict: tomorrow I quit, I promise!... Just one more emerge...
GNU/Linux user #369763
“Wow! I feel root”
Back to top
View user's profile Send private message
VinzC
Advocate
Advocate


Joined: 17 Apr 2004
Posts: 4672
Location: Theux (Belgium)

PostPosted: Thu Apr 16, 2009 7:14 am    Post subject: Reply with quote

Geez! This trick didn't even survive a reboot... [Worked perfectly at home, fails miserably at work...]

Bonding sucks!
_________________
Gentoo addict: tomorrow I quit, I promise!... Just one more emerge...
GNU/Linux user #369763
“Wow! I feel root”
Back to top
View user's profile Send private message
UberLord
Retired Dev
Retired Dev


Joined: 18 Sep 2003
Posts: 6426
Location: Blighty

PostPosted: Thu Apr 16, 2009 12:07 pm    Post subject: Reply with quote

I'm not entirely sure you can do this, even with OpenRC as it stands.

Future OpenRC versions will at least make it possible, mainly by removing the whole net.foo concept and replacing it with a much simpler script just to assign addresses and routes for ALL configured interfaces and run a custom script per interface (like to say setup bonding). Then each daemon component (wpa_supplicant, dhcpcd, etc) can be moved into a generic init script.
_________________
Use dhcpcd for all your automated network configuration needs
Back to top
View user's profile Send private message
VinzC
Advocate
Advocate


Joined: 17 Apr 2004
Posts: 4672
Location: Theux (Belgium)

PostPosted: Thu Apr 16, 2009 1:50 pm    Post subject: Reply with quote

Thanks for your lights, Roy. In fact I'm just surprised it doesn't work here at work in fact though it seemed to work perfectly well at home -- meaning it should be possible with OpenRC. At least I succeeded in having my “custom” configuration work once. Just that the interface configuration must be done manually later on, calling dhcp_start(), for instance, which makes it a “hard runtime” dependency towards dhcp but since it's the default with Gentoo.

BTW, if we're expecting to see something simpler, I love this:
/root/wpa_bonding_supplicant:
#!/bin/sh
cd /
bond=/sys/class/net/bond0/bonding/
while sleep 1s; do
   pgrep wpa_supplicant > /dev/null || exit
   wpa_cli status | grep -q 'COMPLETED'
   primary=eth$?
   echo $primary | diff - $bond/active_slave > /dev/null || \
      echo $primary > $bond/primary
done

/etc/network/interfaces:
noauto bond0
iface bond0 inet dhcp
   pre-up ifconfig bond0 up
   pre-up ifenslave bond0 eth0 eth1
   pre-up wpa_supplicant -i eth1 -b bond0 -c /root/wpa.conf &
   pre-up /root/wpa_bonding_supplicant &
   down wpa_cli terminate
   down pkill wpa_bonding
   post-down ifconfig bond0 up
   post-down ifenslave -d bond0 eth0 eth1
   post-down ifconfig bond0 down

It's from Debian and also assumes there is such a line in Gentoo module configuration
/etc/modprobe.d/bonding:
option bonding mode=active-backup miimon=100 primary=eth0

but it gives a good idea on how simple it is to setup the network. Of course, there is the binary (Lord knows I hate) "network-manager" but simple scripts are possible too. Also note the above example lacks -a /path/to/wpa/action.script, which would have made the endless loop pointless.

I wrote my own network scripts at the time I was using baselayout-1 -- I remember I sent you a copy BTW. My goal was to make them faster (even with bash) than Gentoo network script library, which looked overly complex to me. Another goal was to have only one script for network called... network. Since I also had to bridge several virtual tap interfaces, I took care to simplify it as much as possible, requiring only one line (instead of three) to configure a tap interface. I used it for a couple of months and it was pretty stable... Then came baselayout-2, which was even faster :D .

I'm tempted to port them to baselayout-2/OpenRC. I'd be glad to submit them as a contribution...
_________________
Gentoo addict: tomorrow I quit, I promise!... Just one more emerge...
GNU/Linux user #369763
“Wow! I feel root”
Back to top
View user's profile Send private message
UberLord
Retired Dev
Retired Dev


Joined: 18 Sep 2003
Posts: 6426
Location: Blighty

PostPosted: Thu Apr 16, 2009 11:56 pm    Post subject: Reply with quote

http://roy.marples.name/projects/openrc/browser/trunk/init.d/network.in

The new simple script :)
Here's a bonded interface config for it

Code:
# Create a bonded interface
interfaces="bond0"
ifup_bond0="modprobe bonding; ifconfig bond0 up; ifenslave bond0 bge0"
ifconfig_bond0="192.168.0.10/24"
ifdown_bond0="rmmod bonding"

_________________
Use dhcpcd for all your automated network configuration needs
Back to top
View user's profile Send private message
VinzC
Advocate
Advocate


Joined: 17 Apr 2004
Posts: 4672
Location: Theux (Belgium)

PostPosted: Fri Apr 17, 2009 10:36 am    Post subject: Reply with quote

UberLord wrote:
http://roy.marples.name/projects/openrc/browser/trunk/init.d/network.in

The new simple script :)
Here's a bonded interface config for it

Code:
# Create a bonded interface
interfaces="bond0"
ifup_bond0="modprobe bonding; ifconfig bond0 up; ifenslave bond0 bge0"
ifconfig_bond0="192.168.0.10/24"
ifdown_bond0="rmmod bonding"

Uh 8O ? I know Gentoo users are^Wshould be aware of using the command line but don't you fear this is too technical? This furiously looks like what we type on the command line to start network interfaces.

I'm aware that using configuration files to abstract most of the commands we type is indeed a tough job but isn't there a smarter compromise between usability (for users) and simplicity (for developers)? It's no offence, just a first impression.
_________________
Gentoo addict: tomorrow I quit, I promise!... Just one more emerge...
GNU/Linux user #369763
“Wow! I feel root”
Back to top
View user's profile Send private message
UberLord
Retired Dev
Retired Dev


Joined: 18 Sep 2003
Posts: 6426
Location: Blighty

PostPosted: Fri Apr 17, 2009 1:02 pm    Post subject: Reply with quote

VinzC wrote:
Uh 8O ? I know Gentoo users are^Wshould be aware of using the command line but don't you fear this is too technical? This furiously looks like what we type on the command line to start network interfaces.

I'm aware that using configuration files to abstract most of the commands we type is indeed a tough job but isn't there a smarter compromise between usability (for users) and simplicity (for developers)? It's no offence, just a first impression.


After using NetBSD for some time now (I'm a NetBSD developer - heh) I've come to the conclusion that the reason why network configuration is perceived to be hard is due to the quality of the tools.
Here's how a bonded interface is done on NetBSD.

Code:

interfaces="agr0"
ifconfig_agr0="create; agrport sip0; agrport sip1; 192.168.0.10/24"


How much easier is that? A lot - for the user and for the distro maintainers. And the beauty is that it's all in the ifconfig man page.

All it needs is someone to step-up and bring linux ifconfig into the modern age.
_________________
Use dhcpcd for all your automated network configuration needs
Back to top
View user's profile Send private message
VinzC
Advocate
Advocate


Joined: 17 Apr 2004
Posts: 4672
Location: Theux (Belgium)

PostPosted: Fri Apr 17, 2009 1:45 pm    Post subject: Reply with quote

I see :lol: ...
_________________
Gentoo addict: tomorrow I quit, I promise!... Just one more emerge...
GNU/Linux user #369763
“Wow! I feel root”
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Networking & Security All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum