# $netif reads easier than $1
netif=$1
-use_bridge='false'
-use_vlan='false'
-# enslave this interface to bond?
-for i in /tmp/bond.*.info; do
- [ -e "$i" ] || continue
- unset bondslaves
- unset bondname
- . "$i"
- for slave in $bondslaves ; do
- if [ "$netif" = "$slave" ] ; then
- netif=$bondname
- break 2
- fi
- done
-done
-
-if [ -e /tmp/team.info ]; then
- . /tmp/team.info
- for slave in $teamslaves ; do
- if [ "$netif" = "$slave" ] ; then
- netif=$teammaster
- fi
- done
-fi
-
-if [ -e /tmp/vlan.info ]; then
- . /tmp/vlan.info
- if [ "$netif" = "$phydevice" ]; then
- if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then
- : # We need to really setup bond (recursive call)
- elif [ "$netif" = "$teammaster" ] && [ -n "$DO_TEAM_SETUP" ] ; then
- : # We need to really setup team (recursive call)
- else
- netif="$vlanname"
- use_vlan='true'
- fi
- fi
-fi
-
-# bridge this interface?
-if [ -e /tmp/bridge.info ]; then
- . /tmp/bridge.info
- for ethname in $bridgeslaves ; do
- if [ "$netif" = "$ethname" ]; then
- if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then
- : # We need to really setup bond (recursive call)
- elif [ "$netif" = "$teammaster" ] && [ -n "$DO_TEAM_SETUP" ] ; then
- : # We need to really setup team (recursive call)
- elif [ "$netif" = "$vlanname" ] && [ -n "$DO_VLAN_SETUP" ]; then
- : # We need to really setup vlan (recursive call)
- else
- netif="$bridgename"
- use_bridge='true'
- fi
- fi
- done
-fi
-
-# disable manual ifup while netroot is set for simplifying our logic
-# in netroot case we prefer netroot to bringup $netif automaticlly
-[ -n "$2" -a "$2" = "-m" ] && [ -z "$netroot" ] && manualup="$2"
-
-if [ -n "$manualup" ]; then
- >/tmp/net.$netif.manualup
- rm -f /tmp/net.${netif}.did-setup
-else
- [ -e /tmp/net.${netif}.did-setup ] && exit 0
- [ -e /sys/class/net/$netif/address ] && \
- [ -e /tmp/net.$(cat /sys/class/net/$netif/address).did-setup ] && exit 0
+# loopback is always handled the same way
+if [ "$netif" = "lo" ] ; then
+ ip link set lo up
+ ip addr add 127.0.0.1/8 dev lo
+ exit 0
fi
# Run dhclient
return 0
}
-# loopback is always handled the same way
-if [ "$netif" = "lo" ] ; then
- ip link set lo up
- ip addr add 127.0.0.1/8 dev lo
+get_vid() {
+ case "$1" in
+ vlan*)
+ echo ${1#vlan}
+ ;;
+ *.*)
+ echo ${1##*.}
+ ;;
+ esac
+}
+
+# check, if we need VLAN's for this interface
+if [ -z "$DO_VLAN_PHY" ] && [ -e /tmp/vlan.${netif}.phy ]; then
+ NO_AUTO_DHCP=yes DO_VLAN_PHY=yes ifup "$netif"
+ modprobe -b -q 8021q
+
+ for i in /tmp/vlan.*.${netif}; do
+ [ -e "$i" ] || continue
+ read vlanname < "$i"
+ if [ -n "$vlanname" ]; then
+ linkup "$phydevice"
+ ip link add dev "$vlanname" link "$phydevice" type vlan id "$(get_vid $vlanname)"
+ ifup "$vlanname"
+ fi
+ done
exit 0
fi
-# start bond if needed
-if [ -e /tmp/bond.${netif}.info ]; then
- . /tmp/bond.${netif}.info
-
- if [ "$netif" = "$bondname" ] && [ ! -e /tmp/net.$bondname.up ] ; then # We are master bond device
- modprobe bonding
- echo "+$netif" > /sys/class/net/bonding_masters
- ip link set $netif down
-
- # Stolen from ifup-eth
- # add the bits to setup driver parameters here
- for arg in $bondoptions ; do
- key=${arg%%=*};
- value=${arg##*=};
- # %{value:0:1} is replaced with non-bash specific construct
- if [ "${key}" = "arp_ip_target" -a "${#value}" != "0" -a "+${value%%+*}" != "+" ]; then
- OLDIFS=$IFS;
- IFS=',';
- for arp_ip in $value; do
- echo +$arp_ip > /sys/class/net/${netif}/bonding/$key
- done
- IFS=$OLDIFS;
- else
- echo $value > /sys/class/net/${netif}/bonding/$key
+# bridge this interface?
+if [ -z "$NO_BRIDGE_MASTER" ]; then
+ for i in /tmp/bridge.*.info; do
+ [ -e "$i" ] || continue
+ unset bridgeslaves
+ unset bridgename
+ . "$i"
+ for ethname in $bridgeslaves ; do
+ [ "$netif" != "$ethname" ] && continue
+
+ NO_BRIDGE_MASTER=yes NO_AUTO_DHCP=yes ifup $ethname
+ linkup $ethname
+ if [ ! -e /tmp/bridge.$bridgename.up ]; then
+ brctl addbr $bridgename
+ brctl setfd $bridgename 0
+ > /tmp/bridge.$bridgename.up
fi
+ brctl addif $bridgename $ethname
+ ifup $bridgename
+ exit 0
done
+ done
+fi
- linkup $netif
-
+# enslave this interface to bond?
+if [ -z "$NO_BOND_MASTER" ]; then
+ for i in /tmp/bond.*.info; do
+ [ -e "$i" ] || continue
+ unset bondslaves
+ unset bondname
+ . "$i"
for slave in $bondslaves ; do
- ip link set $slave down
- cat /sys/class/net/$slave/address > /tmp/net.${netif}.${slave}.hwaddr
- echo "+$slave" > /sys/class/net/$bondname/bonding/slaves
- linkup $slave
- done
+ [ "$netif" != "$slave" ] && continue
- # add the bits to setup the needed post enslavement parameters
- for arg in $BONDING_OPTS ; do
- key=${arg%%=*};
- value=${arg##*=};
- if [ "${key}" = "primary" ]; then
- echo $value > /sys/class/net/${netif}/bonding/$key
- fi
+ # already setup
+ [ -e /tmp/bond.$bondname.up ] && exit 0
+
+ # wait for all slaves to show up
+ for slave in $bondslaves ; do
+ # try to create the slave (maybe vlan or bridge)
+ NO_BOND_MASTER=yes NO_AUTO_DHCP=yes ifup $slave
+
+ if ! ip link show dev $slave >/dev/null 2>&1; then
+ # wait for the last slave to show up
+ exit 0
+ fi
+ done
+
+ modprobe -q -b bonding
+ echo "+$bondname" > /sys/class/net/bonding_masters 2>/dev/null
+ ip link set $bondname down
+
+ # Stolen from ifup-eth
+ # add the bits to setup driver parameters here
+ for arg in $bondoptions ; do
+ key=${arg%%=*};
+ value=${arg##*=};
+ # %{value:0:1} is replaced with non-bash specific construct
+ if [ "${key}" = "arp_ip_target" -a "${#value}" != "0" -a "+${value%%+*}" != "+" ]; then
+ OLDIFS=$IFS;
+ IFS=',';
+ for arp_ip in $value; do
+ echo +$arp_ip > /sys/class/net/${bondname}/bonding/$key
+ done
+ IFS=$OLDIFS;
+ else
+ echo $value > /sys/class/net/${bondname}/bonding/$key
+ fi
+ done
+
+ linkup $bondname
+
+ for slave in $bondslaves ; do
+ cat /sys/class/net/$slave/address > /tmp/net.${bondname}.${slave}.hwaddr
+ ip link set $slave down
+ echo "+$slave" > /sys/class/net/$bondname/bonding/slaves
+ linkup $slave
+ done
+
+ # add the bits to setup the needed post enslavement parameters
+ for arg in $bondoptions ; do
+ key=${arg%%=*};
+ value=${arg##*=};
+ if [ "${key}" = "primary" ]; then
+ echo $value > /sys/class/net/${bondname}/bonding/$key
+ fi
+ done
+
+ > /tmp/bond.$bondname.up
+
+ NO_BOND_MASTER=yes ifup $bondname
+ exit $?
done
- fi
+ done
fi
-if [ -e /tmp/team.info ]; then
- . /tmp/team.info
- if [ "$netif" = "$teammaster" ] && [ ! -e /tmp/net.$teammaster.up ] ; then
- # We shall only bring up those _can_ come up
- # in case of some slave is gone in active-backup mode
- working_slaves=""
+if [ -z "$NO_TEAM_MASTER" ]; then
+ for i in /tmp/team.*.info; do
+ [ -e "$i" ] || continue
+ unset teammaster
+ unset teamslaves
+ . "$i"
for slave in $teamslaves ; do
- ip link set $slave up 2>/dev/null
- if wait_for_if_up $slave; then
- working_slaves+="$slave "
- fi
- done
- # Do not add slaves now
- teamd -d -U -n -N -t $teammaster -f /etc/teamd/$teammaster.conf
- for slave in $working_slaves; do
- # team requires the slaves to be down before joining team
- ip link set $slave down
- teamdctl $teammaster port add $slave
- done
- ip link set $teammaster up
- fi
-fi
+ [ "$netif" != "$slave" ] && continue
-# XXX need error handling like dhclient-script
+ [ -e /tmp/team.$teammaster.up ] && exit 0
-if [ -e /tmp/bridge.info ]; then
- . /tmp/bridge.info
-# start bridge if necessary
- if [ "$netif" = "$bridgename" ] && [ ! -e /tmp/net.$bridgename.up ]; then
- brctl addbr $bridgename
- brctl setfd $bridgename 0
- for ethname in $bridgeslaves ; do
- if [ "$ethname" = "$bondname" ] ; then
- DO_BOND_SETUP=yes ifup $bondname -m
- elif [ "$ethname" = "$teammaster" ] ; then
- DO_TEAM_SETUP=yes ifup $teammaster -m
- elif [ "$ethname" = "$vlanname" ]; then
- DO_VLAN_SETUP=yes ifup $vlanname -m
- else
- linkup $ethname
+ # wait for all slaves to show up
+ for slave in $teamslaves ; do
+ # try to create the slave (maybe vlan or bridge)
+ NO_BOND_MASTER=yes NO_AUTO_DHCP=yes ifup $slave
+
+ if ! ip link show dev $slave >/dev/null 2>&1; then
+ # wait for the last slave to show up
+ exit 0
+ fi
+ done
+
+ if [ ! -e /tmp/team.$teammaster.up ] ; then
+ # We shall only bring up those _can_ come up
+ # in case of some slave is gone in active-backup mode
+ working_slaves=""
+ for slave in $teamslaves ; do
+ ip link set $slave up 2>/dev/null
+ if wait_for_if_up $slave; then
+ working_slaves+="$slave "
+ fi
+ done
+ # Do not add slaves now
+ teamd -d -U -n -N -t $teammaster -f /etc/teamd/$teammaster.conf
+ for slave in $working_slaves; do
+ # team requires the slaves to be down before joining team
+ ip link set $slave down
+ teamdctl $teammaster port add $slave
+ done
+
+ ip link set $teammaster up
+
+ > /tmp/team.$teammaster.up
+ NO_TEAM_MASTER=yes ifup $teammaster
+ exit $?
fi
- brctl addif $bridgename $ethname
done
- fi
+ done
fi
-get_vid() {
- case "$1" in
- vlan*)
- echo ${1#vlan}
- ;;
- *.*)
- echo ${1##*.}
- ;;
- esac
-}
+# all synthetic interfaces done.. now check if the interface is available
+if ! ip link show dev $netif >/dev/null 2>&1; then
+ exit 1
+fi
-if [ "$netif" = "$vlanname" ] && [ ! -e /tmp/net.$vlanname.up ]; then
- modprobe 8021q
- if [ "$phydevice" = "$bondname" ] ; then
- DO_BOND_SETUP=yes ifup $phydevice -m
- elif [ "$phydevice" = "$teammaster" ] ; then
- DO_TEAM_SETUP=yes ifup $phydevice -m
- else
- linkup "$phydevice"
- fi
- ip link add dev "$vlanname" link "$phydevice" type vlan id "$(get_vid $vlanname)"
- ip link set "$vlanname" up
+# disable manual ifup while netroot is set for simplifying our logic
+# in netroot case we prefer netroot to bringup $netif automaticlly
+[ -n "$2" -a "$2" = "-m" ] && [ -z "$netroot" ] && manualup="$2"
+
+if [ -n "$manualup" ]; then
+ >/tmp/net.$netif.manualup
+ rm -f /tmp/net.${netif}.did-setup
+else
+ [ -e /tmp/net.${netif}.did-setup ] && exit 0
+ [ -e /sys/class/net/$netif/address ] && \
+ [ -e /tmp/net.$(cat /sys/class/net/$netif/address).did-setup ] && exit 0
fi
+
# No ip lines default to dhcp
ip=$(getarg ip)
-if [ -z "$ip" ]; then
+if [ -z "$NO_AUTO_DHCP" ] && [ -z "$ip" ]; then
for s in $(getargs nameserver); do
[ -n "$s" ] || continue
echo nameserver $s >> /tmp/net.$netif.resolv.conf
esac
# If this option isn't directed at our interface, skip it
- [ -n "$dev" ] && [ "$dev" != "$netif" ] && \
- [ "$use_bridge" != 'true' ] && \
- [ "$use_vlan" != 'true' ] && continue
+ [ -n "$dev" ] && [ "$dev" != "$netif" ] && continue
# setup nameserver
for s in "$dns1" "$dns2" $(getargs nameserver); do
fi
done
-# netif isn't the top stack? Then we should exit here.
-# eg. netif is bond0. br0 is on top of it. dhcp br0 is correct but dhcp
-# bond0 doesn't make sense.
-if [ -n "$DO_BOND_SETUP" -o -n "$DO_TEAM_SETUP" -o -n "$DO_VLAN_SETUP" ]; then
- exit 0
-fi
-
# no ip option directed at our interface?
-if [ ! -e /tmp/net.${netif}.up ]; then
+if [ -z "$NO_AUTO_DHCP" ] && [ ! -e /tmp/net.${netif}.up ]; then
if [ -e /tmp/net.bootdev ]; then
BOOTDEV=$(cat /tmp/net.bootdev)
if [ "$netif" = "$BOOTDEV" ] || [ "$BOOTDEV" = "$(cat /sys/class/net/${netif}/address)" ]; then