Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 02 Jul 2009 04:34:47 +0900 (JST)
From:      Hiroki Sato <hrs@FreeBSD.org>
To:        jilles@stack.nl
Cc:        freebsd-rc@FreeBSD.org
Subject:   Re: RFC: integrate network_ipv6 to netif and tidy up several rc.d scripts
Message-ID:  <20090702.043447.219085264.hrs@allbsd.org>
In-Reply-To: <20090630224110.GA33900@stack.nl>
References:  <20090628.194342.254155418.hrs@allbsd.org> <20090630224110.GA33900@stack.nl>

next in thread | previous in thread | raw e-mail | index | archive | help
----Security_Multipart0(Thu_Jul__2_04_34_47_2009_344)--
Content-Type: Multipart/Mixed;
	boundary="--Next_Part(Thu_Jul__2_04_34_47_2009_516)--"
Content-Transfer-Encoding: 7bit

----Next_Part(Thu_Jul__2_04_34_47_2009_516)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi,

 Thank you very much for your review.  A revised one is attached.
 rc_20090701.diff is the complete diff, and the others are diff from
 the previous patches.  Replies to your comments are in-line below.
 If you noticed other issues, please let me know.  Thank you.

Jilles Tjoelker <jilles@stack.nl> wrote
  in <20090630224110.GA33900@stack.nl>:

ji> > +		if ipv6if $1; then
ji> > +			if checkyesno ipv6_gateway_enable ]; then
ji>
ji> What's this ']'?

 Just a typo.  Removed.

ji> > +	case $2 in
ji> > +	"")	_af=	;;
ji> > +	*)	_af=_$2	;;
ji> > +	esac
ji> > +
ji>
ji> This can be done more simply: _af=${2:+_$2}

 Fixed, thanks.

ji> Here and elsewhere, consider using 'local' (even though it's not POSIX,
ji> it is already used and rather useful) or not copying the parameter into
ji> a variable at all. Otherwise strange bugs may occur due to variables
ji> being corrupted by seemingly innocuous function calls.

 Added local wherever possible.

ji> The redirection should be > /dev/null 2>&1 to avoid an error message if
ji> the address family is not enabled.
ji> There should be a default case which possibly prints an error message
ji> and returns 1.

 True.  Fixed.

ji> > -	for v6if in ${ipv6_network_interfaces}; do
ji> > -		if [ "${v6if}" = "${1}" ]; then
ji> > +	for i in ${ipv6_network_interfaces}; do
ji> > +		if [ "$i" = "$_if" ]; then
ji>
ji> Unnecessary change which might cause trouble because i is not local.

 A local is added here, too.

ji> > +		esac
ji> >  	done
ji> >  	return $_ret
ji> >  }
ji>
ji> It looks like this will stop processing the aliases as soon as it finds
ji> an inet6 one. ifalias_ipv6_up, ifalias_ipv4_down and ifalias_ipv6_down
ji> seem similarly affected.

 Yes, this part had a bug.  Fixed.

ji> > +	return $_ret
ji> > +}
ji>
ji> The warning message is wrong in the sense that ifconfig_$1_alias${alias}
ji> will not work if there are also IPv4 aliases. You could count the number
ji> of IPv4 aliases and add that in, but it may be more appropriate to print
ji> a single warning message.

 Certainly.  Fixed.

ji> > +		hostid=`expr "${laddr}" : 'fe80::\(.*\)%\(.*\)'`
ji>
ji> Faster:
ji> hostid=${laddr#fe80::}
ji> hostid=${hostid%\%*}

 Fixed, thanks for the suggestion.

ji> The _prefix variable is unnecessary complication. Just
ji> _list="${_list} ${_if}" will do. Word splitting in echo $_list will drop
ji> the initial space. If word splitting weren't acceptable,
ji> echo "${_list# }" would remove it as well; this could simplify the auto
ji> case above.

 $prefix is removed.

ji> > Index: etc/rc.d/sysctl
ji> > ===================================================================
ji> > --- etc/rc.d/sysctl	(revision 195133)
ji> > +++ etc/rc.d/sysctl	(working copy)
ji> > @@ -5,7 +5,7 @@
ji> >
ji> >  # PROVIDE: sysctl
ji> >  # REQUIRE: root
ji> > -# BEFORE:  DAEMON
ji> > +# BEFORE: FILESYSTEMS
ji>
ji> >  . /etc/rc.subr
ji>
ji> I think these two changes need separate consideration.

 Moving sysctl to earlier stage is necessary because there are a lot
 of scripts which modify sysctl variables between FILESYSTEMS and
 NETWORKING and making sure it runs before them.  I think there is no
 bad side-effect by this.

ji> > [...]
ji> >  		delay=`expr $delay - 1`
ji>
ji> delay=$((delay - 1))

 Fixed.

ji> Hmm, any reason you're removing gif[0-9]* here?

 I do not think disabling accept_rtadv of gifN is reasonable.  RA may
 be useless for point-to-point interface but can be sent via tunnel
 interface.  Anyway, ND6_IFF_ACCEPT_RTADV is now disabled by default,
 so it should be safe.

ji> > +	static_start $*
ji> > +	options_start $*
ji> >  }
ji>
ji> Nitpick: use "$@" to preserve the parameters exactly. $* performs word
ji> splitting and filename generation on each parameter. (This does not
ji> really matter because rc.subr currently breaks it and the called
ji> functions don't care.)

 Okay, fixed.

-- Hiroki

----Next_Part(Thu_Jul__2_04_34_47_2009_516)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="rc_20090701.diff"

Index: network.subr
===================================================================
--- network.subr	(revision 195252)
+++ network.subr	(working copy)
@@ -31,8 +31,8 @@
 #

 # ifn_start ifn
-# Bring up and configure an interface.  If some configuration is applied
-# print the interface configuration.
+#	Bring up and configure an interface.  If some configuration is
+#	applied print the interface configuration.
 #
 ifn_start()
 {
@@ -40,20 +40,21 @@
 	ifn="$1"
 	cfg=1

-	[ -z "$ifn" ] && err 1 "ifn_start called without an interface"
+	ifexists "$ifn" || err 1 "ifn_start called without an interface"

 	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
-# Shutdown and de-configure an interface.  If action is taken print the
-# interface name.
+# ifn_stop ifn
+#	Shutdown and de-configure an interface.  If action is taken
+#	print the interface name.
 #
 ifn_stop()
 {
@@ -61,13 +62,14 @@
 	ifn="$1"
 	cfg=1

-	[ -z "$ifn" ] && return 1
+	ifexists "$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,51 @@
 #
 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 ipv6; 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"
+		fi
+
+		ifconfig $1 inet6 ${_ipv6_opts}
+
+		# ifconfig_ipv6_IF
+		ifconfig_args=`ifconfig_getargs $1 ipv6`
+		if [ -n "${ifconfig_args}" ]; then
+			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 ${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 +152,7 @@
 #
 ifconfig_down()
 {
-	[ -z "$1" ] && return 1
+	local _cfg
 	_cfg=1

 	if wpaif $1; then
@@ -136,13 +174,15 @@
 }

 # get_if_var if var [default]
-#       Return the value of the pseudo-hash corresponding to $if where
-#       $var is a string containg the sub-string "IF" which will be
-#       replaced with $if after the characters defined in _punct are
-#       replaced with '_'. If the variable is unset, replace it with
-#       $default if given.
+#	Return the value of the pseudo-hash corresponding to $if where
+#	$var is a string containg the sub-string "IF" which will be
+#	replaced with $if after the characters defined in _punct are
+#	replaced with '_'. If the variable is unset, replace it with
+#	$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 +200,30 @@
 	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 +250,9 @@
 #	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 +260,7 @@
 			;;
 		esac
 	done
+
 	return 0
 }

@@ -221,7 +268,9 @@
 #	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 +284,7 @@
 			;;
 		esac
 	done
+
 	return 1
 }

@@ -243,7 +293,9 @@
 #	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 +306,18 @@
 			;;
 		esac
 	done
-	if checkyesno synchronous_dhclient; then
-		return 0
-	else
-		return 1
-	fi
+
+	# if no NOSYNCDHCP and SYNCDHCP
+	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,17 +325,77 @@
 			;;
 		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|ipv4|ip|ip4)
+		${SYSCTL_N} net.inet > /dev/null 2>&1
+		;;
+	inet6|ipv6|ip6)
+		${SYSCTL_N} net.inet6 > /dev/null 2>&1
+		;;
+	*)
+		warn "afexists(): Unsupported address family: $_af"
+		return 1
+		;;
+	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
+}
+
 # ipv6if if
 #	Returns 0 if the interface should be configured for IPv6 and
 #	1 otherwise.
 ipv6if()
 {
-	if ! checkyesno ipv6_enable; then
+	local _if i
+	_if=$1
+
+	if ! afexists ipv6; then
 		return 1
 	fi
+
+	# lo0 is always IPv6-enabled
+	case $_if in
+	lo[0-9]*)
+		return 0
+		;;
+	esac
+
 	case "${ipv6_network_interfaces}" in
 	[Aa][Uu][Tt][Oo])
 		return 0
@@ -292,40 +404,110 @@
 		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
+}
+
 # ifexists if
 #	Returns 0 if the interface exists and 1 otherwise.
 ifexists()
 {
+	[ -z "$1" ] && return 1
 	ifconfig -n $1 > /dev/null 2>&1
 }

 # ipv4_up if
-#  add IPv4 addresses to the interface $if
+#	add IPv4 addresses to the interface $if
 ipv4_up()
 {
+	local _if _ret
 	_if=$1
-	ifalias_up ${_if}
-	ipv4_addrs_common ${_if} alias
+	_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
+	_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
+#	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 @@
 	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.
+#	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 @@
 			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|ipv4|ip4)
+		_ret=`ifalias_ipv4_up "$1"`
+		;;
+	inet6|ipv6|ip6)
+		_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
-			alias=$((${alias} + 1))
-			_ret=0
-		else
+		case "${ifconfig_args}" in
+		inet\ *)
+			ifconfig $1 ${ifconfig_args} alias && _ret=0
+			;;
+		"")
 			break
-		fi
+			;;
+		esac
+		alias=$((${alias} + 1))
 	done
+
 	return $_ret
 }

-#ifalias_down if
+# 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
+			;;
+		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 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|ipv4|ip4)
+		_ret=`ifalias_ipv4_down "$1"`
+		;;
+	inet6|ipv6|ip6)
+		_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))
+	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
+			;;
+		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
-		else
-			break
-		fi
+			;;
+		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 @@
 	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,21 @@
 	if [ -r /etc/stop_if.$1 ]; then
 		. /etc/stop_if.$1
 		return 0
+	else
+		return 1
 	fi
