xref: /freebsd/libexec/rc/rc.d/ip6addrctl (revision 0696600c41600d80bcd993bfd8e675d0ae6951fe)
1*0696600cSBjoern A. Zeeb#!/bin/sh
2*0696600cSBjoern A. Zeeb#
3*0696600cSBjoern A. Zeeb# $FreeBSD$
4*0696600cSBjoern A. Zeeb#
5*0696600cSBjoern A. Zeeb
6*0696600cSBjoern A. Zeeb# PROVIDE: ip6addrctl
7*0696600cSBjoern A. Zeeb# REQUIRE: FILESYSTEMS
8*0696600cSBjoern A. Zeeb# BEFORE: netif
9*0696600cSBjoern A. Zeeb# KEYWORD: nojailvnet
10*0696600cSBjoern A. Zeeb
11*0696600cSBjoern A. Zeeb. /etc/rc.subr
12*0696600cSBjoern A. Zeeb. /etc/network.subr
13*0696600cSBjoern A. Zeeb
14*0696600cSBjoern A. Zeebname="ip6addrctl"
15*0696600cSBjoern A. Zeebdesc="configure address selection policy for IPv6 and IPv4"
16*0696600cSBjoern A. Zeebrcvar="ip6addrctl_enable"
17*0696600cSBjoern A. Zeebstart_cmd="ip6addrctl_start"
18*0696600cSBjoern A. Zeebstop_cmd="ip6addrctl_stop"
19*0696600cSBjoern A. Zeebextra_commands="status prefer_ipv6 prefer_ipv4"
20*0696600cSBjoern A. Zeebstatus_cmd="ip6addrctl"
21*0696600cSBjoern A. Zeebprefer_ipv6_cmd="ip6addrctl_prefer_ipv6"
22*0696600cSBjoern A. Zeebprefer_ipv4_cmd="ip6addrctl_prefer_ipv4"
23*0696600cSBjoern A. Zeebconfig_file="/etc/ip6addrctl.conf"
24*0696600cSBjoern A. Zeeb
25*0696600cSBjoern A. Zeebset_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces
26*0696600cSBjoern A. Zeebset_rcvar_obsolete ipv6_prefer ip6addrctl_policy
27*0696600cSBjoern A. Zeeb
28*0696600cSBjoern A. ZeebIP6ADDRCTL_CMD="/usr/sbin/ip6addrctl"
29*0696600cSBjoern A. Zeeb
30*0696600cSBjoern A. Zeebip6addrctl_prefer_ipv6()
31*0696600cSBjoern A. Zeeb{
32*0696600cSBjoern A. Zeeb	afexists inet6 || return 0
33*0696600cSBjoern A. Zeeb
34*0696600cSBjoern A. Zeeb	${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
35*0696600cSBjoern A. Zeeb	cat <<EOT | ${IP6ADDRCTL_CMD} install /dev/stdin
36*0696600cSBjoern A. Zeeb	::1/128		 50	 0
37*0696600cSBjoern A. Zeeb	::/0		 40	 1
38*0696600cSBjoern A. Zeeb	::ffff:0:0/96	 35	 4
39*0696600cSBjoern A. Zeeb	2002::/16	 30	 2
40*0696600cSBjoern A. Zeeb	2001::/32	  5	 5
41*0696600cSBjoern A. Zeeb	fc00::/7	  3	13
42*0696600cSBjoern A. Zeeb	::/96		  1	 3
43*0696600cSBjoern A. Zeeb	fec0::/10	  1	11
44*0696600cSBjoern A. Zeeb	3ffe::/16	  1	12
45*0696600cSBjoern A. ZeebEOT
46*0696600cSBjoern A. Zeeb}
47*0696600cSBjoern A. Zeeb
48*0696600cSBjoern A. Zeebip6addrctl_prefer_ipv4()
49*0696600cSBjoern A. Zeeb{
50*0696600cSBjoern A. Zeeb	afexists inet6 || return 0
51*0696600cSBjoern A. Zeeb
52*0696600cSBjoern A. Zeeb	${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
53*0696600cSBjoern A. Zeeb	cat <<EOT | ${IP6ADDRCTL_CMD} install /dev/stdin
54*0696600cSBjoern A. Zeeb	::1/128		 50	 0
55*0696600cSBjoern A. Zeeb	::/0		 40	 1
56*0696600cSBjoern A. Zeeb	::ffff:0:0/96	100	 4
57*0696600cSBjoern A. Zeeb	2002::/16	 30	 2
58*0696600cSBjoern A. Zeeb	2001::/32	  5	 5
59*0696600cSBjoern A. Zeeb	fc00::/7	  3	13
60*0696600cSBjoern A. Zeeb	::/96		  1	 3
61*0696600cSBjoern A. Zeeb	fec0::/10	  1	11
62*0696600cSBjoern A. Zeeb	3ffe::/16	  1	12
63*0696600cSBjoern A. ZeebEOT
64*0696600cSBjoern A. Zeeb}
65*0696600cSBjoern A. Zeeb
66*0696600cSBjoern A. Zeebip6addrctl_start()
67*0696600cSBjoern A. Zeeb{
68*0696600cSBjoern A. Zeeb	afexists inet6 || return 0
69*0696600cSBjoern A. Zeeb
70*0696600cSBjoern A. Zeeb	# install the policy of the address selection algorithm.
71*0696600cSBjoern A. Zeeb	case "${ip6addrctl_policy}" in
72*0696600cSBjoern A. Zeeb	[Aa][Uu][Tt][Oo])
73*0696600cSBjoern A. Zeeb		if [ -r "${config_file}" -a -s "${config_file}" ]; then
74*0696600cSBjoern A. Zeeb			${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
75*0696600cSBjoern A. Zeeb			${IP6ADDRCTL_CMD} install "${config_file}"
76*0696600cSBjoern A. Zeeb		else
77*0696600cSBjoern A. Zeeb			if checkyesno ipv6_activate_all_interfaces; then
78*0696600cSBjoern A. Zeeb				ip6addrctl_prefer_ipv6
79*0696600cSBjoern A. Zeeb			elif [ -n "$(list_vars ifconfig_\*_ipv6)" ]; then
80*0696600cSBjoern A. Zeeb				ip6addrctl_prefer_ipv6
81*0696600cSBjoern A. Zeeb			else
82*0696600cSBjoern A. Zeeb				ip6addrctl_prefer_ipv4
83*0696600cSBjoern A. Zeeb			fi
84*0696600cSBjoern A. Zeeb		fi
85*0696600cSBjoern A. Zeeb	;;
86*0696600cSBjoern A. Zeeb	ipv4_prefer)
87*0696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv4
88*0696600cSBjoern A. Zeeb	;;
89*0696600cSBjoern A. Zeeb	ipv6_prefer)
90*0696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv6
91*0696600cSBjoern A. Zeeb	;;
92*0696600cSBjoern A. Zeeb	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
93*0696600cSBjoern A. Zeeb		# Backward compatibility when ipv6_prefer=YES
94*0696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv6
95*0696600cSBjoern A. Zeeb	;;
96*0696600cSBjoern A. Zeeb	[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0)
97*0696600cSBjoern A. Zeeb		# Backward compatibility when ipv6_prefer=NO
98*0696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv4
99*0696600cSBjoern A. Zeeb	;;
100*0696600cSBjoern A. Zeeb	[Nn][Oo][Nn][Ee])
101*0696600cSBjoern A. Zeeb		${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
102*0696600cSBjoern A. Zeeb	;;
103*0696600cSBjoern A. Zeeb	*)
104*0696600cSBjoern A. Zeeb		warn "\$ip6addrctl_policy is invalid: ${ip6addrctl_policy}. " \
105*0696600cSBjoern A. Zeeb		    " \"ipv4_prefer\" is used instead."
106*0696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv4
107*0696600cSBjoern A. Zeeb	;;
108*0696600cSBjoern A. Zeeb	esac
109*0696600cSBjoern A. Zeeb
110*0696600cSBjoern A. Zeeb	if checkyesno ip6addrctl_verbose; then
111*0696600cSBjoern A. Zeeb		echo 'Address selection policy table for IPv4 and IPv6:'
112*0696600cSBjoern A. Zeeb		${IP6ADDRCTL_CMD}
113*0696600cSBjoern A. Zeeb	fi
114*0696600cSBjoern A. Zeeb}
115*0696600cSBjoern A. Zeeb
116*0696600cSBjoern A. Zeebip6addrctl_stop()
117*0696600cSBjoern A. Zeeb{
118*0696600cSBjoern A. Zeeb	afexists inet6 || return 0
119*0696600cSBjoern A. Zeeb
120*0696600cSBjoern A. Zeeb	ip6addrctl flush >/dev/null 2>&1
121*0696600cSBjoern A. Zeeb}
122*0696600cSBjoern A. Zeeb
123*0696600cSBjoern A. Zeebload_rc_config $name
124*0696600cSBjoern A. Zeebrun_rc_command "$1"
125