Author: hrs
Date: Sat Sep 12 22:13:41 2009
New Revision: 197139
URL: http://svn.freebsd.org/changeset/base/197139

Log:
  Integrate rc.d/network_ipv6 into rc.d/netif:
  
  - Add rc.d/stf and rc.d/faith for stf(4) and faith(4).
  - Remove rc.d/auto_linklocal and rc.d/network_ipv6.
  - Move rc.d/sysctl to just before FILESYSTEMS because rc.d/netif
    depends on some sysctl variables.
  
  Reviewed by:  brooks
  MFC after:    3 days

Added:
  head/etc/rc.d/faith   (contents, props changed)
  head/etc/rc.d/stf   (contents, props changed)
Deleted:
  head/etc/rc.d/auto_linklocal
  head/etc/rc.d/network_ipv6
Modified:
  head/etc/network.subr
  head/etc/rc.d/Makefile
  head/etc/rc.d/NETWORKING
  head/etc/rc.d/addswap
  head/etc/rc.d/defaultroute
  head/etc/rc.d/devd
  head/etc/rc.d/ip6addrctl
  head/etc/rc.d/mroute6d
  head/etc/rc.d/netif
  head/etc/rc.d/routing
  head/etc/rc.d/sysctl

Modified: head/etc/network.subr
==============================================================================
--- head/etc/network.subr       Sat Sep 12 22:08:20 2009        (r197138)
+++ head/etc/network.subr       Sat Sep 12 22:13:41 2009        (r197139)
@@ -45,13 +45,14 @@ ifn_start()
        ifscript_up ${ifn} && cfg=0
        ifconfig_up ${ifn} && cfg=0
        ipv4_up ${ifn} && cfg=0
+       ipv6_up ${ifn} && cfg=0
        ipx_up ${ifn} && cfg=0
-       childif_create ${ifn}
+       childif_create ${ifn} && cfg=0
 
        return $cfg
 }
 
-# ifn_start ifn
+# ifn_stop ifn
 # Shutdown and de-configure an interface.  If action is taken print the
 # interface name.
 #
@@ -61,13 +62,14 @@ ifn_stop()
        ifn="$1"
        cfg=1
 
-       [ -z "$ifn" ] && return 1
+       [ -z "$ifn" ] && err 1 "ifn_stop called without an interface"
 
        ipx_down ${ifn} && cfg=0
+       ipv6_down ${ifn} && cfg=0
        ipv4_down ${ifn} && cfg=0
        ifconfig_down ${ifn} && cfg=0
        ifscript_down ${ifn} && cfg=0
-       childif_destroy ${ifn}
+       childif_destroy ${ifn} && cfg=0
 
        return $cfg
 }