-	return 1
 }

-# Create cloneable interfaces.
+# clone_up
+#	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
@@ -477,13 +889,16 @@
 	debug "Cloned: ${_list}"
 }

-# Destroy cloned interfaces. Destroyed interfaces are echoed
-# to standard output.
+# clone_down
+#	Destroy cloned interfaces. Destroyed interfaces are echoed to
+#	standard output.
 #
 clone_down()
 {
+	local _prefix _list ifn
 	_prefix=
 	_list=
+
 	for ifn in ${cloned_interfaces}; do
 		ifconfig ${ifn} destroy
 		if [ $? -eq 0 ]; then
@@ -494,14 +909,14 @@
 	debug "Destroyed clones: ${_list}"
 }

-# Create and configure child interfaces.
-# Return 0 if child interfaces are created.
+# childif_create
+#	Create and configure child interfaces.  Return 0 if child
+#	interfaces are created.
 #
 childif_create()
 {
 	local cfg child child_wlans create_args debug_flags ifn i
 	cfg=1
-
 	ifn=$1

 	# Create wireless interfaces
@@ -531,28 +946,40 @@
 	return ${cfg}
 }

-# Destroy child interfaces.
+# childif_destroy
+#	Destroy child interfaces.
 #
 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.
+# ng_mkpeer
+#	Create netgraph nodes.
 #
-ng_mkpeer() {
+ng_mkpeer()
+{
 	ngctl -f - 2> /dev/null <<EOF
 mkpeer $*
 msg dummy nodeinfo
 EOF
 }

-ng_create_one() {
+# ng_create_one
+#	Create netgraph nodes.
+#
+ng_create_one()
+{
+	local t
+
 	ng_mkpeer $* | while read line; do
 		t=`expr "${line}" : '.* name="\([a-z]*[0-9]*\)" .*'`
 		if [ -n "${t}" ]; then
@@ -562,7 +989,12 @@
 	done
 }

-gif_up() {
+# gif_up
+#	Create gif(4) tunnel interfaces.
+gif_up()
+{
+	local i peers
+
 	for i in ${gif_interfaces}; do
 		peers=`get_if_var $i gifconfig_IF`
 		case ${peers} in
@@ -584,9 +1016,10 @@
 }

 # 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() {
+#	Configure Fast EtherChannel for interface $ifn. Returns 0 if
+#	FEC arguments were found and configured; returns !0 otherwise.
+ng_fec_create()
+{
 	 local req_iface iface bogus
 	 req_iface="$1"

@@ -609,7 +1042,12 @@
 	 done
 }

-fec_up() {
+# fec_up
+#	Create Fast EtherChannel interfaces.
+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
@@ -625,19 +1063,22 @@
 	done
 }

-#
 # ipx_up ifn
-# Configure any IPX addresses for interface $ifn. Returns 0 if IPX
-# arguments were found and configured; returns 1 otherwise.
+#	Configure any IPX addresses for interface $ifn. Returns 0 if
+#	IPX arguments were found and configured; returns 1 otherwise.
 #
 ipx_up()
 {
+	local ifn
 	ifn="$1"
-	ifconfig_args=`get_if_var $ifn ifconfig_IF_ipx`
+
+	# ifconfig_ipx_IF
+	ifconfig_args=`_ifconfig_getargs $ifn ipx`
 	if [ -n "${ifconfig_args}" ]; then
 		ifconfig ${ifn} ${ifconfig_args}
 		return 0
 	fi
+
 	return 1
 }

@@ -647,15 +1088,13 @@
 #
 ipx_down()
 {
-	[ -z "$1" ] && return 1
+	local _if _ifs _ret ipxList oldifs _ipx
+	_if=$1
 	_ifs="^"
 	_ret=1
+	ipxList="`ifconfig ${_if} | grep 'ipx ' | tr "\n" "$_ifs"`"
+	oldifs="$IFS"

-	ifexists $1 || return 1
-
-	ipxList="`ifconfig $1 | grep 'ipx ' | tr "\n" "$_ifs"`"
-
-	oldifs="$IFS"
 	IFS="$_ifs"
 	for _ipx in $ipxList ; do
 		# get rid of extraneous line
@@ -664,7 +1103,7 @@
 		_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 +1117,29 @@
 #
 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
+#		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 +1147,14 @@
 #
 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,45 +1162,56 @@
 				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}"
 		;;
 	esac

-	if [ -z "$type" ]; then
-		echo $_tmplist
-		return 0
-	fi
-
-	# Separate out dhcp and non-dhcp interfaces
-	#
-	_aprefix=
-	_bprefix=
-	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=' '
-		fi
-	done
-
+	_list=
 	case "$type" in
 	nodhcp)
-		echo $_nodhcplist
+		for _if in ${_tmplist} ; do
+			if ! dhcpif $_if && \
+			   [ -n "`_ifconfig_getargs $_if`" ]; then
+				_list="${_list# } ${_if}"
+			fi
+		done
 		;;
 	dhcp)
-		echo $_dhcplist
+		for _if in ${_tmplist} ; do
+			if dhcpif $_if; then
+				_list="${_list# } ${_if}"
+			fi
+		done
 		;;
+	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
 }

@@ -766,12 +1221,12 @@
 #
 get_default_if()
 {
-	routeget="`route -n get $1 default 2>/dev/null`"
+	local routeget oldifs defif line
+	defif=
 	oldifs="$IFS"
 	IFS="
 "
-	defif=
-	for line in $routeget ; do
+	for line in `route -n get $1 default 2>/dev/null`; do
 		case $line in
 		*interface:*)
 			defif=${line##*: }
@@ -783,6 +1238,8 @@
 	echo $defif
 }

+# hexdigit arg
+#	Echo decimal number $arg (single digit) in hexadecimal format.
 hexdigit()
 {
 	if [ $1 -lt 10 ]; then
@@ -799,14 +1256,17 @@
 	fi
 }

+# hexprint arg
+#	Echo decimal number $arg (multiple digits) in hexadecimal format.
 hexprint()
 {
+	local val str dig
 	val=$1
 	str=''
-
 	dig=`hexdigit $((${val} & 15))`
 	str=${dig}${str}
 	val=$((${val} >> 4))
+
 	while [ ${val} -gt 0 ]; do
 		dig=`hexdigit $((${val} & 15))`
 		str=${dig}${str}
@@ -816,250 +1276,13 @@
 	echo ${str}
 }

-# Setup the interfaces for IPv6
-network6_interface_setup()
+# network6_getladdr if [flag]
+#	Echo link-local address from $if if any.
+#	If flag is defined, tentative ones will be excluded.
+network6_getladdr()
 {
-	interfaces=$*
-	rtsol_interfaces=''
-	case ${ipv6_gateway_enable} in
-	[Yy][Ee][Ss])
-		rtsol_available=no
-		;;
-	*)
-		rtsol_available=yes
-		;;
-	esac
-	for i in $interfaces; do
-		rtsol_interface=yes
-		prefix=`get_if_var $i ipv6_prefix_IF`
-		if [ -n "${prefix}" ]; then
-			rtsol_available=no
-			rtsol_interface=no
-			laddr=`network6_getladdr $i`
-			hostid=`expr "${laddr}" : 'fe80::\(.*\)%\(.*\)'`
-			for j in ${prefix}; do
-				address=$j\:${hostid}
-				ifconfig $i inet6 ${address} prefixlen 64 alias
+	local proto addr rest

