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