@@ -81,15 +83,53 @@ ifn_stop()
 #
 ifconfig_up()
 {
+       local _cfg _ipv6_opts ifconfig_args
        _cfg=1
 
+       # ifconfig_IF
        ifconfig_args=`ifconfig_getargs $1`
        if [ -n "${ifconfig_args}" ]; then
                ifconfig $1 ${ifconfig_args}
-               ifconfig $1 up
                _cfg=0
        fi
 
+       # inet6 specific
+       if afexists inet6; then
+               if ipv6if $1; then
+                       if checkyesno ipv6_gateway_enable; then
+                               _ipv6_opts="-accept_rtadv auto_linklocal"
+                       else
+                               _ipv6_opts="auto_linklocal"
+                       fi
+               else
+                       _ipv6_opts="-auto_linklocal ifdisabled"
+               fi
+
+               ifconfig $1 inet6 ${_ipv6_opts}
+
+               # ifconfig_IF_ipv6
+               ifconfig_args=`ifconfig_getargs $1 ipv6`
+               if [ -n "${ifconfig_args}" ]; then
+                       ifconfig $1 inet6 -ifdisabled
+                       ifconfig $1 ${ifconfig_args}
+                       _cfg=0
+               fi
+
+               # backward compatiblity: $ipv6_ifconfig_IF
+               ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF`
+               if [ -n "${ifconfig_args}" ]; then
+                       warn "\$ipv6_ifconfig_$1 is obsolete." \
+                           "  Use ifconfig_$1_ipv6 instead."
+                       ifconfig $1 inet6 -ifdisabled
+                       ifconfig $1 inet6 ${ifconfig_args}
+                       _cfg=0
+               fi
+       fi
+
+       if [ ${_cfg} -eq 0 ]; then
+               ifconfig $1 up
+       fi
+
        if wpaif $1; then
                /etc/rc.d/wpa_supplicant start $1
                _cfg=0          # XXX: not sure this should count
@@ -114,7 +154,7 @@ ifconfig_up()
 #
 ifconfig_down()
 {
-       [ -z "$1" ] && return 1
+       local _cfg
        _cfg=1
 
        if wpaif $1; then
@@ -143,6 +183,8 @@ ifconfig_down()
 #       $default if given.
 get_if_var()
 {
+       local _if _punct _var _default prefix suffix
+
        if [ $# -ne 2 -a $# -ne 3 ]; then
                err 3 'USAGE: get_if_var name var [default]'
        fi
@@ -160,26 +202,30 @@ get_if_var()
        eval echo \${${prefix}${_if}${suffix}-${_default}}
 }
 
-# _ifconfig_getargs if
+# _ifconfig_getargs if [af]
 #      Echos the arguments for the supplied interface to stdout.
 #      returns 1 if empty.  In general, ifconfig_getargs should be used
 #      outside this file.
 _ifconfig_getargs()
 {
+       local _ifn _af
        _ifn=$1
+       _af=${2+_$2}
+
        if [ -z "$_ifn" ]; then
                return 1
        fi
 
-       get_if_var $_ifn ifconfig_IF "$ifconfig_DEFAULT"
+       get_if_var $_ifn ifconfig_IF$_af "$ifconfig_DEFAULT"
 }
 
-# ifconfig_getargs if
+# ifconfig_getargs if [af]
 #      Takes the result from _ifconfig_getargs and removes pseudo
 #      args such as DHCP and WPA.
 ifconfig_getargs()
 {
-       _tmpargs=`_ifconfig_getargs $1`
+       local _tmpargs _arg _args
+       _tmpargs=`_ifconfig_getargs $1 $2`
        if [ $? -eq 1 ]; then
                return 1
        fi
@@ -206,7 +252,9 @@ ifconfig_getargs()
 #      boot time and 1 otherwise.
 autoif()
 {
+       local _tmpargs _arg
        _tmpargs=`_ifconfig_getargs $1`
+
        for _arg in $_tmpargs; do
                case $_arg in
                [Nn][Oo][Aa][Uu][Tt][Oo])
@@ -214,6 +262,7 @@ autoif()
                        ;;
                esac
        done
+
        return 0
 }
 
@@ -221,7 +270,9 @@ autoif()
 #      Returns 0 if the interface is a DHCP interface and 1 otherwise.
 dhcpif()
 {
+       local _tmpargs _arg
        _tmpargs=`_ifconfig_getargs $1`
+
        for _arg in $_tmpargs; do
                case $_arg in
                [Dd][Hh][Cc][Pp])
@@ -235,6 +286,7 @@ dhcpif()
                        ;;
                esac
        done
+
        return 1
 }
 
@@ -243,7 +295,9 @@ dhcpif()
 #      1 otherwise.
 syncdhcpif()
 {
+       local _tmpargs _arg
        _tmpargs=`_ifconfig_getargs $1`
+
        for _arg in $_tmpargs; do
                case $_arg in
                [Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
@@ -254,18 +308,17 @@ syncdhcpif()
                        ;;
                esac
        done
-       if checkyesno synchronous_dhclient; then
-               return 0
-       else
-               return 1
-       fi
+
+       checkyesno synchronous_dhclient
 }
 
 # wpaif if
 #      Returns 0 if the interface is a WPA interface and 1 otherwise.
 wpaif()
 {
+       local _tmpargs _arg
        _tmpargs=`_ifconfig_getargs $1`
+
        for _arg in $_tmpargs; do
                case $_arg in
                [Ww][Pp][Aa])
@@ -273,6 +326,54 @@ wpaif()
                        ;;
                esac
        done
+
+       return 1
+}
+
+# afexists af
+#      Returns 0 if the address family is enabled in the kernel
+#      1 otherwise.
+afexists()
+{
+       local _af
+       _af=$1
+
+       case ${_af} in
+       inet)
+               ${SYSCTL_N} net.inet > /dev/null 2>&1
+               ;;
+       inet6)
+               ${SYSCTL_N} net.inet6 > /dev/null 2>&1
+               ;;
+       *)
+               err 1 "afexists(): Unsupported address family: $_af"
+               ;;
+       esac
+}
+
+# noafif if
+#      Returns 0 if the interface has no af configuration and 1 otherwise.
+noafif()
+{
+       local _if
+       _if=$1
+
+       case $_if in
+       pflog[0-9]*|\
+       pfsync[0-9]*|\
+       an[0-9]*|\
+       ath[0-9]*|\
+       ipw[0-9]*|\
+       iwi[0-9]*|\
+       iwn[0-9]*|\
+       ral[0-9]*|\
+       wi[0-9]*|\
+       wl[0-9]*|\
+       wpi[0-9]*)
+               return 0
+               ;;
+       esac
+
        return 1
 }
 
@@ -281,9 +382,20 @@ wpaif()
 #      1 otherwise.
 ipv6if()
 {
-       if ! checkyesno ipv6_enable; then
+       local _if i
+       _if=$1
+
+       if ! afexists inet6; then
                return 1
        fi
+
+       # lo0 is always IPv6-enabled
+       case $_if in
+       lo0)
+               return 0
+               ;;
+       esac
+
        case "${ipv6_network_interfaces}" in
        [Aa][Uu][Tt][Oo])
                return 0
@@ -292,11 +404,53 @@ ipv6if()
                return 1
                ;;
        esac
-       for v6if in ${ipv6_network_interfaces}; do
-               if [ "${v6if}" = "${1}" ]; then
+
+       for i in ${ipv6_network_interfaces}; do
+               if [ "$i" = "$_if" ]; then
                        return 0
                fi
        done
+
+       return 1
+}
+
+# ipv6_autoconfif if
+#      Returns 0 if the interface should be configured for IPv6 with
+#      Stateless Address Configuration, 1 otherwise.
+ipv6_autoconfif()
+{
+       local _if _tmpargs _arg
+       _if=$1
+
+       if ! ipv6if $_if; then
+               return 1
+       fi
+       if noafif $_if; then
+               return 1
+       fi
+       if checkyesno ipv6_gateway_enable; then
+               return 1
+       fi
+
+       case $_if in
+       lo0|\
+       stf[0-9]*|\
+       faith[0-9]*|\
+       lp[0-9]*|\
+       sl[0-9]*)
+               return 1
+               ;;
+       esac
+
+       _tmpargs=`_ifconfig_getargs $_if ipv6`
+       for _arg in $_tmpargs; do
+               case $_arg in
+               accept_rtadv)
+                       return 0
+                       ;;
+               esac
+       done
+
        return 1
 }
 
@@ -304,6 +458,7 @@ ipv6if()
 #      Returns 0 if the interface exists and 1 otherwise.
 ifexists()
 {
+       [ -z "$1" ] && return 1
        ifconfig -n $1 > /dev/null 2>&1
 }
 
@@ -311,21 +466,48 @@ ifexists()
 #  add IPv4 addresses to the interface $if 
 ipv4_up()
 {
+       local _if _ret
+       _if=$1
+       _ret=1
+
+       ifalias_up ${_if} inet && _ret=0
+       ipv4_addrs_common ${_if} alias && _ret=0
+
+       return $_ret
+}
+
+# ipv6_up if
+#      add IPv6 addresses to the interface $if
+ipv6_up()
+{
+       local _if _ret
        _if=$1
-       ifalias_up ${_if}
-       ipv4_addrs_common ${_if} alias
+       _ret=1
+
+       if ! ipv6if $_if; then
+               return 0
+       fi
+
+       ifalias_up ${_if} inet6 && _ret=0
+       ipv6_prefix_hostid_addr_up ${_if} && _ret=0
+       ipv6_accept_rtadv_up ${_if} && _ret=0
+
+       # wait for DAD
+       sleep `${SYSCTL_N} net.inet6.ip6.dad_count`
+       sleep 1
+
+       return $_ret
 }
 
 # ipv4_down if
 #  remove IPv4 addresses from the interface $if
 ipv4_down()
 {
+       local _if _ifs _ret inetList oldifs _inet
        _if=$1
        _ifs="^"
        _ret=1
 
-       ifexists ${_if} || return 1
-
        inetList="`ifconfig ${_if} | grep 'inet ' | tr "\n" "$_ifs"`"
 
        oldifs="$IFS"
@@ -343,17 +525,55 @@ ipv4_down()
        done
        IFS="$oldifs"
 
-       ifalias_down ${_if} && _ret=0
+       ifalias_down ${_if} inet && _ret=0
        ipv4_addrs_common ${_if} -alias && _ret=0
 
        return $_ret
 }
 
+# ipv6_down if
+#      remove IPv6 addresses from the interface $if
+ipv6_down()
+{
+       local _if _ifs _ret inetList oldifs _inet6
+       _if=$1
+       _ifs="^"
+       _ret=1
+
+       if ! ipv6if $_if; then
+               return 0
+       fi
+
+       ipv6_accept_rtadv_down ${_if} && _ret=0
+       ifalias_down ${_if} inet6 && _ret=0
+
+       inetList="`ifconfig ${_if} | grep 'inet6 ' | tr "\n" "$_ifs"`"
+
+       oldifs="$IFS"
+       IFS="$_ifs"
+       for _inet6 in $inetList ; do
+               # get rid of extraneous line
+               [ -z "$_inet6" ] && break
+
+               _inet6=`expr "$_inet6" : '.*\(inet6 \([0-9a-f:]*\)\).*'`
+
+               IFS="$oldifs"
+               ifconfig ${_if} ${_inet6} -alias
+               IFS="$_ifs"
+               _ret=0
+       done
+       IFS="$oldifs"
+
+       return $_ret
+}
+
 # ipv4_addrs_common if action
 #   Evaluate the ifconfig_if_ipv4 arguments for interface $if
 #   and use $action to add or remove IPv4 addresses from $if.
 ipv4_addrs_common()
 {  
+       local _ret _if _action _cidr _cidr_addr
+       local _ipaddr _netmask _range _ipnet _iplow _iphigh _ipcount 
        _ret=1
        _if=$1
        _action=$2
@@ -386,53 +606,239 @@ ipv4_addrs_common()
                        fi
                done
        done
+
        return $_ret
 }
 
-# ifalias_up if
+# ifalias_up if af
 #      Configure aliases for network interface $if.
 #      It returns 0 if at least one alias was configured or
 #      1 if there were none.
 #
 ifalias_up()
 {
+       local _ret
+       _ret=1
+
+       case "$2" in
+       inet)
+               _ret=`ifalias_ipv4_up "$1"`
+               ;;
+       inet6)
+               _ret=`ifalias_ipv6_up "$1"`
+               ;;
+       esac
+
+       return $_ret
+}
+
+# ifalias_ipv4_up if
+#      Helper function for ifalias_up().  Handles IPv4.
+#
+ifalias_ipv4_up()
+{
+       local _ret alias ifconfig_args
        _ret=1
+
+       # ifconfig_IF_aliasN which starts with "inet"
        alias=0
        while : ; do
                ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
-               if [ -n "${ifconfig_args}" ]; then
-                       ifconfig $1 ${ifconfig_args} alias
+               case "${ifconfig_args}" in
+               inet\ *)
+                       ifconfig $1 ${ifconfig_args} alias && _ret=0
+                       ;;
+               "")
+                       break
+                       ;;
+               esac
                        alias=$((${alias} + 1))
-                       _ret=0
-               else
+       done
+
+       return $_ret
+}
+
+# ifalias_ipv6_up if
+#      Helper function for ifalias_up().  Handles IPv6.
+#
+ifalias_ipv6_up()
+{
+       local _ret alias ifconfig_args
+       _ret=1
+
+       # ifconfig_IF_aliasN which starts with "inet6"
+       alias=0
+       while : ; do
+               ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
+               case "${ifconfig_args}" in
+               inet6\ *)
+                       ifconfig $1 ${ifconfig_args} alias && _ret=0
+                       ;;
+               "")
                        break
-               fi
+                       ;;
+               esac
+               alias=$((${alias} + 1))
+       done
+
+       # backward compatibility: ipv6_ifconfig_IF_aliasN.
+       alias=0
+       while : ; do
+               ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF_alias${alias}`
+               case "${ifconfig_args}" in
+               "")
+                       break
+                       ;;
+               *)
+                       ifconfig $1 inet6 ${ifconfig_args} alias && _ret=0
+                       warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete."
+                           "  Use ifconfig_$1_aliasN instead."
+                       ;;
+               esac
+               alias=$((${alias} + 1))
        done
