2013年1月8日火曜日

"bond-give-a-chance" って何だ?

Raspberry PiでUSB-Wifiアダプタを使う」で、bondingを扱いました。そのとき、/etc/network/interfaces に"bond-give-a-chance"というパラメータを設定しています。これについては http://ubuntuforums.org/archive/index.php/t-1515788.html に出てきたものをそのまま使用していました。けっこう重要そうなパラメータの内容が分からないのもアレなので、ちょっと調べてみました。

まず、このパラメータを利用するのはifenslaveというパッケージです。Raspberry Piでは、/etc/network/if-up.d/ifenslave にスクリプトがありました。これを見てみると、次のような内容となっています。

#!/bin/sh

[ "$VERBOSITY" = 1 ] && set -x

sysfs()
{
 # Called with :
 # $1 = basename of the file in bonding/ to write to.
 # $2 = value to write. Won't write if $2 is empty.
 if [ "$2" ] ; then
  echo "$2" > "/sys/class/net/$IFACE/master/bonding/$1"
  return $?
 fi
 return 0
}

# If the stanza bond-give-a-chance is set for a slave interface,
# then force $IFACE to be the primary for some time, 
# then restore primary to it previous value.

# This stanza is designed to workaround a bug in wpa_supplicant, 
# when used with bonding :

# wpa_supplicant expect wifi authentication packets on the bond interface, 
# but also send wifi authentication packets on the bond interface.
# If the active interface is not the wifi interface at the time 
# wpa_supplicant try to authenticate, the wifi AP won't receive anything, 
# causing the authentication to fail.

# In order for the wifi authentication to succeed, one need to 
# give a chance to the wifi interface to send authentication packets.
# "bond-give-a-chance 10" will set the wifi interface as the primary interface 
# for 10 seconds, then restore the previous primary interface.
# This is supposed to be enought to give a chance to wifi to authenticate properly.

if [ "$IF_BOND_GIVE_A_CHANCE" ] ; then
 read primary < "/sys/class/net/$IFACE/master/bonding/primary"
 # Set the temporary primary.
 sysfs primary "$IFACE"

 # Wait for the link to be setup, 
 # but not longer that $IF_BOND_GIVE_A_CHANGE seconds.
 while [ "$IF_BOND_GIVE_A_CHANCE" -gt 0 ] ; do
  if ip link show $IFACE | grep -sq 'state UP'; then
   break
  fi
  sleep 1
  IF_BOND_GIVE_A_CHANCE=`expr $IF_BOND_GIVE_A_CHANCE - 1`
 done
  
 # Restore the previous primary.
 sysfs primary "$primary"
fi
要約してみると、
  • WiFi interfaceがアクティブでない(primaryでない)状態で、WPAで保護されたネットワークへ接続しようとして失敗するのを防ぐためにある。
  • 指定する数値は秒数であり、この時間内はWiFiをprimaryとして認証を試みる。
ということのようです。

0 件のコメント:

コメントを投稿