svn commit: r197139 - in head/etc: . rc.d

Hiroki Sato hrs at FreeBSD.org
Sat Sep 12 22:13:41 UTC 2009


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 ***


More information about the svn-src-all mailing list