+
        return $_ret
 }
 
-#ifalias_down if
+#ifalias_down if af
 #      Remove aliases for network interface $if.
 #      It returns 0 if at least one alias was removed or
 #      1 if there were none.
 #
 ifalias_down()
 {
+       local _ret
+       _ret=1
+
+       case "$2" in
+       inet)
+               _ret=`ifalias_ipv4_down "$1"`
+               ;;
+       inet6)
+               _ret=`ifalias_ipv6_down "$1"`
+               ;;
+       esac
+
+       return $_ret
+}
+
+#ifalias_ipv4_down if
+#      Helper function for ifalias_down().  Handles IPv4.
+#
+ifalias_ipv4_down()
+{
+       local _ret alias ifconfig_args
        _ret=1
+
+       # ifconfig_IF_aliasN which starts with "inet"
        alias=0
        while : ; do
                ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
-               if [ -n "${ifconfig_args}" ]; then
-                       ifconfig $1 ${ifconfig_args} -alias
+               case "${ifconfig_args}" in
+               inet\ *)
+                       ifconfig $1 ${ifconfig_args} -alias && _ret=0
+                       ;;
+               "")
+                       break
+                       ;;
+               esac
                        alias=$((${alias} + 1))
-                       _ret=0
-               else
+       done
+
+       return $_ret
+}
+
+#ifalias_ipv6_down if
+#      Helper function for ifalias_down().  Handles IPv6.
+#
+ifalias_ipv6_down()
+{
+       local _ret alias ifconfig_args
+       _ret=1
+
+       # ifconfig_IF_aliasN which starts with "inet6"
+       alias=0
+       while : ; do
+               ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
+               case "${ifconfig_args}" in
+               inet6\ *)
+                       ifconfig $1 ${ifconfig_args} -alias && _ret=0
+                       ;;
+               "")
                        break