-				case ${ipv6_gateway_enable} in
-				[Yy][Ee][Ss])
-					# subnet-router anycast address
-					# (rfc2373)
-					ifconfig $i inet6 $j:: prefixlen 64 \
-						alias anycast
-					;;
-				esac
-			done
-		fi
-		ipv6_ifconfig=`get_if_var $i ipv6_ifconfig_IF`
-		if [ -n "${ipv6_ifconfig}" ]; then
-			rtsol_available=no
-			rtsol_interface=no
-			ifconfig $i inet6 ${ipv6_ifconfig} alias
-		fi
-
-		if [ ${rtsol_available} = yes -a ${rtsol_interface} = yes ]
-		then
-			case ${i} in
-			lo0|gif[0-9]*|stf[0-9]*|faith[0-9]*|lp[0-9]*|sl[0-9]*|tun[0-9]*|pflog[0-9]*|pfsync[0-9]*)
-				;;
-			# Wireless NIC cards are virtualized through the wlan interface
-			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]*)
-				;;
-			*)
-				rtsol_interfaces="${rtsol_interfaces} ${i}"
-				;;
-			esac
-		else
-			ifconfig $i inet6
-		fi
-	done
-
-	if [ ${rtsol_available} = yes -a -n "${rtsol_interfaces}" ]; then
-		# Act as endhost - automatically configured.
-		# You can configure only single interface, as
-		# specification assumes that autoconfigured host has
-		# single interface only.
-		sysctl net.inet6.ip6.accept_rtadv=1
-		set ${rtsol_interfaces}
-		ifconfig $1 up
-		rtsol ${rtsol_flags} $1
-	fi
-
-	for i in $interfaces; do
-		alias=0
-		while : ; do
-			ipv6_ifconfig=`get_if_var $i ipv6_ifconfig_IF_alias${alias}`
-			if [ -z "${ipv6_ifconfig}" ]; then
-				break;
-			fi
-			ifconfig $i inet6 ${ipv6_ifconfig} alias
-			alias=$((${alias} + 1))
-		done
-	done
-}
-
-# Setup IPv6 to IPv4 mapping
-network6_stf_setup()
-{
-	case ${stf_interface_ipv4addr} in
-	[Nn][Oo] | '')
-		;;
-	*)
-		# assign IPv6 addr and interface route for 6to4 interface
-		stf_prefixlen=$((16+${stf_interface_ipv4plen:-0}))
-		OIFS="$IFS"
-		IFS=".$IFS"
-		set ${stf_interface_ipv4addr}
-		IFS="$OIFS"
-		hexfrag1=`hexprint $(($1*256 + $2))`
-		hexfrag2=`hexprint $(($3*256 + $4))`
-		ipv4_in_hexformat="${hexfrag1}:${hexfrag2}"
-		case ${stf_interface_ipv6_ifid} in
-		[Aa][Uu][Tt][Oo] | '')
-			for i in ${ipv6_network_interfaces}; do
-				laddr=`network6_getladdr ${i}`
-				case ${laddr} in
-				'')
-					;;
-				*)
-					break
-					;;
-				esac
-			done
-			stf_interface_ipv6_ifid=`expr "${laddr}" : \
-						      'fe80::\(.*\)%\(.*\)'`
-			case ${stf_interface_ipv6_ifid} in
-			'')
-				stf_interface_ipv6_ifid=0:0:0:1
-				;;
-			esac
-			;;
-		esac
-		ifconfig stf0 create >/dev/null 2>&1
-		ifconfig stf0 inet6 2002:${ipv4_in_hexformat}:${stf_interface_ipv6_slaid:-0}:${stf_interface_ipv6_ifid} \
-			prefixlen ${stf_prefixlen}
-		# disallow packets to malicious 6to4 prefix
-		route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject
-		route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject
-		route add -inet6 2002:0000:: -prefixlen 24 ::1 -reject
-		route add -inet6 2002:ff00:: -prefixlen 24 ::1 -reject
-		;;
-	esac
-}
-
-# Setup static routes
-network6_static_routes_setup()
-{
-	# Set up any static routes.
-	case ${ipv6_defaultrouter} in
-	[Nn][Oo] | '')
-		;;
-	*)
-		ipv6_static_routes="default ${ipv6_static_routes}"
-		ipv6_route_default="default ${ipv6_defaultrouter}"
-		;;
-	esac
-	case ${ipv6_static_routes} in
-	[Nn][Oo] | '')
-		;;
-	*)
-		for i in ${ipv6_static_routes}; do
-			ipv6_route_args=`get_if_var $i ipv6_route_IF`
-			route add -inet6 ${ipv6_route_args}
-		done
-		;;
-	esac
-}
-
-# Setup faith
-network6_faith_setup()
-{
-	case ${ipv6_faith_prefix} in
-	[Nn][Oo] | '')
-		;;
-	*)
-		sysctl net.inet6.ip6.keepfaith=1
-		ifconfig faith0 create >/dev/null 2>&1
-		ifconfig faith0 up
-		for prefix in ${ipv6_faith_prefix}; do
-			prefixlen=`expr "${prefix}" : ".*/\(.*\)"`
-			case ${prefixlen} in
-			'')
-				prefixlen=96
-				;;
-			*)
-				prefix=`expr "${prefix}" : \
-					     "\(.*\)/${prefixlen}"`
-				;;
-			esac
-			route add -inet6 ${prefix} -prefixlen ${prefixlen} ::1
-			route change -inet6 ${prefix} -prefixlen ${prefixlen} \
-				-ifp faith0
-		done
-		;;
-	esac
-}
-
-# Install the "default interface" to kernel, which will be used
-# as the default route when there's no router.
-network6_default_interface_setup()
-{
-	# Choose IPv6 default interface if it is not clearly specified.
-	case ${ipv6_default_interface} in
-	'')
-		for i in ${ipv6_network_interfaces}; do
-			case $i in
-			lo0|faith[0-9]*)
-				continue
-				;;
-			esac
-			laddr=`network6_getladdr $i exclude_tentative`
-			case ${laddr} in
-			'')
-				;;
-			*)
-				ipv6_default_interface=$i
-				break
-				;;
-			esac
-		done
-		;;
-	esac
-
-	# Disallow unicast packets without outgoing scope identifiers,
-	# or route such packets to a "default" interface, if it is specified.
-	route add -inet6 fe80:: -prefixlen 10 ::1 -reject
-	case ${ipv6_default_interface} in
-	[Nn][Oo] | '')
-		route add -inet6 ff02:: -prefixlen 16 ::1 -reject
-		;;
-	*)
-		laddr=`network6_getladdr ${ipv6_default_interface}`
-		route add -inet6 ff02:: ${laddr} -prefixlen 16 -interface \
-			-cloning
-
-		# Disable installing the default interface with the
-		# case net.inet6.ip6.forwarding=0 and
-		# net.inet6.ip6.accept_rtadv=0, due to avoid conflict
-		# between the default router list and the manual
-		# configured default route.
-		case ${ipv6_gateway_enable} in
-		[Yy][Ee][Ss])
-			;;
-		*)
-			if [ `sysctl -n net.inet6.ip6.accept_rtadv` -eq 1 ]
-			then
-				ndp -I ${ipv6_default_interface}
-			fi
-			;;
-		esac
-		;;
-	esac
-}
-
-network6_getladdr()
-{
 	ifconfig $1 2>/dev/null | while read proto addr rest; do
 		case ${proto} in
 		inet6)
Index: rc.d/NETWORKING
===================================================================
--- rc.d/NETWORKING	(revision 195153)
+++ rc.d/NETWORKING	(working copy)
@@ -4,7 +4,7 @@
 #

 # PROVIDE: NETWORKING NETWORK
-# REQUIRE: netif netoptions routing network_ipv6 ppp ipfw
+# REQUIRE: netif netoptions routing ppp ipfw stf faith
 # REQUIRE: defaultroute routed mrouted route6d mroute6d resolv

 #	This is a dummy dependency, for services which require networking
Index: rc.d/network_ipv6
===================================================================
--- rc.d/network_ipv6	(revision 195153)
+++ rc.d/network_ipv6	(working copy)
@@ -1,126 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2000  The KAME Project
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD$
-# 	From: src/etc/rc.network6,v 1.29 2002/04/06 15:15:43
-#
-
-# PROVIDE: network_ipv6
-# REQUIRE: routing ip6fw
-# KEYWORD: nojail
-
-. /etc/rc.subr
-. /etc/network.subr
-
-name="network_ipv6"
-rcvar=`set_rcvar ipv6`
-start_cmd="network_ipv6_start"
-
-network_ipv6_start()
-{
-	# disallow "internal" addresses to appear on the wire
-	route add -inet6 ::ffff:0.0.0.0 -prefixlen 96 ::1 -reject
-	route add -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject
-
-	case ${ipv6_network_interfaces} in
-	[Aa][Uu][Tt][Oo])
-		# Get a list of network interfaces
-		ipv6_network_interfaces="`ifconfig -l`"
-		;;
-	[Nn][Oo][Nn][Ee])
-		ipv6_network_interfaces=''
-		;;
-	esac
-
-	if checkyesno ipv6_gateway_enable; then
-		# act as a router
-		${SYSCTL_W} net.inet6.ip6.forwarding=1
-		${SYSCTL_W} net.inet6.ip6.accept_rtadv=0
-
-		# wait for DAD
-		for i in $ipv6_network_interfaces; do
-			ifconfig $i up
-		done
-		sleep `${SYSCTL_N} net.inet6.ip6.dad_count`
-		sleep 1
-	else
-		# act as endhost - start with manual configuration
-		# Setup of net.inet6.ip6.accept_rtadv is done later by
-		# network6_interface_setup.
-		${SYSCTL_W} net.inet6.ip6.forwarding=0
-	fi
-
-	if [ -n "${ipv6_network_interfaces}" ]; then
-		# Setup the interfaces
-		network6_interface_setup $ipv6_network_interfaces
-
-		# wait for DAD's completion (for global addrs)
-		sleep `${SYSCTL_N} net.inet6.ip6.dad_count`
-		sleep 1
-	fi
-
-	# Filter out interfaces on which IPv6 initialization failed.
-	if checkyesno ipv6_gateway_enable; then
-		ipv6_working_interfaces=""
-		for i in ${ipv6_network_interfaces}; do
-			laddr=`network6_getladdr $i exclude_tentative`
-			case ${laddr} in
-			'')
-				;;
-			*)
-				ipv6_working_interfaces="$i \
-				    ${ipv6_working_interfaces}"
-				;;
-			esac
-		done
-		ipv6_network_interfaces=${ipv6_working_interfaces}
-	fi
-
-	# Setup IPv6 to IPv4 mapping
-	network6_stf_setup
-
-	# Install the "default interface" to kernel, which will be used
-	# as the default route when there's no router.
-	network6_default_interface_setup
-
-	# Setup static routes
-	network6_static_routes_setup
-
-	# Setup faith
-	network6_faith_setup
-
-	# Support for IPv4 address tacked onto an IPv6 address
-	if checkyesno ipv6_ipv4mapping; then
-		echo 'IPv4 mapped IPv6 address support=YES'
-		${SYSCTL_W} net.inet6.ip6.v6only=0 >/dev/null
-	else
-		echo 'IPv4 mapped IPv6 address support=NO'
-		${SYSCTL_W} net.inet6.ip6.v6only=1 >/dev/null
-	fi
-}
-
-load_rc_config $name
-run_rc_command "$1"
Index: rc.d/devd
===================================================================
--- rc.d/devd	(revision 195153)
+++ rc.d/devd	(working copy)
@@ -4,7 +4,7 @@
 #

 # PROVIDE: devd
-# REQUIRE: netif network_ipv6
+# REQUIRE: netif
 # BEFORE: NETWORKING mountcritremote
 # KEYWORD: nojail shutdown

Index: rc.d/addswap
===================================================================
--- rc.d/addswap	(revision 195153)
+++ rc.d/addswap	(working copy)
@@ -7,7 +7,6 @@

 # PROVIDE: addswap
 # REQUIRE: FILESYSTEMS
-# BEFORE: sysctl
 # KEYWORD: nojail

 . /etc/rc.subr
Index: rc.d/faith
===================================================================
--- rc.d/faith	(revision 0)
+++ rc.d/faith	(revision 0)
@@ -0,0 +1,77 @@
+#!/bin/sh
+# $FreeBSD$
+#
+
+# PROVIDE: faith
+# REQUIRE: netif routing
+# KEYWORD: nojail
+
+. /etc/rc.subr
+. /etc/network.subr
+
+name="faith"
+start_cmd="faith_up"
+stop_cmd="faith_down"
+
+faith_up()
+{
+	case ${ipv6_faith_prefix} in
+	[Nn][Oo] | '')
+		;;
+	*)
+		echo "Configuring IPv6-to-IPv4 TCP relay capturing interface:" \
+		    " faith0."
+		${SYSCTL_W} net.inet6.ip6.keepfaith=1
+		ifconfig faith0 create >/dev/null 2>&1
+		ifconfig faith0 up
+		for prefix in ${ipv6_faith_prefix}; do
+			prefixlen=`expr "${prefix}" : ".*/\(.*\)"`
+			case ${prefixlen} in
+			'')
+				prefixlen=96
+				;;
+			*)
+				prefix=`expr "${prefix}" : \
+					     "\(.*\)/${prefixlen}"`
+				;;
+			esac
+			route add -inet6 ${prefix} -prefixlen ${prefixlen} ::1
+			route change -inet6 ${prefix} -prefixlen ${prefixlen} \
+				-ifp faith0
+		done
+		if [ -z "${rc_quiet}" ]; then
+			ifconfig faith0
+		fi
+		;;
+	esac
+}
+
+faith_down()
+{
+	echo "Removing IPv6-to-IPv4 TCP relay capturing interface: faith0."
+	ifconfig faith0 destroy
+	${SYSCTL_W} net.inet6.ip6.keepfaith=0
+
+	case ${ipv6_faith_prefix} in
+	[Nn][Oo] | '')
+		;;
+	*)
+		for prefix in ${ipv6_faith_prefix}; do
+			prefixlen=`expr "${prefix}" : ".*/\(.*\)"`
+			case ${prefixlen} in
+			'')
+				prefixlen=96
+				;;
+			*)
+				prefix=`expr "${prefix}" : \
+					     "\(.*\)/${prefixlen}"`
+				;;
+			esac
+			route delete -inet6 ${prefix} -prefixlen ${prefixlen}
+		done
+		;;
+	esac
+}
+
+load_rc_config $name
+run_rc_command "$1"

