Re: ipv6_addrs_IF aliases in rc.conf(5)

From: Phil Kulin <schors_at_gmail.com>
Date: Fri, 28 Dec 2012 01:42:48 +0400
2012/12/26 Kimmo Paasiala <kpaasial_at_gmail.com>:

> I've revised the patch again and updated it at gihub,
> https://gist.github.com/4362018.  It can now be applied at top level
> of sources (/usr/src typically). It now does the deconfiguration in
> reverse order of the configuration, meaning the aliases configured
> with ipv6_addrs_IF are removed before the ones configured with
> ifconfig_IF_aliasN="inet6 ...".

Adapted for FreeBSD 8.2, works fine:

--- network.subr.orig   2011-02-17 05:19:39.000000000 +0300
+++ network.subr        2012-12-28 00:46:38.000000000 +0400
_at__at_ -312,6 +312,12 _at__at_ afexists()
 #      1 otherwise.
 ipv6if()
 {
+       # Test for $ipv6_addrs_IF. If it exists then the
+       # interface should be configured for IPv6
+       _tmpargs=$(get_if_var $_if ipv6_addrs_IF)
+       if [ -n "${_tmpargs}" ]; then
+               return 0
+       fi
        if ! checkyesno ipv6_enable; then
                return 1
        fi
_at__at_ -948,7 +954,12 _at__at_ network6_interface_setup()
                        rtsol_interface=no
                        ifconfig $i inet6 ${ipv6_ifconfig} alias
                fi
-
+               ipv6_addrs=`get_if_var $i ipv6_addrs_IF`
+               if [ -n "${ipv6_addrs}" ]; then
+                       rtsol_available=no
+                       rtsol_interface=no
+                       ipv6_addrs_common ${i} alias
+               fi
                # Wireless NIC cards are virtualized through the wlan interface
                if ! is_wired_interface ${i}; then
                        case "${i}" in
_at__at_ -1178,3 +1189,39 _at__at_ network6_getladdr()
                esac
        done
 }
+
+ipv6_addrs_common()
+{
+       local _ret _if _action _ip6prefix _ip6prefixes
+       local _ip6addr _prefixlen
+       local _range _ip6net _ip6low _ip6high
+       _ret=1
+       _if=$1
+       _action=$2
+       # get the prefixes from ipv6_addrs_IF variable
+       _ip6prefixes=`get_if_var $_if ipv6_addrs_IF`
+       for _ip6prefix in ${_ip6prefixes}; do
+               _ip6addr=${_ip6prefix%%/*}
+               _prefixlen=${_ip6prefix##*/}
+               _range=${_ip6addr##*:}
+               _ip6net=${_ip6addr%:*}
+               _ip6low=${_range%-*}
+               _ip6high=${_range#*-}
+               # If deleting an alias, set _prefixlen to null string.
+               if [ "${_action}" = "-alias" ]; then
+                       _prefixlen=""
+               else
+                       _prefixlen="prefixlen $_prefixlen"
+               fi
+               _ip6high=$(("0x${_ip6high}"))
+               _ip6count=$(("0x${_ip6low}"))
+               while [ "${_ip6count}" -le "${_ip6high}" ]; do
+                       # Re-uses the _ip6addr variable from above
+                       _ip6addr=$(printf "%x" "${_ip6count}")
+                       eval "ifconfig ${_if} inet6
${_ip6net}:${_ip6addr} ${_prefixlen} ${_action}"
+                       _ip6count=$((${_ip6count}+1))
+                       _ret=0
+               done
+       done
+       return $_ret
+}


-- 
Non nobis Domine non nobis sed Nomini Tuo da gloriam
Phil Kulin
Received on Thu Dec 27 2012 - 20:42:51 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:33 UTC