On Thu, Dec 20, 2012 at 3:27 PM, Jilles Tjoelker <jil...@stack.nl> wrote:
> On Thu, Dec 20, 2012 at 01:04:34PM +0200, Kimmo Paasiala wrote:
>> A question related to this for those who have been doing work on the
>> rc(8) scripts. Can I assume that /usr/bin is available when
>> network.subr functions are used? Doing calculations on hexadecimal
>> numbers is going to be very awkward if I can't use for example bc(1).
>
> You cannot assume that /usr/bin is available when setting up the
> network. It may be that /usr is mounted via NFS.
>
> You can use hexadecimal numbers (prefixed with 0x) in $((...))
> expressions. In FreeBSD 9.0 or newer, sh has a printf builtin you can
> use; in older versions you can use hexdigit and hexprint from
> network.subr.
>
> --
> Jilles Tjoelker

Thanks, I've rewitten my patch to support ranges. It is attached in
this message.

Again it's against a very recent 9-STABLE, I still haven't found time
to see if it applies to CURRENT.

It does allow you to do crazy stuff like

ipv6_addrs_re0="2001:db8:1111:2222::1-ffff/64"

However I didn't find anything to limit the number of aliases in the
ipv4 version of the function either.

Please test it :)


Then a question about the PR
(http://www.freebsd.org/cgi/query-pr.cgi?pr=174225) I wrote, how can I
attach this new patch to it? The submit follow up -button fires up my
email client and I'm not so sure how to submit a new patch for the PR
in an email in such a way that it appears properly formatted in the
PR.

Regards,

Kimmo Paasiala
Index: network.subr
===================================================================
--- network.subr        (revision 244523)
+++ network.subr        (working copy)
@@ -562,6 +562,7 @@
        fi
 
        ifalias_up ${_if} inet6 && _ret=0
+       ipv6_addrs_common ${_if} alias && _ret=0
        ipv6_prefix_hostid_addr_common ${_if} alias && _ret=0
        ipv6_accept_rtadv_up ${_if} && _ret=0
 
@@ -684,6 +685,49 @@
        return $_ret
 }
 
+
+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
+}
+
+
+
 # ifalias_up if af
 #      Configure aliases for network interface $if.
 #      It returns 0 if at least one alias was configured or
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to