xref: /freebsd/libexec/rc/rc.d/defaultroute (revision d52de9a3448f0233a11e0b4de557e403ace71748)
1#!/bin/sh
2#
3# Wait for the default route to be up if DHCPv4 or IPv6 SLAAC is in use
4#
5#
6
7# PROVIDE: defaultroute
8# REQUIRE: devd netif stf
9# KEYWORD: nojailvnet
10
11. /etc/rc.subr
12. /etc/network.subr
13
14name="defaultroute"
15desc="Setup default router"
16start_cmd="defaultroute_start"
17stop_cmd=":"
18
19# Does any interface have a carrier?
20defaultroute_carrier()
21{
22	local carrier nocarrier
23
24	carrier=1
25	for _if in ${dhcp_interfaces} ${autoconf_interfaces}; do
26		output=`/sbin/ifconfig ${_if}`
27		nocarrier=`expr "${output}" : '.*[[:blank:]]status: \(no carrier\)'`
28		[ -z "${nocarrier}" ] && carrier=0
29	done
30	return ${carrier}
31}
32
33defaultroute_start()
34{
35	local have_inet have_inet6 nl waited
36
37	# Check for IPv4/IPv6 support
38	have_inet=0
39	afexists inet  && have_inet=1
40	have_inet6=0
41	afexists inet6 && have_inet6=1
42	[ ${have_inet} -eq 0 ] && [ ${have_inet6} -eq 0 ] && return
43
44	# Return without waiting if we don't have dhcp or autoconf interfaces,
45	# or if none of them is plugged in.
46	[ ${have_inet}  -ne 0 ] && dhcp_interfaces=`list_net_interfaces dhcp`
47	[ ${have_inet6} -ne 0 ] && autoconf_interfaces=`list_net_interfaces autoconf`
48	[ -z "${dhcp_interfaces}" -a -z "${autoconf_interfaces}" ] && return
49
50	# Wait for a default route
51	waited=0
52	while [ ${waited} -lt ${defaultroute_delay} ]; do
53		[ ${have_inet}  -ne 0 ] && defif=`get_default_if -inet`
54		[ ${have_inet6} -ne 0 ] && defif6=`get_default_if -inet6`
55		if [ -n "${defif}" ] || [ -n "${defif6}" ]; then
56			if [ ${waited} -ne 0 ]; then
57				[ -n "${defif}"  ] && echo -n "($defif)=>inet "
58				[ -n "${defif6}" ] && echo -n "($defif6)=>inet6"
59				nl=1
60			fi
61			break
62		fi
63		if [ ${waited} -eq 0 ]; then
64			echo -n "Waiting ${defaultroute_delay}s for the default route interface: "
65		else
66			echo -n .
67		fi
68		if [ ${waited} -eq ${defaultroute_carrier_delay} ] && ! defaultroute_carrier; then
69			echo -n "(no carrier)"
70			break
71		fi
72		nl=1
73		sleep 1
74		waited=$(($waited + 1))
75	done
76
77	[ -n "$nl" ] && echo
78}
79
80load_rc_config $name
81
82# doesn't make sense to run in a svcj: config setting
83defaultroute_svcj="NO"
84
85run_rc_command "$1"
86