1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
#!/bin/sh
Wait_for_carrier ()
{
# $1 = network device
echo -n "Waiting for link to come up on $1... "
ip link set $1 up
for step in $(seq 1 15)
do
carrier=$(cat /sys/class/net/$1/carrier \
2>/dev/null)
case "${carrier}" in
1)
echo -e "\nLink is up"
return
;;
*)
# Counter
echo -n "$step "
;;
esac
sleep 1
done
echo -e "\nError - carrier not detected on $1."
ip link set $1 down
}
Select_eth_device ()
{
# Boot type in initramfs's config
bootconf=$(egrep '^BOOT=' /conf/initramfs.conf | tail -1)
# can be superseded by command line (used by Debian-Live's netboot for example)
for ARGUMENT in ${LIVE_BOOT_CMDLINE}
do
case "${ARGUMENT}" in
netboot=*)
NETBOOT="${ARGUMENT#netboot=}"
;;
esac
done
if [ "$bootconf" != "BOOT=nfs" ] && [ -z "$NETBOOT" ] && [ -z "$FETCH" ] && [ -z "$FTPFS" ] && [ -z "$HTTPFS" ]
then
# Not a net boot : nothing to do
return
fi
# we want to do some basic IP
modprobe -q af_packet
# Ensure all our net modules get loaded so we can actually compare MAC addresses...
udevadm trigger
udevadm settle
# Available Ethernet interfaces ?
l_interfaces=""
# See if we can derive the boot device
Device_from_bootif
if [ -z "$DEVICE" ]
then
echo "Waiting for ethernet card(s) up... If this fails, maybe the ethernet card is not supported by the kernel `uname -r`?"
while [ -z "$l_interfaces" ]
do
l_interfaces="$(cd /sys/class/net/ && ls -d * 2>/dev/null | grep -v "lo")"
done
if [ $(echo $l_interfaces | wc -w) -lt 2 ]
then
# only one interface : no choice
echo "DEVICE=$l_interfaces" >> /conf/param.conf
Wait_for_carrier $l_interfaces
return
fi
# If user force to use specific device, write it
for ARGUMENT in ${LIVE_BOOT_CMDLINE}
do
case "${ARGUMENT}" in
live-netdev=*)
NETDEV="${ARGUMENT#live-netdev=}"
echo "DEVICE=$NETDEV" >> /conf/param.conf
echo "Found live-netdev parameter, forcing to to use network device $NETDEV."
Wait_for_carrier $NETDEV
return
;;
esac
done
else
l_interfaces="$DEVICE"
fi
found_eth_dev=""
while true
do
echo -n "Looking for a connected Ethernet interface ..."
for interface in $l_interfaces
do
# ATTR{carrier} is not set if this is not done
echo -n " $interface ?"
ipconfig -c none -d $interface -t 1 >/dev/null 2>&1
sleep 1
done
echo ''
for step in 1 2 3 4 5
do
for interface in $l_interfaces
do
ip link set $interface up
carrier=$(cat /sys/class/net/$interface/carrier \
2>/dev/null)
# link detected
case "${carrier}" in
1)
echo "Connected $interface found"
# inform initrd's init script :
found_eth_dev="$found_eth_dev $interface"
found_eth_dev="$(echo $found_eth_dev | sed -e "s/^[[:space:]]*//g")"
;;
esac
done
if [ -n "$found_eth_dev" ]
then
echo "DEVICE='$found_eth_dev'" >> /conf/param.conf
return
else
# wait a bit
sleep 1
fi
done
done
}
|