xref: /freebsd/libexec/rc/rc.d/defaultroute (revision d52de9a3448f0233a11e0b4de557e403ace71748)
10696600cSBjoern A. Zeeb#!/bin/sh
20696600cSBjoern A. Zeeb#
3*d52de9a3SMarek Zarychta# Wait for the default route to be up if DHCPv4 or IPv6 SLAAC is in use
40696600cSBjoern A. Zeeb#
50696600cSBjoern A. Zeeb#
60696600cSBjoern A. Zeeb
70696600cSBjoern A. Zeeb# PROVIDE: defaultroute
80696600cSBjoern A. Zeeb# REQUIRE: devd netif stf
90696600cSBjoern A. Zeeb# KEYWORD: nojailvnet
100696600cSBjoern A. Zeeb
110696600cSBjoern A. Zeeb. /etc/rc.subr
120696600cSBjoern A. Zeeb. /etc/network.subr
130696600cSBjoern A. Zeeb
140696600cSBjoern A. Zeebname="defaultroute"
150696600cSBjoern A. Zeebdesc="Setup default router"
160696600cSBjoern A. Zeebstart_cmd="defaultroute_start"
170696600cSBjoern A. Zeebstop_cmd=":"
180696600cSBjoern A. Zeeb
190696600cSBjoern A. Zeeb# Does any interface have a carrier?
200696600cSBjoern A. Zeebdefaultroute_carrier()
210696600cSBjoern A. Zeeb{
220696600cSBjoern A. Zeeb	local carrier nocarrier
230696600cSBjoern A. Zeeb
240696600cSBjoern A. Zeeb	carrier=1
25*d52de9a3SMarek Zarychta	for _if in ${dhcp_interfaces} ${autoconf_interfaces}; do
260696600cSBjoern A. Zeeb		output=`/sbin/ifconfig ${_if}`
270696600cSBjoern A. Zeeb		nocarrier=`expr "${output}" : '.*[[:blank:]]status: \(no carrier\)'`
280696600cSBjoern A. Zeeb		[ -z "${nocarrier}" ] && carrier=0
290696600cSBjoern A. Zeeb	done
300696600cSBjoern A. Zeeb	return ${carrier}
310696600cSBjoern A. Zeeb}
320696600cSBjoern A. Zeeb
330696600cSBjoern A. Zeebdefaultroute_start()
340696600cSBjoern A. Zeeb{
35*d52de9a3SMarek Zarychta	local have_inet have_inet6 nl waited
360696600cSBjoern A. Zeeb
37*d52de9a3SMarek Zarychta	# Check for IPv4/IPv6 support
38*d52de9a3SMarek Zarychta	have_inet=0
39*d52de9a3SMarek Zarychta	afexists inet  && have_inet=1
40*d52de9a3SMarek Zarychta	have_inet6=0
41*d52de9a3SMarek Zarychta	afexists inet6 && have_inet6=1
42*d52de9a3SMarek Zarychta	[ ${have_inet} -eq 0 ] && [ ${have_inet6} -eq 0 ] && return
430696600cSBjoern A. Zeeb
44*d52de9a3SMarek Zarychta	# Return without waiting if we don't have dhcp or autoconf interfaces,
45*d52de9a3SMarek Zarychta	# or if none of them is plugged in.
46*d52de9a3SMarek Zarychta	[ ${have_inet}  -ne 0 ] && dhcp_interfaces=`list_net_interfaces dhcp`
47*d52de9a3SMarek Zarychta	[ ${have_inet6} -ne 0 ] && autoconf_interfaces=`list_net_interfaces autoconf`
48*d52de9a3SMarek Zarychta	[ -z "${dhcp_interfaces}" -a -z "${autoconf_interfaces}" ] && return
490696600cSBjoern A. Zeeb
500696600cSBjoern A. Zeeb	# Wait for a default route
510696600cSBjoern A. Zeeb	waited=0
520696600cSBjoern A. Zeeb	while [ ${waited} -lt ${defaultroute_delay} ]; do
53*d52de9a3SMarek Zarychta		[ ${have_inet}  -ne 0 ] && defif=`get_default_if -inet`
54*d52de9a3SMarek Zarychta		[ ${have_inet6} -ne 0 ] && defif6=`get_default_if -inet6`
55*d52de9a3SMarek Zarychta		if [ -n "${defif}" ] || [ -n "${defif6}" ]; then
560696600cSBjoern A. Zeeb			if [ ${waited} -ne 0 ]; then
57*d52de9a3SMarek Zarychta				[ -n "${defif}"  ] && echo -n "($defif)=>inet "
58*d52de9a3SMarek Zarychta				[ -n "${defif6}" ] && echo -n "($defif6)=>inet6"
590696600cSBjoern A. Zeeb				nl=1
600696600cSBjoern A. Zeeb			fi
610696600cSBjoern A. Zeeb			break
620696600cSBjoern A. Zeeb		fi
630696600cSBjoern A. Zeeb		if [ ${waited} -eq 0 ]; then
640696600cSBjoern A. Zeeb			echo -n "Waiting ${defaultroute_delay}s for the default route interface: "
650696600cSBjoern A. Zeeb		else
660696600cSBjoern A. Zeeb			echo -n .
670696600cSBjoern A. Zeeb		fi
680696600cSBjoern A. Zeeb		if [ ${waited} -eq ${defaultroute_carrier_delay} ] && ! defaultroute_carrier; then
690696600cSBjoern A. Zeeb			echo -n "(no carrier)"
700696600cSBjoern A. Zeeb			break
710696600cSBjoern A. Zeeb		fi
720696600cSBjoern A. Zeeb		nl=1
730696600cSBjoern A. Zeeb		sleep 1
740696600cSBjoern A. Zeeb		waited=$(($waited + 1))
750696600cSBjoern A. Zeeb	done
760696600cSBjoern A. Zeeb
770696600cSBjoern A. Zeeb	[ -n "$nl" ] && echo
780696600cSBjoern A. Zeeb}
790696600cSBjoern A. Zeeb
800696600cSBjoern A. Zeebload_rc_config $name
81f99f0ee1SAlexander Leidinger
82f99f0ee1SAlexander Leidinger# doesn't make sense to run in a svcj: config setting
83f99f0ee1SAlexander Leidingerdefaultroute_svcj="NO"
84f99f0ee1SAlexander Leidinger
850696600cSBjoern A. Zeebrun_rc_command "$1"
86