--- /dev/null 2009-06-24 15:58:51.000000000 -0700 +++ bond.sh 2009-06-24 15:54:35.000000000 -0700 @@ -0,0 +1,96 @@ +#!/bin/sh +# @(#) $Id: bond.sh,v 1.4 2009/06/23 20:56:21 leres Exp $ (LBL) +# +# One pair: +# +# bond_enable="YES" +# bond_interfaces="sk0 sk1" +# +# or two pairs (UNTESTED) +# +# bond_interfaces="sk0 sk1 - em2 em3" +# +# or three interfaces +# +# bond_interfaces="em1 em2 em3" +# + +test="" + +case "$1" in + +'start') + ;; + +'stop') + exit + ;; + + +'test') + test="echo" + ;; + + +*) + echo "Usage: $0 { start | stop | test }" + exit 1 + ;; +esac + +# use NETGRAPH to bond interfaces together + +. /etc/rc.conf + +if [ -z "${bond_enable}" -o "x${bond_enable}" != "xYES" ] ; then + exit +fi + +if [ -z "${bond_interfaces}" ] ; then + exit +fi + +# ng_ether must be loaded so netgraph can "see" the +if [ -z "${test}" ]; then + mod="ng_ether" + kldstat -m ${mod} > /dev/null 2>&1 || kldload ${mod} +fi + +# assumes the interfaces are already up +dobond() { + local ngeth + + ngeth="ngeth$1" + shift + ${test} ngctl mkpeer . eiface hook ether || exit 1 + ${test} ngctl mkpeer ${ngeth}: one2many lower one || exit 1 + n2=0 + while [ $# -gt 0 ]; do + ${test} ifconfig $1 -arp -monitor promisc || exit 1 + many="many${n2}" + ${test} ngctl connect $1: ${ngeth}:lower lower ${many} || exit 1 + n2="`expr ${n2} + 1`" + shift + done + + # bring up ngeth0 for sniffing duties + ${test} ifconfig ${ngeth} -arp up || exit 1 +} + +iflist="" +n=0 +for i in ${bond_interfaces}; do + if [ "${i}" = "-" ]; then + if [ -n "${iflist}" ]; then + dobond ${n} ${iflist} + n="`expr ${n} + 1`" + iflist="" + fi + continue + fi + iflist="${iflist} ${i}" +done + +if [ -n "${iflist}" ]; then + dobond ${n} ${iflist} +fi