xref: /freebsd/libexec/rc/rc.d/ip6addrctl (revision f99f0ee14e3af81c23150a6a340259ca8a33d01a)
10696600cSBjoern A. Zeeb#!/bin/sh
20696600cSBjoern A. Zeeb#
30696600cSBjoern A. Zeeb#
40696600cSBjoern A. Zeeb
50696600cSBjoern A. Zeeb# PROVIDE: ip6addrctl
60696600cSBjoern A. Zeeb# REQUIRE: FILESYSTEMS
70696600cSBjoern A. Zeeb# BEFORE: netif
80696600cSBjoern A. Zeeb# KEYWORD: nojailvnet
90696600cSBjoern A. Zeeb
100696600cSBjoern A. Zeeb. /etc/rc.subr
110696600cSBjoern A. Zeeb. /etc/network.subr
120696600cSBjoern A. Zeeb
130696600cSBjoern A. Zeebname="ip6addrctl"
140696600cSBjoern A. Zeebdesc="configure address selection policy for IPv6 and IPv4"
150696600cSBjoern A. Zeebrcvar="ip6addrctl_enable"
160696600cSBjoern A. Zeebstart_cmd="ip6addrctl_start"
170696600cSBjoern A. Zeebstop_cmd="ip6addrctl_stop"
180696600cSBjoern A. Zeebextra_commands="status prefer_ipv6 prefer_ipv4"
190696600cSBjoern A. Zeebstatus_cmd="ip6addrctl"
200696600cSBjoern A. Zeebprefer_ipv6_cmd="ip6addrctl_prefer_ipv6"
210696600cSBjoern A. Zeebprefer_ipv4_cmd="ip6addrctl_prefer_ipv4"
220696600cSBjoern A. Zeebconfig_file="/etc/ip6addrctl.conf"
230696600cSBjoern A. Zeeb
240696600cSBjoern A. Zeebset_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces
250696600cSBjoern A. Zeebset_rcvar_obsolete ipv6_prefer ip6addrctl_policy
260696600cSBjoern A. Zeeb
270696600cSBjoern A. ZeebIP6ADDRCTL_CMD="/usr/sbin/ip6addrctl"
280696600cSBjoern A. Zeeb
290696600cSBjoern A. Zeebip6addrctl_prefer_ipv6()
300696600cSBjoern A. Zeeb{
310696600cSBjoern A. Zeeb	afexists inet6 || return 0
320696600cSBjoern A. Zeeb
330696600cSBjoern A. Zeeb	${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
340696600cSBjoern A. Zeeb	cat <<EOT | ${IP6ADDRCTL_CMD} install /dev/stdin
350696600cSBjoern A. Zeeb	::1/128		 50	 0
360696600cSBjoern A. Zeeb	::/0		 40	 1
370696600cSBjoern A. Zeeb	::ffff:0:0/96	 35	 4
380696600cSBjoern A. Zeeb	2002::/16	 30	 2
390696600cSBjoern A. Zeeb	2001::/32	  5	 5
400696600cSBjoern A. Zeeb	fc00::/7	  3	13
410696600cSBjoern A. Zeeb	::/96		  1	 3
420696600cSBjoern A. Zeeb	fec0::/10	  1	11
430696600cSBjoern A. Zeeb	3ffe::/16	  1	12
440696600cSBjoern A. ZeebEOT
450696600cSBjoern A. Zeeb}
460696600cSBjoern A. Zeeb
470696600cSBjoern A. Zeebip6addrctl_prefer_ipv4()
480696600cSBjoern A. Zeeb{
490696600cSBjoern A. Zeeb	afexists inet6 || return 0
500696600cSBjoern A. Zeeb
510696600cSBjoern A. Zeeb	${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
520696600cSBjoern A. Zeeb	cat <<EOT | ${IP6ADDRCTL_CMD} install /dev/stdin
530696600cSBjoern A. Zeeb	::1/128		 50	 0
540696600cSBjoern A. Zeeb	::/0		 40	 1
550696600cSBjoern A. Zeeb	::ffff:0:0/96	100	 4
560696600cSBjoern A. Zeeb	2002::/16	 30	 2
570696600cSBjoern A. Zeeb	2001::/32	  5	 5
580696600cSBjoern A. Zeeb	fc00::/7	  3	13
590696600cSBjoern A. Zeeb	::/96		  1	 3
600696600cSBjoern A. Zeeb	fec0::/10	  1	11
610696600cSBjoern A. Zeeb	3ffe::/16	  1	12
620696600cSBjoern A. ZeebEOT
630696600cSBjoern A. Zeeb}
640696600cSBjoern A. Zeeb
650696600cSBjoern A. Zeebip6addrctl_start()
660696600cSBjoern A. Zeeb{
670696600cSBjoern A. Zeeb	afexists inet6 || return 0
680696600cSBjoern A. Zeeb
690696600cSBjoern A. Zeeb	# install the policy of the address selection algorithm.
700696600cSBjoern A. Zeeb	case "${ip6addrctl_policy}" in
710696600cSBjoern A. Zeeb	[Aa][Uu][Tt][Oo])
720696600cSBjoern A. Zeeb		if [ -r "${config_file}" -a -s "${config_file}" ]; then
730696600cSBjoern A. Zeeb			${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
740696600cSBjoern A. Zeeb			${IP6ADDRCTL_CMD} install "${config_file}"
750696600cSBjoern A. Zeeb		else
760696600cSBjoern A. Zeeb			if checkyesno ipv6_activate_all_interfaces; then
770696600cSBjoern A. Zeeb				ip6addrctl_prefer_ipv6
780696600cSBjoern A. Zeeb			elif [ -n "$(list_vars ifconfig_\*_ipv6)" ]; then
790696600cSBjoern A. Zeeb				ip6addrctl_prefer_ipv6
800696600cSBjoern A. Zeeb			else
810696600cSBjoern A. Zeeb				ip6addrctl_prefer_ipv4
820696600cSBjoern A. Zeeb			fi
830696600cSBjoern A. Zeeb		fi
840696600cSBjoern A. Zeeb	;;
850696600cSBjoern A. Zeeb	ipv4_prefer)
860696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv4
870696600cSBjoern A. Zeeb	;;
880696600cSBjoern A. Zeeb	ipv6_prefer)
890696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv6
900696600cSBjoern A. Zeeb	;;
910696600cSBjoern A. Zeeb	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
920696600cSBjoern A. Zeeb		# Backward compatibility when ipv6_prefer=YES
930696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv6
940696600cSBjoern A. Zeeb	;;
950696600cSBjoern A. Zeeb	[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0)
960696600cSBjoern A. Zeeb		# Backward compatibility when ipv6_prefer=NO
970696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv4
980696600cSBjoern A. Zeeb	;;
990696600cSBjoern A. Zeeb	[Nn][Oo][Nn][Ee])
1000696600cSBjoern A. Zeeb		${IP6ADDRCTL_CMD} flush >/dev/null 2>&1
1010696600cSBjoern A. Zeeb	;;
1020696600cSBjoern A. Zeeb	*)
1030696600cSBjoern A. Zeeb		warn "\$ip6addrctl_policy is invalid: ${ip6addrctl_policy}. " \
1040696600cSBjoern A. Zeeb		    " \"ipv4_prefer\" is used instead."
1050696600cSBjoern A. Zeeb		ip6addrctl_prefer_ipv4
1060696600cSBjoern A. Zeeb	;;
1070696600cSBjoern A. Zeeb	esac
1080696600cSBjoern A. Zeeb
1090696600cSBjoern A. Zeeb	if checkyesno ip6addrctl_verbose; then
1100696600cSBjoern A. Zeeb		echo 'Address selection policy table for IPv4 and IPv6:'
1110696600cSBjoern A. Zeeb		${IP6ADDRCTL_CMD}
1120696600cSBjoern A. Zeeb	fi
1130696600cSBjoern A. Zeeb}
1140696600cSBjoern A. Zeeb
1150696600cSBjoern A. Zeebip6addrctl_stop()
1160696600cSBjoern A. Zeeb{
1170696600cSBjoern A. Zeeb	afexists inet6 || return 0
1180696600cSBjoern A. Zeeb
1190696600cSBjoern A. Zeeb	ip6addrctl flush >/dev/null 2>&1
1200696600cSBjoern A. Zeeb}
1210696600cSBjoern A. Zeeb
1220696600cSBjoern A. Zeebload_rc_config $name
123*f99f0ee1SAlexander Leidinger
124*f99f0ee1SAlexander Leidinger# doesn't make sense to run in a svcj: config setting
125*f99f0ee1SAlexander Leidingeripv6addrctl_svcj="NO"
126*f99f0ee1SAlexander Leidinger
1270696600cSBjoern A. Zeebrun_rc_command "$1"
128