66# Have a look at /usr/share/doc/bridge-utils/README.Debian if you want
77# more info about the way on wich a bridge is set up on Debian.
88
9- if [ ! -x /sbin/brctl ]
9+ if [ ! -x /usr/ sbin/brctl ]
1010then
1111 exit 0
1212fi
1313
14- . /lib/bridge-utils/bridge-utils.sh
14+ # default configuration
15+ [ -f /etc/default/bridge-utils ] && . /etc/default/bridge-utils
16+
17+ . /usr/lib/bridge-utils/bridge-utils.sh
1518
1619case " $IF_BRIDGE_PORTS " in
1720 " " )
@@ -25,12 +28,24 @@ case "$IF_BRIDGE_PORTS" in
2528 ;;
2629esac
2730
31+ # Overload bridge_hw, now it can be a device as well as an address
32+ # The device can exist or not, then it is emptied
33+ if [ " $IF_BRIDGE_HW " ] && ! echo " $IF_BRIDGE_HW " | grep -q " ..:..:..:..:..:.." ; then
34+ IF_BRIDGE_HW=" $( ip link show dev " $IF_BRIDGE_HW " 2> /dev/null| sed -n " s|.*link/ether \([^ ]*\) brd.*|\1|p" ) "
35+ fi
2836# Previous work (create the interface)
2937if [ " $MODE " = " start" ] && [ ! -d /sys/class/net/$IFACE ]; then
3038 brctl addbr $IFACE || exit 1
3139 if [ " $IF_BRIDGE_HW " ]; then
40+ sleep 1
3241 ip link set dev $IFACE address $IF_BRIDGE_HW
3342 fi
43+ # Activate VLAN filtering on VLAN aware bridges
44+ if [ " $IF_BRIDGE_VLAN_AWARE " = " yes" ]; then
45+ ip link set dev $IFACE type bridge vlan_filtering 1
46+ else
47+ ip link set dev $IFACE type bridge vlan_filtering 0
48+ fi
3449# Wait for the ports to become available
3550 if [ " $IF_BRIDGE_WAITPORT " ]
3651 then
@@ -55,7 +70,11 @@ if [ "$MODE" = "start" ] && [ ! -d /sys/class/net/$IFACE ]; then
5570 fi
5671# Previous work (stop the interface)
5772elif [ " $MODE " = " stop" ]; then
73+ if [ " $PHASE " = " pre-down" ]; then
74+ [ ! -d /sys/class/net/$IFACE ] && brctl addbr $IFACE && ip address add " $IF_ADDRESS " /" $IF_NETMASK " dev $IFACE
75+ elif [ " $PHASE " = " post-down" ]; then
5876 ip link set dev $IFACE down || exit 1
77+ fi
5978fi
6079
6180all_interfaces= &&
6786 # We attach and configure each port of the bridge
6887 if [ " $MODE " = " start" ] && [ ! -d /sys/class/net/$IFACE /brif/$port ]; then
6988 create_vlan_port
70- if [ " $IF_BRIDGE_HW " ]
89+ if [ -e " /sys/class/net/ $port " ]
7190 then
72- KVER=" $( uname -r) "
73- LKVER=" ${KVER#* .} "
74- LKVER=" ${LKVER%% -* } "
75- LKVER=" ${LKVER%% .* } "
76- if [ " ${KVER%% .* } " -lt 3 -o " ${KVER%% .* } " -eq 3 -a " $LKVER " -lt 3 ]
91+ if [ " $IF_BRIDGE_HW " ]
7792 then
78- ip link set dev $port address $IF_BRIDGE_HW
93+ KVER=" $( uname -r) "
94+ LKVER=" ${KVER#* .} "
95+ LKVER=" ${LKVER%% -* } "
96+ LKVER=" ${LKVER%% .* } "
97+ if [ " ${KVER%% .* } " -lt 3 -o " ${KVER%% .* } " -eq 3 -a " $LKVER " -lt 3 ]
98+ then
99+ ip link set dev $port address $IF_BRIDGE_HW
100+ fi
79101 fi
102+ if [ -e /proc/sys/net/ipv6/conf/$port ]
103+ then
104+ ip link set $port addrgenmode none
105+ fi
106+ if [ " $IF_MTU " ]
107+ then
108+ ip link set dev $port mtu " $IF_MTU "
109+ fi
110+ brctl addif $IFACE $port && ip link set dev $port up
80111 fi
81- if [ -f /proc/sys/net/ipv6/conf/$port /disable_ipv6 ]
82- then
83- echo 1 > /proc/sys/net/ipv6/conf/$port /disable_ipv6
84- fi
85- if [ " $IF_MTU " ]
86- then
87- ip link set dev $port mtu " $IF_MTU "
88- fi
89- brctl addif $IFACE $port && ip link set dev $port up
90112 # We detach each port of the bridge
91- elif [ " $MODE " = " stop" ] && [ -d /sys/class/net/$IFACE /brif/$port ]; then
113+ elif [ " $MODE " = " stop" -a " $PHASE " = " post-down " ] && [ -d /sys/class/net/$IFACE /brif/$port ]; then
92114 ip link set dev $port down && brctl delif $IFACE $port && destroy_vlan_port
93- if [ -f /proc/sys/net/ipv6/conf/$port /disable_ipv6 ]
94- then
95- echo 0 > /proc/sys/net/ipv6/conf/$port /disable_ipv6
96- fi
97115 fi
98116 done
99117done
@@ -146,6 +164,11 @@ if [ "$MODE" = "start" ] ; then
146164 brctl setfd $IFACE $IF_BRIDGE_FD
147165 fi
148166
167+ if [ " $IF_BRIDGE_TOKEN " ]
168+ then
169+ ip token set $IF_BRIDGE_TOKEN dev $IFACE
170+ fi
171+
149172
150173 # We activate the bridge
151174 ip link set dev $IFACE up
@@ -182,16 +205,15 @@ if [ "$MODE" = "start" ] ; then
182205 # Wait for the bridge to be ready
183206 if [ " $MAXWAIT " != 0 ]
184207 then
185- /bin/echo -e " \nWaiting for $IFACE to get ready (MAXWAIT is $MAXWAIT seconds)."
186-
187208 unset BREADY
188209 unset TRANSITIONED
189210 COUNT=0
211+ MMAXWAIT=$MAXWAIT
190212
191213 # Use 0.1 delay if available
192- sleep 0.1 2> /dev/null && MAXWAIT =$(( MAXWAIT * 10 ))
214+ sleep 0.1 2> /dev/null && MMAXWAIT =$(( MAXWAIT * 10 ))
193215
194- while [ -n " $BREADY " -a $COUNT -lt $MAXWAIT ]
216+ while [ ! " $BREADY " -a $COUNT -lt $MMAXWAIT ]
195217 do
196218 sleep 0.1 2> /dev/null || sleep 1
197219 COUNT=$(( $COUNT + 1 ))
@@ -207,12 +229,15 @@ if [ "$MODE" = "start" ] ; then
207229 unset BREADY
208230 fi
209231 done
232+ if [ ! " $BREADY " -a $COUNT = 2 ]
233+ then
234+ /bin/echo -e " \nWaiting for $IFACE to get ready (MAXWAIT is $MAXWAIT seconds)."
235+ fi
210236 done
211-
212237 fi
213238
214239# Finally we destroy the interface
215- elif [ " $MODE " = " stop" ]; then
240+ elif [ " $MODE " = " stop" -a " $PHASE " = " post-down " ]; then
216241
217242 brctl delbr $IFACE
218243
0 commit comments