network.subr revision 157706
125184Sjkh# 2113674Smtm# Copyright (c) 2003 The FreeBSD Project. All rights reserved. 3113674Smtm# 4113674Smtm# Redistribution and use in source and binary forms, with or without 5113674Smtm# modification, are permitted provided that the following conditions 6113674Smtm# are met: 7113674Smtm# 1. Redistributions of source code must retain the above copyright 8113674Smtm# notice, this list of conditions and the following disclaimer. 9113674Smtm# 2. Redistributions in binary form must reproduce the above copyright 10113674Smtm# notice, this list of conditions and the following disclaimer in the 11113674Smtm# documentation and/or other materials provided with the distribution. 12113674Smtm# 13113674Smtm# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 14113674Smtm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15113674Smtm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16113674Smtm# ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 17113674Smtm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18113674Smtm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19113674Smtm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20113674Smtm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21113674Smtm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22113674Smtm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23113674Smtm# SUCH DAMAGE. 24113674Smtm# 2550472Speter# $FreeBSD: head/etc/network.subr 157706 2006-04-13 06:50:46Z brooks $ 2666830Sobrien# 2725184Sjkh 28113674Smtm# 29113674Smtm# Subroutines commonly used from network startup scripts. 30113674Smtm# Requires that rc.conf be loaded first. 31113674Smtm# 3225184Sjkh 33113674Smtm# ifconfig_up if 34113674Smtm# Evaluate ifconfig(8) arguments for interface $if and 35113674Smtm# run ifconfig(8) with those arguments. It returns 0 if 36113674Smtm# arguments were found and executed or 1 if the interface 37147088Sbrooks# had no arguments. Pseudo arguments DHCP and WPA are handled 38147088Sbrooks# here. 39113674Smtm# 40113674Smtmifconfig_up() 41113674Smtm{ 42147088Sbrooks _cfg=1 43147088Sbrooks 44147088Sbrooks ifconfig_args=`ifconfig_getargs $1` 45113674Smtm if [ -n "${ifconfig_args}" ]; then 46149726Sbrooks ifconfig $1 up 47157706Sbrooks ifconfig $1 ${ifconfig_args} 48147088Sbrooks _cfg=0 49113674Smtm fi 50147088Sbrooks 51147088Sbrooks if wpaif $1; then 52149726Sbrooks if [ $_cfg -ne 0 ] ; then 53149726Sbrooks ifconfig $1 up 54149726Sbrooks fi 55147682Sbrooks /etc/rc.d/wpa_supplicant start $1 56147088Sbrooks _cfg=0 # XXX: not sure this should count 57147088Sbrooks fi 58147088Sbrooks 59147088Sbrooks if dhcpif $1; then 60149726Sbrooks if [ $_cfg -ne 0 ] ; then 61149726Sbrooks ifconfig $1 up 62149726Sbrooks fi 63157706Sbrooks if syncdhcpif $1; then 64157706Sbrooks /etc/rc.d/dhclient start $1 65157706Sbrooks fi 66147088Sbrooks _cfg=0 67147088Sbrooks fi 68147088Sbrooks 69147121Sbrooks return $_cfg 70113674Smtm} 7125184Sjkh 72116029Smtm# ifconfig_down if 73116029Smtm# Remove all inet entries from the $if interface. It returns 74116029Smtm# 0 if inet entries were found and removed. It returns 1 if 75116100Smtm# no entries were found or they could not be removed. 76116029Smtm# 77157706Sbrooks# XXX: should not be only inet 78157706Sbrooks# 79116029Smtmifconfig_down() 80116029Smtm{ 81116029Smtm [ -z "$1" ] && return 1 82116029Smtm _ifs="^" 83147121Sbrooks _cfg=1 84116029Smtm 85116029Smtm inetList="`ifconfig $1 | grep 'inet ' | tr "\n" "$_ifs"`" 86116029Smtm 87116029Smtm oldifs="$IFS" 88116029Smtm IFS="$_ifs" 89116029Smtm for _inet in $inetList ; do 90116029Smtm # get rid of extraneous line 91116029Smtm [ -z "$_inet" ] && break 92116029Smtm 93116029Smtm _inet=`expr "$_inet" : '.*\(inet \([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*'` 94116029Smtm 95116032Smtm IFS="$oldifs" 96116032Smtm ifconfig $1 ${_inet} delete 97116032Smtm IFS="$_ifs" 98147121Sbrooks _cfg=0 99116029Smtm done 100116029Smtm IFS="$oldifs" 101116029Smtm 102147088Sbrooks if wpaif $1; then 103147682Sbrooks /etc/rc.d/wpa_supplicant stop $1 104147121Sbrooks _cfg=0 105147088Sbrooks fi 106147088Sbrooks 107147088Sbrooks if dhcpif $1; then 108147088Sbrooks /etc/rc.d/dhclient stop $1 109147088Sbrooks _cfg=0 110147088Sbrooks fi 111147088Sbrooks 112157706Sbrooks ifconfig $1 down 113157706Sbrooks 114147121Sbrooks return $_cfg 115116029Smtm} 116116029Smtm 117157706Sbrooks# get_if_var if var [default] 118157706Sbrooks# Return the value of the pseudo-hash corresponding to $if where 119157706Sbrooks# $var is a string containg the sub-string "IF" which will be 120157706Sbrooks# replaced with $if after the characters defined in _punct are 121157706Sbrooks# replaced with '_'. If the variable is unset, replace it with 122157706Sbrooks# $default if given. 123157706Sbrooksget_if_var() 124157706Sbrooks{ 125157706Sbrooks if [ $# -ne 2 -a $# -ne 3 ]; then 126157706Sbrooks err 3 'USAGE: get_if_var name var [default]' 127157706Sbrooks fi 128157706Sbrooks 129157706Sbrooks _if=$1 130157706Sbrooks _punct=". - / +" 131157706Sbrooks for _punct_c in $punct; do 132157706Sbrooks _if=`ltr ${_if} ${_punct_c} '_'` 133157706Sbrooks done 134157706Sbrooks _var=$2 135157706Sbrooks _default=$3 136157706Sbrooks 137157706Sbrooks prefix=${_var%%IF*} 138157706Sbrooks suffix=${_var##*IF} 139157706Sbrooks eval echo \${${prefix}${_if}${suffix}-${_default}} 140157706Sbrooks} 141157706Sbrooks 142147088Sbrooks# _ifconfig_getargs if 143147088Sbrooks# Echos the arguments for the supplied interface to stdout. 144147088Sbrooks# returns 1 if empty. In general, ifconfig_getargs should be used 145147088Sbrooks# outside this file. 146147088Sbrooks_ifconfig_getargs() 147147088Sbrooks{ 148147088Sbrooks _ifn=$1 149147088Sbrooks if [ -z "$_ifn" ]; then 150147088Sbrooks return 1 151147088Sbrooks fi 152147088Sbrooks 153157706Sbrooks get_if_var $_ifn ifconfig_IF "$ifconfig_DEFAULT" 154147088Sbrooks} 155147088Sbrooks 156147088Sbrooks# ifconfig_getargs if 157147088Sbrooks# Takes the result from _ifconfig_getargs and removes pseudo 158147088Sbrooks# args such as DHCP and WPA. 159147088Sbrooksifconfig_getargs() 160147088Sbrooks{ 161147088Sbrooks _tmpargs=`_ifconfig_getargs $1` 162147088Sbrooks if [ $? -eq 1 ]; then 163147088Sbrooks return 1 164147088Sbrooks fi 165147088Sbrooks _args= 166147088Sbrooks 167147088Sbrooks for _arg in $_tmpargs; do 168147088Sbrooks case $_arg in 169157706Sbrooks [Dd][Hh][Cc][Pp]) ;; 170157706Sbrooks [Nn][Oo][Aa][Uu][Tt][Oo]) ;; 171157706Sbrooks [Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]) ;; 172157706Sbrooks [Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]) ;; 173157706Sbrooks [Ww][Pp][Aa]) ;; 174147088Sbrooks *) 175147088Sbrooks _args="$_args $_arg" 176147088Sbrooks ;; 177147088Sbrooks esac 178147088Sbrooks done 179147088Sbrooks 180147088Sbrooks echo $_args 181147088Sbrooks} 182147088Sbrooks 183149401Sbrooks# autoif 184149401Sbrooks# Returns 0 if the interface should be automaticly configured at 185149401Sbrooks# boot time and 1 otherwise. 186149401Sbrooksautoif() 187149401Sbrooks{ 188149401Sbrooks _tmpargs=`_ifconfig_getargs $1` 189149401Sbrooks for _arg in $_tmpargs; do 190149401Sbrooks case $_arg in 191149401Sbrooks [Nn][Oo][Aa][Uu][Tt][Oo]) 192149401Sbrooks return 1 193149401Sbrooks ;; 194149401Sbrooks esac 195149401Sbrooks done 196149401Sbrooks return 0 197149401Sbrooks} 198149401Sbrooks 199147088Sbrooks# dhcpif if 200147088Sbrooks# Returns 0 if the interface is a DHCP interface and 1 otherwise. 201147088Sbrooksdhcpif() 202147088Sbrooks{ 203147088Sbrooks _tmpargs=`_ifconfig_getargs $1` 204147088Sbrooks for _arg in $_tmpargs; do 205147088Sbrooks case $_arg in 206147088Sbrooks [Dd][Hh][Cc][Pp]) 207147088Sbrooks return 0 208147088Sbrooks ;; 209157706Sbrooks [Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]) 210157706Sbrooks return 0 211157706Sbrooks ;; 212157706Sbrooks [Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]) 213157706Sbrooks return 0 214157706Sbrooks ;; 215147088Sbrooks esac 216147088Sbrooks done 217147088Sbrooks return 1 218147088Sbrooks} 219147088Sbrooks 220157706Sbrooks# syncdhcpif 221157706Sbrooks# Returns 0 if the interface should be configured synchronously and 222157706Sbrooks# 1 otherwise. 223157706Sbrookssyncdhcpif() 224157706Sbrooks{ 225157706Sbrooks _tmpargs=`_ifconfig_getargs $1` 226157706Sbrooks for _arg in $_tmpargs; do 227157706Sbrooks case $_arg in 228157706Sbrooks [Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]) 229157706Sbrooks return 1 230157706Sbrooks ;; 231157706Sbrooks [Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]) 232157706Sbrooks return 0 233157706Sbrooks ;; 234157706Sbrooks esac 235157706Sbrooks done 236157706Sbrooks if checkyesno syncronous_dhclient; then 237157706Sbrooks return 0 238157706Sbrooks else 239157706Sbrooks return 1 240157706Sbrooks fi 241157706Sbrooks} 242157706Sbrooks 243147088Sbrooks# wpaif if 244147088Sbrooks# Returns 0 if the interface is a WPA interface and 1 otherwise. 245147088Sbrookswpaif() 246147088Sbrooks{ 247147088Sbrooks _tmpargs=`_ifconfig_getargs $1` 248147088Sbrooks for _arg in $_tmpargs; do 249147088Sbrooks case $_arg in 250147088Sbrooks [Ww][Pp][Aa]) 251147088Sbrooks return 0 252147088Sbrooks ;; 253147088Sbrooks esac 254147088Sbrooks done 255147088Sbrooks return 1 256147088Sbrooks} 257147088Sbrooks 258152441Sbrooks# ipv4_up if 259152441Sbrooks# add IPv4 addresses to the interface $if 260152441Sbrooksipv4_up() 261152441Sbrooks{ 262152441Sbrooks _if=$1 263152441Sbrooks ifalias_up ${_if} 264152441Sbrooks ipv4_addrs_common ${_if} alias 265152441Sbrooks} 266152441Sbrooks 267152441Sbrooks# ipv4_down if 268152441Sbrooks# remove IPv4 addresses from the interface $if 269152441Sbrooksipv4_down() 270152441Sbrooks{ 271152441Sbrooks _if=$1 272152441Sbrooks ifalias_down ${_if} 273152441Sbrooks ipv4_addrs_common ${_if} -alias 274152441Sbrooks} 275152441Sbrooks 276152441Sbrooks# ipv4_addrs_common if action 277152441Sbrooks# Evaluate the ifconfig_if_ipv4 arguments for interface $if 278152441Sbrooks# and use $action to add or remove IPv4 addresses from $if. 279152441Sbrooksipv4_addrs_common() 280152441Sbrooks{ 281152441Sbrooks _ret=1 282152441Sbrooks _if=$1 283152441Sbrooks _action=$2 284152441Sbrooks 285152441Sbrooks # get ipv4-addresses 286157706Sbrooks cidr_addr=`get_if_var $_if ipv4_addrs_IF` 287152441Sbrooks 288152441Sbrooks for _cidr in ${cidr_addr}; do 289152441Sbrooks _ipaddr=${_cidr%%/*} 290152441Sbrooks _netmask="/"${_cidr##*/} 291152441Sbrooks _range=${_ipaddr##*.} 292152441Sbrooks _ipnet=${_ipaddr%.*} 293152441Sbrooks _iplow=${_range%-*} 294152441Sbrooks _iphigh=${_range#*-} 295152441Sbrooks 296152441Sbrooks # clear netmask when removing aliases 297152441Sbrooks if [ "${_action}" = "-alias" ]; then 298152441Sbrooks _netmask="" 299152441Sbrooks fi 300152441Sbrooks 301152441Sbrooks _ipcount=${_iplow} 302152441Sbrooks while [ "${_ipcount}" -le "${_iphigh}" ]; do 303152441Sbrooks eval "ifconfig ${_if} ${_action} ${_ipnet}.${_ipcount}${_netmask}" 304152441Sbrooks _ipcount=$((${_ipcount}+1)) 305152441Sbrooks _ret=0 306152441Sbrooks 307152441Sbrooks # only the first ipaddr in a subnet need the real netmask 308152441Sbrooks if [ "${_action}" != "-alias" ]; then 309152441Sbrooks _netmask="/32" 310152441Sbrooks fi 311152441Sbrooks done 312152441Sbrooks done 313152441Sbrooks return $_ret 314152441Sbrooks} 315152441Sbrooks 316113674Smtm# ifalias_up if 317113674Smtm# Configure aliases for network interface $if. 318113674Smtm# It returns 0 if at least one alias was configured or 319113674Smtm# 1 if there were none. 320113674Smtm# 321113674Smtmifalias_up() 322113674Smtm{ 323113674Smtm _ret=1 324113674Smtm alias=0 325113674Smtm while : ; do 326157706Sbrooks ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}` 327113674Smtm if [ -n "${ifconfig_args}" ]; then 328113674Smtm ifconfig $1 ${ifconfig_args} alias 329113674Smtm alias=$((${alias} + 1)) 330113674Smtm _ret=0 331113674Smtm else 332113674Smtm break 333113674Smtm fi 334113674Smtm done 335113674Smtm return $_ret 336113674Smtm} 337100280Sgordon 338116029Smtm#ifalias_down if 339116029Smtm# Remove aliases for network interface $if. 340116029Smtm# It returns 0 if at least one alias was removed or 341116029Smtm# 1 if there were none. 342116029Smtm# 343116029Smtmifalias_down() 344116029Smtm{ 345116029Smtm _ret=1 346116029Smtm alias=0 347116029Smtm while : ; do 348157706Sbrooks ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}` 349116029Smtm if [ -n "${ifconfig_args}" ]; then 350116029Smtm ifconfig $1 ${ifconfig_args} -alias 351116029Smtm alias=$((${alias} + 1)) 352116029Smtm _ret=0 353116029Smtm else 354116029Smtm break 355116029Smtm fi 356116029Smtm done 357116029Smtm return $_ret 358116029Smtm} 359116029Smtm 360113674Smtm# ifscript_up if 361113674Smtm# Evaluate a startup script for the $if interface. 362113674Smtm# It returns 0 if a script was found and processed or 363113674Smtm# 1 if no script was found. 364113674Smtm# 365113674Smtmifscript_up() 366100280Sgordon{ 367113674Smtm if [ -r /etc/start_if.$1 ]; then 368113674Smtm . /etc/start_if.$1 369113674Smtm return 0 370113674Smtm fi 371113674Smtm return 1 372100280Sgordon} 373100280Sgordon 374116029Smtm# ifscript_down if 375116029Smtm# Evaluate a shutdown script for the $if interface. 376116029Smtm# It returns 0 if a script was found and processed or 377116029Smtm# 1 if no script was found. 378116029Smtm# 379116029Smtmifscript_down() 380116029Smtm{ 381116029Smtm if [ -r /etc/stop_if.$1 ]; then 382116029Smtm . /etc/stop_if.$1 383116029Smtm return 0 384116029Smtm fi 385116029Smtm return 1 386116029Smtm} 387116029Smtm 388113674Smtm# Create cloneable interfaces. 389113674Smtm# 390113674Smtmclone_up() 391100280Sgordon{ 392113674Smtm _prefix= 393113674Smtm _list= 394113674Smtm for ifn in ${cloned_interfaces}; do 395113674Smtm ifconfig ${ifn} create 396116774Skuriyama if [ $? -eq 0 ]; then 397113674Smtm _list="${_list}${_prefix}${ifn}" 398113674Smtm [ -z "$_prefix" ] && _prefix=' ' 399113674Smtm fi 400113674Smtm done 401113674Smtm debug "Cloned: ${_list}" 402113674Smtm} 403100280Sgordon 404113674Smtm# Destroy cloned interfaces. Destroyed interfaces are echoed 405113674Smtm# to standard output. 406113674Smtm# 407113674Smtmclone_down() 408113674Smtm{ 409113674Smtm _prefix= 410113674Smtm _list= 411113674Smtm for ifn in ${cloned_interfaces}; do 412113674Smtm ifconfig ${ifn} destroy 413116774Skuriyama if [ $? -eq 0 ]; then 414113674Smtm _list="${_list}${_prefix}${ifn}" 415113674Smtm [ -z "$_prefix" ] && _prefix=' ' 416113674Smtm fi 417113674Smtm done 418113674Smtm debug "Destroyed clones: ${_list}" 419100280Sgordon} 420100280Sgordon 421113674Smtmgif_up() { 422100282Sdougb case ${gif_interfaces} in 423100282Sdougb [Nn][Oo] | '') 424100282Sdougb ;; 425100282Sdougb *) 426100282Sdougb for i in ${gif_interfaces}; do 427157706Sbrooks peers=`get_if_var $i gifconfig_IF` 428100282Sdougb case ${peers} in 429100282Sdougb '') 430100282Sdougb continue 431100282Sdougb ;; 432100282Sdougb *) 433100282Sdougb ifconfig $i create >/dev/null 2>&1 434100282Sdougb ifconfig $i tunnel ${peers} 435103710Sume ifconfig $i up 436100282Sdougb ;; 437100282Sdougb esac 438100282Sdougb done 439100282Sdougb ;; 440100282Sdougb esac 441100282Sdougb} 442100282Sdougb 443113674Smtm# 444113674Smtm# ipx_up ifn 445113674Smtm# Configure any IPX addresses for interface $ifn. Returns 0 if IPX 446113674Smtm# arguments were found and configured; returns 1 otherwise. 447113674Smtm# 448113674Smtmipx_up() 449100280Sgordon{ 450113674Smtm ifn="$1" 451157706Sbrooks ifconfig_args=`get_if_var $ifn ifconfig_IF_ipx` 452113674Smtm if [ -n "${ifconfig_args}" ]; then 453113674Smtm ifconfig ${ifn} ${ifconfig_args} 454113674Smtm return 0 45585831Sdes fi 456113674Smtm return 1 457113674Smtm} 45885831Sdes 459116029Smtm# ipx_down ifn 460116029Smtm# Remove IPX addresses for interface $ifn. Returns 0 if IPX 461116029Smtm# addresses were found and unconfigured. It returns 1, otherwise. 462113674Smtm# 463116029Smtmipx_down() 464116029Smtm{ 465116100Smtm [ -z "$1" ] && return 1 466116100Smtm _ifs="^" 467116100Smtm _ret=1 468116100Smtm 469116100Smtm ipxList="`ifconfig $1 | grep 'ipx ' | tr "\n" "$_ifs"`" 470116100Smtm 471116100Smtm oldifs="$IFS" 472116100Smtm IFS="$_ifs" 473116100Smtm for _ipx in $ipxList ; do 474116100Smtm # get rid of extraneous line 475116100Smtm [ -z "$_ipx" ] && break 476116100Smtm 477116100Smtm _ipx=`expr "$_ipx" : '.*\(ipx [0-9a-h]\{1,8\}H*\.[0-9a-h]\{1,12\}\).*'` 478116100Smtm 479116100Smtm IFS="$oldifs" 480116100Smtm ifconfig $1 ${_ipx} delete 481116100Smtm IFS="$_ifs" 482116100Smtm _ret=0 483116100Smtm done 484116100Smtm IFS="$oldifs" 485116100Smtm 486116100Smtm return $_ret 487116029Smtm} 488116029Smtm 489137070Spjd# ifnet_rename 490137070Spjd# Rename all requested interfaces. 491116029Smtm# 492137070Spjdifnet_rename() 493137070Spjd{ 494137070Spjd 495138386Srse _ifn_list="`ifconfig -l`" 496137070Spjd [ -z "$_ifn_list" ] && return 0 497137070Spjd for _if in ${_ifn_list} ; do 498157706Sbrooks _ifname=`get_if_var $_if ifconfig_IF_name` 499137070Spjd if [ ! -z "$_ifname" ]; then 500137070Spjd ifconfig $_if name $_ifname 501137070Spjd fi 502137070Spjd done 503137070Spjd return 0 504137070Spjd} 505137070Spjd 506137070Spjd# 507113674Smtm# list_net_interfaces type 508113674Smtm# List all network interfaces. The type of interface returned 509113674Smtm# can be controlled by the type argument. The type 510113674Smtm# argument can be any of the following: 511113674Smtm# nodhcp - all interfaces, excluding DHCP configured interfaces 512113674Smtm# dhcp - list only DHCP configured interfaces 513113674Smtm# If no argument is specified all network interfaces are output. 514134429Syar# Note that the list will include cloned interfaces if applicable. 515134429Syar# Cloned interfaces must already exist to have a chance to appear 516134429Syar# in the list if ${network_interfaces} is set to `auto'. 517113674Smtm# 518113674Smtmlist_net_interfaces() 519113674Smtm{ 520113674Smtm type=$1 52165532Snectar 522149726Sbrooks # Get a list of ALL the interfaces and make lo0 first if it's there. 52351231Ssheldonh # 52451231Ssheldonh case ${network_interfaces} in 52551231Ssheldonh [Aa][Uu][Tt][Oo]) 526149401Sbrooks _prefix='' 527149401Sbrooks _autolist="`ifconfig -l`" 528149726Sbrooks _lo= 529149401Sbrooks for _if in ${_autolist} ; do 530149401Sbrooks if autoif $_if; then 531149726Sbrooks if [ "$_if" = "lo0" ]; then 532149726Sbrooks _lo="lo0 " 533149726Sbrooks else 534149726Sbrooks _tmplist="${_tmplist}${_prefix}${_if}" 535149726Sbrooks [ -z "$_prefix" ] && _prefix=' ' 536149726Sbrooks fi 537149401Sbrooks fi 538149401Sbrooks done 539149726Sbrooks _tmplist="${_lo}${_tmplist}" 54051231Ssheldonh ;; 54183677Sbrooks *) 542149401Sbrooks _tmplist="${network_interfaces} ${cloned_interfaces}" 54383677Sbrooks ;; 54451231Ssheldonh esac 54549122Sbrian 546113674Smtm if [ -z "$type" ]; then 547113674Smtm echo $_tmplist 548113674Smtm return 0 549113674Smtm fi 55049122Sbrian 551138385Srse # Separate out dhcp and non-dhcp interfaces 552113674Smtm # 553113674Smtm _aprefix= 554134376Syar _bprefix= 555113674Smtm for _if in ${_tmplist} ; do 556147684Sbrooks if dhcpif $_if; then 557113674Smtm _dhcplist="${_dhcplist}${_aprefix}${_if}" 558113674Smtm [ -z "$_aprefix" ] && _aprefix=' ' 559157706Sbrooks elif [ -n "`_ifconfig_getargs $_if`" ]; then 560113674Smtm _nodhcplist="${_nodhcplist}${_bprefix}${_if}" 561113674Smtm [ -z "$_bprefix" ] && _bprefix=' ' 562147684Sbrooks fi 56354458Sobrien done 56451231Ssheldonh 565113674Smtm case "$type" in 566113674Smtm nodhcp) 567113674Smtm echo $_nodhcplist 568113674Smtm ;; 569113674Smtm dhcp) 570113674Smtm echo $_dhcplist 571113674Smtm ;; 572113674Smtm esac 573130151Sschweikh return 0 57425184Sjkh} 575114942Sume 576114942Sumehexdigit() 577114942Sume{ 578114942Sume if [ $1 -lt 10 ]; then 579114942Sume echo $1 580114942Sume else 581114942Sume case $1 in 582114942Sume 10) echo a ;; 583114942Sume 11) echo b ;; 584114942Sume 12) echo c ;; 585114942Sume 13) echo d ;; 586114942Sume 14) echo e ;; 587114942Sume 15) echo f ;; 588114942Sume esac 589114942Sume fi 590114942Sume} 591114942Sume 592114942Sumehexprint() 593114942Sume{ 594114942Sume val=$1 595114942Sume str='' 596114942Sume 597114942Sume dig=`hexdigit $((${val} & 15))` 598114942Sume str=${dig}${str} 599114942Sume val=$((${val} >> 4)) 600114942Sume while [ ${val} -gt 0 ]; do 601114942Sume dig=`hexdigit $((${val} & 15))` 602114942Sume str=${dig}${str} 603114942Sume val=$((${val} >> 4)) 604114942Sume done 605114942Sume 606114942Sume echo ${str} 607114942Sume} 608114942Sume 609114942Sume# Setup the interfaces for IPv6 610114942Sumenetwork6_interface_setup() 611114942Sume{ 612114942Sume interfaces=$* 613114942Sume rtsol_interfaces='' 614114942Sume case ${ipv6_gateway_enable} in 615114942Sume [Yy][Ee][Ss]) 616114942Sume rtsol_available=no 617114942Sume ;; 618114942Sume *) 619114942Sume rtsol_available=yes 620114942Sume ;; 621114942Sume esac 622114942Sume for i in $interfaces; do 623114942Sume rtsol_interface=yes 624157706Sbrooks prefix=`get_if_var $i ipv6_prefix_IF` 625114942Sume if [ -n "${prefix}" ]; then 626114942Sume rtsol_available=no 627114942Sume rtsol_interface=no 628114942Sume laddr=`network6_getladdr $i` 629114942Sume hostid=`expr "${laddr}" : 'fe80::\(.*\)%\(.*\)'` 630114942Sume for j in ${prefix}; do 631114942Sume address=$j\:${hostid} 632114942Sume ifconfig $i inet6 ${address} prefixlen 64 alias 633114942Sume 634114942Sume case ${ipv6_gateway_enable} in 635114942Sume [Yy][Ee][Ss]) 636114942Sume # subnet-router anycast address 637114942Sume # (rfc2373) 638114942Sume ifconfig $i inet6 $j:: prefixlen 64 \ 639114942Sume alias anycast 640114942Sume ;; 641114942Sume esac 642114942Sume done 643114942Sume fi 644157706Sbrooks ipv6_ifconfig=`get_if_var $i ipv6_ifconfig_IF` 645114942Sume if [ -n "${ipv6_ifconfig}" ]; then 646114942Sume rtsol_available=no 647114942Sume rtsol_interface=no 648114942Sume ifconfig $i inet6 ${ipv6_ifconfig} alias 649114942Sume fi 650114942Sume 651114942Sume if [ ${rtsol_available} = yes -a ${rtsol_interface} = yes ] 652114942Sume then 653114942Sume case ${i} in 654114942Sume lo0|gif[0-9]*|stf[0-9]*|faith[0-9]*|lp[0-9]*|sl[0-9]*|tun[0-9]*) 655114942Sume ;; 656114942Sume *) 657114942Sume rtsol_interfaces="${rtsol_interfaces} ${i}" 658114942Sume ;; 659114942Sume esac 660114942Sume else 661114942Sume ifconfig $i inet6 662114942Sume fi 663114942Sume done 664114942Sume 665114942Sume if [ ${rtsol_available} = yes -a -n "${rtsol_interfaces}" ]; then 666114942Sume # Act as endhost - automatically configured. 667114942Sume # You can configure only single interface, as 668114942Sume # specification assumes that autoconfigured host has 669114942Sume # single interface only. 670114942Sume sysctl net.inet6.ip6.accept_rtadv=1 671114942Sume set ${rtsol_interfaces} 672114942Sume ifconfig $1 up 673118666Sume rtsol ${rtsol_flags} $1 674114942Sume fi 675114942Sume 676114942Sume for i in $interfaces; do 677114942Sume alias=0 678114942Sume while : ; do 679157706Sbrooks ipv6_ifconfig=`get_if_var $i ipv6_ifconfig_IF_alias${alias}` 680114942Sume if [ -z "${ipv6_ifconfig}" ]; then 681114942Sume break; 682114942Sume fi 683114942Sume ifconfig $i inet6 ${ipv6_ifconfig} alias 684114942Sume alias=$((${alias} + 1)) 685114942Sume done 686114942Sume done 687114942Sume} 688114942Sume 689114942Sume# Setup IPv6 to IPv4 mapping 690114942Sumenetwork6_stf_setup() 691114942Sume{ 692114942Sume case ${stf_interface_ipv4addr} in 693114942Sume [Nn][Oo] | '') 694114942Sume ;; 695114942Sume *) 696114942Sume # assign IPv6 addr and interface route for 6to4 interface 697114942Sume stf_prefixlen=$((16+${stf_interface_ipv4plen:-0})) 698114942Sume OIFS="$IFS" 699114942Sume IFS=".$IFS" 700114942Sume set ${stf_interface_ipv4addr} 701114942Sume IFS="$OIFS" 702114942Sume hexfrag1=`hexprint $(($1*256 + $2))` 703114942Sume hexfrag2=`hexprint $(($3*256 + $4))` 704114942Sume ipv4_in_hexformat="${hexfrag1}:${hexfrag2}" 705114942Sume case ${stf_interface_ipv6_ifid} in 706114942Sume [Aa][Uu][Tt][Oo] | '') 707114942Sume for i in ${ipv6_network_interfaces}; do 708114942Sume laddr=`network6_getladdr ${i}` 709114942Sume case ${laddr} in 710114942Sume '') 711114942Sume ;; 712114942Sume *) 713114942Sume break 714114942Sume ;; 715114942Sume esac 716114942Sume done 717114942Sume stf_interface_ipv6_ifid=`expr "${laddr}" : \ 718114942Sume 'fe80::\(.*\)%\(.*\)'` 719114942Sume case ${stf_interface_ipv6_ifid} in 720114942Sume '') 721114942Sume stf_interface_ipv6_ifid=0:0:0:1 722114942Sume ;; 723114942Sume esac 724114942Sume ;; 725114942Sume esac 726114942Sume ifconfig stf0 create >/dev/null 2>&1 727114942Sume ifconfig stf0 inet6 2002:${ipv4_in_hexformat}:${stf_interface_ipv6_slaid:-0}:${stf_interface_ipv6_ifid} \ 728114942Sume prefixlen ${stf_prefixlen} 729114942Sume # disallow packets to malicious 6to4 prefix 730114942Sume route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject 731114942Sume route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject 732114942Sume route add -inet6 2002:0000:: -prefixlen 24 ::1 -reject 733114942Sume route add -inet6 2002:ff00:: -prefixlen 24 ::1 -reject 734114942Sume ;; 735114942Sume esac 736114942Sume} 737114942Sume 738114942Sume# Setup static routes 739114942Sumenetwork6_static_routes_setup() 740114942Sume{ 741114942Sume # Set up any static routes. 742114942Sume case ${ipv6_defaultrouter} in 743114942Sume [Nn][Oo] | '') 744114942Sume ;; 745114942Sume *) 746114942Sume ipv6_static_routes="default ${ipv6_static_routes}" 747114942Sume ipv6_route_default="default ${ipv6_defaultrouter}" 748114942Sume ;; 749114942Sume esac 750114942Sume case ${ipv6_static_routes} in 751114942Sume [Nn][Oo] | '') 752114942Sume ;; 753114942Sume *) 754114942Sume for i in ${ipv6_static_routes}; do 755157706Sbrooks ipv6_route_args=`get_if_var $i ipv6_route_IF` 756114942Sume route add -inet6 ${ipv6_route_args} 757114942Sume done 758114942Sume ;; 759114942Sume esac 760114942Sume} 761114942Sume 762114942Sume# Setup faith 763114942Sumenetwork6_faith_setup() 764114942Sume{ 765114942Sume case ${ipv6_faith_prefix} in 766114942Sume [Nn][Oo] | '') 767114942Sume ;; 768114942Sume *) 769114942Sume sysctl net.inet6.ip6.keepfaith=1 770114942Sume ifconfig faith0 create >/dev/null 2>&1 771114942Sume ifconfig faith0 up 772114942Sume for prefix in ${ipv6_faith_prefix}; do 773114942Sume prefixlen=`expr "${prefix}" : ".*/\(.*\)"` 774114942Sume case ${prefixlen} in 775114942Sume '') 776114942Sume prefixlen=96 777114942Sume ;; 778114942Sume *) 779114942Sume prefix=`expr "${prefix}" : \ 780114942Sume "\(.*\)/${prefixlen}"` 781114942Sume ;; 782114942Sume esac 783114942Sume route add -inet6 ${prefix} -prefixlen ${prefixlen} ::1 784114942Sume route change -inet6 ${prefix} -prefixlen ${prefixlen} \ 785114942Sume -ifp faith0 786114942Sume done 787114942Sume ;; 788114942Sume esac 789114942Sume} 790114942Sume 791114942Sume# Install the "default interface" to kernel, which will be used 792114942Sume# as the default route when there's no router. 793114942Sumenetwork6_default_interface_setup() 794114942Sume{ 795114942Sume # Choose IPv6 default interface if it is not clearly specified. 796114942Sume case ${ipv6_default_interface} in 797114942Sume '') 798114942Sume for i in ${ipv6_network_interfaces}; do 799114942Sume case $i in 800114942Sume lo0|faith[0-9]*) 801114942Sume continue 802114942Sume ;; 803114942Sume esac 804114942Sume laddr=`network6_getladdr $i exclude_tentative` 805114942Sume case ${laddr} in 806114942Sume '') 807114942Sume ;; 808114942Sume *) 809114942Sume ipv6_default_interface=$i 810114942Sume break 811114942Sume ;; 812114942Sume esac 813114942Sume done 814114942Sume ;; 815114942Sume esac 816114942Sume 817114942Sume # Disallow unicast packets without outgoing scope identifiers, 818114942Sume # or route such packets to a "default" interface, if it is specified. 819114942Sume route add -inet6 fe80:: -prefixlen 10 ::1 -reject 820114942Sume case ${ipv6_default_interface} in 821114942Sume [Nn][Oo] | '') 822114942Sume route add -inet6 ff02:: -prefixlen 16 ::1 -reject 823114942Sume ;; 824114942Sume *) 825114942Sume laddr=`network6_getladdr ${ipv6_default_interface}` 826114942Sume route add -inet6 ff02:: ${laddr} -prefixlen 16 -interface \ 827114942Sume -cloning 828114942Sume 829114942Sume # Disable installing the default interface with the 830114942Sume # case net.inet6.ip6.forwarding=0 and 831114942Sume # net.inet6.ip6.accept_rtadv=0, due to avoid conflict 832114942Sume # between the default router list and the manual 833114942Sume # configured default route. 834114942Sume case ${ipv6_gateway_enable} in 835114942Sume [Yy][Ee][Ss]) 836114942Sume ;; 837114942Sume *) 838114942Sume if [ `sysctl -n net.inet6.ip6.accept_rtadv` -eq 1 ] 839114942Sume then 840114942Sume ndp -I ${ipv6_default_interface} 841114942Sume fi 842114942Sume ;; 843114942Sume esac 844114942Sume ;; 845114942Sume esac 846114942Sume} 847114942Sume 848114942Sumenetwork6_getladdr() 849114942Sume{ 850114942Sume ifconfig $1 2>/dev/null | while read proto addr rest; do 851114942Sume case ${proto} in 852114942Sume inet6) 853114942Sume case ${addr} in 854114942Sume fe80::*) 855114942Sume if [ -z "$2" ]; then 856114942Sume echo ${addr} 857114942Sume return 858114942Sume fi 859114942Sume case ${rest} in 860114942Sume *tentative*) 861114942Sume continue 862114942Sume ;; 863114942Sume *) 864114942Sume echo ${addr} 865114942Sume return 866114942Sume esac 867114942Sume esac 868114942Sume esac 869114942Sume done 870114942Sume} 871