-               fi
+                       ;;
+               esac
+               alias=$((${alias} + 1))
+       done
+
+       # backward compatibility: ipv6_ifconfig_IF_aliasN.
+       while : ; do
+               ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF_alias${alias}`
+               case "${ifconfig_args}" in
+               "")
+                       break
+                       ;;
+               *)
+                       ifconfig $1 inet6 ${ifconfig_args} -alias
+                       alias=$((${alias} + 1))
+                       warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete."
+                           "  Use ifconfig_$1_aliasN instead."
+                       _ret=0
+                       ;;
+               esac
        done
+
        return $_ret
 }
 
+# ipv6_prefix_hostid_addr_up if
+#      add IPv6 prefix + hostid addr to the interface $if
+ipv6_prefix_hostid_addr_up()
+{
+       local _if prefix laddr hostid j address
+       _if=$1
+       prefix=`get_if_var ${_if} ipv6_prefix_IF`
+
+       if [ -n "${prefix}" ]; then
+               laddr=`network6_getladdr ${_if}`
+               hostid=${laddr#fe80::}
+               hostid=${hostid%\%*}
+
+               for j in ${prefix}; do
+                       address=$j\:${hostid}
+                       ifconfig ${_if} inet6 ${address} prefixlen 64 alias
+
+                       # if I am a router, add subnet router
+                       # anycast address (RFC 2373).
+                       if checkyesno ipv6_gateway_enable; then
+                               ifconfig ${_if} inet6 $j:: prefixlen 64 \
+                                       alias anycast
+                       fi
+               done
+       fi
+}
+
+# ipv6_accept_rtadv_up if
+#      Enable accepting Router Advertisement and send Router
+#      Solicitation message
+ipv6_accept_rtadv_up()
+{
+       if ipv6_autoconfif $1; then
+               ifconfig $1 inet6 accept_rtadv up
+               rtsol ${rtsol_flags} $1
+       fi
+}
+
+# ipv6_accept_rtadv_down if
+#      Disable accepting Router Advertisement
+ipv6_accept_rtadv_down()
+{
+       if ipv6_autoconfif $1; then
+               ifconfig $1 inet6 -accept_rtadv
+       fi
+}
+
 # ifscript_up if
 #      Evaluate a startup script for the $if interface.
 #      It returns 0 if a script was found and processed or
@@ -443,8 +849,9 @@ ifscript_up()
        if [ -r /etc/start_if.$1 ]; then
                . /etc/start_if.$1
                return 0
+       else
+               return 1
        fi
-       return 1
 }
 
 # ifscript_down if
@@ -457,16 +864,20 @@ ifscript_down()
        if [ -r /etc/stop_if.$1 ]; then
                . /etc/stop_if.$1
                return 0
+       else
+               return 1
        fi
-       return 1
 }
 
 # Create cloneable interfaces.
 #
 clone_up()
 {
+       local _prefix _list ifn
        _prefix=
        _list=
+
+       # create_args_IF
        for ifn in ${cloned_interfaces}; do
                ifconfig ${ifn} create `get_if_var ${ifn} create_args_IF`
                if [ $? -eq 0 ]; then
@@ -482,8 +893,10 @@ clone_up()
 #
 clone_down()
 {
+       local _prefix _list ifn
        _prefix=
        _list=
+
        for ifn in ${cloned_interfaces}; do
                ifconfig ${ifn} destroy
                if [ $? -eq 0 ]; then
@@ -501,7 +914,6 @@ childif_create()
 {
        local cfg child child_wlans create_args debug_flags ifn i
        cfg=1
-
        ifn=$1
 
        # Create wireless interfaces
@@ -536,11 +948,14 @@ childif_create()
 childif_destroy()
 {
        local cfg child child_wlans ifn
+       cfg=1
 
        child_wlans="`get_if_var $ifn wlans_IF` `get_if_var $ifn vaps_IF`"
        for child in ${child_wlans}; do
                ifconfig $child destroy && cfg=0
        done
+
+       return ${cfg}
 }
 
 # Create netgraph nodes.
@@ -553,6 +968,8 @@ EOF
 }
 
 ng_create_one() {
+       local t
+
        ng_mkpeer $* | while read line; do
                t=`expr "${line}" : '.* name="\([a-z]*[0-9]*\)" .*'`
                if [ -n "${t}" ]; then
@@ -563,6 +980,8 @@ ng_create_one() {
 }
 
 gif_up() {
+       local i peers
+
        for i in ${gif_interfaces}; do
                peers=`get_if_var $i gifconfig_IF`
                case ${peers} in
@@ -586,7 +1005,8 @@ gif_up() {
 # ng_fec_create ifn
 # Configure Fast EtherChannel for interface $ifn. Returns 0 if FEC
 # arguments were found and configured; returns !0 otherwise.
-ng_fec_create() {
+ng_fec_create()
+{
         local req_iface iface bogus
         req_iface="$1"
 
@@ -610,6 +1030,8 @@ ng_fec_create() {
 }
 
 fec_up() {
+       local i j
+
        for i in ${fec_interfaces}; do
                ng_fec_create $i
                for j in `get_if_var $i fecconfig_IF`; do
@@ -632,12 +1054,16 @@ fec_up() {
 #
 ipx_up()
 {
+       local ifn
        ifn="$1"
-       ifconfig_args=`get_if_var $ifn ifconfig_IF_ipx`
+
+       # ifconfig_IF_ipx
+       ifconfig_args=`_ifconfig_getargs $ifn ipx`
        if [ -n "${ifconfig_args}" ]; then
                ifconfig ${ifn} ${ifconfig_args}
                return 0
        fi
+
        return 1
 }
 
@@ -647,15 +1073,13 @@ ipx_up()
 #
 ipx_down()
 {
-       [ -z "$1" ] && return 1
+       local _if _ifs _ret ipxList oldifs _ipx
+       _if=$1
        _ifs="^"
        _ret=1
-
-       ifexists $1 || return 1
-
-       ipxList="`ifconfig $1 | grep 'ipx ' | tr "\n" "$_ifs"`"
-
+       ipxList="`ifconfig ${_if} | grep 'ipx ' | tr "\n" "$_ifs"`"
        oldifs="$IFS"
+
        IFS="$_ifs"
        for _ipx in $ipxList ; do
                # get rid of extraneous line
@@ -664,7 +1088,7 @@ ipx_down()
                _ipx=`expr "$_ipx" : '.*\(ipx 
