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