From 2f9a2eee7ea6f622b7c525d5ae88564a0010d169 Mon Sep 17 00:00:00 2001 From: Ulrich Dangel Date: Fri, 26 Jun 2015 14:56:40 +0200 Subject: [PATCH] Support static ip configuration --- components/9990-cmdline-old | 15 +++----- components/9990-networking.sh | 88 ++++++++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 49 deletions(-) diff --git a/components/9990-cmdline-old b/components/9990-cmdline-old index 91c1449..d0659c8 100755 --- a/components/9990-cmdline-old +++ b/components/9990-cmdline-old @@ -51,9 +51,8 @@ Cmdline_old () ;; ethdevice=*) - DEVICE="${_PARAMETER#ethdevice=}" - ETHDEVICE="${DEVICE}" - export DEVICE ETHDEVICE + ETHDEVICE="${_PARAMETER#ethdevice=}" + export ETHDEVICE ;; ethdevice-timeout=*) @@ -110,13 +109,9 @@ Cmdline_old () ;; ip=*) - STATICIP="${_PARAMETER#ip=}" - - if [ -z "${STATICIP}" ] - then - STATICIP="frommedia" - fi - + # copy complete ip=args into staticip, and + # keep multiple uses. + STATICIP="${STATICIP} ${_PARAMETER}" export STATICIP ;; diff --git a/components/9990-networking.sh b/components/9990-networking.sh index 6d73eec..4337aa6 100755 --- a/components/9990-networking.sh +++ b/components/9990-networking.sh @@ -44,7 +44,7 @@ Device_from_bootif () if [ "$bootif_mac" = "$current_mac" ] then - DEVICE=${device##*/} + ETHDEVICE="${device##*/},$ETHDEVICE" # use ethdevice break fi fi @@ -52,6 +52,24 @@ Device_from_bootif () fi } +get_ipconfig_para() +{ + if [ $# != 1 ] ; then + echo "Missin parameter for $0" + return + fi + devname=$1 + for ip in ${STATICIP} ; do + case $ip in + *:$devname:*) + echo $ip + return + ;; + esac + done + echo $devname +} + do_netsetup () { modprobe -q af_packet # For DHCP @@ -62,8 +80,20 @@ do_netsetup () [ -n "$ETHDEV_TIMEOUT" ] || ETHDEV_TIMEOUT=15 echo "Using timeout of $ETHDEV_TIMEOUT seconds for network configuration." - if [ -z "${NETBOOT}" ] && [ -z "${FETCH}" ] && [ -z "${HTTPFS}" ] && [ -z "${FTPFS}" ] - then + # Our modus operandi for getting a working network setup is this: + # * If ip=* is set, pass that to ipconfig and be done + # * Else, try dhcp on all devices in this order: + # ethdevice= bootif= + + ALLDEVICES="$(cd /sys/class/net/ && ls -1 2>/dev/null | grep -v '^lo$' )" + + # Turn on all interfaces before doing anything, to avoid timing problems + # during link negotiation. + echo "Net: Turning on all device links..." + for device in ${ALLDEVICES}; do + ipconfig -c none -d $device -t 1 2>/dev/null >/dev/null + done + # See if we can select the device from BOOTIF Device_from_bootif @@ -73,14 +103,7 @@ do_netsetup () if [ -z "$ETHDEVICE" ] then echo "If you want to boot from a specific device use bootoption ethdevice=..." - for device in /sys/class/net/* - do - dev=${device##*/} - if [ "$dev" != "lo" ] - then - ETHDEVICE="$ETHDEVICE $dev" - fi - done + ETHDEVICE="$ALLDEVICES" fi # split args of ethdevice=eth0,eth1 into "eth0 eth1" @@ -89,42 +112,29 @@ do_netsetup () devlist="$devlist $device" done - # this is tricky (and ugly) because ipconfig sometimes just hangs/runs into - # an endless loop; if execution fails give it two further tries, that's - # why we use '$devlist $devlist $devlist' for the other for loop - for dev in $devlist $devlist $devlist - do - echo "Executing ipconfig -t $ETHDEV_TIMEOUT $dev" - ipconfig -t "$ETHDEV_TIMEOUT" $dev | tee -a /netboot.config & - jobid=$! - sleep "$ETHDEV_TIMEOUT" ; sleep 1 - if [ -r /proc/"$jobid"/status ] - then - echo "Killing job $jobid for device $dev as ipconfig ran into recursion..." - kill -9 $jobid + for dev in $devlist ; do + param="$(get_ipconfig_para $dev)" + if [ -n "$NODHCP" ] && [ "$param" = "$dev" ] ; then + echo "Ignoring network device $dev due to nodhcp." | tee -a /boot.log + continue fi + echo "Executing ipconfig -t $ETHDEV_TIMEOUT $param" + ipconfig -t "$ETHDEV_TIMEOUT" "$param" | tee -a /netboot.config # if configuration of device worked we should have an assigned # IP address, if so let's use the device as $DEVICE for later usage. # simple and primitive approach which seems to work fine - if ifconfig $dev | grep -q 'inet.*addr:' - then - export DEVICE="$dev" - break - fi - done - else - for interface in ${DEVICE}; do - ipconfig -t "$ETHDEV_TIMEOUT" ${interface} | tee /netboot-${interface}.config - - [ -e /run/net-${interface}.conf ] && . /run/net-${interface}.conf - if [ "$IPV4ADDR" != "0.0.0.0" ] - then - break + IPV4ADDR="0.0.0.0" + if [ -e "/run/net-${device}.conf" ]; then + . /run/net-${device}.conf + fi + if [ "${IPV4ADDR}" != "0.0.0.0" ]; then + export DEVICE="$dev $DEVICE" + # break # exit loop as we just use the irst fi done - fi + unset devlist for interface in ${DEVICE} do -- 2.1.4