xref: /freebsd/libexec/rc/rc.d/netif (revision d0b2dbfa)
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#
26
27# PROVIDE: netif
28# REQUIRE: FILESYSTEMS iovctl serial sysctl
29# REQUIRE: hostid
30# KEYWORD: nojailvnet
31
32. /etc/rc.subr
33. /etc/network.subr
34
35name="netif"
36desc="Network interface setup"
37rcvar="${name}_enable"
38start_cmd="netif_start"
39stop_cmd="netif_stop"
40wlanup_cmd="wlan_up"
41wlandown_cmd="wlan_down"
42cloneup_cmd="clone_up"
43clonedown_cmd="clone_down"
44clear_cmd="doclear"
45vnetup_cmd="vnet_up"
46vnetdown_cmd="vnet_down"
47extra_commands="cloneup clonedown clear vnetup vnetdown"
48cmdifn=
49
50set_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces
51set_rcvar_obsolete ipv6_prefer
52
53netif_start()
54{
55	local _if
56
57	# Set the list of interfaces to work on.
58	#
59	cmdifn=$*
60
61	if [ -z "$cmdifn" ]; then
62		#
63		# We're operating as a general network start routine.
64		#
65
66		# disable SIGINT (Ctrl-c) when running at startup
67		trap : 2
68	fi
69
70	# Create IEEE802.11 interface
71	wlan_up $cmdifn
72
73	# Create cloned interfaces
74	clone_up $cmdifn
75
76	# Rename interfaces.
77	ifnet_rename $cmdifn
78
79	# Configure the interface(s).
80	netif_common ifn_start $cmdifn
81
82	if [ -f /etc/rc.d/ipfilter ] ; then
83		# Resync ipfilter
84		/etc/rc.d/ipfilter quietresync
85	fi
86	if [ -f /etc/rc.d/bridge -a -n "$cmdifn" ] ; then
87		/etc/rc.d/bridge start $cmdifn
88	fi
89	if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then
90		for _if in $cmdifn; do
91			/etc/rc.d/routing static any $_if
92		done
93	fi
94}
95
96netif_stop()
97{
98	_clone_down=1
99	_wlan_down=1
100	netif_stop0 $*
101}
102
103doclear()
104{
105	_clone_down=
106	_wlan_down=
107	netif_stop0 $*
108}
109
110netif_stop0()
111{
112	local _if
113
114	# Set the list of interfaces to work on.
115	#
116	cmdifn=$*
117
118	# Deconfigure the interface(s)
119	netif_common ifn_stop $cmdifn
120
121	# Destroy wlan interfaces
122	if [ -n "$_wlan_down" ]; then
123		wlan_down $cmdifn
124	fi
125
126	# Destroy cloned interfaces
127	if [ -n "$_clone_down" ]; then
128		clone_down $cmdifn
129	fi
130
131	if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then
132		for _if in $cmdifn; do
133			/etc/rc.d/routing stop any $_if
134		done
135	fi
136}
137
138vnet_up()
139{
140	cmdifn=$*
141
142	netif_common ifn_vnetup $cmdifn
143}
144
145vnet_down()
146{
147	cmdifn=$*
148
149	netif_common ifn_vnetdown $cmdifn
150}
151
152# netif_common routine
153#	Common configuration subroutine for network interfaces. This
154#	routine takes all the preparatory steps needed for configuriing
155#	an interface and then calls $routine.
156netif_common()
157{
158	local _cooked_list _tmp_list _fail _func _ok _str _cmdifn
159
160	_func=
161
162	if [ -z "$1" ]; then
163		err 1 "netif_common(): No function name specified."
164	else
165		_func="$1"
166		shift
167	fi
168
169	# Set the scope of the command (all interfaces or just one).
170	#
171	_cooked_list=
172	_tmp_list=
173	_cmdifn=$*
174	if [ -n "$_cmdifn" ]; then
175		# Don't check that the interface(s) exist.  We need to run
176		# the down code even when the interface doesn't exist to
177		# kill off wpa_supplicant.
178		# XXXBED: is this really true or does wpa_supplicant die?
179		# if so, we should get rid of the devd entry
180		_cooked_list="$_cmdifn"
181	else
182		_cooked_list="`list_net_interfaces`"
183	fi
184
185	# Expand epair[0-9] to epair[0-9][ab].
186	for ifn in $_cooked_list; do
187	case ${ifn#epair} in
188	[0-9]*[ab])	;;	# Skip epair[0-9]*[ab].
189	[0-9]*)
190		for _str in $_cooked_list; do
191		case $_str in
192		$ifn)	_tmp_list="$_tmp_list ${ifn}a ${ifn}b" ;;
193		*)	_tmp_list="$_tmp_list ${ifn}" ;;
194		esac
195		done
196		_cooked_list=${_tmp_list# }
197	;;
198	esac
199	done
200
201	_dadwait=
202	_fail=
203	_ok=
204	for ifn in ${_cooked_list# }; do
205		# Skip if ifn does not exist.
206		case $_func in
207		ifn_stop)
208			if ! ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
209				warn "$ifn does not exist.  Skipped."
210				_fail="${_fail} ${ifn}"
211				continue
212			fi
213		;;
214		esac
215		if ${_func} ${ifn} $2; then
216			_ok="${_ok} ${ifn}"
217			if ipv6if ${ifn} && [ "${ifn}" != "lo0" ]; then
218				_dadwait=1
219			fi
220		else
221			_fail="${_fail} ${ifn}"
222		fi
223	done
224
225	# inet6 address configuration needs sleep for DAD.
226	case ${_func}:${_dadwait} in
227	ifn_start:1|ifn_vnetup:1|ifn_vnetdown:1)
228		sleep `${SYSCTL_N} net.inet6.ip6.dad_count`
229		sleep 1
230	;;
231	esac
232
233	_str=
234	if [ -n "${_ok}" ]; then
235		case ${_func} in
236		ifn_start)
237			_str='Starting'
238		;;
239		ifn_stop)
240			_str='Stopping'
241		;;
242		ifn_vnetup)
243			_str='Moving'
244		;;
245		ifn_vnetdown)
246			_str='Reclaiming'
247		;;
248		esac
249		startmsg "${_str} Network:${_ok}."
250		case ${_func} in
251		ifn_vnetup)
252			# Clear _ok not to do "ifconfig $ifn"
253			# because $ifn is no longer in the current vnet.
254			_ok=
255		;;
256		esac
257		if check_startmsgs; then
258			for ifn in ${_ok}; do
259				/sbin/ifconfig ${ifn}
260			done
261		fi
262	fi
263
264	debug "The following interfaces were not configured: $_fail"
265}
266
267# Load the old "network" config file also for compatibility.
268# This is needed for mfsBSD at least.
269load_rc_config network
270load_rc_config $name
271run_rc_command $*
272