[0-9a-h]\{1,8\}H*\.[0-9a-h]\{1,12\}\).*'`
 
                IFS="$oldifs"
-               ifconfig $1 ${_ipx} delete
+               ifconfig ${_if} ${_ipx} delete
                IFS="$_ifs"
                _ret=0
        done
@@ -678,25 +1102,29 @@ ipx_down()
 #
 ifnet_rename()
 {
+       local _if _ifname
 
-       _ifn_list="`ifconfig -l`"
-       [ -z "$_ifn_list" ] && return 0
-       for _if in ${_ifn_list} ; do
+       # ifconfig_IF_name
+       for _if in `ifconfig -l`; do
                _ifname=`get_if_var $_if ifconfig_IF_name`
                if [ ! -z "$_ifname" ]; then
                        ifconfig $_if name $_ifname
                fi
        done
+
        return 0
 }
 
-#
 # list_net_interfaces type
 #      List all network interfaces. The type of interface returned
 #      can be controlled by the type argument. The type
 #      argument can be any of the following:
 #              nodhcp - all interfaces, excluding DHCP configured interfaces
 #              dhcp   - list only DHCP configured interfaces
+#              noautoconf      - all interfaces, excluding IPv6 Stateless
+#                                Address Autoconf configured interfaces
+#              autoconf        - list only IPv6 Stateless Address Autoconf
+#                                configured interfaces
 #      If no argument is specified all network interfaces are output.
 #      Note that the list will include cloned interfaces if applicable.
 #      Cloned interfaces must already exist to have a chance to appear
