network revision 1.3
1#!/bin/sh
2#
3# $NetBSD: network,v 1.3 2000/03/12 04:21:26 itojun Exp $
4#
5
6# PROVIDE: network
7# REQUIRE: root mountcritlocal tty ipfilter
8
9. /etc/rc.subr
10. /etc/rc.conf
11
12name="network"
13start_cmd="network_start"
14stop_cmd="network_stop"
15
16network_start()
17{
18	# set hostname, turn on network
19	#
20	echo "Starting network."
21
22	# If $hostname is set, use it for my Internet name,
23	# otherwise use /etc/myname
24	#
25	if [ -z "$hostname" -a -f /etc/myname ]; then
26		hostname=`cat /etc/myname`
27	fi
28	if [ -n "$hostname" ]; then
29		echo "Hostname: $hostname"
30		hostname $hostname
31	else
32		warn "\$hostname not set."
33	fi
34
35	# Check $domainname first, then /etc/defaultdomain,
36	# for NIS/YP domain name
37	#
38	if [ -z "$domainname" -a -f /etc/defaultdomain ]; then
39		domainname=`cat /etc/defaultdomain`
40	fi
41	if [ -n "$domainname" ]; then
42		echo "NIS domainname: $domainname"
43		domainname $domainname
44	fi
45
46	# Flush all routes just to make sure it is clean
47	if checkyesno flushroutes; then
48		route -n flush
49	fi
50
51	# Set the address for the first loopback interface, so that the
52	# auto-route from a newly configured interface's address to lo0
53	# works correctly.
54	#
55	# NOTE: obscure networking problems may occur if lo0 isn't configured...
56	#
57	ifconfig lo0 inet 127.0.0.1
58
59	# Configure all of the network interfaces listed in $net_interfaces;
60	# if $auto_ifconfig is YES, grab all interfaces from ifconfig.
61	# In the following, "xxN" stands in for interface names, like "le0".
62	# For any interfaces that has an $ifconfig_xxN variable associated,
63	# we do "ifconfig xxN $ifconfig_xxN".
64	# If there is no such variable, we take the contents of the file
65	# /etc/ifconfig.xxN, and run "ifconfig xxN" repeatedly, using each
66	# line of the file as the arguments for a seperate "ifconfig"
67	# invocation.
68	#
69	# In order to configure an interface reasonably, you at the very least
70	# need to specify "[addr_family] [hostname]" (e.g "inet my.domain.org"),
71	# and probably a netmask (as in "netmask 0xffffffe0"). You will
72	# frequently need to specify a media type, as in "media UTP", for
73	# interface cards with multiple media connections that do not
74	# autoconfigure. See the ifconfig manual page for details.
75	#
76	# Note that /etc/ifconfig.xxN takes multiple lines.  The following
77	# configuration is possible:
78	#	inet 10.1.1.1 netmask 0xffffff00
79	#	inet 10.1.1.2 netmask 0xffffff00 alias
80	#	inet6 fec0::1 prefixlen 64 alias
81	#
82	if [ "$net_interfaces" != NO ]; then
83		if checkyesno auto_ifconfig; then
84			tmp="`ifconfig -l`"
85		else
86			tmp="$net_interfaces"
87		fi
88		echo -n 'Configuring network interfaces:'
89		for int in $tmp; do
90			eval `echo 'args=$ifconfig_'$int`
91			if [ -n "$args" ]; then
92				echo -n " $int"
93				ifconfig $int $args
94			elif [ -f /etc/ifconfig.$int ]; then
95				echo -n " $int"
96				(while read args; do
97					if [ -n "`eval echo '$args'`" ] ; then
98						ifconfig $int $args
99					fi
100				done) < /etc/ifconfig.$int
101			else
102				if ! checkyesno auto_ifconfig; then
103					echo
104					warn \
105			"/etc/ifconfig.$int missing and ifconfig_$int not set;"
106					warn "interface $int not configured."
107				fi
108				continue
109			fi
110			configured_interfaces="$configured_interfaces $int"
111		done
112		echo "."
113	fi
114
115	# Check $defaultroute, then /etc/mygate, for the name of my gateway
116	# host. That name must be in /etc/hosts.
117	#
118	if [ -z "$defaultroute" -a -f /etc/mygate ]; then
119		defaultroute=`cat /etc/mygate`
120	fi
121	if [ -n "$defaultroute" ]; then
122		route add default $defaultroute
123	fi
124
125	# Check if each configured interface xxN has an $ifaliases_xxN variable
126	# associated, then configure additional IP addresses for that interface.
127	# The variable contains a list of "address netmask" pairs, with
128	# "netmask" set to "-" if the interface default netmask is to be used.
129	#
130	# Note that $ifaliases_xxN works only with certain configurations and
131	# considered not recommended.  Use /etc/ifconfig.xxN if possible.
132	# 
133	#
134	if [ -n "$configured_interfaces" ]; then
135		echo "Adding interface aliases:"
136		done_aliases_message=yes
137	fi
138	for int in $configured_interfaces; do
139		eval `echo 'args=$ifaliases_'$int`
140		if [ -n "$args" ]; then
141			set -- $args
142			while [ $# -ge 2 ]; do
143				addr=$1 ; net=$2 ; shift 2
144				if [ "$net" = "-" ]; then
145					ifconfig $int inet alias $addr
146				else
147					ifconfig $int inet alias $addr \
148					    netmask $net
149				fi
150				# Use loopback, not the wire
151				route add $addr 127.0.0.1
152			done
153		fi
154	done
155
156	# /etc/ifaliases, if it exists, contains the names of additional IP
157	# addresses for each interface. It is formatted as a series of lines
158	# that contain
159	#	address interface netmask
160	#
161	# Note that /etc/ifaliases works only with certain cases only and its
162	# use is not recommended.  Use /etc/ifconfig.xxN instead.
163	#
164	#
165	if [ -f /etc/ifaliases ]; then
166	(
167		if [ "$done_aliases_message" != yes ]; then
168			echo "Adding interface aliases:"
169		fi
170		while read addr int net; do
171			if [ -z "$net" ]; then
172				ifconfig $int inet alias $addr
173			else
174				ifconfig $int inet alias $addr netmask $net
175			fi
176			# use loopback, not the wire
177			route add $addr 127.0.0.1
178		done
179	) < /etc/ifaliases
180	fi
181
182	# IPv6
183	# Note that manual configuration can be done in the above, using
184	# ifconfig.
185	#
186	if ifconfig lo0 inet6 >/dev/null 2>&1; then
187		# We have IPv6 support in kernel.
188
189		# disallow scoped unicast dest without outgoing scope
190		# identifiers.
191		#
192		route add -inet6 fe80:: -prefixlen 10 ::1 -reject
193		route add -inet6 fc80:: -prefixlen 10 ::1 -reject
194
195		# disallow "internal" addresses to appear on the wire.
196		#
197		route add -inet6 ::ffff:0.0.0.0 -prefixlen 96 ::1 -reject
198		route add -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject
199
200		# disallow packets to malicious 6to4 prefix
201		#
202		route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject
203		route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject
204		route add -inet6 2002:0000:0000:: -prefixlen 48 ::1 -reject
205		route add -inet6 2002:ffff:ffff:: -prefixlen 48 ::1 -reject
206
207		sysctl -w net.inet6.ip6.forwarding=0 >/dev/null
208		sysctl -w net.inet6.ip6.accept_rtadv=0 >/dev/null
209
210		# backward compatibility
211		#
212		if [ -z "$ip6mode" -a -n "$ip6forwarding" ]; then
213			warn 'Please migrate to newer rc.conf' \
214			    '(use ip6mode, not ip6forwarding)'
215			if checkyesno ip6forwarding; then
216				ip6mode=router
217			else
218				if checkyesno rtsol; then
219					ip6mode=autohost
220				else
221					ip6mode=host
222				fi
223			fi
224		fi
225
226		case $ip6mode in
227		router)
228			echo 'IPv6 mode: router'
229			sysctl -w net.inet6.ip6.forwarding=1 >/dev/null
230			;;
231
232		autohost)
233			echo 'IPv6 mode: autoconfigured host'
234			sysctl -w net.inet6.ip6.accept_rtadv=1 >/dev/null
235			if [ -n "$ip6defaultif" ]; then
236				ndp -I $ip6defaultif
237			fi
238			;;
239
240		host)	
241			echo 'IPv6 mode: host'
242			if [ -n "$ip6defaultif" ]; then
243				ndp -I $ip6defaultif
244			fi
245			;;
246
247		*)	echo 'WARNING: invalid value in ip6mode'
248			;;
249
250		esac
251
252		if checkyesno rtsol; then
253			if [ "$ip6mode" = "autohost" ]; then
254				echo 'Sending router solicitation...'
255				rtsol $rtsol_flags
256			else
257				echo
258				warn \
259			    "ip6mode must be set to 'autohost' to use rtsol."
260			fi
261		fi
262
263		# wait till DAD is completed. always invoke it in case if are
264		# configured manually by ifconfig
265		#
266		dadcount=`sysctl -n net.inet6.ip6.dad_count 2>/dev/null`
267		sleep $dadcount
268		sleep 1
269	fi
270
271	# XXX this must die
272	if [ -s /etc/netstart.local ]; then
273		sh /etc/netstart.local start
274	fi
275}
276
277network_stop()
278{
279	echo "Stopping network."
280
281	# XXX this must die
282	if [ -s /etc/netstart.local ]; then
283		sh /etc/netstart.local stop
284	fi
285
286	rtsolpid=`check_process rtsol`
287	if [ -n "$rtsolpid" ]; then
288		echo "Stopping rtsol (IPv6 router solicitation daemon)."
289		kill -TERM $rtsolpid
290	fi
291
292	echo "Deleting aliases."
293	if [ -f /etc/ifaliases ]; then
294	(
295		while read addr int net; do
296			ifconfig $int inet delete $addr
297		done
298	) < /etc/ifaliases
299	fi
300
301	for int in $configured_interfaces; do
302		eval `echo 'args=$ifaliases_'$int`
303		if [ -n "$args" ]; then
304			set -- $args
305			while [ $# -ge 2 ]; do
306				addr=$1 ; net=$2 ; shift 2
307				ifconfig $int inet delete $addr
308			done
309		fi
310	done
311
312	# down interfaces
313	#
314	echo -n 'Downing network interfaces:'
315	if [ "$net_interfaces" != NO ]; then
316		if checkyesno auto_ifconfig; then
317			tmp="`ifconfig -l`"
318		else
319			tmp="$net_interfaces"
320		fi
321		for int in $tmp; do
322			eval `echo 'args=$ifconfig_'$int`
323			if [ -n "$args" ] || [ -f /etc/ifconfig.$int ]; then
324				echo -n " $int"
325				ifconfig $int down
326			fi
327		done
328		echo "."
329	fi
330
331	# flush routes
332	#
333	route -n flush
334
335}
336
337run_rc_command "$1"
338