xref: /freebsd/libexec/rc/rc.d/netif (revision 5bb3134a8c21cb87b30e135ef168483f0333dabb)
1#!/bin/sh
2#
3# Copyright (c) 2003 The FreeBSD Project. All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE PROJECT ``AS IS'' AND ANY EXPRESS OR
15# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17# IN NO EVENT SHALL THE PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT,
18# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24#
25# $FreeBSD$
26#
27
28# PROVIDE: netif
29# REQUIRE: FILESYSTEMS iovctl serial sysctl
30# REQUIRE: hostid
31# KEYWORD: nojailvnet
32
33. /etc/rc.subr
34. /etc/network.subr
35
36name="netif"
37desc="Network interface setup"
38rcvar="${name}_enable"
39start_cmd="netif_start"
40stop_cmd="netif_stop"
41wlanup_cmd="wlan_up"
42wlandown_cmd="wlan_down"
43cloneup_cmd="clone_up"
44clonedown_cmd="clone_down"
45clear_cmd="doclear"
46vnetup_cmd="vnet_up"
47vnetdown_cmd="vnet_down"
48extra_commands="cloneup clonedown clear vnetup vnetdown"
49cmdifn=
50
51set_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces
52set_rcvar_obsolete ipv6_prefer
53
54netif_start()
55{
56	local _if
57
58	# Set the list of interfaces to work on.
59	#
60	cmdifn=$*
61
62	if [ -z "$cmdifn" ]; then
63		#
64		# We're operating as a general network start routine.
65		#
66
67		# disable SIGINT (Ctrl-c) when running at startup
68		trap : 2
69	fi
70
71	# Create IEEE802.11 interface
72	wlan_up $cmdifn
73
74	# Create cloned interfaces
75	clone_up $cmdifn
76
77	# Rename interfaces.
78	ifnet_rename $cmdifn
79
80	# Configure the interface(s).
81	netif_common ifn_start $cmdifn
82
83	if [ -f /etc/rc.d/ipfilter ] ; then
84		# Resync ipfilter
85		/etc/rc.d/ipfilter quietresync
86	fi
87	if [ -f /etc/rc.d/bridge -a -n "$cmdifn" ] ; then
88		/etc/rc.d/bridge start $cmdifn
89	fi
90	if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then
91		for _if in $cmdifn; do
92			/etc/rc.d/routing static any $_if
93		done
94	fi
95}
96
97netif_stop()
98{
99	_clone_down=1
100	_wlan_down=1
101	netif_stop0 $*
102}
103
104doclear()
105{
106	_clone_down=
107	_wlan_down=
108	netif_stop0 $*
109}
110
111netif_stop0()
112{
113	local _if
114
115	# Set the list of interfaces to work on.
116	#
117	cmdifn=$*
118
119	# Deconfigure the interface(s)
120	netif_common ifn_stop $cmdifn
121
122	# Destroy wlan interfaces
123	if [ -n "$_wlan_down" ]; then
124		wlan_down $cmdifn
125	fi
126
127	# Destroy cloned interfaces
128	if [ -n "$_clone_down" ]; then
129		clone_down $cmdifn
130	fi
131
132	if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then
133		for _if in $cmdifn; do
134			/etc/rc.d/routing stop any $_if
135		done
136	fi
137}
138
139vnet_up()
140{
141	cmdifn=$*
142
143	netif_common ifn_vnetup $cmdifn
144}
145
146vnet_down()
147{
148	cmdifn=$*
149
150	netif_common ifn_vnetdown $cmdifn
151}
152
153# netif_common routine
154#	Common configuration subroutine for network interfaces. This
155#	routine takes all the preparatory steps needed for configuriing
156#	an interface and then calls $routine.
157netif_common()
158{
159	local _cooked_list _tmp_list _fail _func _ok _str _cmdifn
160
161	_func=
162
163	if [ -z "$1" ]; then
164		err 1 "netif_common(): No function name specified."
165	else
166		_func="$1"
167		shift
168	fi
169
170	# Set the scope of the command (all interfaces or just one).
171	#
172	_cooked_list=
173	_tmp_list=
174	_cmdifn=$*
175	if [ -n "$_cmdifn" ]; then
176		# Don't check that the interface(s) exist.  We need to run
177		# the down code even when the interface doesn't exist to
178		# kill off wpa_supplicant.
179		# XXXBED: is this really true or does wpa_supplicant die?
180		# if so, we should get rid of the devd entry
181		_cooked_list="$_cmdifn"
182	else
183		_cooked_list="`list_net_interfaces`"
184	fi
185
186	# Expand epair[0-9] to epair[0-9][ab].
187	for ifn in $_cooked_list; do
188	case ${ifn#epair} in
189	[0-9]*[ab])	;;	# Skip epair[0-9]*[ab].
190	[0-9]*)
191		for _str in $_cooked_list; do
192		case $_str in
193		$ifn)	_tmp_list="$_tmp_list ${ifn}a ${ifn}b" ;;
194		*)	_tmp_list="$_tmp_list ${ifn}" ;;
195		esac
196		done
197		_cooked_list=${_tmp_list# }
198	;;
199	esac
200	done
201
202	_dadwait=
203	_fail=
204	_ok=
205	for ifn in ${_cooked_list# }; do
206		# Skip if ifn does not exist.
207		case $_func in
208		ifn_stop)
209			if ! ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
210				warn "$ifn does not exist.  Skipped."
211				_fail="${_fail} ${ifn}"
212				continue
213			fi
214		;;
215		esac
216		if ${_func} ${ifn} $2; then
217			_ok="${_ok} ${ifn}"
218			if ipv6if ${ifn}; then
219				_dadwait=1
220			fi
221		else
222			_fail="${_fail} ${ifn}"
223		fi
224	done
225
226	# inet6 address configuration needs sleep for DAD.
227	case ${_func}:${_dadwait} in
228	ifn_start:1|ifn_vnetup:1|ifn_vnetdown:1)
229		sleep `${SYSCTL_N} net.inet6.ip6.dad_count`
230		sleep 1
231	;;
232	esac
233
234	_str=
235	if [ -n "${_ok}" ]; then
236		case ${_func} in
237		ifn_start)
238			_str='Starting'
239		;;
240		ifn_stop)
241			_str='Stopping'
242		;;
243		ifn_vnetup)
244			_str='Moving'
245		;;
246		ifn_vnetdown)
247			_str='Reclaiming'
248		;;
249		esac
250		echo "${_str} Network:${_ok}."
251		case ${_func} in
252		ifn_vnetup)
253			# Clear _ok not to do "ifconfig $ifn"
254			# because $ifn is no longer in the current vnet.
255			_ok=
256		;;
257		esac
258		if check_startmsgs; then
259			for ifn in ${_ok}; do
260				/sbin/ifconfig ${ifn}
261			done
262		fi
263	fi
264
265	debug "The following interfaces were not configured: $_fail"
266}
267
268# Load the old "network" config file also for compatibility.
269# This is needed for mfsBSD at least.
270load_rc_config network
271load_rc_config $name
272run_rc_command $*
273