@@ -704,13 +1132,14 @@ ifnet_rename()
 #
 list_net_interfaces()
 {
+       local type _tmplist _list _autolist _lo _if
        type=$1
 
        # Get a list of ALL the interfaces and make lo0 first if it's there.
        #
+       _tmplist=
        case ${network_interfaces} in
        [Aa][Uu][Tt][Oo])
-               _prefix=''
                _autolist="`ifconfig -l`"
                _lo=
                for _if in ${_autolist} ; do
@@ -718,12 +1147,11 @@ list_net_interfaces()
                                if [ "$_if" = "lo0" ]; then
                                        _lo="lo0 "
                                else
-                                       _tmplist="${_tmplist}${_prefix}${_if}"
-                                       [ -z "$_prefix" ] && _prefix=' '
+                                       _tmplist="${_tmplist} ${_if}"
                                fi
                        fi
                done
-               _tmplist="${_lo}${_tmplist}"
+               _tmplist="${_lo}${_tmplist# }"
                ;;
        *)
                _tmplist="${network_interfaces} ${cloned_interfaces}"
@@ -737,33 +1165,45 @@ list_net_interfaces()
                ;;
        esac
 
-       if [ -z "$type" ]; then
-               echo $_tmplist
-               return 0
+       _list=
+       case "$type" in
+       nodhcp)
+               for _if in ${_tmplist} ; do
+                       if ! dhcpif $_if && \
+                          [ -n "`_ifconfig_getargs $_if`" ]; then
+                               _list="${_list# } ${_if}"
        fi