Property changes on: rc.d/faith
___________________________________________________________________
Added: svn:executable
   + *

Index: rc.d/sysctl
===================================================================
--- rc.d/sysctl	(revision 195153)
+++ rc.d/sysctl	(working copy)
@@ -5,7 +5,7 @@

 # PROVIDE: sysctl
 # REQUIRE: root
-# BEFORE:  DAEMON
+# BEFORE: FILESYSTEMS

 . /etc/rc.subr

Index: rc.d/mroute6d
===================================================================
--- rc.d/mroute6d	(revision 195153)
+++ rc.d/mroute6d	(working copy)
@@ -4,7 +4,8 @@
 #

 # PROVIDE: mroute6d
-# REQUIRE: network_ipv6
+# REQUIRE: netif routing
+# BEFORE: NETWORKING
 # KEYWORD: nojail

 . /etc/rc.subr
Index: rc.d/ip6addrctl
===================================================================
--- rc.d/ip6addrctl	(revision 195153)
+++ rc.d/ip6addrctl	(working copy)
@@ -4,8 +4,8 @@
 #

 # PROVIDE: ip6addrctl
-# REQUIRE: FILESYSTEMS netif
-# BEFORE: network_ipv6
+# REQUIRE: FILESYSTEMS
+# BEFORE: netif
 # KEYWORD: nojail

 . /etc/rc.subr
@@ -52,7 +52,7 @@
 			ip6addrctl install /etc/ip6addrctl.conf
 			checkyesno ip6addrctl_verbose && ip6addrctl
 		else
-			if checkyesno ipv6_enable; then
+			if checkyesno ipv6_prefer; then
 				ip6addrctl_prefer_ipv6
 			else
 				ip6addrctl_prefer_ipv4
Index: rc.d/stf
===================================================================
--- rc.d/stf	(revision 0)
+++ rc.d/stf	(revision 0)
@@ -0,0 +1,79 @@
+#!/bin/sh
+# $FreeBSD$
+#
+
+# PROVIDE: stf
+# REQUIRE: netif routing
+# KEYWORD: nojail
+
+. /etc/rc.subr
+. /etc/network.subr
+
+name="stf"
+start_cmd="stf_up"
+stop_cmd="stf_down"
+
+stf_up()
+{
+	case ${stf_interface_ipv4addr} in
+	[Nn][Oo] | '')
+		;;
+	*)
+		# assign IPv6 addr and interface route for 6to4 interface
+		stf_prefixlen=$((16+${stf_interface_ipv4plen:-0}))
+		OIFS="$IFS"
+		IFS=".$IFS"
+		set ${stf_interface_ipv4addr}
+		IFS="$OIFS"
+		hexfrag1=`hexprint $(($1*256 + $2))`
+		hexfrag2=`hexprint $(($3*256 + $4))`
+		ipv4_in_hexformat="${hexfrag1}:${hexfrag2}"
+		case ${stf_interface_ipv6_ifid} in
+		[Aa][Uu][Tt][Oo] | '')
+			for i in ${ipv6_network_interfaces}; do
+				laddr=`network6_getladdr ${i}`
+				case ${laddr} in
+				'')
+					;;
+				*)
+					break
+					;;
+				esac
+			done
+			stf_interface_ipv6_ifid=`expr "${laddr}" : \
+						      'fe80::\(.*\)%\(.*\)'`
+			case ${stf_interface_ipv6_ifid} in
+			'')
+				stf_interface_ipv6_ifid=0:0:0:1
+				;;
+			esac
+			;;
+		esac
+		echo "Configuring 6to4 tunnel interface: stf0."
+		ifconfig stf0 create >/dev/null 2>&1
+		ifconfig stf0 inet6 2002:${ipv4_in_hexformat}:${stf_interface_ipv6_slaid:-0}:${stf_interface_ipv6_ifid} \
+			prefixlen ${stf_prefixlen}
+		if [ -z "${rc_quiet}" ]; then
+			/sbin/ifconfig stf0
+		fi
+		# disallow packets to malicious 6to4 prefix
+		route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject
+		route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject
+		route add -inet6 2002:0000:: -prefixlen 24 ::1 -reject
+		route add -inet6 2002:ff00:: -prefixlen 24 ::1 -reject
+		;;
+	esac
+}
+
+stf_down()
+{
+	echo "Removing 6to4 tunnel interface: stf0."
+	ifconfig stf0 destroy
+	route delete -inet6 2002:e000:: -prefixlen 20 ::1
+	route delete -inet6 2002:7f00:: -prefixlen 24 ::1
+	route delete -inet6 2002:0000:: -prefixlen 24 ::1
+	route delete -inet6 2002:ff00:: -prefixlen 24 ::1
+}
+
+load_rc_config $name
+run_rc_command "$1"

Property changes on: rc.d/stf
___________________________________________________________________
Added: svn:executable
   + *

Index: rc.d/Makefile
===================================================================
--- rc.d/Makefile	(revision 195153)
+++ rc.d/Makefile	(working copy)
@@ -4,13 +4,13 @@

 FILES=	DAEMON FILESYSTEMS LOGIN NETWORKING SERVERS \
 	abi accounting addswap adjkerntz amd \
-	apm apmd archdep atm1 atm2 atm3 auditd auto_linklocal \
+	apm apmd archdep atm1 atm2 atm3 auditd \
 	bgfsck bluetooth bootparams bridge bsnmpd bthidd \
 	ccd cleanvar cleartmp cron \
 	ddb defaultroute devd devfs dhclient \
 	dmesg dumpon \
 	encswap \
-	fsck ftp-proxy ftpd \
+	faith fsck ftp-proxy ftpd \
 	gbde geli geli2 gssd \
 	hcsecd \
 	hostapd hostid hostname \
@@ -23,7 +23,7 @@
 	mixer motd mountcritlocal mountcritremote mountlate \
 	mdconfig mdconfig2 mountd moused mroute6d mrouted msgs \
 	named natd netif netoptions \
-	network_ipv6 newsyslog nfsclient nfscbd nfsd \
+	newsyslog nfsclient nfscbd nfsd \
 	nfsserver nfsuserd nisdomain nsswitch ntpd ntpdate \
 	othermta \
 	pf pflog pfsync \
@@ -32,7 +32,7 @@
 	random rarpd resolv rfcomm_pppd_server root \
 	route6d routed routing rpcbind rtadvd rwho \
 	savecore sdpd securelevel sendmail \
-	serial sppp statd swap1 \
+	serial sppp statd stf swap1 \
 	syscons sysctl syslogd \
 	timed tmp \
 	ugidfw \
Index: rc.d/route6d
===================================================================
--- rc.d/route6d	(revision 195153)
+++ rc.d/route6d	(working copy)
@@ -4,22 +4,35 @@
 #

 # PROVIDE: route6d
-# REQUIRE: network_ipv6
+# REQUIRE: netif routing
 # KEYWORD: nojail

 . /etc/rc.subr

 name="route6d"
-
-# XXX - Executable may be in a different location. The $name variable
-#       is different from the variable in rc.conf(5) so the
-#       subroutines in rc.subr won't catch it. In this case, it
-#	is also needed by the eval statement in the FreeBSD conditional.
-#
+rcvar=`set_rcvar`
 load_rc_config $name

-rcvar="ipv6_router_enable"
-command="${ipv6_router:-/usr/sbin/${name}}"
-eval ${name}_flags=\"${ipv6_router_flags}\"
+case ${ipv6_router_enable} in
+"")	;;
+*)
+	warn "\$ipv6_router_enable is obsolete.  Use \$route6d_enable instead."
+	route6d_enable=$ipv6_router_enable
+	;;
+esac
+case ${ipv6_router} in
+"")	;;
+*)
+	warn "\$ipv6_router is obsolete.  Use \$route6d_program instead."
+	route6d_program=$ipv6_router
+	;;
+esac
+case ${router_flags} in
+"")	;;
+*)
+	warn "\$ipv6_router_flags is obsolete.  Use \$route6d_flags instead."
+	route6d_flags=$ipv6_router_flags
+	;;
+esac

 run_rc_command "$1"
Index: rc.d/netoptions
===================================================================
--- rc.d/netoptions	(revision 195153)
+++ rc.d/netoptions	(working copy)
@@ -5,10 +5,15 @@

 # PROVIDE: netoptions
 # REQUIRE: FILESYSTEMS
+# BEFORE: netif
 # KEYWORD: nojail

 . /etc/rc.subr

+name="netoptions"
+start_cmd="netoptions_start"
+stop_cmd=:
+
 _netoptions_initdone=
 netoptions_init()
 {
@@ -18,75 +23,58 @@
 	fi
 }

-load_rc_config 'XXX'
+netoptions_start()
+{
+	if checkyesno log_in_vain; then
+		netoptions_init
+		echo -n " log_in_vain=${log_in_vain}"
+		${SYSCTL_W} net.inet.tcp.log_in_vain="${log_in_vain}" >/dev/null
+		${SYSCTL_W} net.inet.udp.log_in_vain="${log_in_vain}" >/dev/null
+	fi

-case ${log_in_vain} in
-[Nn][Oo] | '')
-	log_in_vain=0
-	;;
-[Yy][Ee][Ss])
-	log_in_vain=1
-	;;
-[0-9]*)
-	;;
-*)
-	netoptions_init
-	echo " invalid log_in_vain setting: ${log_in_vain}"
-	log_in_vain=0
-	;;
-esac
+	if checkyesno tcp_extensions; then
+		netoptions_init
+		echo -n ' rfc1323 extensions=NO'
+		${SYSCTL_W} net.inet.tcp.rfc1323=0 >/dev/null
+	fi

-if [ "${log_in_vain}" -ne 0 ]; then
-	netoptions_init
-	echo -n " log_in_vain=${log_in_vain}"
-	sysctl net.inet.tcp.log_in_vain="${log_in_vain}" >/dev/null
-	sysctl net.inet.udp.log_in_vain="${log_in_vain}" >/dev/null
-fi
+	if ! checkyesno tcp_keepalive; then
+		netoptions_init
+		echo -n ' TCP keepalive=NO'
+		${SYSCTL_W} net.inet.tcp.always_keepalive=0 >/dev/null
+	fi

