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: root mountcritlocal 8# BEFORE: netif 9# KEYWORD: nojailvnet 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