ipv6_addrs_IF aliases in rc.conf(5)
Phil Kulin
schors at gmail.com
Thu Dec 27 21:42:51 UTC 2012
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
@@ -312,6 +312,12 @@ 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
@@ -948,7 +954,12 @@ 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
@@ -1178,3 +1189,39 @@ 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
More information about the freebsd-current
mailing list