xref: /dragonfly/etc/rc.d/ip6addrctl (revision 7485684f)
1#!/bin/sh
2#
3# $FreeBSD: head/libexec/rc/rc.d/ip6addrctl 320802 2017-07-08 09:28:31Z kp $
4#
5
6# PROVIDE: ip6addrctl
7# REQUIRE: FILESYSTEMS
8# BEFORE:  NETWORKING
9# KEYWORD: nojail
10
11. /etc/rc.subr
12. /etc/network.subr
13
14name="ip6addrctl"
15desc="configure address selection policy for IPv6 and IPv4"
16rcvar="ip6addrctl_enable"
17start_cmd="ip6addrctl_start"
18stop_cmd="ip6addrctl_stop"
19extra_commands="status prefer_ipv6 prefer_ipv4"
20status_cmd="ip6addrctl"
21prefer_ipv6_cmd="ip6addrctl_prefer_ipv6"
22prefer_ipv4_cmd="ip6addrctl_prefer_ipv4"
23config_file="/etc/ip6addrctl.conf"
24
25IP6ADDRCTL_CMD="/usr/sbin/ip6addrctl"
26
27has_inet6() {
28	${SYSCTL} -q net.inet6 >/dev/null || {
29		warn "kernel does not support INET6"
30		false
31	}
32}
33
34ip6addrctl_prefer_ipv6()
35{
36	has_inet6 || return 0
37
38	${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
39	cat <<EOT | ${IP6ADDRCTL_CMD} install /dev/stdin
40	::1/128		 50	 0
41	::/0		 40	 1
42	::ffff:0:0/96	 35	 4
43	2002::/16	 30	 2
44	2001::/32	  5	 5
45	fc00::/7	  3	13
46	::/96		  1	 3
47	fec0::/10	  1	11
48	3ffe::/16	  1	12
49EOT
50}
51
52ip6addrctl_prefer_ipv4()
53{
54	has_inet6 || return 0
55
56	${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
57	cat <<EOT | ${IP6ADDRCTL_CMD} install /dev/stdin
58	::1/128		 50	 0
59	::/0		 40	 1
60	::ffff:0:0/96	100	 4
61	2002::/16	 30	 2
62	2001::/32	  5	 5
63	fc00::/7	  3	13
64	::/96		  1	 3
65	fec0::/10	  1	11
66	3ffe::/16	  1	12
67EOT
68}
69
70ip6addrctl_start()
71{
72	has_inet6 || return 0
73
74	# Install the policy of the address selection algorithm.
75	case "${ip6addrctl_policy}" in
76	[Aa][Uu][Tt][Oo])
77		if [ -r "${config_file}" -a -s "${config_file}" ]; then
78			${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
79			${IP6ADDRCTL_CMD} install "${config_file}"
80		else
81			if checkyesno ipv6_enable; then
82				ip6addrctl_prefer_ipv6
83			else
84				ip6addrctl_prefer_ipv4
85			fi
86		fi
87		;;
88	ipv4_prefer)
89		ip6addrctl_prefer_ipv4
90		;;
91	ipv6_prefer)
92		ip6addrctl_prefer_ipv6
93		;;
94	[Nn][Oo][Nn][Ee])
95		${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
96		;;
97	*)
98		warn "\$ip6addrctl_policy is invalid: ${ip6addrctl_policy}. " \
99		    " \"ipv4_prefer\" is used instead."
100		ip6addrctl_prefer_ipv4
101		;;
102	esac
103
104	if checkyesno ip6addrctl_verbose; then
105		echo 'Address selection policy table for IPv4 and IPv6:'
106		${IP6ADDRCTL_CMD}
107	fi
108}
109
110ip6addrctl_stop()
111{
112	has_inet6 || return 0
113
114	ip6addrctl flush >/dev/null 2>&1
115}
116
117load_rc_config $name
118run_rc_command "$1"
119