freebsd-dev/etc/rc.d/defaultroute
Ed Maste e64241487f /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@
2010-09-29 13:08:23 +00:00

74 lines
1.4 KiB
Bash
Executable File

#!/bin/sh
#
# Wait for the default route to be up if DHCP is in use
#
# $FreeBSD$
#
# PROVIDE: defaultroute
# REQUIRE: devd faith netif stf
# KEYWORD: nojail
. /etc/rc.subr
. /etc/network.subr
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 nl waited
afexists inet || return 0
# Return without waiting if we don't have dhcp interfaces or
# if none of the dhcp interfaces is plugged in.
dhcp_interfaces=`list_net_interfaces dhcp`
[ -z "${dhcp_interfaces}" ] && return
# Wait for a default route
waited=0
while [ ${waited} -lt ${defaultroute_delay} ]; do
defif=`get_default_if -inet`
if [ -n "${defif}" ]; then
if [ ${waited} -ne 0 ]; then
echo -n "($defif)"
nl=1
fi
break
fi
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
waited=$(($waited + 1))
done
[ -n "$nl" ] && echo
}
load_rc_config $name
run_rc_command "$1"