xref: /freebsd/libexec/rc/network.subr (revision ed4d2a54fc7a0397c2042f496f176305ca03ebdd)
10696600cSBjoern A. Zeeb#
20696600cSBjoern A. Zeeb# Copyright (c) 2003 The FreeBSD Project. All rights reserved.
30696600cSBjoern A. Zeeb#
40696600cSBjoern A. Zeeb# Redistribution and use in source and binary forms, with or without
50696600cSBjoern A. Zeeb# modification, are permitted provided that the following conditions
60696600cSBjoern A. Zeeb# are met:
70696600cSBjoern A. Zeeb# 1. Redistributions of source code must retain the above copyright
80696600cSBjoern A. Zeeb#    notice, this list of conditions and the following disclaimer.
90696600cSBjoern A. Zeeb# 2. Redistributions in binary form must reproduce the above copyright
100696600cSBjoern A. Zeeb#    notice, this list of conditions and the following disclaimer in the
110696600cSBjoern A. Zeeb#    documentation and/or other materials provided with the distribution.
120696600cSBjoern A. Zeeb#
130696600cSBjoern A. Zeeb# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
140696600cSBjoern A. Zeeb# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
150696600cSBjoern A. Zeeb# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
160696600cSBjoern A. Zeeb# ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
170696600cSBjoern A. Zeeb# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
180696600cSBjoern A. Zeeb# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
190696600cSBjoern A. Zeeb# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
200696600cSBjoern A. Zeeb# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
210696600cSBjoern A. Zeeb# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
220696600cSBjoern A. Zeeb# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
230696600cSBjoern A. Zeeb# SUCH DAMAGE.
240696600cSBjoern A. Zeeb#
250696600cSBjoern A. Zeeb#
260696600cSBjoern A. ZeebIFCONFIG_CMD="/sbin/ifconfig"
270696600cSBjoern A. Zeeb: ${netif_ipexpand_max:=2048}
280696600cSBjoern A. Zeeb
290696600cSBjoern A. Zeeb#
300696600cSBjoern A. Zeeb# Subroutines commonly used from network startup scripts.
310696600cSBjoern A. Zeeb# Requires that rc.conf be loaded first.
320696600cSBjoern A. Zeeb#
330696600cSBjoern A. Zeeb
340696600cSBjoern A. Zeeb# ifn_start ifn
350696600cSBjoern A. Zeeb#	Bring up and configure an interface.  If some configuration is
360696600cSBjoern A. Zeeb#	applied, print the interface configuration.
370696600cSBjoern A. Zeeb#
380696600cSBjoern A. Zeebifn_start()
390696600cSBjoern A. Zeeb{
400696600cSBjoern A. Zeeb	local ifn cfg
410696600cSBjoern A. Zeeb	ifn="$1"
420696600cSBjoern A. Zeeb	cfg=1
430696600cSBjoern A. Zeeb
440696600cSBjoern A. Zeeb	[ -z "$ifn" ] && err 1 "ifn_start called without an interface"
450696600cSBjoern A. Zeeb
460696600cSBjoern A. Zeeb	ifscript_up ${ifn} && cfg=0
470696600cSBjoern A. Zeeb	ifconfig_up ${ifn} && cfg=0
480696600cSBjoern A. Zeeb	if ! noafif $ifn; then
490696600cSBjoern A. Zeeb		afexists inet6 && ipv6_up ${ifn} && cfg=0
50*ed4d2a54SBjoern A. Zeeb		afexists inet && ipv4_up ${ifn} && cfg=0
510696600cSBjoern A. Zeeb	fi
520696600cSBjoern A. Zeeb	childif_create ${ifn} && cfg=0
530696600cSBjoern A. Zeeb
540696600cSBjoern A. Zeeb	return $cfg
550696600cSBjoern A. Zeeb}
560696600cSBjoern A. Zeeb
570696600cSBjoern A. Zeeb# ifn_stop ifn
580696600cSBjoern A. Zeeb#	Shutdown and de-configure an interface.  If action is taken,
590696600cSBjoern A. Zeeb#	print the interface name.
600696600cSBjoern A. Zeeb#
610696600cSBjoern A. Zeebifn_stop()
620696600cSBjoern A. Zeeb{
630696600cSBjoern A. Zeeb	local ifn cfg
640696600cSBjoern A. Zeeb	ifn="$1"
650696600cSBjoern A. Zeeb	cfg=1
660696600cSBjoern A. Zeeb
670696600cSBjoern A. Zeeb	[ -z "$ifn" ] && err 1 "ifn_stop called without an interface"
680696600cSBjoern A. Zeeb
690696600cSBjoern A. Zeeb	if ! noafif $ifn; then
700696600cSBjoern A. Zeeb		afexists inet && ipv4_down ${ifn} && cfg=0
71*ed4d2a54SBjoern A. Zeeb		afexists inet6 && ipv6_down ${ifn} && cfg=0
720696600cSBjoern A. Zeeb	fi
730696600cSBjoern A. Zeeb	ifconfig_down ${ifn} && cfg=0
740696600cSBjoern A. Zeeb	ifscript_down ${ifn} && cfg=0
750696600cSBjoern A. Zeeb	childif_destroy ${ifn} && cfg=0
760696600cSBjoern A. Zeeb
770696600cSBjoern A. Zeeb	return $cfg
780696600cSBjoern A. Zeeb}
790696600cSBjoern A. Zeeb
800696600cSBjoern A. Zeeb# ifn_vnetup ifn
810696600cSBjoern A. Zeeb#	Move ifn to the specified vnet jail.
820696600cSBjoern A. Zeeb#
830696600cSBjoern A. Zeebifn_vnetup()
840696600cSBjoern A. Zeeb{
850696600cSBjoern A. Zeeb
860696600cSBjoern A. Zeeb	ifn_vnet0 $1 vnet
870696600cSBjoern A. Zeeb}
880696600cSBjoern A. Zeeb
890696600cSBjoern A. Zeeb# ifn_vnetdown ifn
900696600cSBjoern A. Zeeb#	Reclaim ifn from the specified vnet jail.
910696600cSBjoern A. Zeeb#
920696600cSBjoern A. Zeebifn_vnetdown()
930696600cSBjoern A. Zeeb{
940696600cSBjoern A. Zeeb
950696600cSBjoern A. Zeeb	ifn_vnet0 $1 -vnet
960696600cSBjoern A. Zeeb}
970696600cSBjoern A. Zeeb
980696600cSBjoern A. Zeeb# ifn_vnet0 ifn action
990696600cSBjoern A. Zeeb#	Helper function for ifn_vnetup and ifn_vnetdown.
1000696600cSBjoern A. Zeeb#
1010696600cSBjoern A. Zeebifn_vnet0()
1020696600cSBjoern A. Zeeb{
1030696600cSBjoern A. Zeeb	local _ifn _cfg _action _vnet
1040696600cSBjoern A. Zeeb	_ifn="$1"
1050696600cSBjoern A. Zeeb	_action="$2"
1060696600cSBjoern A. Zeeb	_cfg=1
1070696600cSBjoern A. Zeeb
1080696600cSBjoern A. Zeeb	if _vnet=$(vnetif $_ifn); then
1090696600cSBjoern A. Zeeb		${IFCONFIG_CMD} $_ifn $_action $_vnet && _cfg=0
1100696600cSBjoern A. Zeeb	fi
1110696600cSBjoern A. Zeeb
1120696600cSBjoern A. Zeeb	return $_cfg
1130696600cSBjoern A. Zeeb}
1140696600cSBjoern A. Zeeb
1150696600cSBjoern A. Zeeb# ifconfig_up if
1160696600cSBjoern A. Zeeb#	Evaluate ifconfig(8) arguments for interface $if and
1170696600cSBjoern A. Zeeb#	run ifconfig(8) with those arguments. It returns 0 if
1180696600cSBjoern A. Zeeb#	arguments were found and executed or 1 if the interface
1190696600cSBjoern A. Zeeb#	had no arguments.  Pseudo arguments DHCP and WPA are handled
1200696600cSBjoern A. Zeeb#	here.
1210696600cSBjoern A. Zeeb#
1220696600cSBjoern A. Zeebifconfig_up()
1230696600cSBjoern A. Zeeb{
1240696600cSBjoern A. Zeeb	local _cfg _ifconfig_descr _ipv6_opts ifconfig_args
1250696600cSBjoern A. Zeeb	_cfg=1
1260696600cSBjoern A. Zeeb
1270696600cSBjoern A. Zeeb	# Make sure lo0 always comes up.
1280696600cSBjoern A. Zeeb	if [ "$1" = "lo0" ]; then
1290696600cSBjoern A. Zeeb		_cfg=0
1300696600cSBjoern A. Zeeb	fi
1310696600cSBjoern A. Zeeb
1320696600cSBjoern A. Zeeb	# inet6 specific
1330696600cSBjoern A. Zeeb	if ! noafif $1 && afexists inet6; then
1340696600cSBjoern A. Zeeb		if checkyesno ipv6_activate_all_interfaces; then
1350696600cSBjoern A. Zeeb			_ipv6_opts="-ifdisabled"
1360696600cSBjoern A. Zeeb		fi
1370696600cSBjoern A. Zeeb
1380696600cSBjoern A. Zeeb		# backward compatibility: $ipv6_enable
1390696600cSBjoern A. Zeeb		case $ipv6_enable in
1400696600cSBjoern A. Zeeb		[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
1410696600cSBjoern A. Zeeb			case $1 in
1420696600cSBjoern A. Zeeb			bridge[0-9]*)
1430696600cSBjoern A. Zeeb				# No accept_rtadv by default on if_bridge(4)
1440696600cSBjoern A. Zeeb				# to avoid a conflict with the member
1450696600cSBjoern A. Zeeb				# interfaces.
1460696600cSBjoern A. Zeeb			;;
1470696600cSBjoern A. Zeeb			*)
1480696600cSBjoern A. Zeeb				if ! checkyesno ipv6_gateway_enable; then
1490696600cSBjoern A. Zeeb					_ipv6_opts="${_ipv6_opts} accept_rtadv"
1500696600cSBjoern A. Zeeb				fi
1510696600cSBjoern A. Zeeb			;;
1520696600cSBjoern A. Zeeb			esac
1530696600cSBjoern A. Zeeb		;;
1540696600cSBjoern A. Zeeb		esac
1550696600cSBjoern A. Zeeb
1560696600cSBjoern A. Zeeb		case $ipv6_cpe_wanif in
1570696600cSBjoern A. Zeeb		$1)
1580696600cSBjoern A. Zeeb			_ipv6_opts="${_ipv6_opts} -no_radr accept_rtadv"
1590696600cSBjoern A. Zeeb		;;
1600696600cSBjoern A. Zeeb		esac
1610696600cSBjoern A. Zeeb
1620696600cSBjoern A. Zeeb		if [ -n "${_ipv6_opts}" ]; then
1630696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $1 inet6 ${_ipv6_opts}
1640696600cSBjoern A. Zeeb		fi
1650696600cSBjoern A. Zeeb	fi
1660696600cSBjoern A. Zeeb
1670696600cSBjoern A. Zeeb	# ifconfig_IF
1680696600cSBjoern A. Zeeb	ifconfig_args=`ifconfig_getargs $1`
1690696600cSBjoern A. Zeeb	if [ -n "${ifconfig_args}" ]; then
1700696600cSBjoern A. Zeeb		eval ${IFCONFIG_CMD} $1 ${ifconfig_args}
1710696600cSBjoern A. Zeeb		_cfg=0
1720696600cSBjoern A. Zeeb	fi
1730696600cSBjoern A. Zeeb
1740696600cSBjoern A. Zeeb	# inet6 specific
1750696600cSBjoern A. Zeeb	if ! noafif $1 && afexists inet6; then
1760696600cSBjoern A. Zeeb		# ifconfig_IF_ipv6
1770696600cSBjoern A. Zeeb		ifconfig_args=`ifconfig_getargs $1 ipv6`
1780696600cSBjoern A. Zeeb		if [ -n "${ifconfig_args}" ]; then
1790696600cSBjoern A. Zeeb			# backward compatibility: inet6 keyword
1800696600cSBjoern A. Zeeb			case "${ifconfig_args}" in
1810696600cSBjoern A. Zeeb			:*|[0-9a-fA-F]*:*)
1820696600cSBjoern A. Zeeb				warn "\$ifconfig_$1_ipv6 needs leading" \
1830696600cSBjoern A. Zeeb				    "\"inet6\" keyword for an IPv6 address."
1840696600cSBjoern A. Zeeb				ifconfig_args="inet6 ${ifconfig_args}"
1850696600cSBjoern A. Zeeb			;;
1860696600cSBjoern A. Zeeb			esac
1870696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $1 inet6 -ifdisabled
1880696600cSBjoern A. Zeeb			eval ${IFCONFIG_CMD} $1 ${ifconfig_args}
1890696600cSBjoern A. Zeeb			_cfg=0
1900696600cSBjoern A. Zeeb		fi
1910696600cSBjoern A. Zeeb
1920696600cSBjoern A. Zeeb		# $ipv6_prefix_IF will be handled in
1930696600cSBjoern A. Zeeb		# ipv6_prefix_hostid_addr_common().
1940696600cSBjoern A. Zeeb		ifconfig_args=`get_if_var $1 ipv6_prefix_IF`
1950696600cSBjoern A. Zeeb		if [ -n "${ifconfig_args}" ]; then
1960696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $1 inet6 -ifdisabled
1970696600cSBjoern A. Zeeb			_cfg=0
1980696600cSBjoern A. Zeeb		fi
1990696600cSBjoern A. Zeeb
2000696600cSBjoern A. Zeeb		# backward compatibility: $ipv6_ifconfig_IF
2010696600cSBjoern A. Zeeb		ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF`
2020696600cSBjoern A. Zeeb		if [ -n "${ifconfig_args}" ]; then
2030696600cSBjoern A. Zeeb			warn "\$ipv6_ifconfig_$1 is obsolete." \
2040696600cSBjoern A. Zeeb			    "  Use ifconfig_$1_ipv6 instead."
2050696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $1 inet6 -ifdisabled
2060696600cSBjoern A. Zeeb			eval ${IFCONFIG_CMD} $1 inet6 ${ifconfig_args}
2070696600cSBjoern A. Zeeb			_cfg=0
2080696600cSBjoern A. Zeeb		fi
2090696600cSBjoern A. Zeeb	fi
2100696600cSBjoern A. Zeeb
2110696600cSBjoern A. Zeeb	ifalias $1 link alias
2120696600cSBjoern A. Zeeb	ifalias $1 ether alias
2130696600cSBjoern A. Zeeb
2140696600cSBjoern A. Zeeb	_ifconfig_descr=`get_if_var $1 ifconfig_IF_descr`
2150696600cSBjoern A. Zeeb	if [ -n "${_ifconfig_descr}" ]; then
2160696600cSBjoern A. Zeeb		${IFCONFIG_CMD} $1 description "${_ifconfig_descr}"
2170696600cSBjoern A. Zeeb	fi
2180696600cSBjoern A. Zeeb
2190696600cSBjoern A. Zeeb	if wpaif $1; then
2200696600cSBjoern A. Zeeb		/etc/rc.d/wpa_supplicant start $1
2210696600cSBjoern A. Zeeb		_cfg=0		# XXX: not sure this should count
2220696600cSBjoern A. Zeeb	elif hostapif $1; then
2230696600cSBjoern A. Zeeb		/etc/rc.d/hostapd start $1
2240696600cSBjoern A. Zeeb		_cfg=0
2250696600cSBjoern A. Zeeb	elif [ ${_cfg} -eq 0 ]; then
2260696600cSBjoern A. Zeeb		${IFCONFIG_CMD} $1 up
2270696600cSBjoern A. Zeeb	fi
2280696600cSBjoern A. Zeeb
2291b5be720SBjoern A. Zeeb	if ! noafif $1 && afexists inet6; then
23076d32f04SBjoern A. Zeeb		ipv6_accept_rtadv_up $1 && _cfg=0
2311b5be720SBjoern A. Zeeb	fi
2321b5be720SBjoern A. Zeeb
2330696600cSBjoern A. Zeeb	if dhcpif $1; then
2340696600cSBjoern A. Zeeb		if [ $_cfg -ne 0 ] ; then
2350696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $1 up
2360696600cSBjoern A. Zeeb		fi
2370696600cSBjoern A. Zeeb		if syncdhcpif $1; then
2380696600cSBjoern A. Zeeb			/etc/rc.d/dhclient start $1
2390696600cSBjoern A. Zeeb		fi
2400696600cSBjoern A. Zeeb		_cfg=0
2410696600cSBjoern A. Zeeb	fi
2420696600cSBjoern A. Zeeb
2430696600cSBjoern A. Zeeb	return $_cfg
2440696600cSBjoern A. Zeeb}
2450696600cSBjoern A. Zeeb
2460696600cSBjoern A. Zeeb# ifconfig_down if
2470696600cSBjoern A. Zeeb#	returns 1 if wpa_supplicant or dhclient was stopped or
2480696600cSBjoern A. Zeeb#	the interface exists.
2490696600cSBjoern A. Zeeb#
2500696600cSBjoern A. Zeebifconfig_down()
2510696600cSBjoern A. Zeeb{
2520696600cSBjoern A. Zeeb	local _cfg
2530696600cSBjoern A. Zeeb	_cfg=1
2540696600cSBjoern A. Zeeb
2550696600cSBjoern A. Zeeb	if wpaif $1; then
2560696600cSBjoern A. Zeeb		/etc/rc.d/wpa_supplicant stop $1
2570696600cSBjoern A. Zeeb		_cfg=0
2580696600cSBjoern A. Zeeb	elif hostapif $1; then
2590696600cSBjoern A. Zeeb		/etc/rc.d/hostapd stop $1
2600696600cSBjoern A. Zeeb		_cfg=0
2611a7c1b2cSAndriy Voskoboinyk	elif dhcpif $1; then
2620696600cSBjoern A. Zeeb		/etc/rc.d/dhclient stop $1
2630696600cSBjoern A. Zeeb		_cfg=0
2640696600cSBjoern A. Zeeb	fi
2650696600cSBjoern A. Zeeb
2660696600cSBjoern A. Zeeb	if ifexists $1; then
2670696600cSBjoern A. Zeeb		${IFCONFIG_CMD} $1 down
2680696600cSBjoern A. Zeeb		_cfg=0
2690696600cSBjoern A. Zeeb	fi
2700696600cSBjoern A. Zeeb
2710696600cSBjoern A. Zeeb	return $_cfg
2720696600cSBjoern A. Zeeb}
2730696600cSBjoern A. Zeeb
2740696600cSBjoern A. Zeeb# get_if_var if var [default]
2750696600cSBjoern A. Zeeb#	Return the value of the pseudo-hash corresponding to $if where
2760696600cSBjoern A. Zeeb#	$var is a string containg the sub-string "IF" which will be
2770696600cSBjoern A. Zeeb#	replaced with $if after the characters defined in _punct are
2780696600cSBjoern A. Zeeb#	replaced with '_'. If the variable is unset, replace it with
2790696600cSBjoern A. Zeeb#	$default if given.
2800696600cSBjoern A. Zeebget_if_var()
2810696600cSBjoern A. Zeeb{
2820696600cSBjoern A. Zeeb	local _if _punct _punct_c _var _default prefix suffix
2830696600cSBjoern A. Zeeb
2840696600cSBjoern A. Zeeb	if [ $# -ne 2 -a $# -ne 3 ]; then
2850696600cSBjoern A. Zeeb		err 3 'USAGE: get_if_var name var [default]'
2860696600cSBjoern A. Zeeb	fi
2870696600cSBjoern A. Zeeb
2880696600cSBjoern A. Zeeb	_if=$1
2890696600cSBjoern A. Zeeb	_punct=".-/+"
2900696600cSBjoern A. Zeeb	ltr ${_if} "${_punct}" '_' _if
2910696600cSBjoern A. Zeeb	_var=$2
2920696600cSBjoern A. Zeeb	_default=$3
2930696600cSBjoern A. Zeeb
2940696600cSBjoern A. Zeeb	prefix=${_var%%IF*}
2950696600cSBjoern A. Zeeb	suffix=${_var##*IF}
2960696600cSBjoern A. Zeeb	eval echo \${${prefix}${_if}${suffix}-${_default}}
2970696600cSBjoern A. Zeeb}
2980696600cSBjoern A. Zeeb
2990696600cSBjoern A. Zeeb# _ifconfig_getargs if [af]
3000696600cSBjoern A. Zeeb#	Prints the arguments for the supplied interface to stdout.
3010696600cSBjoern A. Zeeb#	Returns 1 if empty.  In general, ifconfig_getargs should be used
3020696600cSBjoern A. Zeeb#	outside this file.
3030696600cSBjoern A. Zeeb_ifconfig_getargs()
3040696600cSBjoern A. Zeeb{
3050696600cSBjoern A. Zeeb	local _ifn _af
3060696600cSBjoern A. Zeeb	_ifn=$1
3070696600cSBjoern A. Zeeb	_af=${2+_$2}
3080696600cSBjoern A. Zeeb
3090696600cSBjoern A. Zeeb	if [ -z "$_ifn" ]; then
3100696600cSBjoern A. Zeeb		return 1
3110696600cSBjoern A. Zeeb	fi
3120696600cSBjoern A. Zeeb
3130696600cSBjoern A. Zeeb	get_if_var $_ifn ifconfig_IF$_af "$ifconfig_DEFAULT"
3140696600cSBjoern A. Zeeb}
3150696600cSBjoern A. Zeeb
3160696600cSBjoern A. Zeeb# ifconfig_getargs if [af]
3170696600cSBjoern A. Zeeb#	Takes the result from _ifconfig_getargs and removes pseudo
3180696600cSBjoern A. Zeeb#	args such as DHCP and WPA.
3190696600cSBjoern A. Zeebifconfig_getargs()
3200696600cSBjoern A. Zeeb{
3210696600cSBjoern A. Zeeb	local _tmpargs _arg _args _vnet
3220696600cSBjoern A. Zeeb	_tmpargs=`_ifconfig_getargs $1 $2`
3230696600cSBjoern A. Zeeb	if [ $? -eq 1 ]; then
3240696600cSBjoern A. Zeeb		return 1
3250696600cSBjoern A. Zeeb	fi
3260696600cSBjoern A. Zeeb	_args=
3270696600cSBjoern A. Zeeb	_vnet=0
3280696600cSBjoern A. Zeeb
3290696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
3300696600cSBjoern A. Zeeb		case $_arg:$_vnet in
3310696600cSBjoern A. Zeeb		[Dd][Hh][Cc][Pp]:0) ;;
3320696600cSBjoern A. Zeeb		[Nn][Oo][Aa][Uu][Tt][Oo]:0) ;;
3330696600cSBjoern A. Zeeb		[Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]:0) ;;
3340696600cSBjoern A. Zeeb		[Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]:0) ;;
3350696600cSBjoern A. Zeeb		[Ww][Pp][Aa]:0) ;;
3360696600cSBjoern A. Zeeb		[Hh][Oo][Ss][Tt][Aa][Pp]:0) ;;
3370696600cSBjoern A. Zeeb		vnet:0)	_vnet=1 ;;
3380696600cSBjoern A. Zeeb		*:1)	_vnet=0 ;;
3390696600cSBjoern A. Zeeb		*:0)
3400696600cSBjoern A. Zeeb			_args="$_args $_arg"
3410696600cSBjoern A. Zeeb		;;
3420696600cSBjoern A. Zeeb		esac
3430696600cSBjoern A. Zeeb	done
3440696600cSBjoern A. Zeeb
3450696600cSBjoern A. Zeeb	echo $_args
3460696600cSBjoern A. Zeeb}
3470696600cSBjoern A. Zeeb
3480696600cSBjoern A. Zeeb# autoif
3490696600cSBjoern A. Zeeb#	Returns 0 if the interface should be automatically configured at
3500696600cSBjoern A. Zeeb#	boot time and 1 otherwise.
3510696600cSBjoern A. Zeebautoif()
3520696600cSBjoern A. Zeeb{
3530696600cSBjoern A. Zeeb	local _tmpargs _arg
3540696600cSBjoern A. Zeeb	_tmpargs=`_ifconfig_getargs $1`
3550696600cSBjoern A. Zeeb
3560696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
3570696600cSBjoern A. Zeeb		case $_arg in
3580696600cSBjoern A. Zeeb		[Nn][Oo][Aa][Uu][Tt][Oo])
3590696600cSBjoern A. Zeeb			return 1
3600696600cSBjoern A. Zeeb			;;
3610696600cSBjoern A. Zeeb		esac
3620696600cSBjoern A. Zeeb	done
3630696600cSBjoern A. Zeeb
3640696600cSBjoern A. Zeeb	return 0
3650696600cSBjoern A. Zeeb}
3660696600cSBjoern A. Zeeb
3670696600cSBjoern A. Zeeb# dhcpif if
3680696600cSBjoern A. Zeeb#	Returns 0 if the interface is a DHCP interface and 1 otherwise.
3690696600cSBjoern A. Zeebdhcpif()
3700696600cSBjoern A. Zeeb{
3710696600cSBjoern A. Zeeb	local _tmpargs _arg
3720696600cSBjoern A. Zeeb	_tmpargs=`_ifconfig_getargs $1`
3730696600cSBjoern A. Zeeb
3740696600cSBjoern A. Zeeb	case $1 in
3750696600cSBjoern A. Zeeb	lo[0-9]*|\
3760696600cSBjoern A. Zeeb	stf[0-9]*|\
3770696600cSBjoern A. Zeeb	lp[0-9]*|\
3780696600cSBjoern A. Zeeb	sl[0-9]*)
3790696600cSBjoern A. Zeeb		return 1
3800696600cSBjoern A. Zeeb		;;
3810696600cSBjoern A. Zeeb	esac
3820696600cSBjoern A. Zeeb	if noafif $1; then
3830696600cSBjoern A. Zeeb		return 1
3840696600cSBjoern A. Zeeb	fi
3850696600cSBjoern A. Zeeb
3860696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
3870696600cSBjoern A. Zeeb		case $_arg in
3880696600cSBjoern A. Zeeb		[Dd][Hh][Cc][Pp])
3890696600cSBjoern A. Zeeb			return 0
3900696600cSBjoern A. Zeeb			;;
3910696600cSBjoern A. Zeeb		[Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
3920696600cSBjoern A. Zeeb			return 0
3930696600cSBjoern A. Zeeb			;;
3940696600cSBjoern A. Zeeb		[Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
3950696600cSBjoern A. Zeeb			return 0
3960696600cSBjoern A. Zeeb			;;
3970696600cSBjoern A. Zeeb		esac
3980696600cSBjoern A. Zeeb	done
3990696600cSBjoern A. Zeeb
4000696600cSBjoern A. Zeeb	return 1
4010696600cSBjoern A. Zeeb}
4020696600cSBjoern A. Zeeb
4030696600cSBjoern A. Zeeb# syncdhcpif
4040696600cSBjoern A. Zeeb#	Returns 0 if the interface should be configured synchronously and
4050696600cSBjoern A. Zeeb#	1 otherwise.
4060696600cSBjoern A. Zeebsyncdhcpif()
4070696600cSBjoern A. Zeeb{
4080696600cSBjoern A. Zeeb	local _tmpargs _arg
4090696600cSBjoern A. Zeeb	_tmpargs=`_ifconfig_getargs $1`
4100696600cSBjoern A. Zeeb
4110696600cSBjoern A. Zeeb	if noafif $1; then
4120696600cSBjoern A. Zeeb		return 1
4130696600cSBjoern A. Zeeb	fi
4140696600cSBjoern A. Zeeb
4150696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
4160696600cSBjoern A. Zeeb		case $_arg in
4170696600cSBjoern A. Zeeb		[Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
4180696600cSBjoern A. Zeeb			return 1
4190696600cSBjoern A. Zeeb			;;
4200696600cSBjoern A. Zeeb		[Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
4210696600cSBjoern A. Zeeb			return 0
4220696600cSBjoern A. Zeeb			;;
4230696600cSBjoern A. Zeeb		esac
4240696600cSBjoern A. Zeeb	done
4250696600cSBjoern A. Zeeb
4260696600cSBjoern A. Zeeb	checkyesno synchronous_dhclient
4270696600cSBjoern A. Zeeb}
4280696600cSBjoern A. Zeeb
4290696600cSBjoern A. Zeeb# wpaif if
4300696600cSBjoern A. Zeeb#	Returns 0 if the interface is a WPA interface and 1 otherwise.
4310696600cSBjoern A. Zeebwpaif()
4320696600cSBjoern A. Zeeb{
4330696600cSBjoern A. Zeeb	local _tmpargs _arg
4340696600cSBjoern A. Zeeb	_tmpargs=`_ifconfig_getargs $1`
4350696600cSBjoern A. Zeeb
4360696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
4370696600cSBjoern A. Zeeb		case $_arg in
4380696600cSBjoern A. Zeeb		[Ww][Pp][Aa])
4390696600cSBjoern A. Zeeb			return 0
4400696600cSBjoern A. Zeeb			;;
4410696600cSBjoern A. Zeeb		esac
4420696600cSBjoern A. Zeeb	done
4430696600cSBjoern A. Zeeb
4440696600cSBjoern A. Zeeb	return 1
4450696600cSBjoern A. Zeeb}
4460696600cSBjoern A. Zeeb
4470696600cSBjoern A. Zeeb# hostapif if
4480696600cSBjoern A. Zeeb#	Returns 0 if the interface is a HOSTAP interface and 1 otherwise.
4490696600cSBjoern A. Zeebhostapif()
4500696600cSBjoern A. Zeeb{
4510696600cSBjoern A. Zeeb	local _tmpargs _arg
4520696600cSBjoern A. Zeeb	_tmpargs=`_ifconfig_getargs $1`
4530696600cSBjoern A. Zeeb
4540696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
4550696600cSBjoern A. Zeeb		case $_arg in
4560696600cSBjoern A. Zeeb		[Hh][Oo][Ss][Tt][Aa][Pp])
4570696600cSBjoern A. Zeeb			return 0
4580696600cSBjoern A. Zeeb			;;
4590696600cSBjoern A. Zeeb		esac
4600696600cSBjoern A. Zeeb	done
4610696600cSBjoern A. Zeeb
4620696600cSBjoern A. Zeeb	return 1
4630696600cSBjoern A. Zeeb}
4640696600cSBjoern A. Zeeb
4650696600cSBjoern A. Zeeb# vnetif if
4660696600cSBjoern A. Zeeb#	Returns 0 and echo jail if "vnet" keyword is specified on the
4670696600cSBjoern A. Zeeb#	interface, and 1 otherwise.
4680696600cSBjoern A. Zeebvnetif()
4690696600cSBjoern A. Zeeb{
4700696600cSBjoern A. Zeeb	local _tmpargs _arg _vnet
4710696600cSBjoern A. Zeeb	_tmpargs=`_ifconfig_getargs $1`
4720696600cSBjoern A. Zeeb
4730696600cSBjoern A. Zeeb	_vnet=0
4740696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
4750696600cSBjoern A. Zeeb		case $_arg:$_vnet in
4760696600cSBjoern A. Zeeb		vnet:0)	_vnet=1 ;;
4770696600cSBjoern A. Zeeb		*:1)	echo $_arg; return 0 ;;
4780696600cSBjoern A. Zeeb		esac
4790696600cSBjoern A. Zeeb	done
4800696600cSBjoern A. Zeeb
4810696600cSBjoern A. Zeeb	return 1
4820696600cSBjoern A. Zeeb}
4830696600cSBjoern A. Zeeb
4840696600cSBjoern A. Zeeb# afexists af
4850696600cSBjoern A. Zeeb#	Returns 0 if the address family is enabled in the kernel
4860696600cSBjoern A. Zeeb#	1 otherwise.
4870696600cSBjoern A. Zeebafexists()
4880696600cSBjoern A. Zeeb{
4890696600cSBjoern A. Zeeb	local _af
4900696600cSBjoern A. Zeeb	_af=$1
4910696600cSBjoern A. Zeeb
4920696600cSBjoern A. Zeeb	case ${_af} in
4930696600cSBjoern A. Zeeb	inet|inet6)
4940696600cSBjoern A. Zeeb		check_kern_features ${_af}
4950696600cSBjoern A. Zeeb		;;
4960696600cSBjoern A. Zeeb	link|ether)
4970696600cSBjoern A. Zeeb		return 0
4980696600cSBjoern A. Zeeb		;;
4990696600cSBjoern A. Zeeb	*)
5000696600cSBjoern A. Zeeb		err 1 "afexists(): Unsupported address family: $_af"
5010696600cSBjoern A. Zeeb		;;
5020696600cSBjoern A. Zeeb	esac
5030696600cSBjoern A. Zeeb}
5040696600cSBjoern A. Zeeb
5050696600cSBjoern A. Zeeb# noafif if
5060696600cSBjoern A. Zeeb#	Returns 0 if the interface has no af configuration and 1 otherwise.
5070696600cSBjoern A. Zeebnoafif()
5080696600cSBjoern A. Zeeb{
5090696600cSBjoern A. Zeeb	local _if
5100696600cSBjoern A. Zeeb	_if=$1
5110696600cSBjoern A. Zeeb
5120696600cSBjoern A. Zeeb	case $_if in
5130696600cSBjoern A. Zeeb	pflog[0-9]*|\
5140696600cSBjoern A. Zeeb	pfsync[0-9]*|\
5150696600cSBjoern A. Zeeb	usbus[0-9]*|\
5160696600cSBjoern A. Zeeb	an[0-9]*|\
5170696600cSBjoern A. Zeeb	ath[0-9]*|\
5180696600cSBjoern A. Zeeb	ipw[0-9]*|\
5190696600cSBjoern A. Zeeb	ipfw[0-9]*|\
5200696600cSBjoern A. Zeeb	iwi[0-9]*|\
5210696600cSBjoern A. Zeeb	iwn[0-9]*|\
5220696600cSBjoern A. Zeeb	ral[0-9]*|\
5230696600cSBjoern A. Zeeb	wi[0-9]*|\
5240696600cSBjoern A. Zeeb	wl[0-9]*|\
5250696600cSBjoern A. Zeeb	wpi[0-9]*)
5260696600cSBjoern A. Zeeb		return 0
5270696600cSBjoern A. Zeeb		;;
5280696600cSBjoern A. Zeeb	esac
5290696600cSBjoern A. Zeeb
5300696600cSBjoern A. Zeeb	return 1
5310696600cSBjoern A. Zeeb}
5320696600cSBjoern A. Zeeb
5330696600cSBjoern A. Zeeb# ipv6if if
5340696600cSBjoern A. Zeeb#	Returns 0 if the interface should be configured for IPv6 and
5350696600cSBjoern A. Zeeb#	1 otherwise.
5360696600cSBjoern A. Zeebipv6if()
5370696600cSBjoern A. Zeeb{
5380696600cSBjoern A. Zeeb	local _if _tmpargs i
5390696600cSBjoern A. Zeeb	_if=$1
5400696600cSBjoern A. Zeeb
5410696600cSBjoern A. Zeeb	if ! afexists inet6; then
5420696600cSBjoern A. Zeeb		return 1
5430696600cSBjoern A. Zeeb	fi
5440696600cSBjoern A. Zeeb
5450696600cSBjoern A. Zeeb	# lo0 is always IPv6-enabled
5460696600cSBjoern A. Zeeb	case $_if in
5470696600cSBjoern A. Zeeb	lo0)
5480696600cSBjoern A. Zeeb		return 0
5490696600cSBjoern A. Zeeb		;;
5500696600cSBjoern A. Zeeb	esac
5510696600cSBjoern A. Zeeb
5520696600cSBjoern A. Zeeb	case "${ipv6_network_interfaces}" in
5530696600cSBjoern A. Zeeb	$_if|"$_if "*|*" $_if"|*" $_if "*|[Aa][Uu][Tt][Oo])
5540696600cSBjoern A. Zeeb		# True if $ifconfig_IF_ipv6 is defined.
5550696600cSBjoern A. Zeeb		_tmpargs=`_ifconfig_getargs $_if ipv6`
5560696600cSBjoern A. Zeeb		if [ -n "${_tmpargs}" ]; then
5570696600cSBjoern A. Zeeb			return 0
5580696600cSBjoern A. Zeeb		fi
5590696600cSBjoern A. Zeeb
5600696600cSBjoern A. Zeeb		# True if $ipv6_prefix_IF is defined.
5610696600cSBjoern A. Zeeb		_tmpargs=`get_if_var $_if ipv6_prefix_IF`
5620696600cSBjoern A. Zeeb		if [ -n "${_tmpargs}" ]; then
5630696600cSBjoern A. Zeeb			return 0
5640696600cSBjoern A. Zeeb		fi
5650696600cSBjoern A. Zeeb
5660696600cSBjoern A. Zeeb		# backward compatibility: True if $ipv6_ifconfig_IF is defined.
5670696600cSBjoern A. Zeeb		_tmpargs=`get_if_var $_if ipv6_ifconfig_IF`
5680696600cSBjoern A. Zeeb		if [ -n "${_tmpargs}" ]; then
5690696600cSBjoern A. Zeeb			return 0
5700696600cSBjoern A. Zeeb		fi
5710696600cSBjoern A. Zeeb		;;
5720696600cSBjoern A. Zeeb	esac
5730696600cSBjoern A. Zeeb
5740696600cSBjoern A. Zeeb	return 1
5750696600cSBjoern A. Zeeb}
5760696600cSBjoern A. Zeeb
5770696600cSBjoern A. Zeeb# ipv6_autoconfif if
5780696600cSBjoern A. Zeeb#	Returns 0 if the interface should be configured for IPv6 with
5790696600cSBjoern A. Zeeb#	Stateless Address Configuration; 1 otherwise.
5800696600cSBjoern A. Zeebipv6_autoconfif()
5810696600cSBjoern A. Zeeb{
5820696600cSBjoern A. Zeeb	local _if _tmpargs _arg
5830696600cSBjoern A. Zeeb	_if=$1
5840696600cSBjoern A. Zeeb
5850696600cSBjoern A. Zeeb	case $_if in
5860696600cSBjoern A. Zeeb	lo[0-9]*|\
5870696600cSBjoern A. Zeeb	stf[0-9]*|\
5880696600cSBjoern A. Zeeb	lp[0-9]*|\
5890696600cSBjoern A. Zeeb	sl[0-9]*)
5900696600cSBjoern A. Zeeb		return 1
5910696600cSBjoern A. Zeeb		;;
5920696600cSBjoern A. Zeeb	esac
5930696600cSBjoern A. Zeeb	if noafif $_if; then
5940696600cSBjoern A. Zeeb		return 1
5950696600cSBjoern A. Zeeb	fi
5960696600cSBjoern A. Zeeb	if ! ipv6if $_if; then
5970696600cSBjoern A. Zeeb		return 1
5980696600cSBjoern A. Zeeb	fi
5990696600cSBjoern A. Zeeb	if checkyesno ipv6_gateway_enable; then
6000696600cSBjoern A. Zeeb		return 1
6010696600cSBjoern A. Zeeb	fi
6020696600cSBjoern A. Zeeb	_tmpargs=`get_if_var $_if ipv6_prefix_IF`
6030696600cSBjoern A. Zeeb	if [ -n "${_tmpargs}" ]; then
6040696600cSBjoern A. Zeeb		return 1
6050696600cSBjoern A. Zeeb	fi
6060696600cSBjoern A. Zeeb	# backward compatibility: $ipv6_enable
6070696600cSBjoern A. Zeeb	case $ipv6_enable in
6080696600cSBjoern A. Zeeb	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
6090696600cSBjoern A. Zeeb		if checkyesno ipv6_gateway_enable; then
6100696600cSBjoern A. Zeeb			return 1
6110696600cSBjoern A. Zeeb		fi
6120696600cSBjoern A. Zeeb		case $1 in
6130696600cSBjoern A. Zeeb		bridge[0-9]*)
6140696600cSBjoern A. Zeeb			# No accept_rtadv by default on if_bridge(4)
6150696600cSBjoern A. Zeeb			# to avoid a conflict with the member
6160696600cSBjoern A. Zeeb			# interfaces.
6170696600cSBjoern A. Zeeb			return 1
6180696600cSBjoern A. Zeeb		;;
6190696600cSBjoern A. Zeeb		*)
6200696600cSBjoern A. Zeeb			return 0
6210696600cSBjoern A. Zeeb		;;
6220696600cSBjoern A. Zeeb		esac
6230696600cSBjoern A. Zeeb	;;
6240696600cSBjoern A. Zeeb	esac
6250696600cSBjoern A. Zeeb
6260696600cSBjoern A. Zeeb	_tmpargs=`_ifconfig_getargs $_if ipv6`
6270696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
6280696600cSBjoern A. Zeeb		case $_arg in
6290696600cSBjoern A. Zeeb		accept_rtadv)
6300696600cSBjoern A. Zeeb			return 0
6310696600cSBjoern A. Zeeb			;;
6320696600cSBjoern A. Zeeb		esac
6330696600cSBjoern A. Zeeb	done
6340696600cSBjoern A. Zeeb
6350696600cSBjoern A. Zeeb	# backward compatibility: $ipv6_ifconfig_IF
6360696600cSBjoern A. Zeeb	_tmpargs=`get_if_var $_if ipv6_ifconfig_IF`
6370696600cSBjoern A. Zeeb	for _arg in $_tmpargs; do
6380696600cSBjoern A. Zeeb		case $_arg in
6390696600cSBjoern A. Zeeb		accept_rtadv)
6400696600cSBjoern A. Zeeb			return 0
6410696600cSBjoern A. Zeeb			;;
6420696600cSBjoern A. Zeeb		esac
6430696600cSBjoern A. Zeeb	done
6440696600cSBjoern A. Zeeb
6450696600cSBjoern A. Zeeb	return 1
6460696600cSBjoern A. Zeeb}
6470696600cSBjoern A. Zeeb
6480696600cSBjoern A. Zeeb# ifexists if
6490696600cSBjoern A. Zeeb#	Returns 0 if the interface exists and 1 otherwise.
6500696600cSBjoern A. Zeebifexists()
6510696600cSBjoern A. Zeeb{
6520696600cSBjoern A. Zeeb	[ -z "$1" ] && return 1
6530696600cSBjoern A. Zeeb	${IFCONFIG_CMD} -n $1 > /dev/null 2>&1
6540696600cSBjoern A. Zeeb}
6550696600cSBjoern A. Zeeb
6560696600cSBjoern A. Zeeb# ipv4_up if
6570696600cSBjoern A. Zeeb#	add IPv4 addresses to the interface $if
6580696600cSBjoern A. Zeebipv4_up()
6590696600cSBjoern A. Zeeb{
6600696600cSBjoern A. Zeeb	local _if _ret
6610696600cSBjoern A. Zeeb	_if=$1
6620696600cSBjoern A. Zeeb	_ret=1
6630696600cSBjoern A. Zeeb
6640696600cSBjoern A. Zeeb	# Add 127.0.0.1/8 to lo0 unless otherwise specified.
6650696600cSBjoern A. Zeeb	if [ "${_if}" = "lo0" ]; then
6660696600cSBjoern A. Zeeb		ifconfig_args=`get_if_var ${_if} ifconfig_IF`
6670696600cSBjoern A. Zeeb		if [ -z "${ifconfig_args}" ]; then
6680696600cSBjoern A. Zeeb			${IFCONFIG_CMD} ${_if} inet 127.0.0.1/8 alias
6690696600cSBjoern A. Zeeb		fi
6700696600cSBjoern A. Zeeb	fi
6710696600cSBjoern A. Zeeb	ifalias ${_if} inet alias && _ret=0
6720696600cSBjoern A. Zeeb
6730696600cSBjoern A. Zeeb	return $_ret
6740696600cSBjoern A. Zeeb}
6750696600cSBjoern A. Zeeb
6760696600cSBjoern A. Zeeb# ipv6_up if
6770696600cSBjoern A. Zeeb#	add IPv6 addresses to the interface $if
6780696600cSBjoern A. Zeebipv6_up()
6790696600cSBjoern A. Zeeb{
6800696600cSBjoern A. Zeeb	local _if _ret
6810696600cSBjoern A. Zeeb	_if=$1
6820696600cSBjoern A. Zeeb	_ret=1
6830696600cSBjoern A. Zeeb
6840696600cSBjoern A. Zeeb	if ! ipv6if $_if; then
6850696600cSBjoern A. Zeeb		return 0
6860696600cSBjoern A. Zeeb	fi
6870696600cSBjoern A. Zeeb
6880696600cSBjoern A. Zeeb	ifalias ${_if} inet6 alias && _ret=0
6890696600cSBjoern A. Zeeb	ipv6_prefix_hostid_addr_common ${_if} alias && _ret=0
6900696600cSBjoern A. Zeeb
6910696600cSBjoern A. Zeeb	return $_ret
6920696600cSBjoern A. Zeeb}
6930696600cSBjoern A. Zeeb
6940696600cSBjoern A. Zeeb# ipv4_down if
6950696600cSBjoern A. Zeeb#	remove IPv4 addresses from the interface $if
6960696600cSBjoern A. Zeebipv4_down()
6970696600cSBjoern A. Zeeb{
6980696600cSBjoern A. Zeeb	local _if _ifs _ret inetList oldifs _inet
6990696600cSBjoern A. Zeeb	_if=$1
7000696600cSBjoern A. Zeeb	_ifs="^"
7010696600cSBjoern A. Zeeb	_ret=1
7020696600cSBjoern A. Zeeb
7030696600cSBjoern A. Zeeb	ifalias ${_if} inet -alias && _ret=0
7040696600cSBjoern A. Zeeb
7050696600cSBjoern A. Zeeb	inetList="`${IFCONFIG_CMD} ${_if} | grep 'inet ' | tr "\n\t" "$_ifs"`"
7060696600cSBjoern A. Zeeb
7070696600cSBjoern A. Zeeb	oldifs="$IFS"
7080696600cSBjoern A. Zeeb	IFS="$_ifs"
7090696600cSBjoern A. Zeeb	for _inet in $inetList ; do
7100696600cSBjoern A. Zeeb		# get rid of extraneous line
7110696600cSBjoern A. Zeeb		case $_inet in
712fef0e429SCy Schubert		inet[[:space:]]*)	;;
7130696600cSBjoern A. Zeeb		*)		continue ;;
7140696600cSBjoern A. Zeeb		esac
7150696600cSBjoern A. Zeeb
7160696600cSBjoern A. Zeeb		_inet=`expr "$_inet" : '.*\(inet \([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*'`
7170696600cSBjoern A. Zeeb
7180696600cSBjoern A. Zeeb		IFS="$oldifs"
7190696600cSBjoern A. Zeeb		${IFCONFIG_CMD} ${_if} ${_inet} delete
7200696600cSBjoern A. Zeeb		IFS="$_ifs"
7210696600cSBjoern A. Zeeb		_ret=0
7220696600cSBjoern A. Zeeb	done
7230696600cSBjoern A. Zeeb	IFS="$oldifs"
7240696600cSBjoern A. Zeeb
7250696600cSBjoern A. Zeeb	return $_ret
7260696600cSBjoern A. Zeeb}
7270696600cSBjoern A. Zeeb
7280696600cSBjoern A. Zeeb# ipv6_down if
7290696600cSBjoern A. Zeeb#	remove IPv6 addresses from the interface $if
7300696600cSBjoern A. Zeebipv6_down()
7310696600cSBjoern A. Zeeb{
7320696600cSBjoern A. Zeeb	local _if _ifs _ret inetList oldifs _inet6
7330696600cSBjoern A. Zeeb	_if=$1
7340696600cSBjoern A. Zeeb	_ifs="^"
7350696600cSBjoern A. Zeeb	_ret=1
7360696600cSBjoern A. Zeeb
7370696600cSBjoern A. Zeeb	if ! ipv6if $_if; then
7380696600cSBjoern A. Zeeb		return 0
7390696600cSBjoern A. Zeeb	fi
7400696600cSBjoern A. Zeeb
7410696600cSBjoern A. Zeeb	ipv6_accept_rtadv_down ${_if} && _ret=0
7420696600cSBjoern A. Zeeb	ipv6_prefix_hostid_addr_common ${_if} -alias && _ret=0
7430696600cSBjoern A. Zeeb	ifalias ${_if} inet6 -alias && _ret=0
7440696600cSBjoern A. Zeeb
7450696600cSBjoern A. Zeeb	inetList="`${IFCONFIG_CMD} ${_if} | grep 'inet6 ' | tr "\n\t" "$_ifs"`"
7460696600cSBjoern A. Zeeb
7470696600cSBjoern A. Zeeb	oldifs="$IFS"
7480696600cSBjoern A. Zeeb	IFS="$_ifs"
7490696600cSBjoern A. Zeeb	for _inet6 in $inetList ; do
7500696600cSBjoern A. Zeeb		# get rid of extraneous line
7510696600cSBjoern A. Zeeb		case $_inet6 in
752fef0e429SCy Schubert		inet6[[:space:]]*)	;;
7530696600cSBjoern A. Zeeb		*)		continue ;;
7540696600cSBjoern A. Zeeb		esac
7550696600cSBjoern A. Zeeb
7560696600cSBjoern A. Zeeb		_inet6=`expr "$_inet6" : '.*\(inet6 \([0-9a-f:]*\)\).*'`
7570696600cSBjoern A. Zeeb
7580696600cSBjoern A. Zeeb		IFS="$oldifs"
7590696600cSBjoern A. Zeeb		${IFCONFIG_CMD} ${_if} ${_inet6} -alias
7600696600cSBjoern A. Zeeb		IFS="$_ifs"
7610696600cSBjoern A. Zeeb		_ret=0
7620696600cSBjoern A. Zeeb	done
7630696600cSBjoern A. Zeeb	IFS="$oldifs"
7640696600cSBjoern A. Zeeb
7650696600cSBjoern A. Zeeb	return $_ret
7660696600cSBjoern A. Zeeb}
7670696600cSBjoern A. Zeeb
7680696600cSBjoern A. Zeeb# ifalias if af action
7690696600cSBjoern A. Zeeb#	Configure or remove aliases for network interface $if.
7700696600cSBjoern A. Zeeb#	It returns 0 if at least one alias was configured or
7710696600cSBjoern A. Zeeb#	removed, or 1 if there were none.
7720696600cSBjoern A. Zeeb#
7730696600cSBjoern A. Zeebifalias()
7740696600cSBjoern A. Zeeb{
7750696600cSBjoern A. Zeeb	local _ret
7760696600cSBjoern A. Zeeb	_ret=1
7770696600cSBjoern A. Zeeb
7780696600cSBjoern A. Zeeb	afexists $2 || return $_ret
7790696600cSBjoern A. Zeeb
7800696600cSBjoern A. Zeeb	case "$2" in
7810696600cSBjoern A. Zeeb	inet|inet6|link|ether)
7820696600cSBjoern A. Zeeb		ifalias_af_common $1 $2 $3 && _ret=0
7830696600cSBjoern A. Zeeb		;;
7840696600cSBjoern A. Zeeb	esac
7850696600cSBjoern A. Zeeb
7860696600cSBjoern A. Zeeb	return $_ret
7870696600cSBjoern A. Zeeb}
7880696600cSBjoern A. Zeeb
7890696600cSBjoern A. Zeeb# ifalias_expand_addr af action addr
7900696600cSBjoern A. Zeeb#	Expand address range ("N-M") specification in addr.
7910696600cSBjoern A. Zeeb#	"addr" must not include an address-family keyword.
7920696600cSBjoern A. Zeeb#	The results will include an address-family keyword.
7930696600cSBjoern A. Zeeb#
7940696600cSBjoern A. Zeebifalias_expand_addr()
7950696600cSBjoern A. Zeeb{
7960696600cSBjoern A. Zeeb	local _af _action
7970696600cSBjoern A. Zeeb
7980696600cSBjoern A. Zeeb	_af=$1
7990696600cSBjoern A. Zeeb	_action=$2
8000696600cSBjoern A. Zeeb	shift 2
8010696600cSBjoern A. Zeeb
8020696600cSBjoern A. Zeeb	afexists $_af || return
8030696600cSBjoern A. Zeeb	ifalias_expand_addr_$_af $_action $*
8040696600cSBjoern A. Zeeb}
8050696600cSBjoern A. Zeeb
8060696600cSBjoern A. Zeeb# ifalias_expand_addr_inet action addr
8070696600cSBjoern A. Zeeb#	Helper function for ifalias_expand_addr().  Handles IPv4.
8080696600cSBjoern A. Zeeb#
8090696600cSBjoern A. Zeebifalias_expand_addr_inet()
8100696600cSBjoern A. Zeeb{
8110696600cSBjoern A. Zeeb	local _action _arg _cidr _cidr_addr _exargs
8120696600cSBjoern A. Zeeb	local _ipaddr _plen _range _iphead _iptail _iplow _iphigh _ipcount
8130696600cSBjoern A. Zeeb	local _retstr _c
8140696600cSBjoern A. Zeeb	_action=$1
8150696600cSBjoern A. Zeeb	_arg=$2
8160696600cSBjoern A. Zeeb	shift 2
8170696600cSBjoern A. Zeeb	_exargs=$*
8180696600cSBjoern A. Zeeb	_retstr=
8190696600cSBjoern A. Zeeb
8200696600cSBjoern A. Zeeb	case $_action:$_arg:$_exargs in
8210696600cSBjoern A. Zeeb	*:*--*)		return ;;	# invalid
8220696600cSBjoern A. Zeeb	tmp:*[0-9]-[0-9]*:*)		# to be expanded
8230696600cSBjoern A. Zeeb		_action="alias"
8240696600cSBjoern A. Zeeb	;;
8250696600cSBjoern A. Zeeb	*:*[0-9]-[0-9]*:*)		# to be expanded
8260696600cSBjoern A. Zeeb	;;
8270696600cSBjoern A. Zeeb	tmp:*:*netmask*)		# already expanded w/ netmask option
8280696600cSBjoern A. Zeeb		echo ${_arg%/[0-9]*} $_exargs && return
8290696600cSBjoern A. Zeeb	;;
8300696600cSBjoern A. Zeeb	tmp:*:*)			# already expanded w/o netmask option
8310696600cSBjoern A. Zeeb		echo $_arg $_exargs && return
8320696600cSBjoern A. Zeeb	;;
8330696600cSBjoern A. Zeeb	*:*:*netmask*)			# already expanded w/ netmask option
8340696600cSBjoern A. Zeeb		echo inet ${_arg%/[0-9]*} $_exargs && return
8350696600cSBjoern A. Zeeb	;;
8360696600cSBjoern A. Zeeb	*:*:*)				# already expanded w/o netmask option
8370696600cSBjoern A. Zeeb		echo inet $_arg $_exargs && return
8380696600cSBjoern A. Zeeb	;;
8390696600cSBjoern A. Zeeb	esac
8400696600cSBjoern A. Zeeb
8410696600cSBjoern A. Zeeb	for _cidr in $_arg; do
8420696600cSBjoern A. Zeeb		_ipaddr=${_cidr%%/*}
8430696600cSBjoern A. Zeeb		_plen=${_cidr##*/}
8440696600cSBjoern A. Zeeb		# When subnet prefix length is not specified, use /32.
8450696600cSBjoern A. Zeeb		case $_plen in
8460696600cSBjoern A. Zeeb		$_ipaddr)	_plen=32 ;;	# "/" character not found
8470696600cSBjoern A. Zeeb		esac
8480696600cSBjoern A. Zeeb
8490696600cSBjoern A. Zeeb		OIFS=$IFS
8500696600cSBjoern A. Zeeb		IFS=. set -- $_ipaddr
8510696600cSBjoern A. Zeeb		_range=
8520696600cSBjoern A. Zeeb		_iphead=
8530696600cSBjoern A. Zeeb		_iptail=
8540696600cSBjoern A. Zeeb		for _c in $@; do
8550696600cSBjoern A. Zeeb			case $_range:$_c in
8560696600cSBjoern A. Zeeb			:[0-9]*-[0-9]*)
8570696600cSBjoern A. Zeeb				_range=$_c
8580696600cSBjoern A. Zeeb			;;
8590696600cSBjoern A. Zeeb			:*)
8600696600cSBjoern A. Zeeb				_iphead="${_iphead}${_iphead:+.}${_c}"
8610696600cSBjoern A. Zeeb			;;
8620696600cSBjoern A. Zeeb			*:*)
8630696600cSBjoern A. Zeeb				_iptail="${_iptail}${_iptail:+.}${_c}"
8640696600cSBjoern A. Zeeb			;;
8650696600cSBjoern A. Zeeb			esac
8660696600cSBjoern A. Zeeb		done
8670696600cSBjoern A. Zeeb		IFS=$OIFS
8680696600cSBjoern A. Zeeb		_iplow=${_range%-*}
8690696600cSBjoern A. Zeeb		_iphigh=${_range#*-}
8700696600cSBjoern A. Zeeb
8710696600cSBjoern A. Zeeb		# clear netmask when removing aliases
8720696600cSBjoern A. Zeeb		if [ "$_action" = "-alias" ]; then
8730696600cSBjoern A. Zeeb			_plen=""
8740696600cSBjoern A. Zeeb		fi
8750696600cSBjoern A. Zeeb
8760696600cSBjoern A. Zeeb		_ipcount=$_iplow
8770696600cSBjoern A. Zeeb		while [ "$_ipcount" -le "$_iphigh" ]; do
8780696600cSBjoern A. Zeeb			_retstr="${_retstr} ${_iphead}${_iphead:+.}${_ipcount}${_iptail:+.}${_iptail}${_plen:+/}${_plen}"
8790696600cSBjoern A. Zeeb			if [ $_ipcount -gt $(($_iplow + $netif_ipexpand_max)) ]; then
8800696600cSBjoern A. Zeeb				warn "Range specification is too large (${_iphead}${_iphead:+.}${_iplow}${_iptail:+.}${_iptail}-${_iphead}${_iphead:+.}${_iphigh}${_iptail:+.}${_iptail}).  ${_iphead}${_iphead:+.}${_iplow}${_iptail:+.}${_iptail}-${_iphead}${_iphead:+.}${_ipcount}${_iptail:+.}${_iptail} was processed.  Increase \$netif_ipexpand_max in rc.conf."
8810696600cSBjoern A. Zeeb				break
8820696600cSBjoern A. Zeeb			else
8830696600cSBjoern A. Zeeb				_ipcount=$(($_ipcount + 1))
8840696600cSBjoern A. Zeeb			fi
8850696600cSBjoern A. Zeeb			# Forcibly set /32 for remaining aliases.
8860696600cSBjoern A. Zeeb			_plen=32
8870696600cSBjoern A. Zeeb		done
8880696600cSBjoern A. Zeeb	done
8890696600cSBjoern A. Zeeb
8900696600cSBjoern A. Zeeb	for _c in $_retstr; do
8910696600cSBjoern A. Zeeb		ifalias_expand_addr_inet $_action $_c $_exargs
8920696600cSBjoern A. Zeeb	done
8930696600cSBjoern A. Zeeb}
8940696600cSBjoern A. Zeeb
8950696600cSBjoern A. Zeeb# ifalias_expand_addr_inet6 action addr
8960696600cSBjoern A. Zeeb#	Helper function for ifalias_expand_addr().  Handles IPv6.
8970696600cSBjoern A. Zeeb#
8980696600cSBjoern A. Zeebifalias_expand_addr_inet6()
8990696600cSBjoern A. Zeeb{
9000696600cSBjoern A. Zeeb	local _action _arg _cidr _cidr_addr _exargs
9010696600cSBjoern A. Zeeb	local _ipaddr _plen _ipleft _ipright _iplow _iphigh _ipcount
9020696600cSBjoern A. Zeeb	local _ipv4part
9030696600cSBjoern A. Zeeb	local _retstr _c
9040696600cSBjoern A. Zeeb	_action=$1
9050696600cSBjoern A. Zeeb	_arg=$2
9060696600cSBjoern A. Zeeb	shift 2
9070696600cSBjoern A. Zeeb	_exargs=$*
9080696600cSBjoern A. Zeeb	_retstr=
9090696600cSBjoern A. Zeeb
9100696600cSBjoern A. Zeeb	case $_action:$_arg:$_exargs in
9110696600cSBjoern A. Zeeb	*:*--*:*)	return ;;	# invalid
9120696600cSBjoern A. Zeeb	tmp:*[0-9a-zA-Z]-[0-9a-zA-Z]*:*)# to be expanded
9130696600cSBjoern A. Zeeb		_action="alias"
9140696600cSBjoern A. Zeeb	;;
9150696600cSBjoern A. Zeeb	*:*[0-9a-zA-Z]-[0-9a-zA-Z]*:*)	# to be expanded
9160696600cSBjoern A. Zeeb	;;
9170696600cSBjoern A. Zeeb	tmp:*:*prefixlen*)	# already expanded w/ prefixlen option
9180696600cSBjoern A. Zeeb		echo ${_arg%/[0-9]*} $_exargs && return
9190696600cSBjoern A. Zeeb	;;
9200696600cSBjoern A. Zeeb	tmp:*:*)		# already expanded w/o prefixlen option
9210696600cSBjoern A. Zeeb		echo $_arg $_exargs && return
9220696600cSBjoern A. Zeeb	;;
9230696600cSBjoern A. Zeeb	*:*:*prefixlen*)	# already expanded w/ prefixlen option
9240696600cSBjoern A. Zeeb		echo inet6 ${_arg%/[0-9]*} $_exargs && return
9250696600cSBjoern A. Zeeb	;;
9260696600cSBjoern A. Zeeb	*:*:*)			# already expanded w/o prefixlen option
9270696600cSBjoern A. Zeeb		echo inet6 $_arg $_exargs && return
9280696600cSBjoern A. Zeeb	;;
9290696600cSBjoern A. Zeeb	esac
9300696600cSBjoern A. Zeeb
9310696600cSBjoern A. Zeeb	for _cidr in $_arg; do
9320696600cSBjoern A. Zeeb		_ipaddr="${_cidr%%/*}"
9330696600cSBjoern A. Zeeb		_plen="${_cidr##*/}"
9340696600cSBjoern A. Zeeb
9350696600cSBjoern A. Zeeb		case $_action:$_ipaddr:$_cidr in
9360696600cSBjoern A. Zeeb		-alias:*:*)		unset _plen ;;
9370696600cSBjoern A. Zeeb		*:$_cidr:$_ipaddr)	unset _plen ;;
9380696600cSBjoern A. Zeeb		esac
9390696600cSBjoern A. Zeeb
9400696600cSBjoern A. Zeeb		if [ "${_ipaddr%:*.*.*.*}" = "$_ipaddr" ]; then
9410696600cSBjoern A. Zeeb			# Handle !v4mapped && !v4compat addresses.
9420696600cSBjoern A. Zeeb
9430696600cSBjoern A. Zeeb			# The default prefix length is 64.
9440696600cSBjoern A. Zeeb			case $_ipaddr:$_cidr in
9450696600cSBjoern A. Zeeb			$_cidr:$_ipaddr)	_plen="64" ;;
9460696600cSBjoern A. Zeeb			esac
9470696600cSBjoern A. Zeeb			_ipleft=${_ipaddr%-*}
9480696600cSBjoern A. Zeeb			_ipright=${_ipaddr#*-}
9490696600cSBjoern A. Zeeb			_iplow=${_ipleft##*:}
9500696600cSBjoern A. Zeeb			_iphigh=${_ipright%%:*}
9510696600cSBjoern A. Zeeb			_ipleft=${_ipleft%:*}
9520696600cSBjoern A. Zeeb			_ipright=${_ipright#*:}
9530696600cSBjoern A. Zeeb
9540696600cSBjoern A. Zeeb			if [ "$_iphigh" = "$_ipright" ]; then
9550696600cSBjoern A. Zeeb				unset _ipright
9560696600cSBjoern A. Zeeb			else
9570696600cSBjoern A. Zeeb				_ipright=:$_ipright
9580696600cSBjoern A. Zeeb			fi
9590696600cSBjoern A. Zeeb
9600696600cSBjoern A. Zeeb			if [ -n "$_iplow" -a -n "$_iphigh" ]; then
9610696600cSBjoern A. Zeeb				_iplow=$((0x$_iplow))
9620696600cSBjoern A. Zeeb				_iphigh=$((0x$_iphigh))
9630696600cSBjoern A. Zeeb				_ipcount=$_iplow
9640696600cSBjoern A. Zeeb				while [ $_ipcount -le $_iphigh ]; do
9650696600cSBjoern A. Zeeb					_r=`printf "%s:%04x%s%s" \
9660696600cSBjoern A. Zeeb					    $_ipleft $_ipcount $_ipright \
9670696600cSBjoern A. Zeeb					    ${_plen:+/}$_plen`
9680696600cSBjoern A. Zeeb					_retstr="$_retstr $_r"
9690696600cSBjoern A. Zeeb					if [ $_ipcount -gt $(($_iplow + $netif_ipexpand_max)) ]
9700696600cSBjoern A. Zeeb					then
9710696600cSBjoern A. Zeeb						warn "Range specification is too large $(printf '(%s:%x%s-%s:%x%s)' "$_ipleft" "$_iplow" "$_ipright" "$_ipleft" "$_iphigh" "$_ipright"). $(printf '%s:%x%s-%s:%x%s' "$_ipleft" "$_iplow" "$_ipright" "$_ipleft" "$_ipcount" "$_ipright") was processed.  Increase \$netif_ipexpand_max in rc.conf."
9720696600cSBjoern A. Zeeb						break
9730696600cSBjoern A. Zeeb					else
9740696600cSBjoern A. Zeeb						_ipcount=$(($_ipcount + 1))
9750696600cSBjoern A. Zeeb					fi
9760696600cSBjoern A. Zeeb				done
9770696600cSBjoern A. Zeeb			else
9780696600cSBjoern A. Zeeb				_retstr="${_ipaddr}${_plen:+/}${_plen}"
9790696600cSBjoern A. Zeeb			fi
9800696600cSBjoern A. Zeeb
9810696600cSBjoern A. Zeeb			for _c in $_retstr; do
9820696600cSBjoern A. Zeeb				ifalias_expand_addr_inet6 $_action $_c $_exargs
9830696600cSBjoern A. Zeeb			done
9840696600cSBjoern A. Zeeb		else
9850696600cSBjoern A. Zeeb			# v4mapped/v4compat should handle as an IPv4 alias
9860696600cSBjoern A. Zeeb			_ipv4part=${_ipaddr##*:}
9870696600cSBjoern A. Zeeb
9880696600cSBjoern A. Zeeb			# Adjust prefix length if any.  If not, set the
9890696600cSBjoern A. Zeeb			# default prefix length as 32.
9900696600cSBjoern A. Zeeb			case $_ipaddr:$_cidr in
9910696600cSBjoern A. Zeeb			$_cidr:$_ipaddr)	_plen=32 ;;
9920696600cSBjoern A. Zeeb			*)			_plen=$(($_plen - 96)) ;;
9930696600cSBjoern A. Zeeb			esac
9940696600cSBjoern A. Zeeb
9950696600cSBjoern A. Zeeb			_retstr=`ifalias_expand_addr_inet \
9960696600cSBjoern A. Zeeb			    tmp ${_ipv4part}${_plen:+/}${_plen}`
9970696600cSBjoern A. Zeeb			for _c in $_retstr; do
9980696600cSBjoern A. Zeeb				ifalias_expand_addr_inet $_action $_c $_exargs
9990696600cSBjoern A. Zeeb			done
10000696600cSBjoern A. Zeeb		fi
10010696600cSBjoern A. Zeeb	done
10020696600cSBjoern A. Zeeb}
10030696600cSBjoern A. Zeeb
10040696600cSBjoern A. Zeeb# ifalias_af_common_handler if af action args
10050696600cSBjoern A. Zeeb#	Helper function for ifalias_af_common().
10060696600cSBjoern A. Zeeb#
10070696600cSBjoern A. Zeebifalias_af_common_handler()
10080696600cSBjoern A. Zeeb{
10090696600cSBjoern A. Zeeb	local _ret _if _af _action _args _c _tmpargs
10100696600cSBjoern A. Zeeb
10110696600cSBjoern A. Zeeb	_ret=1
10120696600cSBjoern A. Zeeb	_if=$1
10130696600cSBjoern A. Zeeb	_af=$2
10140696600cSBjoern A. Zeeb	_action=$3
10150696600cSBjoern A. Zeeb	shift 3
10160696600cSBjoern A. Zeeb	_args=$*
10170696600cSBjoern A. Zeeb
10180696600cSBjoern A. Zeeb	case $_args in
1019fef0e429SCy Schubert	${_af}[[:space:]]*)	;;
10200696600cSBjoern A. Zeeb	*)	return	;;
10210696600cSBjoern A. Zeeb	esac
10220696600cSBjoern A. Zeeb
10230696600cSBjoern A. Zeeb	# link(ether) does not support address removal.
10240696600cSBjoern A. Zeeb	case $_af:$_action in
10250696600cSBjoern A. Zeeb	link:-alias|ether:-alias)	return ;;
10260696600cSBjoern A. Zeeb	esac
10270696600cSBjoern A. Zeeb
10280696600cSBjoern A. Zeeb	_tmpargs=
10290696600cSBjoern A. Zeeb	for _c in $_args; do
10300696600cSBjoern A. Zeeb		case $_c in
10310696600cSBjoern A. Zeeb		${_af})
10320696600cSBjoern A. Zeeb			case $_tmpargs in
1033fef0e429SCy Schubert			${_af}[[:space:]]*[0-9a-fA-F]-*)
10340696600cSBjoern A. Zeeb				ifalias_af_common_handler $_if $_af $_action \
1035fef0e429SCy Schubert				`ifalias_expand_addr $_af $_action ${_tmpargs#${_af}[[:space:]]}`
10360696600cSBjoern A. Zeeb			;;
1037fef0e429SCy Schubert			${_af}[[:space:]]*)
10380696600cSBjoern A. Zeeb				${IFCONFIG_CMD} $_if $_tmpargs $_action && _ret=0
10390696600cSBjoern A. Zeeb			;;
10400696600cSBjoern A. Zeeb			esac
10410696600cSBjoern A. Zeeb			_tmpargs=$_af
10420696600cSBjoern A. Zeeb		;;
10430696600cSBjoern A. Zeeb		*)
10440696600cSBjoern A. Zeeb			_tmpargs="$_tmpargs $_c"
10450696600cSBjoern A. Zeeb		;;
10460696600cSBjoern A. Zeeb		esac
10470696600cSBjoern A. Zeeb	done
10480696600cSBjoern A. Zeeb	# Process the last component if any.
104987061d3bSCy Schubert	if [ -n "${_tmpargs}" ]; then
10500696600cSBjoern A. Zeeb		case $_tmpargs in
1051e3e57edfSCy Schubert		${_af}[[:space:]]pass[[:space:]]*)
1052e3e57edfSCy Schubert			${IFCONFIG_CMD} $_if $_tmpargs $_action && _ret=0
1053e3e57edfSCy Schubert		;;
1054fef0e429SCy Schubert		${_af}[[:space:]]*[0-9a-fA-F]-*)
10550696600cSBjoern A. Zeeb			ifalias_af_common_handler $_if $_af $_action \
1056fef0e429SCy Schubert			`ifalias_expand_addr $_af $_action ${_tmpargs#${_af}[[:space:]]}`
10570696600cSBjoern A. Zeeb		;;
1058fef0e429SCy Schubert		${_af}[[:space:]]*)
10590696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $_if $_tmpargs $_action && _ret=0
10600696600cSBjoern A. Zeeb		;;
10610696600cSBjoern A. Zeeb		esac
10620696600cSBjoern A. Zeeb	fi
10630696600cSBjoern A. Zeeb
10640696600cSBjoern A. Zeeb	return $_ret
10650696600cSBjoern A. Zeeb}
10660696600cSBjoern A. Zeeb
10670696600cSBjoern A. Zeeb# ifalias_af_common if af action
10680696600cSBjoern A. Zeeb#	Helper function for ifalias().
10690696600cSBjoern A. Zeeb#
10700696600cSBjoern A. Zeebifalias_af_common()
10710696600cSBjoern A. Zeeb{
10720696600cSBjoern A. Zeeb	local _ret _if _af _action alias ifconfig_args _aliasn _c _tmpargs _iaf
10730696600cSBjoern A. Zeeb	local _vif _punct=".-/+"
10740696600cSBjoern A. Zeeb
10750696600cSBjoern A. Zeeb	_ret=1
10760696600cSBjoern A. Zeeb	_aliasn=
10770696600cSBjoern A. Zeeb	_if=$1
10780696600cSBjoern A. Zeeb	_af=$2
10790696600cSBjoern A. Zeeb	_action=$3
10800696600cSBjoern A. Zeeb
10810696600cSBjoern A. Zeeb	# Normalize $_if before using it in a pattern to list_vars()
10820696600cSBjoern A. Zeeb	ltr "$_if" "$_punct" "_" _vif
10830696600cSBjoern A. Zeeb
10840696600cSBjoern A. Zeeb	# ifconfig_IF_aliasN which starts with $_af
10850696600cSBjoern A. Zeeb	for alias in `list_vars ifconfig_${_vif}_alias[0-9]\* |
10860696600cSBjoern A. Zeeb		sort_lite -nk1.$((9+${#_vif}+7))`
10870696600cSBjoern A. Zeeb	do
10880696600cSBjoern A. Zeeb		eval ifconfig_args=\"\$$alias\"
10890696600cSBjoern A. Zeeb		_iaf=
10900696600cSBjoern A. Zeeb		case $ifconfig_args in
1091fef0e429SCy Schubert		inet[[:space:]]*)	_iaf=inet ;;
1092fef0e429SCy Schubert		inet6[[:space:]]*)	_iaf=inet6 ;;
1093fef0e429SCy Schubert		link[[:space:]]*)	_iaf=link ;;
1094fef0e429SCy Schubert		ether[[:space:]]*)	_iaf=ether ;;
10950696600cSBjoern A. Zeeb		esac
10960696600cSBjoern A. Zeeb
10970696600cSBjoern A. Zeeb		case ${_af}:${_action}:${_iaf}:"${ifconfig_args}" in
10980696600cSBjoern A. Zeeb		${_af}:*:${_af}:*)
10990696600cSBjoern A. Zeeb			_aliasn="$_aliasn $ifconfig_args"
11000696600cSBjoern A. Zeeb			;;
11010696600cSBjoern A. Zeeb		${_af}:*:"":"")
11020696600cSBjoern A. Zeeb			break
11030696600cSBjoern A. Zeeb			;;
11040696600cSBjoern A. Zeeb		inet:alias:"":*)
11050696600cSBjoern A. Zeeb			_aliasn="$_aliasn inet $ifconfig_args"
11060696600cSBjoern A. Zeeb			warn "\$${alias} needs leading" \
11070696600cSBjoern A. Zeeb			    "\"inet\" keyword for an IPv4 address."
11080696600cSBjoern A. Zeeb		esac
11090696600cSBjoern A. Zeeb	done
11100696600cSBjoern A. Zeeb
11110696600cSBjoern A. Zeeb	# backward compatibility: ipv6_ifconfig_IF_aliasN.
11120696600cSBjoern A. Zeeb	case $_af in
11130696600cSBjoern A. Zeeb	inet6)
11140696600cSBjoern A. Zeeb		for alias in `list_vars ipv6_ifconfig_${_vif}_alias[0-9]\* |
11150696600cSBjoern A. Zeeb			sort_lite -nk1.$((14+${#_vif}+7))`
11160696600cSBjoern A. Zeeb		do
11170696600cSBjoern A. Zeeb			eval ifconfig_args=\"\$$alias\"
11180696600cSBjoern A. Zeeb			case ${_action}:"${ifconfig_args}" in
11190696600cSBjoern A. Zeeb			*:"")
11200696600cSBjoern A. Zeeb				break
11210696600cSBjoern A. Zeeb			;;
11220696600cSBjoern A. Zeeb			alias:*)
11230696600cSBjoern A. Zeeb				_aliasn="${_aliasn} inet6 ${ifconfig_args}"
11240696600cSBjoern A. Zeeb				warn "\$${alias} is obsolete. " \
11250696600cSBjoern A. Zeeb				    "Use ifconfig_${_vif}_aliasN instead."
11260696600cSBjoern A. Zeeb			;;
11270696600cSBjoern A. Zeeb			esac
11280696600cSBjoern A. Zeeb		done
11290696600cSBjoern A. Zeeb	esac
11300696600cSBjoern A. Zeeb
11310696600cSBjoern A. Zeeb	# backward compatibility: ipv4_addrs_IF.
11320696600cSBjoern A. Zeeb	for _tmpargs in `get_if_var $_if ipv4_addrs_IF`; do
11330696600cSBjoern A. Zeeb		_aliasn="$_aliasn inet $_tmpargs"
11340696600cSBjoern A. Zeeb	done
11350696600cSBjoern A. Zeeb
11360696600cSBjoern A. Zeeb	# Handle ifconfig_IF_aliases, ifconfig_IF_aliasN, and the others.
11370696600cSBjoern A. Zeeb	_tmpargs=
11380696600cSBjoern A. Zeeb	for _c in `get_if_var $_if ifconfig_IF_aliases` $_aliasn; do
11390696600cSBjoern A. Zeeb		case $_c in
11400696600cSBjoern A. Zeeb		inet|inet6|link|ether)
11410696600cSBjoern A. Zeeb			case $_tmpargs in
1142fef0e429SCy Schubert			${_af}[[:space:]]*)
11430696600cSBjoern A. Zeeb				eval ifalias_af_common_handler $_if $_af $_action $_tmpargs && _ret=0
11440696600cSBjoern A. Zeeb			;;
11450696600cSBjoern A. Zeeb			esac
11460696600cSBjoern A. Zeeb			_tmpargs=$_c
11470696600cSBjoern A. Zeeb		;;
11480696600cSBjoern A. Zeeb		*)
11490696600cSBjoern A. Zeeb			_tmpargs="$_tmpargs $_c"
11500696600cSBjoern A. Zeeb		esac
11510696600cSBjoern A. Zeeb	done
11520696600cSBjoern A. Zeeb	# Process the last component
11530696600cSBjoern A. Zeeb	case $_tmpargs in
1154fef0e429SCy Schubert	${_af}[[:space:]]*)
11550696600cSBjoern A. Zeeb		ifalias_af_common_handler $_if $_af $_action $_tmpargs && _ret=0
11560696600cSBjoern A. Zeeb	;;
11570696600cSBjoern A. Zeeb	esac
11580696600cSBjoern A. Zeeb
11590696600cSBjoern A. Zeeb	return $_ret
11600696600cSBjoern A. Zeeb}
11610696600cSBjoern A. Zeeb
11620696600cSBjoern A. Zeeb# ipv6_prefix_hostid_addr_common if action
11630696600cSBjoern A. Zeeb#	Add or remove IPv6 prefix + hostid addr on the interface $if
11640696600cSBjoern A. Zeeb#
11650696600cSBjoern A. Zeebipv6_prefix_hostid_addr_common()
11660696600cSBjoern A. Zeeb{
11670696600cSBjoern A. Zeeb	local _if _action prefix j
11680696600cSBjoern A. Zeeb	_if=$1
11690696600cSBjoern A. Zeeb	_action=$2
11700696600cSBjoern A. Zeeb	prefix=`get_if_var ${_if} ipv6_prefix_IF`
11710696600cSBjoern A. Zeeb
11720696600cSBjoern A. Zeeb	if [ -n "${prefix}" ]; then
11730696600cSBjoern A. Zeeb		for j in ${prefix}; do
11740696600cSBjoern A. Zeeb			# The default prefixlen is 64.
11750696600cSBjoern A. Zeeb			plen=${j#*/}
11760696600cSBjoern A. Zeeb			case $j:$plen in
11770696600cSBjoern A. Zeeb			$plen:$j)	plen=64 ;;
11780696600cSBjoern A. Zeeb			*)		j=${j%/*} ;;
11790696600cSBjoern A. Zeeb			esac
11800696600cSBjoern A. Zeeb
11810696600cSBjoern A. Zeeb			# Normalize the last part by removing ":"
11820696600cSBjoern A. Zeeb			j=${j%::*}
11830696600cSBjoern A. Zeeb			j=${j%:}
11840696600cSBjoern A. Zeeb			${IFCONFIG_CMD} ${_if} inet6 $j:: \
11850696600cSBjoern A. Zeeb				prefixlen $plen eui64 ${_action}
11860696600cSBjoern A. Zeeb
11870696600cSBjoern A. Zeeb			# if I am a router, add subnet router
11880696600cSBjoern A. Zeeb			# anycast address (RFC 2373).
11890696600cSBjoern A. Zeeb			if checkyesno ipv6_gateway_enable; then
11900696600cSBjoern A. Zeeb				${IFCONFIG_CMD} ${_if} inet6 $j:: \
11910696600cSBjoern A. Zeeb					prefixlen $plen ${_action} anycast
11920696600cSBjoern A. Zeeb			fi
11930696600cSBjoern A. Zeeb		done
11940696600cSBjoern A. Zeeb	fi
11950696600cSBjoern A. Zeeb}
11960696600cSBjoern A. Zeeb
11970696600cSBjoern A. Zeeb# ipv6_accept_rtadv_up if
11980696600cSBjoern A. Zeeb#	Enable accepting Router Advertisement and send Router
11990696600cSBjoern A. Zeeb#	Solicitation message
12000696600cSBjoern A. Zeebipv6_accept_rtadv_up()
12010696600cSBjoern A. Zeeb{
12020696600cSBjoern A. Zeeb	if ipv6_autoconfif $1; then
12030696600cSBjoern A. Zeeb		${IFCONFIG_CMD} $1 inet6 accept_rtadv up
12041b5be720SBjoern A. Zeeb		if [ -x /sbin/rtsol ]; then
12051b5be720SBjoern A. Zeeb			/sbin/rtsol ${rtsol_flags} $1
12060696600cSBjoern A. Zeeb		fi
120776d32f04SBjoern A. Zeeb		return 0
12080696600cSBjoern A. Zeeb	fi
120976d32f04SBjoern A. Zeeb	return 1
12100696600cSBjoern A. Zeeb}
12110696600cSBjoern A. Zeeb
12120696600cSBjoern A. Zeeb# ipv6_accept_rtadv_down if
12130696600cSBjoern A. Zeeb#	Disable accepting Router Advertisement
12140696600cSBjoern A. Zeebipv6_accept_rtadv_down()
12150696600cSBjoern A. Zeeb{
12160696600cSBjoern A. Zeeb	if ipv6_autoconfif $1; then
12170696600cSBjoern A. Zeeb		${IFCONFIG_CMD} $1 inet6 -accept_rtadv
12180696600cSBjoern A. Zeeb	fi
12190696600cSBjoern A. Zeeb}
12200696600cSBjoern A. Zeeb
12210696600cSBjoern A. Zeeb# ifscript_up if
12220696600cSBjoern A. Zeeb#	Evaluate a startup script for the $if interface.
12230696600cSBjoern A. Zeeb#	It returns 0 if a script was found and processed or
12240696600cSBjoern A. Zeeb#	1 if no script was found.
12250696600cSBjoern A. Zeeb#
12260696600cSBjoern A. Zeebifscript_up()
12270696600cSBjoern A. Zeeb{
12280696600cSBjoern A. Zeeb	if [ -r /etc/start_if.$1 ]; then
12290696600cSBjoern A. Zeeb		. /etc/start_if.$1
12300696600cSBjoern A. Zeeb		return 0
12310696600cSBjoern A. Zeeb	else
12320696600cSBjoern A. Zeeb		return 1
12330696600cSBjoern A. Zeeb	fi
12340696600cSBjoern A. Zeeb}
12350696600cSBjoern A. Zeeb
12360696600cSBjoern A. Zeeb# ifscript_down if
12370696600cSBjoern A. Zeeb#	Evaluate a shutdown script for the $if interface.
12380696600cSBjoern A. Zeeb#	It returns 0 if a script was found and processed or
12390696600cSBjoern A. Zeeb#	1 if no script was found.
12400696600cSBjoern A. Zeeb#
12410696600cSBjoern A. Zeebifscript_down()
12420696600cSBjoern A. Zeeb{
12430696600cSBjoern A. Zeeb	if [ -r /etc/stop_if.$1 ]; then
12440696600cSBjoern A. Zeeb		. /etc/stop_if.$1
12450696600cSBjoern A. Zeeb		return 0
12460696600cSBjoern A. Zeeb	else
12470696600cSBjoern A. Zeeb		return 1
12480696600cSBjoern A. Zeeb	fi
12490696600cSBjoern A. Zeeb}
12500696600cSBjoern A. Zeeb
12510696600cSBjoern A. Zeeb# wlan_up
12520696600cSBjoern A. Zeeb#	Create IEEE802.11 interfaces.
12530696600cSBjoern A. Zeeb#
12540696600cSBjoern A. Zeebwlan_up()
12550696600cSBjoern A. Zeeb{
12560696600cSBjoern A. Zeeb	local _list _iflist parent child_wlans child create_args debug_flags
12570696600cSBjoern A. Zeeb	_list=
12580696600cSBjoern A. Zeeb	_iflist=$*
12590696600cSBjoern A. Zeeb
12600696600cSBjoern A. Zeeb	# Parse wlans_$parent="$child ..."
1261de1dde5dSBjoern A. Zeeb	for parent in `set | sed -nE 's/wlans_([a-z]+[a-z0-9]+[0-9]+)=.*/\1/p'`; do
12620696600cSBjoern A. Zeeb		child_wlans=`get_if_var $parent wlans_IF`
12630696600cSBjoern A. Zeeb		for child in ${child_wlans}; do
12640696600cSBjoern A. Zeeb			create_args="wlandev $parent `get_if_var $child create_args_IF`"
12650696600cSBjoern A. Zeeb			debug_flags="`get_if_var $child wlandebug_IF`"
12660696600cSBjoern A. Zeeb			case $_iflist in
1267fef0e429SCy Schubert			""|$child|$child[[:space:]]*|*[[:space:]]$child[[:space:]]*|*[[:space:]]$child)	;;
12680696600cSBjoern A. Zeeb			*)	continue ;;
12690696600cSBjoern A. Zeeb			esac
12700696600cSBjoern A. Zeeb			# Skip if ${child} already exists.
12710696600cSBjoern A. Zeeb			if ${IFCONFIG_CMD} $child > /dev/null 2>&1; then
12720696600cSBjoern A. Zeeb				continue
12730696600cSBjoern A. Zeeb			fi
12740696600cSBjoern A. Zeeb			if expr $child : 'wlan[0-9][0-9]*$' >/dev/null 2>&1; then
12750696600cSBjoern A. Zeeb				${IFCONFIG_CMD} $child create ${create_args} && cfg=0
12760696600cSBjoern A. Zeeb			else
12770696600cSBjoern A. Zeeb				${IFCONFIG_CMD} wlan create ${create_args} name $child && cfg=0
12780696600cSBjoern A. Zeeb			fi
12790696600cSBjoern A. Zeeb			if [ $? -eq 0 ]; then
12800696600cSBjoern A. Zeeb				_list="$_list $child"
12810696600cSBjoern A. Zeeb			fi
12820696600cSBjoern A. Zeeb			if [ -n "${debug_flags}" ]; then
12830696600cSBjoern A. Zeeb				wlandebug -i $child ${debug_flags}
12840696600cSBjoern A. Zeeb			fi
12850696600cSBjoern A. Zeeb		done
12860696600cSBjoern A. Zeeb	done
12870696600cSBjoern A. Zeeb	if [ -n "${_list# }" ]; then
12880696600cSBjoern A. Zeeb		echo "Created wlan(4) interfaces: ${_list# }."
12890696600cSBjoern A. Zeeb	fi
12900696600cSBjoern A. Zeeb	debug "Created wlan(4)s: ${_list# }"
12910696600cSBjoern A. Zeeb}
12920696600cSBjoern A. Zeeb
12930696600cSBjoern A. Zeeb# wlan_down
12940696600cSBjoern A. Zeeb#	Destroy IEEE802.11 interfaces.
12950696600cSBjoern A. Zeeb#
12960696600cSBjoern A. Zeebwlan_down()
12970696600cSBjoern A. Zeeb{
12980696600cSBjoern A. Zeeb	local _list _iflist parent child_wlans child
12990696600cSBjoern A. Zeeb	_list=
13000696600cSBjoern A. Zeeb	_iflist=$*
13010696600cSBjoern A. Zeeb
13020696600cSBjoern A. Zeeb	# Parse wlans_$parent="$child ..."
1303de1dde5dSBjoern A. Zeeb	for parent in `set | sed -nE 's/wlans_([a-z]+[a-z0-9]+[0-9]+)=.*/\1/p'`; do
13040696600cSBjoern A. Zeeb		child_wlans=`get_if_var $parent wlans_IF`
13050696600cSBjoern A. Zeeb		for child in ${child_wlans}; do
13060696600cSBjoern A. Zeeb			case $_iflist in
1307fef0e429SCy Schubert			""|$child|$child[[:space:]]*|*[[:space:]]$child[[:space:]]*|*[[:space:]]$child)	;;
13080696600cSBjoern A. Zeeb			*)	continue ;;
13090696600cSBjoern A. Zeeb			esac
13100696600cSBjoern A. Zeeb			# Skip if ${child} doesn't exists.
13110696600cSBjoern A. Zeeb			if ! ${IFCONFIG_CMD} $child > /dev/null 2>&1; then
13120696600cSBjoern A. Zeeb				continue
13130696600cSBjoern A. Zeeb			fi
13140696600cSBjoern A. Zeeb			${IFCONFIG_CMD} -n ${child} destroy
13150696600cSBjoern A. Zeeb			if [ $? -eq 0 ]; then
13160696600cSBjoern A. Zeeb				_list="$_list $child"
13170696600cSBjoern A. Zeeb			fi
13180696600cSBjoern A. Zeeb		done
13190696600cSBjoern A. Zeeb	done
13200696600cSBjoern A. Zeeb	if [ -n "${_list# }" ]; then
13210696600cSBjoern A. Zeeb		echo "Destroyed wlan(4) interfaces: ${_list# }."
13220696600cSBjoern A. Zeeb	fi
13230696600cSBjoern A. Zeeb	debug "Destroyed wlan(4)s: ${_list# }"
13240696600cSBjoern A. Zeeb}
13250696600cSBjoern A. Zeeb
13260696600cSBjoern A. Zeeb# clone_up
13270696600cSBjoern A. Zeeb#	Create cloneable interfaces.
13280696600cSBjoern A. Zeeb#
13290696600cSBjoern A. Zeebclone_up()
13300696600cSBjoern A. Zeeb{
1331734b726dSEugene Grosbein	local _list ifn ifopt _iflist _inet6 _n tmpargs
13320696600cSBjoern A. Zeeb	_list=
13330696600cSBjoern A. Zeeb	_iflist=$*
13340696600cSBjoern A. Zeeb
13350696600cSBjoern A. Zeeb	# create_args_IF
13360696600cSBjoern A. Zeeb	for ifn in ${cloned_interfaces}; do
13370696600cSBjoern A. Zeeb		# Parse ifn:ifopt.
13380696600cSBjoern A. Zeeb		OIFS=$IFS; IFS=:; set -- $ifn; ifn=$1; ifopt=$2; IFS=$OIFS
13390696600cSBjoern A. Zeeb		case $_iflist in
1340fef0e429SCy Schubert		""|$ifn|$ifn[[:space:]]*|*[[:space:]]$ifn[[:space:]]*|*[[:space:]]$ifn)	;;
13410696600cSBjoern A. Zeeb		*)	continue ;;
13420696600cSBjoern A. Zeeb		esac
13430696600cSBjoern A. Zeeb		case $ifn in
13440696600cSBjoern A. Zeeb		epair[0-9]*)
13450696600cSBjoern A. Zeeb			# epair(4) uses epair[0-9] for creation and
13460696600cSBjoern A. Zeeb			# epair[0-9][ab] for configuration.
13470696600cSBjoern A. Zeeb			#
13480696600cSBjoern A. Zeeb			# Skip if ${ifn}a or ${ifn}b already exist.
13490696600cSBjoern A. Zeeb			if ${IFCONFIG_CMD} ${ifn}a > /dev/null 2>&1; then
13500696600cSBjoern A. Zeeb				continue
13510696600cSBjoern A. Zeeb			elif ${IFCONFIG_CMD} ${ifn}b > /dev/null 2>&1; then
13520696600cSBjoern A. Zeeb				continue
13530696600cSBjoern A. Zeeb			fi
13540696600cSBjoern A. Zeeb			${IFCONFIG_CMD} ${ifn} create \
13550696600cSBjoern A. Zeeb			    `get_if_var ${ifn} create_args_IF`
13560696600cSBjoern A. Zeeb			if [ $? -eq 0 ]; then
13570696600cSBjoern A. Zeeb				_list="$_list ${ifn}a ${ifn}b"
13580696600cSBjoern A. Zeeb			fi
13590696600cSBjoern A. Zeeb		;;
13600696600cSBjoern A. Zeeb		*)
13610696600cSBjoern A. Zeeb			# Skip if ${ifn} already exists.
13620696600cSBjoern A. Zeeb			if ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
13630696600cSBjoern A. Zeeb				continue
13640696600cSBjoern A. Zeeb			fi
13650696600cSBjoern A. Zeeb			${IFCONFIG_CMD} ${ifn} create \
13660696600cSBjoern A. Zeeb			    `get_if_var ${ifn} create_args_IF`
13670696600cSBjoern A. Zeeb			if [ $? -eq 0 ]; then
13680696600cSBjoern A. Zeeb				_list="$_list $ifn"
13690696600cSBjoern A. Zeeb			fi
13700696600cSBjoern A. Zeeb		esac
13710696600cSBjoern A. Zeeb	done
13720696600cSBjoern A. Zeeb	for ifn in ${gif_interfaces}; do
13730696600cSBjoern A. Zeeb		# Parse ifn:ifopt.
13740696600cSBjoern A. Zeeb		OIFS=$IFS; IFS=:; set -- $ifn; ifn=$1; ifopt=$2; IFS=$OIFS
13750696600cSBjoern A. Zeeb		case $_iflist in
1376fef0e429SCy Schubert		""|$ifn|$ifn[[:space:]]*|*[[:space:]]$ifn[[:space:]]*|*[[:space:]]$ifn)	;;
13770696600cSBjoern A. Zeeb		*)	continue ;;
13780696600cSBjoern A. Zeeb		esac
13790696600cSBjoern A. Zeeb		# Skip if ifn already exists.
13800696600cSBjoern A. Zeeb		if ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
13810696600cSBjoern A. Zeeb			continue
13820696600cSBjoern A. Zeeb		fi
13830696600cSBjoern A. Zeeb		case $ifn in
13840696600cSBjoern A. Zeeb		gif[0-9]*)
13850696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $ifn create
13860696600cSBjoern A. Zeeb		;;
13870696600cSBjoern A. Zeeb		*)
13880696600cSBjoern A. Zeeb			_n=$(${IFCONFIG_CMD} gif create)
13890696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $_n name $ifn
13900696600cSBjoern A. Zeeb		;;
13910696600cSBjoern A. Zeeb		esac
13920696600cSBjoern A. Zeeb		if [ $? -eq 0 ]; then
13930696600cSBjoern A. Zeeb			_list="$_list $ifn"
13940696600cSBjoern A. Zeeb			tmpargs=$(get_if_var $ifn gifconfig_IF)
1395734b726dSEugene Grosbein			_inet6=''
1396734b726dSEugene Grosbein			case "$tmpargs" in
1397734b726dSEugene Grosbein			'')
1398734b726dSEugene Grosbein			;;
1399734b726dSEugene Grosbein			inet6[[:space:]]*)
1400734b726dSEugene Grosbein				tmpargs=${tmpargs#inet6}
1401734b726dSEugene Grosbein				_inet6=inet6
1402734b726dSEugene Grosbein				# FALLTHROUGH
1403734b726dSEugene Grosbein			;&
1404734b726dSEugene Grosbein			*)
1405734b726dSEugene Grosbein				${IFCONFIG_CMD} $ifn $_inet6 tunnel $tmpargs
1406734b726dSEugene Grosbein			;;
1407734b726dSEugene Grosbein			esac
1408734b726dSEugene Grosbein		fi
14090696600cSBjoern A. Zeeb	done
14100696600cSBjoern A. Zeeb	if [ -n "${_list# }" ]; then
14110696600cSBjoern A. Zeeb		echo "Created clone interfaces: ${_list# }."
14120696600cSBjoern A. Zeeb	fi
14130696600cSBjoern A. Zeeb	debug "Cloned: ${_list# }"
14140696600cSBjoern A. Zeeb}
14150696600cSBjoern A. Zeeb
14160696600cSBjoern A. Zeeb# clone_down
14170696600cSBjoern A. Zeeb#	Destroy cloned interfaces. Destroyed interfaces are echoed to
14180696600cSBjoern A. Zeeb#	standard output.
14190696600cSBjoern A. Zeeb#
14200696600cSBjoern A. Zeebclone_down()
14210696600cSBjoern A. Zeeb{
14220696600cSBjoern A. Zeeb	local _list ifn _difn ifopt _iflist _sticky
14230696600cSBjoern A. Zeeb	_list=
14240696600cSBjoern A. Zeeb	_iflist=$*
14250696600cSBjoern A. Zeeb
14260696600cSBjoern A. Zeeb	: ${cloned_interfaces_sticky:=NO}
14270696600cSBjoern A. Zeeb	if checkyesno cloned_interfaces_sticky; then
14280696600cSBjoern A. Zeeb		_sticky=1
14290696600cSBjoern A. Zeeb	else
14300696600cSBjoern A. Zeeb		_sticky=0
14310696600cSBjoern A. Zeeb	fi
14320696600cSBjoern A. Zeeb	for ifn in ${cloned_interfaces} ${gif_interfaces}; do
14330696600cSBjoern A. Zeeb		# Parse ifn:ifopt.
14340696600cSBjoern A. Zeeb		OIFS=$IFS; IFS=:; set -- $ifn; ifn=$1; ifopt=$2; IFS=$OIFS
14350696600cSBjoern A. Zeeb		case $ifopt:$_sticky in
14360696600cSBjoern A. Zeeb		sticky:*)	continue ;;	# :sticky => not destroy
14370696600cSBjoern A. Zeeb		nosticky:*)	;;		# :nosticky => destroy
14380696600cSBjoern A. Zeeb		*:1)		continue ;;	# global sticky knob == 1
14390696600cSBjoern A. Zeeb		esac
14400696600cSBjoern A. Zeeb		case $_iflist in
1441fef0e429SCy Schubert		""|$ifn|$ifn[[:space:]]*|*[[:space:]]$ifn[[:space:]]*|*[[:space:]]$ifn)	;;
14420696600cSBjoern A. Zeeb		*)	continue ;;
14430696600cSBjoern A. Zeeb		esac
14440696600cSBjoern A. Zeeb		case $ifn in
14450696600cSBjoern A. Zeeb		epair[0-9]*)
14460696600cSBjoern A. Zeeb			# Note: epair(4) uses epair[0-9] for removal and
14470696600cSBjoern A. Zeeb			# epair[0-9][ab] for configuration.
14480696600cSBjoern A. Zeeb			#
14490696600cSBjoern A. Zeeb			# Skip if both of ${ifn}a and ${ifn}b do not exist.
14500696600cSBjoern A. Zeeb			if ${IFCONFIG_CMD} ${ifn}a > /dev/null 2>&1; then
14510696600cSBjoern A. Zeeb				_difn=${ifn}a
14520696600cSBjoern A. Zeeb			elif ${IFCONFIG_CMD} ${ifn}b > /dev/null 2>&1; then
14530696600cSBjoern A. Zeeb				_difn=${ifn}b
14540696600cSBjoern A. Zeeb			else
14550696600cSBjoern A. Zeeb				continue
14560696600cSBjoern A. Zeeb			fi
14570696600cSBjoern A. Zeeb			${IFCONFIG_CMD} -n $_difn destroy
14580696600cSBjoern A. Zeeb			if [ $? -eq 0 ]; then
14590696600cSBjoern A. Zeeb				_list="$_list ${ifn}a ${ifn}b"
14600696600cSBjoern A. Zeeb			fi
14610696600cSBjoern A. Zeeb		;;
14620696600cSBjoern A. Zeeb		*)
14630696600cSBjoern A. Zeeb			# Skip if ifn does not exist.
14640696600cSBjoern A. Zeeb			if ! ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
14650696600cSBjoern A. Zeeb				continue
14660696600cSBjoern A. Zeeb			fi
14670696600cSBjoern A. Zeeb			${IFCONFIG_CMD} -n ${ifn} destroy
14680696600cSBjoern A. Zeeb			if [ $? -eq 0 ]; then
14690696600cSBjoern A. Zeeb				_list="$_list $ifn"
14700696600cSBjoern A. Zeeb			fi
14710696600cSBjoern A. Zeeb		;;
14720696600cSBjoern A. Zeeb		esac
14730696600cSBjoern A. Zeeb	done
14740696600cSBjoern A. Zeeb	if [ -n "${_list# }" ]; then
14750696600cSBjoern A. Zeeb		echo "Destroyed clone interfaces: ${_list# }."
14760696600cSBjoern A. Zeeb	fi
14770696600cSBjoern A. Zeeb	debug "Destroyed clones: ${_list# }"
14780696600cSBjoern A. Zeeb}
14790696600cSBjoern A. Zeeb
14800696600cSBjoern A. Zeeb# childif_create
14810696600cSBjoern A. Zeeb#	Create and configure child interfaces.  Return 0 if child
14820696600cSBjoern A. Zeeb#	interfaces are created.
14830696600cSBjoern A. Zeeb#
14840696600cSBjoern A. Zeebchildif_create()
14850696600cSBjoern A. Zeeb{
148690809c67SGleb Smirnoff	local cfg child child_vlans create_args debug_flags ifn i
14870696600cSBjoern A. Zeeb	cfg=1
14880696600cSBjoern A. Zeeb	ifn=$1
14890696600cSBjoern A. Zeeb
14900696600cSBjoern A. Zeeb	# Create vlan interfaces
14910696600cSBjoern A. Zeeb	child_vlans=`get_if_var $ifn vlans_IF`
14920696600cSBjoern A. Zeeb
14930696600cSBjoern A. Zeeb	if [ -n "${child_vlans}" ]; then
14940696600cSBjoern A. Zeeb		load_kld if_vlan
14950696600cSBjoern A. Zeeb	fi
14960696600cSBjoern A. Zeeb
14970696600cSBjoern A. Zeeb	for child in ${child_vlans}; do
14980696600cSBjoern A. Zeeb		if expr $child : '[1-9][0-9]*$' >/dev/null 2>&1; then
14990696600cSBjoern A. Zeeb			child="${ifn}.${child}"
15000696600cSBjoern A. Zeeb			create_args=`get_if_var $child create_args_IF`
15010696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $child create ${create_args} && cfg=0
15020696600cSBjoern A. Zeeb		else
15030696600cSBjoern A. Zeeb			create_args="vlandev $ifn `get_if_var $child create_args_IF`"
15040696600cSBjoern A. Zeeb			if expr $child : 'vlan[0-9][0-9]*$' >/dev/null 2>&1; then
15050696600cSBjoern A. Zeeb				${IFCONFIG_CMD} $child create ${create_args} && cfg=0
15060696600cSBjoern A. Zeeb			else
15070696600cSBjoern A. Zeeb				i=`${IFCONFIG_CMD} vlan create ${create_args}`
15080696600cSBjoern A. Zeeb				${IFCONFIG_CMD} $i name $child && cfg=0
15090696600cSBjoern A. Zeeb			fi
15100696600cSBjoern A. Zeeb		fi
15110696600cSBjoern A. Zeeb		if autoif $child; then
15120696600cSBjoern A. Zeeb			ifn_start $child
15130696600cSBjoern A. Zeeb		fi
15140696600cSBjoern A. Zeeb	done
15150696600cSBjoern A. Zeeb
15160696600cSBjoern A. Zeeb	return ${cfg}
15170696600cSBjoern A. Zeeb}
15180696600cSBjoern A. Zeeb
15190696600cSBjoern A. Zeeb# childif_destroy
15200696600cSBjoern A. Zeeb#	Destroy child interfaces.
15210696600cSBjoern A. Zeeb#
15220696600cSBjoern A. Zeebchildif_destroy()
15230696600cSBjoern A. Zeeb{
152490809c67SGleb Smirnoff	local cfg child child_vlans ifn
15250696600cSBjoern A. Zeeb	cfg=1
15260696600cSBjoern A. Zeeb
15270696600cSBjoern A. Zeeb	child_vlans=`get_if_var $ifn vlans_IF`
15280696600cSBjoern A. Zeeb	for child in ${child_vlans}; do
15290696600cSBjoern A. Zeeb		if expr $child : '[1-9][0-9]*$' >/dev/null 2>&1; then
15300696600cSBjoern A. Zeeb			child="${ifn}.${child}"
15310696600cSBjoern A. Zeeb		fi
15320696600cSBjoern A. Zeeb		if ! ifexists $child; then
15330696600cSBjoern A. Zeeb			continue
15340696600cSBjoern A. Zeeb		fi
15350696600cSBjoern A. Zeeb		${IFCONFIG_CMD} -n $child destroy && cfg=0
15360696600cSBjoern A. Zeeb	done
15370696600cSBjoern A. Zeeb
15380696600cSBjoern A. Zeeb	return ${cfg}
15390696600cSBjoern A. Zeeb}
15400696600cSBjoern A. Zeeb
15410696600cSBjoern A. Zeeb# ng_mkpeer
15420696600cSBjoern A. Zeeb#	Create netgraph nodes.
15430696600cSBjoern A. Zeeb#
15440696600cSBjoern A. Zeebng_mkpeer()
15450696600cSBjoern A. Zeeb{
15460696600cSBjoern A. Zeeb	ngctl -f - 2> /dev/null <<EOF
15470696600cSBjoern A. Zeebmkpeer $*
15480696600cSBjoern A. Zeebmsg dummy nodeinfo
15490696600cSBjoern A. ZeebEOF
15500696600cSBjoern A. Zeeb}
15510696600cSBjoern A. Zeeb
15520696600cSBjoern A. Zeeb# ng_create_one
15530696600cSBjoern A. Zeeb#	Create netgraph nodes.
15540696600cSBjoern A. Zeeb#
15550696600cSBjoern A. Zeebng_create_one()
15560696600cSBjoern A. Zeeb{
15570696600cSBjoern A. Zeeb	local t
15580696600cSBjoern A. Zeeb
15590696600cSBjoern A. Zeeb	ng_mkpeer $* | while read line; do
15600696600cSBjoern A. Zeeb		t=`expr "${line}" : '.* name="\([a-z]*[0-9]*\)" .*'`
15610696600cSBjoern A. Zeeb		if [ -n "${t}" ]; then
15620696600cSBjoern A. Zeeb			echo ${t}
15630696600cSBjoern A. Zeeb			return
15640696600cSBjoern A. Zeeb		fi
15650696600cSBjoern A. Zeeb	done
15660696600cSBjoern A. Zeeb}
15670696600cSBjoern A. Zeeb
15680696600cSBjoern A. Zeeb# ifnet_rename [ifname]
15690696600cSBjoern A. Zeeb#	Rename interfaces if ifconfig_IF_name is defined.
15700696600cSBjoern A. Zeeb#
15710696600cSBjoern A. Zeebifnet_rename()
15720696600cSBjoern A. Zeeb{
15730696600cSBjoern A. Zeeb	local _if _ifname
15740696600cSBjoern A. Zeeb
15750696600cSBjoern A. Zeeb	# ifconfig_IF_name
15760696600cSBjoern A. Zeeb	for _if in ${*:-$(${IFCONFIG_CMD} -l)}; do
15770696600cSBjoern A. Zeeb		_ifname=`get_if_var $_if ifconfig_IF_name`
15780696600cSBjoern A. Zeeb		if [ ! -z "$_ifname" ]; then
15790696600cSBjoern A. Zeeb			${IFCONFIG_CMD} $_if name $_ifname
15800696600cSBjoern A. Zeeb		fi
15810696600cSBjoern A. Zeeb	done
15820696600cSBjoern A. Zeeb
15830696600cSBjoern A. Zeeb	return 0
15840696600cSBjoern A. Zeeb}
15850696600cSBjoern A. Zeeb
15860696600cSBjoern A. Zeeb# list_net_interfaces type
15870696600cSBjoern A. Zeeb#	List all network interfaces. The type of interface returned
15880696600cSBjoern A. Zeeb#	can be controlled by the type argument. The type
15890696600cSBjoern A. Zeeb#	argument can be any of the following:
15900696600cSBjoern A. Zeeb#		nodhcp	- all interfaces, excluding DHCP configured interfaces
15910696600cSBjoern A. Zeeb#		dhcp	- list only DHCP configured interfaces
15920696600cSBjoern A. Zeeb#		noautoconf	- all interfaces, excluding IPv6 Stateless
15930696600cSBjoern A. Zeeb#				  Address Autoconf configured interfaces
15940696600cSBjoern A. Zeeb#		autoconf	- list only IPv6 Stateless Address Autoconf
15950696600cSBjoern A. Zeeb#				  configured interfaces
15960696600cSBjoern A. Zeeb#	If no argument is specified all network interfaces are output.
15970696600cSBjoern A. Zeeb#	Note that the list will include cloned interfaces if applicable.
15980696600cSBjoern A. Zeeb#	Cloned interfaces must already exist to have a chance to appear
15990696600cSBjoern A. Zeeb#	in the list if ${network_interfaces} is set to `auto'.
16000696600cSBjoern A. Zeeb#
16010696600cSBjoern A. Zeeblist_net_interfaces()
16020696600cSBjoern A. Zeeb{
16030696600cSBjoern A. Zeeb	local type _tmplist _list _autolist _lo _if
16040696600cSBjoern A. Zeeb	type=$1
16050696600cSBjoern A. Zeeb
16060696600cSBjoern A. Zeeb	# Get a list of ALL the interfaces and make lo0 first if it's there.
16070696600cSBjoern A. Zeeb	#
16080696600cSBjoern A. Zeeb	_tmplist=
16090696600cSBjoern A. Zeeb	case ${network_interfaces} in
16100696600cSBjoern A. Zeeb	[Aa][Uu][Tt][Oo])
16110696600cSBjoern A. Zeeb		_autolist="`${IFCONFIG_CMD} -l`"
16120696600cSBjoern A. Zeeb		_lo=
16130696600cSBjoern A. Zeeb		for _if in ${_autolist} ; do
16140696600cSBjoern A. Zeeb			if autoif $_if; then
16150696600cSBjoern A. Zeeb				if [ "$_if" = "lo0" ]; then
16160696600cSBjoern A. Zeeb					_lo="lo0 "
16170696600cSBjoern A. Zeeb				else
16180696600cSBjoern A. Zeeb					_tmplist="${_tmplist} ${_if}"
16190696600cSBjoern A. Zeeb				fi
16200696600cSBjoern A. Zeeb			fi
16210696600cSBjoern A. Zeeb		done
16220696600cSBjoern A. Zeeb		_tmplist="${_lo}${_tmplist# }"
16230696600cSBjoern A. Zeeb	;;
16240696600cSBjoern A. Zeeb	*)
16250696600cSBjoern A. Zeeb		for _if in ${network_interfaces} ${cloned_interfaces}; do
16260696600cSBjoern A. Zeeb			# epair(4) uses epair[0-9] for creation and
16270696600cSBjoern A. Zeeb			# epair[0-9][ab] for configuration.
16280696600cSBjoern A. Zeeb			case $_if in
16290696600cSBjoern A. Zeeb			epair[0-9]*)
16300696600cSBjoern A. Zeeb				_tmplist="$_tmplist ${_if}a ${_if}b"
16310696600cSBjoern A. Zeeb			;;
16320696600cSBjoern A. Zeeb			*)
16330696600cSBjoern A. Zeeb				_tmplist="$_tmplist $_if"
16340696600cSBjoern A. Zeeb			;;
16350696600cSBjoern A. Zeeb			esac
16360696600cSBjoern A. Zeeb		done
16370696600cSBjoern A. Zeeb		#
16380696600cSBjoern A. Zeeb		# lo0 is effectively mandatory, so help prevent foot-shooting
16390696600cSBjoern A. Zeeb		#
16400696600cSBjoern A. Zeeb		case "$_tmplist" in
16410696600cSBjoern A. Zeeb		lo0|'lo0 '*|*' lo0'|*' lo0 '*)
16420696600cSBjoern A. Zeeb			# This is fine, do nothing
16430696600cSBjoern A. Zeeb			_tmplist="${_tmplist# }"
16440696600cSBjoern A. Zeeb		;;
16450696600cSBjoern A. Zeeb		*)
16460696600cSBjoern A. Zeeb			_tmplist="lo0 ${_tmplist# }"
16470696600cSBjoern A. Zeeb		;;
16480696600cSBjoern A. Zeeb		esac
16490696600cSBjoern A. Zeeb	;;
16500696600cSBjoern A. Zeeb	esac
16510696600cSBjoern A. Zeeb
16520696600cSBjoern A. Zeeb	_list=
16530696600cSBjoern A. Zeeb	case "$type" in
16540696600cSBjoern A. Zeeb	nodhcp)
16550696600cSBjoern A. Zeeb		for _if in ${_tmplist} ; do
16560696600cSBjoern A. Zeeb			if ! dhcpif $_if && \
16570696600cSBjoern A. Zeeb			   [ -n "`_ifconfig_getargs $_if`" ]; then
16580696600cSBjoern A. Zeeb				_list="${_list# } ${_if}"
16590696600cSBjoern A. Zeeb			fi
16600696600cSBjoern A. Zeeb		done
16610696600cSBjoern A. Zeeb	;;
16620696600cSBjoern A. Zeeb	dhcp)
16630696600cSBjoern A. Zeeb		for _if in ${_tmplist} ; do
16640696600cSBjoern A. Zeeb			if dhcpif $_if; then
16650696600cSBjoern A. Zeeb				_list="${_list# } ${_if}"
16660696600cSBjoern A. Zeeb			fi
16670696600cSBjoern A. Zeeb		done
16680696600cSBjoern A. Zeeb	;;
16690696600cSBjoern A. Zeeb	noautoconf)
16700696600cSBjoern A. Zeeb		for _if in ${_tmplist} ; do
16710696600cSBjoern A. Zeeb			if ! ipv6_autoconfif $_if && \
16720696600cSBjoern A. Zeeb			   [ -n "`_ifconfig_getargs $_if ipv6`" ]; then
16730696600cSBjoern A. Zeeb				_list="${_list# } ${_if}"
16740696600cSBjoern A. Zeeb			fi
16750696600cSBjoern A. Zeeb		done
16760696600cSBjoern A. Zeeb	;;
16770696600cSBjoern A. Zeeb	autoconf)
16780696600cSBjoern A. Zeeb		for _if in ${_tmplist} ; do
16790696600cSBjoern A. Zeeb			if ipv6_autoconfif $_if; then
16800696600cSBjoern A. Zeeb				_list="${_list# } ${_if}"
16810696600cSBjoern A. Zeeb			fi
16820696600cSBjoern A. Zeeb		done
16830696600cSBjoern A. Zeeb	;;
16840696600cSBjoern A. Zeeb	*)
16850696600cSBjoern A. Zeeb		_list=${_tmplist}
16860696600cSBjoern A. Zeeb	;;
16870696600cSBjoern A. Zeeb	esac
16880696600cSBjoern A. Zeeb
16890696600cSBjoern A. Zeeb	echo $_list
16900696600cSBjoern A. Zeeb
16910696600cSBjoern A. Zeeb	return 0
16920696600cSBjoern A. Zeeb}
16930696600cSBjoern A. Zeeb
16940696600cSBjoern A. Zeeb# get_default_if -address_family
16950696600cSBjoern A. Zeeb#	Get the interface of the default route for the given address family.
16960696600cSBjoern A. Zeeb#	The -address_family argument must be suitable passing to route(8).
16970696600cSBjoern A. Zeeb#
16980696600cSBjoern A. Zeebget_default_if()
16990696600cSBjoern A. Zeeb{
17000696600cSBjoern A. Zeeb	local routeget oldifs defif line
17010696600cSBjoern A. Zeeb	defif=
17020696600cSBjoern A. Zeeb	oldifs="$IFS"
17030696600cSBjoern A. Zeeb	IFS="
17040696600cSBjoern A. Zeeb"
17050696600cSBjoern A. Zeeb	for line in `route -n get $1 default 2>/dev/null`; do
17060696600cSBjoern A. Zeeb		case $line in
17070696600cSBjoern A. Zeeb		*interface:*)
17080696600cSBjoern A. Zeeb			defif=${line##*: }
17090696600cSBjoern A. Zeeb			;;
17100696600cSBjoern A. Zeeb		esac
17110696600cSBjoern A. Zeeb	done
17120696600cSBjoern A. Zeeb	IFS=${oldifs}
17130696600cSBjoern A. Zeeb
17140696600cSBjoern A. Zeeb	echo $defif
17150696600cSBjoern A. Zeeb}
17160696600cSBjoern A. Zeeb
17170696600cSBjoern A. Zeeb# hexdigit arg
17180696600cSBjoern A. Zeeb#	Echo decimal number $arg (single digit) in hexadecimal format.
17190696600cSBjoern A. Zeebhexdigit()
17200696600cSBjoern A. Zeeb{
17210696600cSBjoern A. Zeeb	printf '%x\n' "$1"
17220696600cSBjoern A. Zeeb}
17230696600cSBjoern A. Zeeb
17240696600cSBjoern A. Zeeb# hexprint arg
17250696600cSBjoern A. Zeeb#	Echo decimal number $arg (multiple digits) in hexadecimal format.
17260696600cSBjoern A. Zeebhexprint()
17270696600cSBjoern A. Zeeb{
17280696600cSBjoern A. Zeeb	printf '%x\n' "$1"
17290696600cSBjoern A. Zeeb}
17300696600cSBjoern A. Zeeb
17310696600cSBjoern A. Zeebis_wired_interface()
17320696600cSBjoern A. Zeeb{
17330696600cSBjoern A. Zeeb	local media
17340696600cSBjoern A. Zeeb
17350696600cSBjoern A. Zeeb	case `${IFCONFIG_CMD} $1 2>/dev/null` in
17360696600cSBjoern A. Zeeb	*media:?Ethernet*) media=Ethernet ;;
17370696600cSBjoern A. Zeeb	esac
17380696600cSBjoern A. Zeeb
17390696600cSBjoern A. Zeeb	test "$media" = "Ethernet"
17400696600cSBjoern A. Zeeb}
17410696600cSBjoern A. Zeeb
17420696600cSBjoern A. Zeeb# network6_getladdr if [flag]
17430696600cSBjoern A. Zeeb#	Echo link-local address from $if if any.
17440696600cSBjoern A. Zeeb#	If flag is defined, tentative ones will be excluded.
17450696600cSBjoern A. Zeebnetwork6_getladdr()
17460696600cSBjoern A. Zeeb{
17470696600cSBjoern A. Zeeb	local _if _flag proto addr rest
17480696600cSBjoern A. Zeeb	_if=$1
17490696600cSBjoern A. Zeeb	_flag=$2
17500696600cSBjoern A. Zeeb
1751e448ff6fSBjoern A. Zeeb	${IFCONFIG_CMD} $_if inet6 2>/dev/null | while read proto addr rest; do
17520696600cSBjoern A. Zeeb		case "${proto}/${addr}/${_flag}/${rest}" in
17530696600cSBjoern A. Zeeb		inet6/fe80::*//*)
17540696600cSBjoern A. Zeeb			echo ${addr}
17550696600cSBjoern A. Zeeb		;;
17560696600cSBjoern A. Zeeb		inet6/fe80:://*tentative*)	# w/o flag
17570696600cSBjoern A. Zeeb			sleep `${SYSCTL_N} net.inet6.ip6.dad_count`
17580696600cSBjoern A. Zeeb			network6_getladdr $_if $_flags
17590696600cSBjoern A. Zeeb		;;
17600696600cSBjoern A. Zeeb		inet6/fe80::/*/*tentative*)	# w/ flag
17610696600cSBjoern A. Zeeb			echo ${addr}
17620696600cSBjoern A. Zeeb		;;
17630696600cSBjoern A. Zeeb		*)
17640696600cSBjoern A. Zeeb			continue
17650696600cSBjoern A. Zeeb		;;
17660696600cSBjoern A. Zeeb		esac
17670696600cSBjoern A. Zeeb
17680696600cSBjoern A. Zeeb		return
17690696600cSBjoern A. Zeeb	done
17700696600cSBjoern A. Zeeb}
1771