1121749Sume#!/bin/sh
2121749Sume#
3121749Sume# $FreeBSD$
4121749Sume#
5121749Sume
6121749Sume# PROVIDE: ip6addrctl
7197139Shrs# REQUIRE: FILESYSTEMS
8197139Shrs# BEFORE: netif
9136224Smtm# KEYWORD: nojail
10121749Sume
11121749Sume. /etc/rc.subr
12197697Shrs. /etc/network.subr
13121749Sume
14121749Sumename="ip6addrctl"
15230099Sdougbrcvar="ip6addrctl_enable"
16121749Sumestart_cmd="ip6addrctl_start"
17129994Sumestop_cmd="ip6addrctl_stop"
18129994Sumeextra_commands="status prefer_ipv6 prefer_ipv4"
19129994Sumestatus_cmd="ip6addrctl"
20129994Sumeprefer_ipv6_cmd="ip6addrctl_prefer_ipv6"
21129994Sumeprefer_ipv4_cmd="ip6addrctl_prefer_ipv4"
22212579Shrsconfig_file="/etc/ip6addrctl.conf"
23121749Sume
24212579Shrsset_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces
25212579Shrsset_rcvar_obsolete ipv6_prefer ip6addrctl_policy
26212574Shrs
27250240ShrsIP6ADDRCTL_CMD="/usr/sbin/ip6addrctl"
28250240Shrs
29129994Sumeip6addrctl_prefer_ipv6()
30129994Sume{
31197697Shrs	afexists inet6 || return 0
32197697Shrs
33250240Shrs	${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
34250240Shrs	cat <<EOT | ${IP6ADDRCTL_CMD} install /dev/stdin
35250240Shrs	::1/128		 50	 0
36250240Shrs	::/0		 40	 1
37250240Shrs	::ffff:0:0/96	 35	 4
38250240Shrs	2002::/16	 30	 2
39250240Shrs	2001::/32	  5	 5
40250240Shrs	fc00::/7	  3	13
41250240Shrs	::/96		  1	 3
42250240Shrs	fec0::/10	  1	11
43250240Shrs	3ffe::/16	  1	12
44250240ShrsEOT
45129994Sume}
46129994Sume
47129994Sumeip6addrctl_prefer_ipv4()
48129994Sume{
49197697Shrs	afexists inet6 || return 0
50197697Shrs
51250240Shrs	${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
52250240Shrs	cat <<EOT | ${IP6ADDRCTL_CMD} install /dev/stdin
53250240Shrs	::1/128		 50	 0
54250240Shrs	::/0		 40	 1
55250240Shrs	::ffff:0:0/96	100	 4
56250240Shrs	2002::/16	 30	 2
57250240Shrs	2001::/32	  5	 5
58250240Shrs	fc00::/7	  3	13
59250240Shrs	::/96		  1	 3
60250240Shrs	fec0::/10	  1	11
61250240Shrs	3ffe::/16	  1	12
62250240ShrsEOT
63129994Sume}
64129994Sume
65121749Sumeip6addrctl_start()
66121749Sume{
67197697Shrs	afexists inet6 || return 0
68121749Sume
69197697Shrs	# install the policy of the address selection algorithm.
70212579Shrs	case "${ip6addrctl_policy}" in
71212579Shrs	[Aa][Uu][Tt][Oo])
72212579Shrs		if [ -r "${config_file}" -a -s "${config_file}" ]; then
73250240Shrs			${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
74250240Shrs			${IP6ADDRCTL_CMD} install "${config_file}"
75129994Sume		else
76212579Shrs			if checkyesno ipv6_activate_all_interfaces; then
77212579Shrs				ip6addrctl_prefer_ipv6
78272864Shrs			elif [ -n "$(list_vars ifconfig_\*_ipv6)" ]; then
79272864Shrs				ip6addrctl_prefer_ipv6
80212579Shrs			else
81212579Shrs				ip6addrctl_prefer_ipv4
82212579Shrs			fi
83121749Sume		fi
84212579Shrs	;;
85212579Shrs	ipv4_prefer)
86212579Shrs		ip6addrctl_prefer_ipv4
87212579Shrs	;;
88212579Shrs	ipv6_prefer)
89212579Shrs		ip6addrctl_prefer_ipv6
90212579Shrs	;;
91212579Shrs	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
92212579Shrs		# Backward compatibility when ipv6_prefer=YES
93212579Shrs		ip6addrctl_prefer_ipv6
94212579Shrs	;;
95212579Shrs	[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0)
96212579Shrs		# Backward compatibility when ipv6_prefer=NO
97212579Shrs		ip6addrctl_prefer_ipv4
98212579Shrs	;;
99238622Semax	[Nn][Oo][Nn][Ee])
100250240Shrs		${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
101238622Semax	;;
102212579Shrs	*)
103212579Shrs		warn "\$ip6addrctl_policy is invalid: ${ip6addrctl_policy}. " \
104212579Shrs		    " \"ipv4_prefer\" is used instead."
105212579Shrs		ip6addrctl_prefer_ipv4
106212579Shrs	;;
107212579Shrs	esac
108250240Shrs
109250240Shrs	if checkyesno ip6addrctl_verbose; then
110250240Shrs		echo 'Address selection policy table for IPv4 and IPv6:'
111250240Shrs		${IP6ADDRCTL_CMD}
112250240Shrs	fi
113121749Sume}
114121749Sume
115129994Sumeip6addrctl_stop()
116129994Sume{
117197697Shrs	afexists inet6 || return 0
118197697Shrs
119197697Shrs	ip6addrctl flush >/dev/null 2>&1
120129994Sume}
121129994Sume
122121749Sumeload_rc_config $name
123121749Sumerun_rc_command "$1"
124