-case ${tcp_extensions} in
-[Yy][Ee][Ss] | '')
-	;;
-*)
-	netoptions_init
-	echo -n ' tcp extensions=NO'
-	sysctl net.inet.tcp.rfc1323=0 >/dev/null
-	;;
-esac
+	if checkyesno tcp_drop_synfin; then
+		netoptions_init
+		echo -n ' drop SYN+FIN packets=YES'
+		${SYSCTL_W} net.inet.tcp.drop_synfin=1 >/dev/null
+	fi

-case ${tcp_keepalive} in
-[Nn][Oo])
-	netoptions_init
-	echo -n ' TCP keepalive=NO'
-	sysctl net.inet.tcp.always_keepalive=0 >/dev/null
-	;;
-esac
+	case ${ip_portrange_first} in
+	[0-9]*)
+		netoptions_init
+		echo -n " ip_portrange_first=$ip_portrange_first"
+		${SYSCTL_W} net.inet.ip.portrange.first=$ip_portrange_first >/dev/null
+		;;
+	esac

-case ${tcp_drop_synfin} in
-[Yy][Ee][Ss])
-	netoptions_init
-	echo -n ' drop SYN+FIN packets=YES'
-	sysctl net.inet.tcp.drop_synfin=1 >/dev/null
-	;;
-esac
+	case ${ip_portrange_last} in
+	[0-9]*)
+		netoptions_init
+		echo -n " ip_portrange_last=$ip_portrange_last"
+		${SYSCTL_W} net.inet.ip.portrange.last=$ip_portrange_last >/dev/null
+		;;
+	esac

-case ${ip_portrange_first} in
-[Nn][Oo] | '')
-	;;
-*)
-	netoptions_init
-	echo -n " ip_portrange_first=$ip_portrange_first"
-	sysctl net.inet.ip.portrange.first=$ip_portrange_first >/dev/null
-	;;
-esac
+	if checkyesno ipv6_ipv4mapping; then
+		${SYSCTL_W} net.inet6.ip6.v6only=0 >/dev/null
+	else
+		echo -n " no-ipv4-mapped-ipv6"
+		${SYSCTL_W} net.inet6.ip6.v6only=1 >/dev/null
+	fi

-case ${ip_portrange_last} in
-[Nn][Oo] | '')
-	;;
-*)
-	netoptions_init
-	echo -n " ip_portrange_last=$ip_portrange_last"
-	sysctl net.inet.ip.portrange.last=$ip_portrange_last >/dev/null
-	;;
-esac
+	[ -n "${_netoptions_initdone}" ] && echo '.'
+}

-[ -n "${_netoptions_initdone}" ] && echo '.'
+load_rc_config $name
+run_rc_command $1
Index: rc.d/auto_linklocal
===================================================================
--- rc.d/auto_linklocal	(revision 195153)
+++ rc.d/auto_linklocal	(working copy)
@@ -1,33 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD$
-#
-
-# PROVIDE: auto_linklocal
-# REQUIRE: root
-# BEFORE:  sysctl
-# KEYWORD: nojail
-
-. /etc/rc.subr
-. /etc/network.subr
-
-name="auto_linklocal"
-start_cmd="auto_linklocal_start"
-stop_cmd=":"
-
-auto_linklocal_start()
-{
-	if ! checkyesno ipv6_enable && ${SYSCTL} net.inet6 > /dev/null 2>&1; then
-		if ! ${SYSCTL_W} net.inet6.ip6.auto_linklocal=0 >/dev/null 2>&1; then
-			warn "failed to set sysctl(8)"
-			return 1
-		fi
-		laddr=`network6_getladdr lo0`
-		if [ -z "${laddr}" ]; then
-			ifconfig lo0 inet6 fe80::1 prefixlen 64
-		fi
-	fi
-}
-
-load_rc_config $name
-run_rc_command "$1"
Index: rc.d/routed
===================================================================
--- rc.d/routed	(revision 195153)
+++ rc.d/routed	(working copy)
@@ -10,13 +10,29 @@
 . /etc/rc.subr

 name="routed"
+rcvar=`set_rcvar`
+load_rc_config $name

-# XXX - Executable may be in a different location. The $name variable
-#       is different from the variable in rc.conf(5) so the
-#       subroutines in rc.subr won't catch it.
-#
-load_rc_config $name
-rcvar="router_enable"
-command="${router:-/sbin/${name}}"
-eval ${name}_flags=\"${router_flags}\"
+case ${router_enable} in
+"")	;;
+*)
+	warn "\$router_enable is obsolete.  Use \$routed_enable instead."
+	routed_enable=$router_enable
+	;;
+esac
+case ${router} in
+"")	;;
+*)
+	warn "\$router is obsolete.  Use \$routed_program instead."
+	routed_program=$router
+	;;
+esac
+case ${router_flags} in
+"")	;;
+*)
+	warn "\$router_flags is obsolete.  Use \$routed_flags instead."
+	routed_flags=$router_flags
+	;;
+esac
+
 run_rc_command "$1"
Index: rc.d/defaultroute
===================================================================
--- rc.d/defaultroute	(revision 195153)
+++ rc.d/defaultroute	(working copy)
@@ -6,7 +6,7 @@
 #

 # PROVIDE: defaultroute
-# REQUIRE: devd netif network_ipv6
+# REQUIRE: devd netif
 # KEYWORD: nojail

 . /etc/rc.subr
@@ -18,7 +18,7 @@

 defaultroute_start()
 {
-	local output carrier nocarrier
+	local output carrier nocarrier nl

 	# Return without waiting if we don't have dhcp interfaces or
 	# if none of the dhcp interfaces is plugged in.
@@ -41,6 +41,7 @@
 		if [ -n "${defif}" ]; then
 			if [ ${delay} -ne ${defaultroute_delay} ]; then
 				echo -n "($defif)"
+				nl=1
 			fi
 			break
 		fi
@@ -49,11 +50,12 @@
 		else
 			echo -n .
 		fi
+		nl=1
 		sleep 1
-		delay=`expr $delay - 1`
+		delay=$(($delay - 1))
 	done

-	echo
+	[ -n "$nl" ] && echo
 }

 load_rc_config $name
Index: rc.d/rtadvd
===================================================================
--- rc.d/rtadvd	(revision 195153)
+++ rc.d/rtadvd	(working copy)
@@ -40,10 +40,25 @@
 	# get a list of interfaces and enable it on them
 	#
 	case ${rtadvd_interfaces} in
-	'')
+	[Aa][Uu][Tt][Oo]|'')
 		for i in `ifconfig -l` ; do
 			case $i in
-			lo0|gif[0-9]*|stf[0-9]*|faith[0-9]*|lp[0-9]*|sl[0-9]*|tun[0-9]*)
+			lo0|\
+			stf[0-9]*|\
+			faith[0-9]*|\
+			lp[0-9]*|\
+			sl[0-9]*|\
+			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]*)
 				continue
 				;;
 			*)
Index: rc.d/routing
===================================================================
--- rc.d/routing	(revision 195153)
+++ rc.d/routing	(working copy)
@@ -21,17 +21,79 @@

 routing_start()
 {
-	static_start
-	options_start
+	static_start "$@"
+	options_start "$@"
 }

 routing_stop()
 {
+	static_stop "$@"
 	route -n flush
+	for i in ${ipv6_network_interfaces}; do
+		ifconfig $i inet6 -defaultif
+	done
 }

 static_start()
 {
+	local _af
+	_af=$1
+
+	case ${_af} in
+	inet | ipv4 | ip4)
+		do_static ipv4 add
+		;;
+	inet6 | ipv6 | ip6)
+		do_static ipv6 add
+		;;
+	atm)
+		do_static atm add
+		;;
+	*)
+		do_static ipv4 add
+		do_static ipv6 add
+		do_static atm add
+		;;
+	esac
+}
+
+static_stop()
+{
+	local _af
+	_af=$1
+
+	case ${_af} in
+	inet | ipv4 | ip4)
+		do_static ipv4 delete
+		;;
+	inet6 | ipv6 | ip6)
+		do_static ipv6 delete
+		;;
+	atm)
+		do_static atm delete
+		;;
+	*)
+		do_static ipv4 delete
+		do_static ipv6 delete
+		do_static atm delete
+		;;
+	esac
+}
+
+do_static()
+{
+	local _af _action
+	_af=$1
+	_action=$2
+
+	eval $1_static $2
+}
+
+ipv4_static()
+{
+	local _action
+	_action=$1
+
 	case ${defaultrouter} in
 	[Nn][Oo] | '')
 		;;
@@ -41,20 +103,130 @@
 		;;
 	esac

-	# Setup static routes. This should be done before router discovery.
-	#
 	if [ -n "${static_routes}" ]; then
 		for i in ${static_routes}; do
-			eval route_args=\$route_${i}
-			route add ${route_args}
+			route_args=`get_if_var $i route_IF`
+			route ${_action} ${route_args}
 		done
 	fi
