e64241487f
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@
74 lines
1.4 KiB
Bash
Executable File
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"
|