|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# We don't need to check for ip= errors here, that is handled by the
|
|
|
|
# cmdline parser script
|
|
|
|
#
|
|
|
|
# without $2 means this is for real netroot case
|
|
|
|
# or it is for manually bring up network ie. for kdump scp vmcore
|
|
|
|
PATH=/usr/sbin:/usr/bin:/sbin:/bin
|
|
|
|
|
|
|
|
type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
|
|
|
|
type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh
|
|
|
|
|
|
|
|
# Huh? No $1?
|
|
|
|
[ -z "$1" ] && exit 1
|
|
|
|
|
|
|
|
# $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"
|
|
|
|
[ -z "$netroot" ] && [ -z "$manualup" ] && exit 0
|
|
|
|
if [ -n "$manualup" ]; then
|
|
|
|
>/tmp/net.$netif.manualup
|
|
|
|
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
|
|
|
|
|
|
|
|
# Run dhclient
|
|
|
|
do_dhcp() {
|
|
|
|
# dhclient-script will mark the netif up and generate the online
|
|
|
|
# event for nfsroot
|
|
|
|
# XXX add -V vendor class and option parsing per kernel
|
|
|
|
|
|
|
|
[ -e /tmp/dhclient.$netif.pid ] && return 0
|
|
|
|
|
|
|
|
if ! iface_has_link $netif; then
|
|
|
|
echo "No carrier detected"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
echo "Starting dhcp for interface $netif"
|
|
|
|
dhclient "$@" -1 -q -cf /etc/dhclient.conf -pf /tmp/dhclient.$netif.pid -lf /tmp/dhclient.$netif.lease $netif \
|
|
|
|
|| echo "dhcp failed"
|
|
|
|
}
|
|
|
|
|
|
|
|
load_ipv6() {
|
|
|
|
[ -d /proc/sys/net/ipv6 ] && return
|
|
|
|
modprobe ipv6
|
|
|
|
i=0
|
|
|
|
while [ ! -d /proc/sys/net/ipv6 ]; do
|
|
|
|
i=$(($i+1))
|
|
|
|
[ $i -gt 10 ] && break
|
|
|
|
sleep 0.1
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
do_ipv6auto() {
|
|
|
|
load_ipv6
|
|
|
|
echo 0 > /proc/sys/net/ipv6/conf/$netif/forwarding
|
|
|
|
echo 1 > /proc/sys/net/ipv6/conf/$netif/accept_ra
|
|
|
|
echo 1 > /proc/sys/net/ipv6/conf/$netif/accept_redirects
|
|
|
|
linkup $netif
|
|
|
|
wait_for_ipv6_auto $netif
|
|
|
|
|
|
|
|
[ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname
|
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
# Handle static ip configuration
|
|
|
|
do_static() {
|
Specify strstr tightly, add strglob/strglobin.
By convention, strstr should be a literal string match. Previously, it
would match as a glob pattern. Some code used that, so add new
functions strglob and strglobin to do what that code expects, and
specify them tightly too. strglob tests whether the glob pattern
matches the entire string (the name strglob is also used in the yorick
language, and that's what it does there), while strglobin tests whether
the glob pattern matches anywhere in the string.
Also tightens str_starts, str_ends, and str_replace to deal with
literal strings only. In a quick grep I did not find code that depended
on these functions matching globs.
Changes the call sites where strstr was used with glob patterns to use
strglobin or strglob as the intention seemed to be (or, in one case,
strstr with the * removed as it did not affect the result anyway).
11 years ago
|
|
|
strglobin $ip '*:*:*' && load_ipv6
|
|
|
|
|
|
|
|
linkup $netif
|
|
|
|
[ -n "$macaddr" ] && ip link set address $macaddr dev $netif
|
|
|
|
[ -n "$mtu" ] && ip link set mtu $mtu dev $netif
|
Specify strstr tightly, add strglob/strglobin.
By convention, strstr should be a literal string match. Previously, it
would match as a glob pattern. Some code used that, so add new
functions strglob and strglobin to do what that code expects, and
specify them tightly too. strglob tests whether the glob pattern
matches the entire string (the name strglob is also used in the yorick
language, and that's what it does there), while strglobin tests whether
the glob pattern matches anywhere in the string.
Also tightens str_starts, str_ends, and str_replace to deal with
literal strings only. In a quick grep I did not find code that depended
on these functions matching globs.
Changes the call sites where strstr was used with glob patterns to use
strglobin or strglob as the intention seemed to be (or, in one case,
strstr with the * removed as it did not affect the result anyway).
11 years ago
|
|
|
if strglobin $ip '*:*:*'; then
|
|
|
|
# note no ip addr flush for ipv6
|
|
|
|
ip addr add $ip/$mask ${srv:+peer $srv} dev $netif
|
|
|
|
wait_for_ipv6_dad $netif
|
|
|
|
else
|
|
|
|
ip addr flush dev $netif
|
|
|
|
ip addr add $ip/$mask ${srv:+peer $srv} brd + dev $netif
|
|
|
|
fi
|
|
|
|
|
|
|
|
[ -n "$gw" ] && echo ip route replace default via $gw dev $netif > /tmp/net.$netif.gw
|
|
|
|
[ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname
|
|
|
|
|
|
|
|
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
|
|
|
|
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
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
linkup $netif
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
# 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
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
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=""
|
|
|
|
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
|
|
|
|
|
|
|
|
# XXX need error handling like dhclient-script
|
|
|
|
|
|
|
|
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
|
|
|
|
fi
|
|
|
|
brctl addif $bridgename $ethname
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
get_vid() {
|
|
|
|
case "$1" in
|
|
|
|
vlan*)
|
|
|
|
echo ${1#vlan}
|
|
|
|
;;
|
|
|
|
*.*)
|
|
|
|
echo ${1##*.}
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
fi
|
|
|
|
|
|
|
|
# No ip lines default to dhcp
|
|
|
|
ip=$(getarg ip)
|
|
|
|
|
|
|
|
if [ -z "$ip" ]; then
|
|
|
|
namesrv=$(getargs nameserver)
|
|
|
|
for s in $namesrv; do
|
|
|
|
echo nameserver $s >> /tmp/net.$netif.resolv.conf
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ "$netroot" = "dhcp6" ]; then
|
|
|
|
do_dhcp -6
|
|
|
|
else
|
|
|
|
do_dhcp -4
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Specific configuration, spin through the kernel command line
|
|
|
|
# looking for ip= lines
|
|
|
|
for p in $(getargs ip=); do
|
|
|
|
ip_to_var $p
|
|
|
|
# skip ibft
|
|
|
|
[ "$autoconf" = "ibft" ] && continue
|
|
|
|
|
|
|
|
case "$dev" in
|
|
|
|
??:??:??:??:??:??) # MAC address
|
|
|
|
_dev=$(iface_for_mac $dev)
|
|
|
|
[ -n "$_dev" ] && dev="$_dev"
|
|
|
|
;;
|
|
|
|
??-??-??-??-??-??) # MAC address in BOOTIF form
|
|
|
|
_dev=$(iface_for_mac $(fix_bootif $dev))
|
|
|
|
[ -n "$_dev" ] && dev="$_dev"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# If this option isn't directed at our interface, skip it
|
|
|
|
[ -n "$dev" ] && [ "$dev" != "$netif" ] && \
|
|
|
|
[ "$use_bridge" != 'true' ] && \
|
|
|
|
[ "$use_vlan" != 'true' ] && continue
|
|
|
|
|
|
|
|
# setup nameserver
|
|
|
|
namesrv="$dns1 $dns2 $(getargs nameserver)"
|
|
|
|
for s in $namesrv; do
|
|
|
|
echo nameserver $s >> /tmp/net.$netif.resolv.conf
|
|
|
|
done
|
|
|
|
|
|
|
|
# Store config for later use
|
|
|
|
for i in ip srv gw mask hostname macaddr dns1 dns2; do
|
|
|
|
eval '[ "$'$i'" ] && echo '$i'="$'$i'"'
|
|
|
|
done > /tmp/net.$netif.override
|
|
|
|
|
|
|
|
for autoopt in $(str_replace "$autoconf" "," " "); do
|
|
|
|
case $autoopt in
|
|
|
|
dhcp|on|any)
|
|
|
|
do_dhcp -4 ;;
|
|
|
|
dhcp6)
|
|
|
|
load_ipv6
|
|
|
|
do_dhcp -6 ;;
|
|
|
|
auto6)
|
|
|
|
do_ipv6auto ;;
|
|
|
|
*)
|
|
|
|
do_static ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
> /tmp/net.${netif}.up
|
|
|
|
|
|
|
|
case $autoconf in
|
|
|
|
dhcp|on|any|dhcp6)
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
setup_net $netif
|
|
|
|
source_hook initqueue/online $netif
|
|
|
|
if [ -z "$manualup" ]; then
|
|
|
|
/sbin/netroot $netif
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
exit 0
|
|
|
|
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 getargs 'ip=dhcp6'; then
|
|
|
|
load_ipv6
|
|
|
|
do_dhcp -6
|
|
|
|
else
|
|
|
|
do_dhcp -4
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
exit 0
|