network.subr revision 149401
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 149401 2005-08-24 01:23:49Z 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 46113674Smtm ifconfig $1 ${ifconfig_args} 47147088Sbrooks _cfg=0 48113674Smtm fi 49147088Sbrooks 50147088Sbrooks if wpaif $1; then 51147682Sbrooks /etc/rc.d/wpa_supplicant start $1 52147088Sbrooks _cfg=0 # XXX: not sure this should count 53147088Sbrooks fi 54147088Sbrooks 55147088Sbrooks if dhcpif $1; then 56147088Sbrooks /etc/rc.d/dhclient start $1 57147088Sbrooks _cfg=0 58147088Sbrooks fi 59147088Sbrooks 60147121Sbrooks return $_cfg 61113674Smtm} 6225184Sjkh 63116029Smtm# ifconfig_down if 64116029Smtm# Remove all inet entries from the $if interface. It returns 65116029Smtm# 0 if inet entries were found and removed. It returns 1 if 66116100Smtm# no entries were found or they could not be removed. 67116029Smtm# 68116029Smtmifconfig_down() 69116029Smtm{ 70116029Smtm [ -z "$1" ] && return 1 71116029Smtm _ifs="^" 72147121Sbrooks _cfg=1 73116029Smtm 74116029Smtm inetList="`ifconfig $1 | grep 'inet ' | tr "\n" "$_ifs"`" 75116029Smtm 76116029Smtm oldifs="$IFS" 77116029Smtm IFS="$_ifs" 78116029Smtm for _inet in $inetList ; do 79116029Smtm # get rid of extraneous line 80116029Smtm [ -z "$_inet" ] && break 81116029Smtm 82116029Smtm _inet=`expr "$_inet" : '.*\(inet \([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*'` 83116029Smtm 84116032Smtm IFS="$oldifs" 85116032Smtm ifconfig $1 ${_inet} delete 86116032Smtm IFS="$_ifs" 87147121Sbrooks _cfg=0 88116029Smtm done 89116029Smtm IFS="$oldifs" 90116029Smtm 91147088Sbrooks if wpaif $1; then 92147682Sbrooks /etc/rc.d/wpa_supplicant stop $1 93147121Sbrooks _cfg=0 94147088Sbrooks fi 95147088Sbrooks 96147088Sbrooks if dhcpif $1; then 97147088Sbrooks /etc/rc.d/dhclient stop $1 98147088Sbrooks _cfg=0 99147088Sbrooks fi 100147088Sbrooks 101147121Sbrooks return $_cfg 102116029Smtm} 103116029Smtm 104147088Sbrooks# _ifconfig_getargs if 105147088Sbrooks# Echos the arguments for the supplied interface to stdout. 106147088Sbrooks# returns 1 if empty. In general, ifconfig_getargs should be used 107147088Sbrooks# outside this file. 108147088Sbrooks_ifconfig_getargs() 109147088Sbrooks{ 110147088Sbrooks _ifn=$1 111147088Sbrooks if [ -z "$_ifn" ]; then 112147088Sbrooks return 1 113147088Sbrooks fi 114147088Sbrooks 115147088Sbrooks eval _args=\$ifconfig_$1 116147684Sbrooks if [ -z "$_args" ]; then 117147684Sbrooks _args=$ifconfig_DEFAULT 118147088Sbrooks fi 119147088Sbrooks 120147684Sbrooks echo "$_args" 121147088Sbrooks} 122147088Sbrooks 123147088Sbrooks# ifconfig_getargs if 124147088Sbrooks# Takes the result from _ifconfig_getargs and removes pseudo 125147088Sbrooks# args such as DHCP and WPA. 126147088Sbrooksifconfig_getargs() 127147088Sbrooks{ 128147088Sbrooks _tmpargs=`_ifconfig_getargs $1` 129147088Sbrooks if [ $? -eq 1 ]; then 130147088Sbrooks return 1 131147088Sbrooks fi 132147088Sbrooks _args= 133147088Sbrooks 134147088Sbrooks for _arg in $_tmpargs; do 135147088Sbrooks case $_arg in 136147088Sbrooks [Dd][Hh][Cc][Pp]) 137147088Sbrooks ;; 138149401Sbrooks [Nn][Oo][Aa][Uu][Tt][Oo]) 139149401Sbrooks ;; 140147088Sbrooks [Ww][Pp][Aa]) 141147088Sbrooks ;; 142147088Sbrooks *) 143147088Sbrooks _args="$_args $_arg" 144147088Sbrooks ;; 145147088Sbrooks esac 146147088Sbrooks done 147147088Sbrooks 148147088Sbrooks echo $_args 149147088Sbrooks} 150147088Sbrooks 151149401Sbrooks# autoif 152149401Sbrooks# Returns 0 if the interface should be automaticly configured at 153149401Sbrooks# boot time and 1 otherwise. 154149401Sbrooksautoif() 155149401Sbrooks{ 156149401Sbrooks _tmpargs=`_ifconfig_getargs $1` 157149401Sbrooks for _arg in $_tmpargs; do 158149401Sbrooks case $_arg in 159149401Sbrooks [Nn][Oo][Aa][Uu][Tt][Oo]) 160149401Sbrooks return 1 161149401Sbrooks ;; 162149401Sbrooks esac 163149401Sbrooks done 164149401Sbrooks return 0 165149401Sbrooks} 166149401Sbrooks 167147088Sbrooks# dhcpif if 168147088Sbrooks# Returns 0 if the interface is a DHCP interface and 1 otherwise. 169147088Sbrooksdhcpif() 170147088Sbrooks{ 171147088Sbrooks _tmpargs=`_ifconfig_getargs $1` 172147088Sbrooks for _arg in $_tmpargs; do 173147088Sbrooks case $_arg in 174147088Sbrooks [Dd][Hh][Cc][Pp]) 175147088Sbrooks return 0 176147088Sbrooks ;; 177147088Sbrooks esac 178147088Sbrooks done 179147088Sbrooks return 1 180147088Sbrooks} 181147088Sbrooks 182147088Sbrooks# wpaif if 183147088Sbrooks# Returns 0 if the interface is a WPA interface and 1 otherwise. 184147088Sbrookswpaif() 185147088Sbrooks{ 186147088Sbrooks _tmpargs=`_ifconfig_getargs $1` 187147088Sbrooks for _arg in $_tmpargs; do 188147088Sbrooks case $_arg in 189147088Sbrooks [Ww][Pp][Aa]) 190147088Sbrooks return 0 191147088Sbrooks ;; 192147088Sbrooks esac 193147088Sbrooks done 194147088Sbrooks return 1 195147088Sbrooks} 196147088Sbrooks 197113674Smtm# ifalias_up if 198113674Smtm# Configure aliases for network interface $if. 199113674Smtm# It returns 0 if at least one alias was configured or 200113674Smtm# 1 if there were none. 201113674Smtm# 202113674Smtmifalias_up() 203113674Smtm{ 204113674Smtm _ret=1 205113674Smtm alias=0 206113674Smtm while : ; do 207113674Smtm eval ifconfig_args=\$ifconfig_$1_alias${alias} 208113674Smtm if [ -n "${ifconfig_args}" ]; then 209113674Smtm ifconfig $1 ${ifconfig_args} alias 210113674Smtm alias=$((${alias} + 1)) 211113674Smtm _ret=0 212113674Smtm else 213113674Smtm break 214113674Smtm fi 215113674Smtm done 216113674Smtm return $_ret 217113674Smtm} 218100280Sgordon 219116029Smtm#ifalias_down if 220116029Smtm# Remove aliases for network interface $if. 221116029Smtm# It returns 0 if at least one alias was removed or 222116029Smtm# 1 if there were none. 223116029Smtm# 224116029Smtmifalias_down() 225116029Smtm{ 226116029Smtm _ret=1 227116029Smtm alias=0 228116029Smtm while : ; do 229116029Smtm eval ifconfig_args=\$ifconfig_$1_alias${alias} 230116029Smtm if [ -n "${ifconfig_args}" ]; then 231116029Smtm ifconfig $1 ${ifconfig_args} -alias 232116029Smtm alias=$((${alias} + 1)) 233116029Smtm _ret=0 234116029Smtm else 235116029Smtm break 236116029Smtm fi 237116029Smtm done 238116029Smtm return $_ret 239116029Smtm} 240116029Smtm 241113674Smtm# ifscript_up if 242113674Smtm# Evaluate a startup script for the $if interface. 243113674Smtm# It returns 0 if a script was found and processed or 244113674Smtm# 1 if no script was found. 245113674Smtm# 246113674Smtmifscript_up() 247100280Sgordon{ 248113674Smtm if [ -r /etc/start_if.$1 ]; then 249113674Smtm . /etc/start_if.$1 250113674Smtm return 0 251113674Smtm fi 252113674Smtm return 1 253100280Sgordon} 254100280Sgordon 255116029Smtm# ifscript_down if 256116029Smtm# Evaluate a shutdown script for the $if interface. 257116029Smtm# It returns 0 if a script was found and processed or 258116029Smtm# 1 if no script was found. 259116029Smtm# 260116029Smtmifscript_down() 261116029Smtm{ 262116029Smtm if [ -r /etc/stop_if.$1 ]; then 263116029Smtm . /etc/stop_if.$1 264116029Smtm return 0 265116029Smtm fi 266116029Smtm return 1 267116029Smtm} 268116029Smtm 269113674Smtm# Create cloneable interfaces. 270113674Smtm# 271113674Smtmclone_up() 272100280Sgordon{ 273113674Smtm _prefix= 274113674Smtm _list= 275113674Smtm for ifn in ${cloned_interfaces}; do 276113674Smtm ifconfig ${ifn} create 277116774Skuriyama if [ $? -eq 0 ]; then 278113674Smtm _list="${_list}${_prefix}${ifn}" 279113674Smtm [ -z "$_prefix" ] && _prefix=' ' 280113674Smtm fi 281113674Smtm done 282113674Smtm debug "Cloned: ${_list}" 283113674Smtm} 284100280Sgordon 285113674Smtm# Destroy cloned interfaces. Destroyed interfaces are echoed 286113674Smtm# to standard output. 287113674Smtm# 288113674Smtmclone_down() 289113674Smtm{ 290113674Smtm _prefix= 291113674Smtm _list= 292113674Smtm for ifn in ${cloned_interfaces}; do 293113674Smtm ifconfig ${ifn} destroy 294116774Skuriyama if [ $? -eq 0 ]; then 295113674Smtm _list="${_list}${_prefix}${ifn}" 296113674Smtm [ -z "$_prefix" ] && _prefix=' ' 297113674Smtm fi 298113674Smtm done 299113674Smtm debug "Destroyed clones: ${_list}" 300100280Sgordon} 301100280Sgordon 302113674Smtmgif_up() { 303100282Sdougb case ${gif_interfaces} in 304100282Sdougb [Nn][Oo] | '') 305100282Sdougb ;; 306100282Sdougb *) 307100282Sdougb for i in ${gif_interfaces}; do 308100282Sdougb eval peers=\$gifconfig_$i 309100282Sdougb case ${peers} in 310100282Sdougb '') 311100282Sdougb continue 312100282Sdougb ;; 313100282Sdougb *) 314100282Sdougb ifconfig $i create >/dev/null 2>&1 315100282Sdougb ifconfig $i tunnel ${peers} 316103710Sume ifconfig $i up 317100282Sdougb ;; 318100282Sdougb esac 319100282Sdougb done 320100282Sdougb ;; 321100282Sdougb esac 322100282Sdougb} 323100282Sdougb 324113674Smtm# 325113674Smtm# ipx_up ifn 326113674Smtm# Configure any IPX addresses for interface $ifn. Returns 0 if IPX 327113674Smtm# arguments were found and configured; returns 1 otherwise. 328113674Smtm# 329113674Smtmipx_up() 330100280Sgordon{ 331113674Smtm ifn="$1" 332113674Smtm eval ifconfig_args=\$ifconfig_${ifn}_ipx 333113674Smtm if [ -n "${ifconfig_args}" ]; then 334113674Smtm ifconfig ${ifn} ${ifconfig_args} 335113674Smtm return 0 33685831Sdes fi 337113674Smtm return 1 338113674Smtm} 33985831Sdes 340116029Smtm# ipx_down ifn 341116029Smtm# Remove IPX addresses for interface $ifn. Returns 0 if IPX 342116029Smtm# addresses were found and unconfigured. It returns 1, otherwise. 343113674Smtm# 344116029Smtmipx_down() 345116029Smtm{ 346116100Smtm [ -z "$1" ] && return 1 347116100Smtm _ifs="^" 348116100Smtm _ret=1 349116100Smtm 350116100Smtm ipxList="`ifconfig $1 | grep 'ipx ' | tr "\n" "$_ifs"`" 351116100Smtm 352116100Smtm oldifs="$IFS" 353116100Smtm IFS="$_ifs" 354116100Smtm for _ipx in $ipxList ; do 355116100Smtm # get rid of extraneous line 356116100Smtm [ -z "$_ipx" ] && break 357116100Smtm 358116100Smtm _ipx=`expr "$_ipx" : '.*\(ipx [0-9a-h]\{1,8\}H*\.[0-9a-h]\{1,12\}\).*'` 359116100Smtm 360116100Smtm IFS="$oldifs" 361116100Smtm ifconfig $1 ${_ipx} delete 362116100Smtm IFS="$_ifs" 363116100Smtm _ret=0 364116100Smtm done 365116100Smtm IFS="$oldifs" 366116100Smtm 367116100Smtm return $_ret 368116029Smtm} 369116029Smtm 370137070Spjd# ifnet_rename 371137070Spjd# Rename all requested interfaces. 372116029Smtm# 373137070Spjdifnet_rename() 374137070Spjd{ 375137070Spjd 376138386Srse _ifn_list="`ifconfig -l`" 377137070Spjd [ -z "$_ifn_list" ] && return 0 378137070Spjd for _if in ${_ifn_list} ; do 379137070Spjd eval _ifname=\$ifconfig_${_if}_name 380137070Spjd if [ ! -z "$_ifname" ]; then 381137070Spjd ifconfig $_if name $_ifname 382137070Spjd fi 383137070Spjd done 384137070Spjd return 0 385137070Spjd} 386137070Spjd 387137070Spjd# 388113674Smtm# list_net_interfaces type 389113674Smtm# List all network interfaces. The type of interface returned 390113674Smtm# can be controlled by the type argument. The type 391113674Smtm# argument can be any of the following: 392113674Smtm# nodhcp - all interfaces, excluding DHCP configured interfaces 393113674Smtm# dhcp - list only DHCP configured interfaces 394113674Smtm# If no argument is specified all network interfaces are output. 395134429Syar# Note that the list will include cloned interfaces if applicable. 396134429Syar# Cloned interfaces must already exist to have a chance to appear 397134429Syar# in the list if ${network_interfaces} is set to `auto'. 398113674Smtm# 399113674Smtmlist_net_interfaces() 400113674Smtm{ 401113674Smtm type=$1 40265532Snectar 403113674Smtm # Get a list of ALL the interfaces 40451231Ssheldonh # 40551231Ssheldonh case ${network_interfaces} in 40651231Ssheldonh [Aa][Uu][Tt][Oo]) 407149401Sbrooks _prefix='' 408149401Sbrooks _autolist="`ifconfig -l`" 409149401Sbrooks for _if in ${_autolist} ; do 410149401Sbrooks if autoif $_if; then 411149401Sbrooks _tmplist="${_tmplist}${_prefix}${_if}" 412149401Sbrooks [ -z "$_prefix" ] && _prefix=' ' 413149401Sbrooks fi 414149401Sbrooks done 41551231Ssheldonh ;; 41683677Sbrooks *) 417149401Sbrooks _tmplist="${network_interfaces} ${cloned_interfaces}" 41883677Sbrooks ;; 41951231Ssheldonh esac 42049122Sbrian 421113674Smtm if [ -z "$type" ]; then 422113674Smtm echo $_tmplist 423113674Smtm return 0 424113674Smtm fi 42549122Sbrian 426138385Srse # Separate out dhcp and non-dhcp interfaces 427113674Smtm # 428113674Smtm _aprefix= 429134376Syar _bprefix= 430113674Smtm for _if in ${_tmplist} ; do 431147684Sbrooks if dhcpif $_if; then 432113674Smtm _dhcplist="${_dhcplist}${_aprefix}${_if}" 433113674Smtm [ -z "$_aprefix" ] && _aprefix=' ' 434147684Sbrooks elif [ -n "`_ifconfig_getargs $if`" ]; then 435113674Smtm _nodhcplist="${_nodhcplist}${_bprefix}${_if}" 436113674Smtm [ -z "$_bprefix" ] && _bprefix=' ' 437147684Sbrooks fi 43854458Sobrien done 43951231Ssheldonh 440113674Smtm case "$type" in 441113674Smtm nodhcp) 442113674Smtm echo $_nodhcplist 443113674Smtm ;; 444113674Smtm dhcp) 445113674Smtm echo $_dhcplist 446113674Smtm ;; 447113674Smtm esac 448130151Sschweikh return 0 44925184Sjkh} 450114942Sume 451114942Sumehexdigit() 452114942Sume{ 453114942Sume if [ $1 -lt 10 ]; then 454114942Sume echo $1 455114942Sume else 456114942Sume case $1 in 457114942Sume 10) echo a ;; 458114942Sume 11) echo b ;; 459114942Sume 12) echo c ;; 460114942Sume 13) echo d ;; 461114942Sume 14) echo e ;; 462114942Sume 15) echo f ;; 463114942Sume esac 464114942Sume fi 465114942Sume} 466114942Sume 467114942Sumehexprint() 468114942Sume{ 469114942Sume val=$1 470114942Sume str='' 471114942Sume 472114942Sume dig=`hexdigit $((${val} & 15))` 473114942Sume str=${dig}${str} 474114942Sume val=$((${val} >> 4)) 475114942Sume while [ ${val} -gt 0 ]; do 476114942Sume dig=`hexdigit $((${val} & 15))` 477114942Sume str=${dig}${str} 478114942Sume val=$((${val} >> 4)) 479114942Sume done 480114942Sume 481114942Sume echo ${str} 482114942Sume} 483114942Sume 484114942Sume# Setup the interfaces for IPv6 485114942Sumenetwork6_interface_setup() 486114942Sume{ 487114942Sume interfaces=$* 488114942Sume rtsol_interfaces='' 489114942Sume case ${ipv6_gateway_enable} in 490114942Sume [Yy][Ee][Ss]) 491114942Sume rtsol_available=no 492114942Sume ;; 493114942Sume *) 494114942Sume rtsol_available=yes 495114942Sume ;; 496114942Sume esac 497114942Sume for i in $interfaces; do 498114942Sume rtsol_interface=yes 499114942Sume eval prefix=\$ipv6_prefix_$i 500114942Sume if [ -n "${prefix}" ]; then 501114942Sume rtsol_available=no 502114942Sume rtsol_interface=no 503114942Sume laddr=`network6_getladdr $i` 504114942Sume hostid=`expr "${laddr}" : 'fe80::\(.*\)%\(.*\)'` 505114942Sume for j in ${prefix}; do 506114942Sume address=$j\:${hostid} 507114942Sume ifconfig $i inet6 ${address} prefixlen 64 alias 508114942Sume 509114942Sume case ${ipv6_gateway_enable} in 510114942Sume [Yy][Ee][Ss]) 511114942Sume # subnet-router anycast address 512114942Sume # (rfc2373) 513114942Sume ifconfig $i inet6 $j:: prefixlen 64 \ 514114942Sume alias anycast 515114942Sume ;; 516114942Sume esac 517114942Sume done 518114942Sume fi 519114942Sume eval ipv6_ifconfig=\$ipv6_ifconfig_$i 520114942Sume if [ -n "${ipv6_ifconfig}" ]; then 521114942Sume rtsol_available=no 522114942Sume rtsol_interface=no 523114942Sume ifconfig $i inet6 ${ipv6_ifconfig} alias 524114942Sume fi 525114942Sume 526114942Sume if [ ${rtsol_available} = yes -a ${rtsol_interface} = yes ] 527114942Sume then 528114942Sume case ${i} in 529114942Sume lo0|gif[0-9]*|stf[0-9]*|faith[0-9]*|lp[0-9]*|sl[0-9]*|tun[0-9]*) 530114942Sume ;; 531114942Sume *) 532114942Sume rtsol_interfaces="${rtsol_interfaces} ${i}" 533114942Sume ;; 534114942Sume esac 535114942Sume else 536114942Sume ifconfig $i inet6 537114942Sume fi 538114942Sume done 539114942Sume 540114942Sume if [ ${rtsol_available} = yes -a -n "${rtsol_interfaces}" ]; then 541114942Sume # Act as endhost - automatically configured. 542114942Sume # You can configure only single interface, as 543114942Sume # specification assumes that autoconfigured host has 544114942Sume # single interface only. 545114942Sume sysctl net.inet6.ip6.accept_rtadv=1 546114942Sume set ${rtsol_interfaces} 547114942Sume ifconfig $1 up 548118666Sume rtsol ${rtsol_flags} $1 549114942Sume fi 550114942Sume 551114942Sume for i in $interfaces; do 552114942Sume alias=0 553114942Sume while : ; do 554114942Sume eval ipv6_ifconfig=\$ipv6_ifconfig_${i}_alias${alias} 555114942Sume if [ -z "${ipv6_ifconfig}" ]; then 556114942Sume break; 557114942Sume fi 558114942Sume ifconfig $i inet6 ${ipv6_ifconfig} alias 559114942Sume alias=$((${alias} + 1)) 560114942Sume done 561114942Sume done 562114942Sume} 563114942Sume 564114942Sume# Setup IPv6 to IPv4 mapping 565114942Sumenetwork6_stf_setup() 566114942Sume{ 567114942Sume case ${stf_interface_ipv4addr} in 568114942Sume [Nn][Oo] | '') 569114942Sume ;; 570114942Sume *) 571114942Sume # assign IPv6 addr and interface route for 6to4 interface 572114942Sume stf_prefixlen=$((16+${stf_interface_ipv4plen:-0})) 573114942Sume OIFS="$IFS" 574114942Sume IFS=".$IFS" 575114942Sume set ${stf_interface_ipv4addr} 576114942Sume IFS="$OIFS" 577114942Sume hexfrag1=`hexprint $(($1*256 + $2))` 578114942Sume hexfrag2=`hexprint $(($3*256 + $4))` 579114942Sume ipv4_in_hexformat="${hexfrag1}:${hexfrag2}" 580114942Sume case ${stf_interface_ipv6_ifid} in 581114942Sume [Aa][Uu][Tt][Oo] | '') 582114942Sume for i in ${ipv6_network_interfaces}; do 583114942Sume laddr=`network6_getladdr ${i}` 584114942Sume case ${laddr} in 585114942Sume '') 586114942Sume ;; 587114942Sume *) 588114942Sume break 589114942Sume ;; 590114942Sume esac 591114942Sume done 592114942Sume stf_interface_ipv6_ifid=`expr "${laddr}" : \ 593114942Sume 'fe80::\(.*\)%\(.*\)'` 594114942Sume case ${stf_interface_ipv6_ifid} in 595114942Sume '') 596114942Sume stf_interface_ipv6_ifid=0:0:0:1 597114942Sume ;; 598114942Sume esac 599114942Sume ;; 600114942Sume esac 601114942Sume ifconfig stf0 create >/dev/null 2>&1 602114942Sume ifconfig stf0 inet6 2002:${ipv4_in_hexformat}:${stf_interface_ipv6_slaid:-0}:${stf_interface_ipv6_ifid} \ 603114942Sume prefixlen ${stf_prefixlen} 604114942Sume # disallow packets to malicious 6to4 prefix 605114942Sume route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject 606114942Sume route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject 607114942Sume route add -inet6 2002:0000:: -prefixlen 24 ::1 -reject 608114942Sume route add -inet6 2002:ff00:: -prefixlen 24 ::1 -reject 609114942Sume ;; 610114942Sume esac 611114942Sume} 612114942Sume 613114942Sume# Setup static routes 614114942Sumenetwork6_static_routes_setup() 615114942Sume{ 616114942Sume # Set up any static routes. 617114942Sume case ${ipv6_defaultrouter} in 618114942Sume [Nn][Oo] | '') 619114942Sume ;; 620114942Sume *) 621114942Sume ipv6_static_routes="default ${ipv6_static_routes}" 622114942Sume ipv6_route_default="default ${ipv6_defaultrouter}" 623114942Sume ;; 624114942Sume esac 625114942Sume case ${ipv6_static_routes} in 626114942Sume [Nn][Oo] | '') 627114942Sume ;; 628114942Sume *) 629114942Sume for i in ${ipv6_static_routes}; do 630114942Sume eval ipv6_route_args=\$ipv6_route_${i} 631114942Sume route add -inet6 ${ipv6_route_args} 632114942Sume done 633114942Sume ;; 634114942Sume esac 635114942Sume} 636114942Sume 637114942Sume# Setup faith 638114942Sumenetwork6_faith_setup() 639114942Sume{ 640114942Sume case ${ipv6_faith_prefix} in 641114942Sume [Nn][Oo] | '') 642114942Sume ;; 643114942Sume *) 644114942Sume sysctl net.inet6.ip6.keepfaith=1 645114942Sume ifconfig faith0 create >/dev/null 2>&1 646114942Sume ifconfig faith0 up 647114942Sume for prefix in ${ipv6_faith_prefix}; do 648114942Sume prefixlen=`expr "${prefix}" : ".*/\(.*\)"` 649114942Sume case ${prefixlen} in 650114942Sume '') 651114942Sume prefixlen=96 652114942Sume ;; 653114942Sume *) 654114942Sume prefix=`expr "${prefix}" : \ 655114942Sume "\(.*\)/${prefixlen}"` 656114942Sume ;; 657114942Sume esac 658114942Sume route add -inet6 ${prefix} -prefixlen ${prefixlen} ::1 659114942Sume route change -inet6 ${prefix} -prefixlen ${prefixlen} \ 660114942Sume -ifp faith0 661114942Sume done 662114942Sume ;; 663114942Sume esac 664114942Sume} 665114942Sume 666114942Sume# Install the "default interface" to kernel, which will be used 667114942Sume# as the default route when there's no router. 668114942Sumenetwork6_default_interface_setup() 669114942Sume{ 670114942Sume # Choose IPv6 default interface if it is not clearly specified. 671114942Sume case ${ipv6_default_interface} in 672114942Sume '') 673114942Sume for i in ${ipv6_network_interfaces}; do 674114942Sume case $i in 675114942Sume lo0|faith[0-9]*) 676114942Sume continue 677114942Sume ;; 678114942Sume esac 679114942Sume laddr=`network6_getladdr $i exclude_tentative` 680114942Sume case ${laddr} in 681114942Sume '') 682114942Sume ;; 683114942Sume *) 684114942Sume ipv6_default_interface=$i 685114942Sume break 686114942Sume ;; 687114942Sume esac 688114942Sume done 689114942Sume ;; 690114942Sume esac 691114942Sume 692114942Sume # Disallow unicast packets without outgoing scope identifiers, 693114942Sume # or route such packets to a "default" interface, if it is specified. 694114942Sume route add -inet6 fe80:: -prefixlen 10 ::1 -reject 695114942Sume case ${ipv6_default_interface} in 696114942Sume [Nn][Oo] | '') 697114942Sume route add -inet6 ff02:: -prefixlen 16 ::1 -reject 698114942Sume ;; 699114942Sume *) 700114942Sume laddr=`network6_getladdr ${ipv6_default_interface}` 701114942Sume route add -inet6 ff02:: ${laddr} -prefixlen 16 -interface \ 702114942Sume -cloning 703114942Sume 704114942Sume # Disable installing the default interface with the 705114942Sume # case net.inet6.ip6.forwarding=0 and 706114942Sume # net.inet6.ip6.accept_rtadv=0, due to avoid conflict 707114942Sume # between the default router list and the manual 708114942Sume # configured default route. 709114942Sume case ${ipv6_gateway_enable} in 710114942Sume [Yy][Ee][Ss]) 711114942Sume ;; 712114942Sume *) 713114942Sume if [ `sysctl -n net.inet6.ip6.accept_rtadv` -eq 1 ] 714114942Sume then 715114942Sume ndp -I ${ipv6_default_interface} 716114942Sume fi 717114942Sume ;; 718114942Sume esac 719114942Sume ;; 720114942Sume esac 721114942Sume} 722114942Sume 723114942Sumenetwork6_getladdr() 724114942Sume{ 725114942Sume ifconfig $1 2>/dev/null | while read proto addr rest; do 726114942Sume case ${proto} in 727114942Sume inet6) 728114942Sume case ${addr} in 729114942Sume fe80::*) 730114942Sume if [ -z "$2" ]; then 731114942Sume echo ${addr} 732114942Sume return 733114942Sume fi 734114942Sume case ${rest} in 735114942Sume *tentative*) 736114942Sume continue 737114942Sume ;; 738114942Sume *) 739114942Sume echo ${addr} 740114942Sume return 741114942Sume esac 742114942Sume esac 743114942Sume esac 744114942Sume done 745114942Sume} 746