-	# Now ATM static routes
-	#
+}
+
+ipv6_static()
+{
+	local _action i
+	_action=$1
+
+	# disallow "internal" addresses to appear on the wire
+	route ${_action} -inet6 ::ffff:0.0.0.0 -prefixlen 96 ::1 -reject
+	route ${_action} -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject
+
+	case ${ipv6_defaultrouter} in
+	[Nn][Oo] | '')
+		;;
+	*)
+		ipv6_static_routes="default ${ipv6_static_routes}"
+		ipv6_route_default="default ${ipv6_defaultrouter}"
+		;;
+	esac
+
+	if [ -n "${ipv6_static_routes}" ]; then
+		for i in ${ipv6_static_routes}; do
+			ipv6_route_args=`get_if_var $i ipv6_route_IF`
+			route ${_action} -inet6 ${route_args}
+		done
+	fi
+
+	# Fixup $ipv6_network_interfaces
+	case ${ipv6_network_interfaces} in
+	[Nn][Oo][Nn][Ee])
+		ipv6_network_interfaces=''
+		;;
+	esac
+
+	if checkyesno ipv6_gateway_enable; then
+		for i in ${ipv6_network_interfaces}; do
+
+			laddr=`network6_getladdr $i exclude_tentative`
+			case ${laddr} in
+			'')
+				;;
+			*)
+				ipv6_working_interfaces="$i \
+				    ${ipv6_working_interfaces}"
+				;;
+			esac
+		done
+		ipv6_network_interfaces=${ipv6_working_interfaces}
+	fi
+
+	# Install the "default interface" to kernel, which will be used
+	# as the default route when there's no router.
+	case "${ipv6_default_interface}" in
+	[Nn][Oo] | [Nn][Oo][Nn][Ee])
+		ipv6_default_interface=""
+		;;
+	[Aa][Uu][Tt][Oo] | "")
+		for i in ${ipv6_network_interfaces}; do
+			case $i in
+			lo0|faith[0-9]*)
+				continue
+				;;
+			esac
+			laddr=`network6_getladdr $i exclude_tentative`
+			case ${laddr} in
+			'')
+				;;
+			*)
+				ipv6_default_interface=$i
+				break
+				;;
+			esac
+		done
+		;;
+	esac
+
+	# Disallow unicast packets without outgoing scope identifiers,
+	# or route such packets to a "default" interface, if it is specified.
+	route ${_action} -inet6 fe80:: -prefixlen 10 ::1 -reject
+
+	case ${ipv6_default_interface} in
+	'')
+		route ${_action} -inet6 ff02:: -prefixlen 16 ::1 -reject
+		;;
+	*)
+		laddr=`network6_getladdr ${ipv6_default_interface}`
+		route ${_action} -inet6 ff02:: ${laddr} -prefixlen 16 -interface
+
+		# Disable installing the default interface with the
+		# case net.inet6.ip6.forwarding=0 and
+		# the interface with no ND6_IFF_ACCEPT_RTADV
+		# to avoid conflict between the default router list and
+		# the manual configured default route.
+		if ! checkyesno ipv6_gateway_enable; then
+			ifconfig ${ipv6_default_interface} nd6 | \
+			while read proto options
+			do
+				case "${proto}:${options}" in
+				nd6:*ACCEPT_RTADV*)
+					ifconfig ${ipv6_default_interface} inet6 defaultif
+					break
+				;;
+				esac
+			done
+		fi
+		;;
+	esac
+}
+
+atm_static()
+{
+	local _action i
+	_action=$1
+
 	if [ -n "${natm_static_routes}" ]; then
 		for i in ${natm_static_routes}; do
-			eval route_args=\$route_${i}
-			atmconfig natm add ${route_args}
+			route_args=`get_if_var $i route_IF`
+			atmconfig natm ${_action} ${route_args}
 		done
 	fi
 }
@@ -70,72 +242,62 @@

 options_start()
 {
-	case ${icmp_bmcastecho} in
-	[Yy][Ee][Ss])
+	if checkyesno icmp_bmcastecho; then
 		ropts_init
 		echo -n ' broadcast ping responses=YES'
 		sysctl net.inet.icmp.bmcastecho=1 >/dev/null
-		;;
-	esac
+	fi

-	case ${icmp_drop_redirect} in
-	[Yy][Ee][Ss])
+	if checkyesno icmp_drop_redirect; then
 		ropts_init
 		echo -n ' ignore ICMP redirect=YES'
 		sysctl net.inet.icmp.drop_redirect=1 >/dev/null
-		;;
-	esac
+	fi

-	case ${icmp_log_redirect} in
-	[Yy][Ee][Ss])
+	if checkyesno icmp_log_redirect; then
 		ropts_init
 		echo -n ' log ICMP redirect=YES'
 		sysctl net.inet.icmp.log_redirect=1 >/dev/null
-		;;
-	esac
+	fi

-	case ${gateway_enable} in
-	[Yy][Ee][Ss])
+	if checkyesno gateway_enable; then
 		ropts_init
-		echo -n ' IP gateway=YES'
+		echo -n ' IPv4 gateway=YES'
 		sysctl net.inet.ip.forwarding=1 >/dev/null
-		;;
-	esac
+	fi

-	case ${forward_sourceroute} in
-	[Yy][Ee][Ss])
+	if checkyesno ipv6_gateway_enable; then
 		ropts_init
+		echo -n ' IPv6 gateway=YES'
+		sysctl net.inet6.ip6.forwarding=1 >/dev/null
+	fi
+
+	if checkyesno forward_sourceroute; then
+		ropts_init
 		echo -n ' do source routing=YES'
 		sysctl net.inet.ip.sourceroute=1 >/dev/null
-		;;
-	esac
+	fi

-	case ${accept_sourceroute} in
-	[Yy][Ee][Ss])
+	if checkyesno accept_sourceroute; then
 		ropts_init
 		echo -n ' accept source routing=YES'
 		sysctl net.inet.ip.accept_sourceroute=1 >/dev/null
-		;;
-	esac
+	fi

-	case ${ipxgateway_enable} in
-	[Yy][Ee][Ss])
+	if checkyesno ipxgateway_enable; then
 		ropts_init
 		echo -n ' IPX gateway=YES'
 		sysctl net.ipx.ipx.ipxforwarding=1 >/dev/null
-		;;
-	esac
+	fi

-	case ${arpproxy_all} in
-	[Yy][Ee][Ss])
+	if checkyesno arpproxy_all; then
 		ropts_init
 		echo -n ' ARP proxyall=YES'
 		sysctl net.link.ether.inet.proxyall=1 >/dev/null
-		;;
-	esac
+	fi

 	 [ -n "${_ropts_initdone}" ] && echo '.'
 }

 load_rc_config $name
-run_rc_command "$1"
+run_rc_command "$@"
Index: defaults/rc.conf
===================================================================
--- defaults/rc.conf	(revision 195153)
+++ defaults/rc.conf	(working copy)
@@ -196,6 +196,8 @@
 ifconfig_lo0="inet 127.0.0.1"	# default loopback device configuration.
 #ifconfig_lo0_alias0="inet 127.0.0.254 netmask 0xffffffff" # Sample alias entry.
 #ifconfig_ed0_ipx="ipx 0x00010010"	# Sample IPX address family entry.
+#ifconfig_ed0_ipv6="inet6 2001:db8:1::1 prefixlen 64" # Sample IPv6 addr entry
+#ifconfig_ed0_alias0="inet6 2001:db8:2::1 prefixlen 64" # Sample IPv6 alias
 #ifconfig_fxp0_name="net0"	# Change interface name from fxp0 to net0.
 #wlans_ath0="wlan0"		# wlan(4) interfaces for ath0 device
 #wlandebug_wlan0="scan+auth+assoc"	# Set debug flags with wlanddebug(8)
@@ -360,9 +362,12 @@
 static_routes=""		# Set to static route list (or leave empty).
 natm_static_routes=""		# Set to static route list for NATM (or leave empty).
 gateway_enable="NO"		# Set to YES if this host will be a gateway.
-router_enable="NO"		# Set to YES to enable a routing daemon.
-router="/sbin/routed"		# Name of routing daemon to use if enabled.
-router_flags="-q"		# Flags for routing daemon.
+routed_enable="NO"		# Set to YES to enable a routing daemon.
+#router_enable="NO"		# (works but obsolete)
+routed_program="/sbin/routed"	# Name of routing daemon to use if enabled.
+#router="/sbin/routed"		# (works but obsolete)
+routed_flags="-q"		# Flags for routing daemon.
+#router_flags="-q"		# (works but obsolete)
 mrouted_enable="NO"		# Do IPv4 multicast routing.
 mrouted_program="/usr/local/sbin/mrouted"	# Name of IPv4 multicast
 						# routing daemon.  You need to
@@ -417,8 +422,8 @@
 icmp_bmcastecho="NO"	# respond to broadcast ping packets

 ### IPv6 options: ###
-ipv6_enable="NO"		# Set to YES to set up for IPv6.
-ipv6_network_interfaces="auto"	# List of network interfaces (or "auto").
+ipv6_network_interfaces="none"	# List of IPv6 network interfaces
+				# (or "auto" or "none").
 ipv6_defaultrouter="NO"		# Set to IPv6 default gateway (or NO).
 #ipv6_defaultrouter="2002:c058:6301::"	# Use this for 6to4 (RFC 3068)
 ipv6_static_routes=""		# Set to static route list (or leave empty).
@@ -426,20 +431,22 @@
 				#  route toward loopback interface.
 #ipv6_route_xxx="fec0:0000:0000:0006:: -prefixlen 64 ::1"
 ipv6_gateway_enable="NO"	# Set to YES if this host will be a gateway.
-ipv6_router_enable="NO"		# Set to YES to enable an IPv6 routing daemon.
-ipv6_router="/usr/sbin/route6d"	# Name of IPv6 routing daemon.
-ipv6_router_flags=""		# Flags to IPv6 routing daemon.
-#ipv6_router_flags="-l"		# Example for route6d with only IPv6 site local
+
+route6d_enable="NO"		# Set to YES to enable an IPv6 routing daemon.
+#ipv6_router_enable="NO"	# (works but obsolete)
+route6d_program="/usr/sbin/route6d"	# Name of IPv6 routing daemon.
+#ipv6_router="/usr/sbin/route6d"	# (works but obsolete)
+route6d_flags=""		# Flags to IPv6 routing daemon.
+#ipv6_router_flags=""		# (works but obsolete)
+#route6d_flags="-l"		# Example for route6d with only IPv6 site local
 				# addrs.
-#ipv6_router_flags="-q"		# If you want to run a routing daemon on an end
+#route6d_flags="-q"		# If you want to run a routing daemon on an end
 				# node, you should stop advertisement.
 #ipv6_network_interfaces="ed0 ep0"	# Examples for router
 					# or static configuration for end node.
 					# Choose correct prefix value.
 #ipv6_prefix_ed0="fec0:0000:0000:0001 fec0:0000:0000:0002"  # Examples for rtr.
 #ipv6_prefix_ep0="fec0:0000:0000:0003 fec0:0000:0000:0004"  # Examples for rtr.
-#ipv6_ifconfig_ed0="fec0:0:0:5::1 prefixlen 64"	# Sample manual assign entry
-#ipv6_ifconfig_ed0_alias0="fec0:0:0:5::2 prefixlen 64" # Sample alias entry.
 ipv6_default_interface="NO"	# Default output interface for scoped addrs.
 				# Now this works only for IPv6 link local
 				# multicast addrs.
@@ -481,6 +488,7 @@
 					# for examples
 ip6addrctl_enable="YES"	# Set to YES to enable default address selection
 ip6addrctl_verbose="NO"	# Set to YES to enable verbose configuration messages
+ipv6_prefer="NO"	# Use IPv6 when both IPv4 and IPv6 can be used

 ##############################################################
 ###  System console options  #################################

----Next_Part(Thu_Jul__2_04_34_47_2009_516)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="network.subr.diff"

--- tmp/network.subr	2009-07-02 04:03:34.000000000 +0000
+++ network.subr	2009-07-02 04:04:55.000000000 +0000
@@ -31,8 +31,8 @@
 #

 # ifn_start ifn