-
-       # Separate out dhcp and non-dhcp interfaces
-       #
-       _aprefix=
-       _bprefix=
+               done
+               ;;
+       dhcp)
        for _if in ${_tmplist} ; do
                if dhcpif $_if; then
-                       _dhcplist="${_dhcplist}${_aprefix}${_if}"
-                       [ -z "$_aprefix" ] && _aprefix=' '
-               elif [ -n "`_ifconfig_getargs $_if`" ]; then
-                       _nodhcplist="${_nodhcplist}${_bprefix}${_if}"
-                       [ -z "$_bprefix" ] && _bprefix=' '
+                               _list="${_list# } ${_if}"
                fi
        done
-
-       case "$type" in
-       nodhcp)
-               echo $_nodhcplist
                ;;
-       dhcp)
-               echo $_dhcplist
+       noautoconf)
+               for _if in ${_tmplist} ; do
+                       if ! ipv6_autoconfif $_if && \
+                          [ -n "`_ifconfig_getargs $_if ipv6`" ]; then
+                               _list="${_list# } ${_if}"
+                       fi
+               done
+               ;;
+       autoconf)
+               for _if in ${_tmplist} ; do
+                       if ipv6_autoconfif $_if; then
+                               _list="${_list# } ${_if}"
+                       fi
+               done
+               ;;
+       *)
+               _list=${_tmplist}
                ;;
        esac
+
+       echo $_list
+
        return 0
 }
 
@@ -773,12 +1213,12 @@ list_net_interfaces()
 #
 get_default_if()

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to