summaryrefslogtreecommitdiffstats
path: root/etc
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2010-09-29 13:08:23 +0000
committeremaste <emaste@FreeBSD.org>2010-09-29 13:08:23 +0000
commit0c4cfaf196bd2a404ceace72c44657c50e016f80 (patch)
treeb86d5b0c78ee6aad3d7bbc3257a813c29ccbcfa7 /etc
parentd9c87b0853c67c042a8a1d6b29c69542823e701f (diff)
downloadFreeBSD-src-0c4cfaf196bd2a404ceace72c44657c50e016f80.zip
FreeBSD-src-0c4cfaf196bd2a404ceace72c44657c50e016f80.tar.gz
/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@
Diffstat (limited to 'etc')
-rwxr-xr-xetc/rc.d/defaultroute43
1 files changed, 26 insertions, 17 deletions
diff --git a/etc/rc.d/defaultroute b/etc/rc.d/defaultroute
index 647dc41..ea54c83 100755
--- a/etc/rc.d/defaultroute
+++ b/etc/rc.d/defaultroute
@@ -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
OpenPOWER on IntegriCloud