-# Bring up and configure an interface.  If some configuration is applied
-# print the interface configuration.
+#	Bring up and configure an interface.  If some configuration is
+#	applied print the interface configuration.
 #
 ifn_start()
 {
@@ -40,21 +40,21 @@
 	ifn="$1"
 	cfg=1

-	[ -z "$ifn" ] && err 1 "ifn_start called without an interface"
+	ifexists "$ifn" || err 1 "ifn_start called without an interface"

 	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
-# Shutdown and de-configure an interface.  If action is taken print the
-# interface name.
+# ifn_stop ifn
+#	Shutdown and de-configure an interface.  If action is taken
+#	print the interface name.
 #
 ifn_stop()
 {
@@ -62,14 +62,14 @@
 	ifn="$1"
 	cfg=1

-	[ -z "$ifn" ] && return 1
+	ifexists "$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
 }
@@ -83,8 +83,10 @@
 #
 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}
@@ -94,7 +96,7 @@
 	# inet6 specific
 	if afexists ipv6; then
 		if ipv6if $1; then
-			if checkyesno ipv6_gateway_enable ]; then
+			if checkyesno ipv6_gateway_enable; then
 				_ipv6_opts="-accept_rtadv auto_linklocal"
 			else
 				_ipv6_opts="auto_linklocal"
@@ -105,6 +107,7 @@

 		ifconfig $1 inet6 ${_ipv6_opts}

+		# ifconfig_ipv6_IF
 		ifconfig_args=`ifconfig_getargs $1 ipv6`
 		if [ -n "${ifconfig_args}" ]; then
 			ifconfig $1 ${ifconfig_args}
@@ -121,7 +124,7 @@
 		fi
 	fi

-	if [ ${_cfg} = 0 ]; then
+	if [ ${_cfg} -eq 0 ]; then
 		ifconfig $1 up
 	fi

@@ -149,7 +152,7 @@
 #
 ifconfig_down()
 {
-	[ -z "$1" ] && return 1
+	local _cfg
 	_cfg=1

 	if wpaif $1; then
@@ -171,13 +174,15 @@
 }

 # get_if_var if var [default]
-#       Return the value of the pseudo-hash corresponding to $if where
-#       $var is a string containg the sub-string "IF" which will be
-#       replaced with $if after the characters defined in _punct are
-#       replaced with '_'. If the variable is unset, replace it with
-#       $default if given.
+#	Return the value of the pseudo-hash corresponding to $if where
+#	$var is a string containg the sub-string "IF" which will be
+#	replaced with $if after the characters defined in _punct are
+#	replaced with '_'. If the variable is unset, replace it with
+#	$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
@@ -201,11 +206,9 @@
 #	outside this file.
 _ifconfig_getargs()
 {
+	local _ifn _af
 	_ifn=$1
-	case $2 in
-	"")	_af=	;;
-	*)	_af=_$2	;;
-	esac
+	_af=${2+_$2}

 	if [ -z "$_ifn" ]; then
 		return 1
@@ -219,6 +222,7 @@
 #	args such as DHCP and WPA.
 ifconfig_getargs()
 {
+	local _tmpargs _arg _args
 	_tmpargs=`_ifconfig_getargs $1 $2`
 	if [ $? -eq 1 ]; then
 		return 1
@@ -246,7 +250,9 @@
 #	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])
@@ -254,6 +260,7 @@
 			;;
 		esac
 	done
+
 	return 0
 }

@@ -261,7 +268,9 @@
 #	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])
@@ -275,6 +284,7 @@
 			;;
 		esac
 	done
+
 	return 1
 }

@@ -283,7 +293,9 @@
 #	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])
@@ -294,18 +306,18 @@
 			;;
 		esac
 	done
-	if checkyesno synchronous_dhclient; then
-		return 0
-	else
-		return 1
-	fi
+
+	# if no NOSYNCDHCP and SYNCDHCP
+	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])
@@ -313,6 +325,7 @@
 			;;
 		esac
 	done
+
 	return 1
 }

@@ -321,24 +334,47 @@
 #	1 otherwise.
 afexists()
 {
+	local _af
 	_af=$1

 	case ${_af} in
 	inet|ipv4|ip|ip4)
-		if ${SYSCTL_N} net.inet > /dev/null; then
-			return 0
-		else
-			return 1
-		fi
+		${SYSCTL_N} net.inet > /dev/null 2>&1
 		;;
 	inet6|ipv6|ip6)
-		if ${SYSCTL_N} net.inet6 > /dev/null; then
-			return 0
-		else
-			return 1
-		fi
+		${SYSCTL_N} net.inet6 > /dev/null 2>&1
+		;;
+	*)
+		warn "afexists(): Unsupported address family: $_af"
+		return 1
+		;;
+	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
 }

 # ipv6if if
@@ -346,6 +382,7 @@
 #	1 otherwise.
 ipv6if()
 {
+	local _if i
 	_if=$1

 	if ! afexists ipv6; then
@@ -367,11 +404,13 @@
 		return 1
 		;;
 	esac
+
 	for i in ${ipv6_network_interfaces}; do
 		if [ "$i" = "$_if" ]; then
 			return 0
 		fi
 	done
+
 	return 1
 }

@@ -380,11 +419,15 @@
 #	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
@@ -394,18 +437,7 @@
 	stf[0-9]*|\
 	faith[0-9]*|\
 	lp[0-9]*|\
-	sl[0-9]*|\
-	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]*)
+	sl[0-9]*)
 		return 1
 		;;
 	esac
@@ -426,48 +458,56 @@
 #	Returns 0 if the interface exists and 1 otherwise.
 ifexists()
 {
+	[ -z "$1" ] && return 1
 	ifconfig -n $1 > /dev/null 2>&1
 }

 # ipv4_up if
-#  add IPv4 addresses to the interface $if
+#	add IPv4 addresses to the interface $if
 ipv4_up()
 {
+	local _if _ret
 	_if=$1
+	_ret=1

-	ifalias_up ${_if} inet
-	ipv4_addrs_common ${_if} alias
+	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
+#	add IPv6 addresses to the interface $if
 ipv6_up()
 {
+	local _if _ret
 	_if=$1
+	_ret=1

 	if ! ipv6if $_if; then
-		return
+		return 0
 	fi

-	ifalias_up ${_if} inet6
-	ipv6_prefix_hostid_addr_up ${_if}
-	ipv6_accept_rtadv_up ${_if}
+	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
+#	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"
@@ -492,20 +532,19 @@
 }

 # ipv6_down if
-#  remove IPv6 addresses from the interface $if
+#	remove IPv6 addresses from the interface $if
 ipv6_down()
 {
+	local _if _ifs _ret inetList oldifs _inet6
 	_if=$1
 	_ifs="^"
 	_ret=1

-	ifexists ${_if} || return 1
-
 	if ! ipv6if $_if; then
 		return 0
 	fi

-	ipv6_accept_rtadv_down ${_if}
+	ipv6_accept_rtadv_down ${_if} && _ret=0
 	ifalias_down ${_if} inet6 && _ret=0

 	inetList="`ifconfig ${_if} | grep 'inet6 ' | tr "\n" "$_ifs"`"
@@ -529,10 +568,12 @@
 }

 # 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.
+#	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
@@ -565,6 +606,7 @@
 			fi
 		done
 	done
+
 	return $_ret
 }

@@ -575,6 +617,7 @@
 #
 ifalias_up()
 {
+	local _ret
 	_ret=1

 	case "$2" in
@@ -594,22 +637,24 @@
 #
 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}`
 		case "${ifconfig_args}" in
 		inet\ *)
-			ifconfig $1 ${ifconfig_args} alias
-			alias=$((${alias} + 1))
-			_ret=0
+			ifconfig $1 ${ifconfig_args} alias && _ret=0
 			;;
-		*)
+		"")
 			break
 			;;
 		esac
+		alias=$((${alias} + 1))
 	done
+
 	return $_ret
 }

@@ -618,21 +663,22 @@
 #
 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
-			alias=$((${alias} + 1))
-			_ret=0
+			ifconfig $1 ${ifconfig_args} alias && _ret=0
 			;;
-		*)
+		"")
 			break
 			;;
 		esac
+		alias=$((${alias} + 1))
 	done

 	# backward compatibility: ipv6_ifconfig_IF_aliasN.
@@ -644,14 +690,14 @@
 			break
 			;;
 		*)
-			ifconfig $1 inet6 ${ifconfig_args} alias
-			alias=$((${alias} + 1))
+			ifconfig $1 inet6 ${ifconfig_args} alias && _ret=0
 			warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete."
-			    "  Use ifconfig_$1_alias${alias} instead."
-			_ret=0
+			    "  Use ifconfig_$1_aliasN instead."
 			;;
 		esac
+		alias=$((${alias} + 1))
 	done
+
 	return $_ret
 }

@@ -662,6 +708,7 @@
 #
 ifalias_down()
 {
+	local _ret
 	_ret=1

 	case "$2" in
@@ -681,22 +728,24 @@
 #
 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}`
 		case "${ifconfig_args}" in
 		inet\ *)
-			ifconfig $1 ${ifconfig_args} -alias
-			alias=$((${alias} + 1))
-			_ret=0
+			ifconfig $1 ${ifconfig_args} -alias && _ret=0
 			;;
-		*)
+		"")
 			break
 			;;
 		esac
+		alias=$((${alias} + 1))
 	done
+
 	return $_ret
 }

@@ -705,21 +754,22 @@
 #
 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
-			alias=$((${alias} + 1))
-			_ret=0
+			ifconfig $1 ${ifconfig_args} -alias && _ret=0
 			;;
-		*)
+		"")
 			break
 			;;
 		esac
+		alias=$((${alias} + 1))
 	done

 	# backward compatibility: ipv6_ifconfig_IF_aliasN.
@@ -728,28 +778,33 @@
 		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_alias${alias} instead."
+			    "  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
+#	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=`expr "${laddr}" : 'fe80::\(.*\)%\(.*\)'`
+		hostid=${laddr#fe80::}
+		hostid=${hostid%\%*}
+
 		for j in ${prefix}; do
 			address=$j\:${hostid}
 			ifconfig ${_if} inet6 ${address} prefixlen 64 alias
@@ -765,25 +820,22 @@
 }

 # ipv6_accept_rtadv_up if
-#  Enable accepting Router Advertisement and send Router Solicitation message
+#	Enable accepting Router Advertisement and send Router
+#	Solicitation message
 ipv6_accept_rtadv_up()
 {
-	_if=$1
-
-	if ipv6_autoconfif $_if; then
-		ifconfig ${_if} inet6 accept_rtadv up
-		rtsol ${rtsol_flags} ${_if}
+	if ipv6_autoconfif $1; then
+		ifconfig $1 inet6 accept_rtadv up
+		rtsol ${rtsol_flags} $1
 	fi
 }

 # ipv6_accept_rtadv_down if
