Author: emaste
Date: Wed Sep 29 13:08:23 2010
New Revision: 213270
URL: http://svn.freebsd.org/changeset/base/213270

Log:
  /etc/rc.d/defaultroute currently bails immediately if all interfaces
  set to use DHCP have no carrier.  This can cause grief as it may take
  some time for link to be established, and defaultroute may terminate
  before this happens.
  
  Introduce a defaultroute_carrier_delay variable and then wait that long
  in defaultroute before bailing if no interfaces have carrier.  With the
  default settings defaultroute will wait for five seconds for this, and
  the original 30 second wait for a default route to appear is unchanged.
  Note that there is in discussion an alternative approach to the broader
  problem of waiting for DHCP-configured routes.  However, this change
  addresses a real problem in the current defaultroute script.
  
  Discussed on: freebsd-rc@

Modified:
  head/etc/rc.d/defaultroute

Modified: head/etc/rc.d/defaultroute
==============================================================================
--- head/etc/rc.d/defaultroute  Wed Sep 29 12:53:02 2010        (r213269)
+++ head/etc/rc.d/defaultroute  Wed Sep 29 13:08:23 2010        (r213270)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Wait for the default route to be up
+# Wait for the default route to be up if DHCP is in use
 #
 # $FreeBSD$
 #
@@ -16,9 +16,23 @@ name="defaultroute"
 start_cmd="defaultroute_start"
 stop_cmd=":"
 
+# Does any interface have a carrier?
+defaultroute_carrier()
+{
+       local carrier nocarrier
+
+       carrier=1
+       for _if in ${dhcp_interfaces}; do
+               output=`/sbin/ifconfig ${_if}`
+               nocarrier=`expr "${output}" : '.*[[:blank:]]status: \(no 
carrier\)'`
+               [ -z "${nocarrier}" ] && carrier=0
+       done
+       return ${carrier}
+}
+
 defaultroute_start()
 {
-       local output carrier nocarrier nl
+       local nl waited
 
        afexists inet || return 0
 
@@ -26,35 +40,30 @@ defaultroute_start()
        # if none of the dhcp interfaces is plugged in.
        dhcp_interfaces=`list_net_interfaces dhcp`
        [ -z "${dhcp_interfaces}" ] && return
-       carrier=false
-       for _if in ${dhcp_interfaces}; do
-               output=`/sbin/ifconfig ${_if}`
-               nocarrier=`expr "${output}" : '.*[[:blank:]]status: \(no 
carrier\)'`
-               [ -z "${nocarrier}" ] && carrier=true
-       done
-       if ! ${carrier}; then
-               return
-       fi
 
        # Wait for a default route
-       delay=${defaultroute_delay}
-       while [ ${delay} -gt 0 ]; do
+       waited=0
+       while [ ${waited} -lt ${defaultroute_delay} ]; do
                defif=`get_default_if -inet`
                if [ -n "${defif}" ]; then
-                       if [ ${delay} -ne ${defaultroute_delay} ]; then
+                       if [ ${waited} -ne 0 ]; then
                                echo -n "($defif)"
                                nl=1
                        fi
                        break
                fi
-               if [ ${delay} -eq ${defaultroute_delay} ]; then
-                       echo -n "Waiting ${delay}s for the default route 
interface: "
+               if [ ${waited} -eq 0 ]; then
+                       echo -n "Waiting ${defaultroute_delay}s for the default 
route interface: "
                else
                        echo -n .
                fi
+               if [ ${waited} -eq ${defaultroute_carrier_delay} ] && ! 
defaultroute_carrier; then
+                       echo -n "(no carrier)"
+                       break
+               fi
                nl=1
                sleep 1
-               delay=$(($delay - 1))
+               waited=$(($waited + 1))
        done
 
        [ -n "$nl" ] && echo
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to