routing revision 273188
1#!/bin/sh
2#
3# Configure routing and miscellaneous network tunables
4#
5# $FreeBSD: releng/10.1/etc/rc.d/routing 273188 2014-10-16 22:00:24Z hrs $
6#
7
8# PROVIDE: routing
9# REQUIRE: faith netif ppp stf
10# KEYWORD: nojailvnet
11
12. /etc/rc.subr
13. /etc/network.subr
14
15name="routing"
16start_cmd="routing_start doall"
17stop_cmd="routing_stop"
18extra_commands="options static"
19static_cmd="routing_start static"
20options_cmd="routing_start options"
21
22ROUTE_CMD="/sbin/route"
23
24routing_start()
25{
26	local _cmd _af _if _a _ret
27	_cmd=$1
28	_af=$2
29	_if=$3
30	_ret=0
31
32	case $_if in
33	""|[Aa][Ll][Ll]|[Aa][Nn][Yy])	_if="" ;;
34	esac
35
36	case $_af in
37	""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
38		for _a in inet inet6 atm; do
39			afexists $_a || continue
40			setroutes $_cmd $_a $_if || _ret=1
41		done
42	;;
43	*)
44		if afexists $_af; then
45			setroutes $_cmd $_af $_if || _ret=1
46		else
47			err 1 "Unsupported address family: $_af."
48		fi
49	;;
50	esac
51
52	return $_ret
53}
54
55routing_stop()
56{
57	local _af _if _a
58	_af=$1
59	_if=$2
60
61	case $_if in
62	""|[Aa][Ll][Ll]|[Aa][Nn][Yy])	_if="" ;;
63	esac
64
65	case $_af in
66	""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
67		for _a in inet inet6 ipx atm; do
68			afexists $_a || continue
69			eval static_${_a} delete $_if
70			# When $_if is specified, do not flush routes.
71			if ! [ -n "$_if" ]; then
72				eval routing_stop_${_a}
73			fi
74		done
75	;;
76	*)
77		if afexists $_af; then
78			eval static_${_af} delete $_if 
79			# When $_if is specified, do not flush routes.
80			if ! [ -n "$_if" ]; then
81				eval routing_stop_${_af}
82			fi
83		else
84			err 1 "Unsupported address family: $_af."
85		fi
86	;;
87	esac
88}
89
90setroutes()
91{
92	case $1 in
93	static)
94		static_$2 add $3
95		;;
96	options)
97		options_$2
98		;;
99	doall)
100		static_$2 add $3
101		options_$2
102		;;
103	esac
104}
105
106routing_stop_inet()
107{
108	${ROUTE_CMD} -n flush -inet
109}
110
111routing_stop_inet6()
112{
113	local i
114
115	${ROUTE_CMD} -n flush -inet6
116	for i in `list_net_interfaces`; do
117		if ipv6if $i; then
118			ifconfig $i inet6 -defaultif
119		fi
120	done
121}
122
123routing_stop_atm()
124{
125	return 0
126}
127
128routing_stop_ipx()
129{
130	return 0
131}
132
133static_inet()
134{
135	local _action _if _skip
136	_action=$1
137	_if=$2
138
139	# Add default route.
140	case ${defaultrouter} in
141	[Nn][Oo] | '')
142		;;
143	*)
144		static_routes="${static_routes} _default"
145		route__default="default ${defaultrouter}"
146		;;
147	esac
148
149	# Install configured routes.
150	if [ -n "${static_routes}" ]; then
151		for i in ${static_routes}; do
152			_skip=0
153			if [ -n "$_if" ]; then
154				case $i in
155				*:$_if)	;;
156				*)	_skip=1 ;;
157				esac
158			fi
159			if [ $_skip = 0 ]; then
160				route_args=`get_if_var ${i%:*} route_IF`
161				if [ -n "$route_args" ]; then
162					${ROUTE_CMD} ${_action} ${route_args}
163				else
164					warn "route_${i%:*} not found."
165				fi
166			fi
167		done
168	fi
169}
170
171static_inet6()
172{
173	local _action _if _skip fibmod fibs
174	_action=$1
175	_if=$2
176
177	# get the number of FIBs supported.
178	fibs=$((`${SYSCTL_N} net.fibs` - 1))
179	if [ "$fibs" -gt 0 ]; then
180		fibmod="-fib 0-$fibs"
181	else
182		fibmod=
183	fi
184
185	# Add pre-defined static routes first.
186	ipv6_static_routes="_v4mapped _v4compat ${ipv6_static_routes}"
187	ipv6_static_routes="_lla _llma ${ipv6_static_routes}"
188
189	# disallow "internal" addresses to appear on the wire
190	ipv6_route__v4mapped="::ffff:0.0.0.0 -prefixlen 96 ::1 -reject ${fibmod}"
191	ipv6_route__v4compat="::0.0.0.0 -prefixlen 96 ::1 -reject ${fibmod}"
192
193	# Disallow link-local unicast packets without outgoing scope
194	# identifiers.  However, if you set "ipv6_default_interface",
195	# for the host case, you will allow to omit the identifiers.
196	# Under this configuration, the packets will go to the default
197	# interface.
198	ipv6_route__lla="fe80:: -prefixlen 10 ::1 -reject ${fibmod}"
199	ipv6_route__llma="ff02:: -prefixlen 16 ::1 -reject ${fibmod}"
200
201	# Add default route.
202	case ${ipv6_defaultrouter} in
203	[Nn][Oo] | '')
204		;;
205	*)
206		ipv6_static_routes="${ipv6_static_routes} _default"
207		ipv6_route__default="default ${ipv6_defaultrouter}"
208		;;
209	esac
210
211	# Install configured routes.
212	if [ -n "${ipv6_static_routes}" ]; then
213		for i in ${ipv6_static_routes}; do
214			_skip=0
215			if [ -n "$_if" ]; then
216				case $i in
217				*:$_if)	;;
218				*)	_skip=1 ;;
219				esac
220			fi
221			if [ $_skip = 0 ]; then
222				ipv6_route_args=`get_if_var ${i%:*} ipv6_route_IF`
223				if [ -n "$ipv6_route_args" ]; then
224					${ROUTE_CMD} ${_action} \
225						-inet6 ${ipv6_route_args}
226				else
227					warn "route_${i%:*} not found"
228				fi
229			fi
230		done
231	fi
232
233	# Install the "default interface" to kernel, which will be used
234	# as the default route when there's no router.
235
236	# Disable installing the default interface when we act
237	# as router to avoid conflict between the default
238	# router list and the manual configured default route.
239	if checkyesno ipv6_gateway_enable; then
240		return
241	fi
242
243	case "${ipv6_default_interface}" in
244	[Nn][Oo] | [Nn][Oo][Nn][Ee])
245		return
246		;;
247	[Aa][Uu][Tt][Oo] | "")
248		for i in ${ipv6_network_interfaces}; do
249			case $i in
250			[Nn][Oo][Nn][Ee])
251				return
252				;;
253			lo0|faith[0-9]*)
254				continue
255				;;
256			esac
257			laddr=`network6_getladdr $i exclude_tentative`
258			case ${laddr} in
259			'')
260				;;
261			*)
262				ipv6_default_interface=$i
263				break
264				;;
265			esac
266		done
267		;;
268	esac
269
270	ifconfig ${ipv6_default_interface} inet6 defaultif
271	sysctl net.inet6.ip6.use_defaultzone=1
272}
273
274static_atm()
275{
276	local _action i route_args
277	_action=$1
278
279	if [ -n "${natm_static_routes}" ]; then
280		for i in ${natm_static_routes}; do
281			route_args=`get_if_var $i route_IF`
282			if [ -n "$route_args" ]; then
283				atmconfig natm ${_action} ${route_args}
284			else
285				warn "route_${i} not found."
286			fi
287		done
288	fi
289}
290
291static_ipx()
292{
293	:
294}
295
296ropts_init()
297{
298	if [ -z "${_ropts_initdone}" ]; then
299		echo -n "Additional $1 routing options:"
300		_ropts_initdone=yes
301	fi
302}
303
304options_inet()
305{
306	_ropts_initdone=
307	if checkyesno icmp_bmcastecho; then
308		ropts_init inet
309		echo -n ' broadcast ping responses=YES'
310		${SYSCTL} net.inet.icmp.bmcastecho=1 > /dev/null
311	else
312		${SYSCTL} net.inet.icmp.bmcastecho=0 > /dev/null
313	fi
314
315	if checkyesno icmp_drop_redirect; then
316		ropts_init inet
317		echo -n ' ignore ICMP redirect=YES'
318		${SYSCTL} net.inet.icmp.drop_redirect=1 > /dev/null
319	else
320		${SYSCTL} net.inet.icmp.drop_redirect=0 > /dev/null
321	fi
322
323	if checkyesno icmp_log_redirect; then
324		ropts_init inet
325		echo -n ' log ICMP redirect=YES'
326		${SYSCTL} net.inet.icmp.log_redirect=1 > /dev/null
327	else
328		${SYSCTL} net.inet.icmp.log_redirect=0 > /dev/null
329	fi
330
331	if checkyesno gateway_enable; then
332		ropts_init inet
333		echo -n ' gateway=YES'
334		${SYSCTL} net.inet.ip.forwarding=1 > /dev/null
335	else
336		${SYSCTL} net.inet.ip.forwarding=0 > /dev/null
337	fi
338
339	if checkyesno forward_sourceroute; then
340		ropts_init inet
341		echo -n ' do source routing=YES'
342		${SYSCTL} net.inet.ip.sourceroute=1 > /dev/null
343	else
344		${SYSCTL} net.inet.ip.sourceroute=0 > /dev/null
345	fi
346
347	if checkyesno accept_sourceroute; then
348		ropts_init inet
349		echo -n ' accept source routing=YES'
350		${SYSCTL} net.inet.ip.accept_sourceroute=1 > /dev/null
351	else
352		${SYSCTL} net.inet.ip.accept_sourceroute=0 > /dev/null
353	fi
354
355	if checkyesno arpproxy_all; then
356		ropts_init inet
357		echo -n ' ARP proxyall=YES'
358		${SYSCTL} net.link.ether.inet.proxyall=1 > /dev/null
359	else
360		${SYSCTL} net.link.ether.inet.proxyall=0 > /dev/null
361	fi
362
363	[ -n "${_ropts_initdone}" ] && echo '.'
364}
365
366options_inet6()
367{
368	_ropts_initdone=
369
370	if checkyesno ipv6_gateway_enable; then
371		ropts_init inet6
372		echo -n ' gateway=YES'
373		${SYSCTL} net.inet6.ip6.forwarding=1 > /dev/null
374	else
375		${SYSCTL} net.inet6.ip6.forwarding=0 > /dev/null
376	fi
377
378	[ -n "${_ropts_initdone}" ] && echo '.'
379}
380
381options_atm()
382{
383	_ropts_initdone=
384
385	[ -n "${_ropts_initdone}" ] && echo '.'
386}
387
388options_ipx()
389{
390	_ropts_initdone=
391
392	if checkyesno ipxgateway_enable; then
393		ropts_init ipx
394		echo -n ' gateway=YES'
395		${SYSCTL} net.ipx.ipx.ipxforwarding=1 > /dev/null
396	else
397		${SYSCTL} net.ipx.ipx.ipxforwarding=0 > /dev/null
398	fi
399
400	[ -n "${_ropts_initdone}" ] && echo '.'
401}
402
403load_rc_config $name
404run_rc_command "$@"
405