-#  Disabled accepting Router Advertisement
+#	Disable accepting Router Advertisement
 ipv6_accept_rtadv_down()
 {
-	_if=$1
-
-	if ipv6_autoconfif $_if; then
-		ifconfig ${_if} inet6 -accept_rtadv
+	if ipv6_autoconfif $1; then
+		ifconfig $1 inet6 -accept_rtadv
 	fi
 }

@@ -797,8 +849,9 @@
 	if [ -r /etc/start_if.$1 ]; then
 		. /etc/start_if.$1
 		return 0
+	else
+		return 1
 	fi
-	return 1
 }

 # ifscript_down if
@@ -811,16 +864,21 @@
 	if [ -r /etc/stop_if.$1 ]; then
 		. /etc/stop_if.$1
 		return 0
+	else
+		return 1
 	fi
-	return 1
 }

-# Create cloneable interfaces.
+# clone_up
+#	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
@@ -831,13 +889,16 @@
 	debug "Cloned: ${_list}"
 }

-# Destroy cloned interfaces. Destroyed interfaces are echoed
-# to standard output.
+# clone_down
+#	Destroy cloned interfaces. Destroyed interfaces are echoed to
+#	standard output.
 #
 clone_down()
 {
+	local _prefix _list ifn
 	_prefix=
 	_list=
+
 	for ifn in ${cloned_interfaces}; do
 		ifconfig ${ifn} destroy
 		if [ $? -eq 0 ]; then
@@ -848,14 +909,14 @@
 	debug "Destroyed clones: ${_list}"
 }

-# Create and configure child interfaces.
-# Return 0 if child interfaces are created.
+# childif_create
+#	Create and configure child interfaces.  Return 0 if child
+#	interfaces are created.
 #
 childif_create()
 {
 	local cfg child child_wlans create_args debug_flags ifn i
 	cfg=1
-
 	ifn=$1

 	# Create wireless interfaces
@@ -885,28 +946,40 @@
 	return ${cfg}
 }

-# Destroy child interfaces.
+# childif_destroy
+#	Destroy child interfaces.
 #
 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.
+# ng_mkpeer
+#	Create netgraph nodes.
 #
-ng_mkpeer() {
+ng_mkpeer()
+{
 	ngctl -f - 2> /dev/null <<EOF
 mkpeer $*
 msg dummy nodeinfo
 EOF
 }

-ng_create_one() {
+# ng_create_one
+#	Create netgraph nodes.
+#
+ng_create_one()
+{
+	local t
+
 	ng_mkpeer $* | while read line; do
 		t=`expr "${line}" : '.* name="\([a-z]*[0-9]*\)" .*'`
 		if [ -n "${t}" ]; then
@@ -916,7 +989,12 @@
 	done
 }

-gif_up() {
+# gif_up
+#	Create gif(4) tunnel interfaces.
+gif_up()
+{
+	local i peers
+
 	for i in ${gif_interfaces}; do
 		peers=`get_if_var $i gifconfig_IF`
 		case ${peers} in
@@ -938,9 +1016,10 @@
 }

 # 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() {
+#	Configure Fast EtherChannel for interface $ifn. Returns 0 if
+#	FEC arguments were found and configured; returns !0 otherwise.
+ng_fec_create()
+{
 	 local req_iface iface bogus
 	 req_iface="$1"

@@ -963,7 +1042,12 @@
 	 done
 }

-fec_up() {
+# fec_up
+#	Create Fast EtherChannel interfaces.
+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
@@ -979,19 +1063,22 @@
 	done
 }

-#
 # ipx_up ifn
-# Configure any IPX addresses for interface $ifn. Returns 0 if IPX
-# arguments were found and configured; returns 1 otherwise.
+#	Configure any IPX addresses for interface $ifn. Returns 0 if
+#	IPX arguments were found and configured; returns 1 otherwise.
 #
 ipx_up()
 {
+	local ifn
 	ifn="$1"
+
+	# ifconfig_ipx_IF
 	ifconfig_args=`_ifconfig_getargs $ifn ipx`
 	if [ -n "${ifconfig_args}" ]; then
 		ifconfig ${ifn} ${ifconfig_args}
 		return 0
 	fi
+
 	return 1
 }

@@ -1001,15 +1088,13 @@
 #
 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
@@ -1018,7 +1103,7 @@
 		_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
@@ -1032,19 +1117,19 @@
 #
 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
@@ -1062,6 +1147,7 @@
 #
 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.
@@ -1069,7 +1155,6 @@
 	_tmplist=
 	case ${network_interfaces} in
 	[Aa][Uu][Tt][Oo])
-		_prefix=''
 		_autolist="`ifconfig -l`"
 		_lo=
 		for _if in ${_autolist} ; do
@@ -1077,68 +1162,56 @@
 				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}"
 		;;
 	esac

-	if [ -z "$type" ]; then
-		echo $_tmplist
-		return 0
-	fi
-
-	# Separate out dhcp and non-dhcp interfaces
-	#
 	_list=
-	_prefix=
 	case "$type" in
 	nodhcp)
 		for _if in ${_tmplist} ; do
 			if ! dhcpif $_if && \
 			   [ -n "`_ifconfig_getargs $_if`" ]; then
-				_list="${_list}${_prefix}${_if}"
-				[ -z "$_prefix" ] && _prefix=' '
+				_list="${_list# } ${_if}"
 			fi
 		done
-		echo $_list
 		;;
 	dhcp)
 		for _if in ${_tmplist} ; do
 			if dhcpif $_if; then
-				_list="${_list}${_prefix}${_if}"
-				[ -z "$_prefix" ] && _prefix=' '
+				_list="${_list# } ${_if}"
 			fi
 		done
-		echo $_list
 		;;
 	noautoconf)
 		for _if in ${_tmplist} ; do
 			if ! ipv6_autoconfif $_if && \
 			   [ -n "`_ifconfig_getargs $_if ipv6`" ]; then
-				_list="${_list}${_prefix}${_if}"
-				[ -z "$_prefix" ] && _prefix=' '
+				_list="${_list# } ${_if}"
 			fi
 		done
-		echo $_list
 		;;
 	autoconf)
 		for _if in ${_tmplist} ; do
 			if ipv6_autoconfif $_if; then
-				_list="${_list}${_prefix}${_if}"
-				[ -z "$_prefix" ] && _prefix=' '
+				_list="${_list# } ${_if}"
 			fi
 		done
-		echo $_list
+		;;
+	*)
+		_list=${_tmplist}
 		;;
 	esac

+	echo $_list
+
 	return 0
 }

@@ -1148,12 +1221,12 @@
 #
 get_default_if()
 {
-	routeget="`route -n get $1 default 2>/dev/null`"
+	local routeget oldifs defif line
+	defif=
 	oldifs="$IFS"
 	IFS="
 "
-	defif=
-	for line in $routeget ; do
+	for line in `route -n get $1 default 2>/dev/null`; do
 		case $line in
 		*interface:*)
 			defif=${line##*: }
@@ -1165,6 +1238,8 @@
 	echo $defif
 }

+# hexdigit arg
+#	Echo decimal number $arg (single digit) in hexadecimal format.
 hexdigit()
 {
 	if [ $1 -lt 10 ]; then
@@ -1181,14 +1256,17 @@
 	fi
 }

+# hexprint arg
+#	Echo decimal number $arg (multiple digits) in hexadecimal format.
 hexprint()
 {
+	local val str dig
 	val=$1
 	str=''
-
 	dig=`hexdigit $((${val} & 15))`
 	str=${dig}${str}
 	val=$((${val} >> 4))
+
 	while [ ${val} -gt 0 ]; do
 		dig=`hexdigit $((${val} & 15))`
 		str=${dig}${str}
@@ -1198,8 +1276,13 @@
 	echo ${str}
 }

+# network6_getladdr if [flag]
+#	Echo link-local address from $if if any.
+#	If flag is defined, tentative ones will be excluded.
 network6_getladdr()
 {
+	local proto addr rest
+
 	ifconfig $1 2>/dev/null | while read proto addr rest; do
 		case ${proto} in
 		inet6)

----Next_Part(Thu_Jul__2_04_34_47_2009_516)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="defaultroute.diff"

--- /etc/rc.d/defaultroute	2009-06-28 05:03:37.000000000 +0000
+++ rc.d/defaultroute	2009-07-02 03:27:36.000000000 +0000
@@ -52,7 +52,7 @@
 		fi
 		nl=1
 		sleep 1
-		delay=`expr $delay - 1`
+		delay=$(($delay - 1))
 	done

 	[ -n "$nl" ] && echo

----Next_Part(Thu_Jul__2_04_34_47_2009_516)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="routing.diff"

--- /etc/rc.d/routing	2009-06-28 18:10:43.000000000 +0000
+++ rc.d/routing	2009-07-02 03:33:53.000000000 +0000
@@ -21,13 +21,13 @@

 routing_start()
 {
-	static_start $*
-	options_start $*
+	static_start "$@"
+	options_start "$@"
 }

 routing_stop()
 {
-	static_stop $*
+	static_stop "$@"
 	route -n flush
 	for i in ${ipv6_network_interfaces}; do
 		ifconfig $i inet6 -defaultif
@@ -36,6 +36,7 @@

 static_start()
 {
+	local _af
 	_af=$1

 	case ${_af} in
@@ -58,6 +59,7 @@

 static_stop()
 {
+	local _af
 	_af=$1

 	case ${_af} in
@@ -80,6 +82,7 @@

 do_static()
 {
+	local _af _action
 	_af=$1
 	_action=$2

@@ -88,6 +91,7 @@

 ipv4_static()
 {
+	local _action
 	_action=$1

 	case ${defaultrouter} in
@@ -109,6 +113,7 @@

 ipv6_static()
 {
+	local _action i
 	_action=$1

 	# disallow "internal" addresses to appear on the wire
@@ -215,6 +220,7 @@

 atm_static()
 {
+	local _action i
 	_action=$1

 	if [ -n "${natm_static_routes}" ]; then
@@ -294,4 +300,4 @@
 }

 load_rc_config $name
-run_rc_command $*
+run_rc_command "$@"

----Next_Part(Thu_Jul__2_04_34_47_2009_516)----

----Security_Multipart0(Thu_Jul__2_04_34_47_2009_344)--
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iEYEABECAAYFAkpLulcACgkQTyzT2CeTzy0xQACfQtaqnlGOhX2G5ZTC8peIkGI4
iW0An23/aMA+HS/nA/8C4xUgP2EUIbKO
=eX2F
-----END PGP SIGNATURE-----

----Security_Multipart0(Thu_Jul__2_04_34_47_2009_344)----



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090702.043447.219085264.hrs>