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>