summaryrefslogtreecommitdiffstats
path: root/etc/network.subr
diff options
context:
space:
mode:
authorhrs <hrs@FreeBSD.org>2009-09-12 22:13:41 +0000
committerhrs <hrs@FreeBSD.org>2009-09-12 22:13:41 +0000
commit7c88a6d4ae7fe6cf1d242c9a458a3a3460936fed (patch)
tree24c1384fabefec07ce6741f83b3711da2a7f62a8 /etc/network.subr
parent2eb62239d7432351eb544690c4ea2fc648ae2abc (diff)
downloadFreeBSD-src-7c88a6d4ae7fe6cf1d242c9a458a3a3460936fed.zip
FreeBSD-src-7c88a6d4ae7fe6cf1d242c9a458a3a3460936fed.tar.gz
Integrate rc.d/network_ipv6 into rc.d/netif:
- Add rc.d/stf and rc.d/faith for stf(4) and faith(4). - Remove rc.d/auto_linklocal and rc.d/network_ipv6. - Move rc.d/sysctl to just before FILESYSTEMS because rc.d/netif depends on some sysctl variables. Reviewed by: brooks MFC after: 3 days
Diffstat (limited to 'etc/network.subr')
-rw-r--r--etc/network.subr845
1 files changed, 520 insertions, 325 deletions
diff --git a/etc/network.subr b/etc/network.subr
index e794fab..c9462fa 100644
--- a/etc/network.subr
+++ b/etc/network.subr
@@ -45,13 +45,14 @@ ifn_start()
ifscript_up ${ifn} && cfg=0
ifconfig_up ${ifn} && cfg=0
ipv4_up ${ifn} && cfg=0
+ ipv6_up ${ifn} && cfg=0
ipx_up ${ifn} && cfg=0
- childif_create ${ifn}
+ childif_create ${ifn} && cfg=0
return $cfg
}
-# ifn_start ifn
+# ifn_stop ifn
# Shutdown and de-configure an interface. If action is taken print the
# interface name.
#
@@ -61,13 +62,14 @@ ifn_stop()
ifn="$1"
cfg=1
- [ -z "$ifn" ] && return 1
+ [ -z "$ifn" ] && err 1 "ifn_stop called without an interface"
ipx_down ${ifn} && cfg=0
+ ipv6_down ${ifn} && cfg=0
ipv4_down ${ifn} && cfg=0
ifconfig_down ${ifn} && cfg=0
ifscript_down ${ifn} && cfg=0
- childif_destroy ${ifn}
+ childif_destroy ${ifn} && cfg=0
return $cfg
}
@@ -81,15 +83,53 @@ ifn_stop()
#
ifconfig_up()
{
+ local _cfg _ipv6_opts ifconfig_args
_cfg=1
+ # ifconfig_IF
ifconfig_args=`ifconfig_getargs $1`
if [ -n "${ifconfig_args}" ]; then
ifconfig $1 ${ifconfig_args}
- ifconfig $1 up
_cfg=0
fi
+ # inet6 specific
+ if afexists inet6; then
+ if ipv6if $1; then
+ if checkyesno ipv6_gateway_enable; then
+ _ipv6_opts="-accept_rtadv auto_linklocal"
+ else
+ _ipv6_opts="auto_linklocal"
+ fi
+ else
+ _ipv6_opts="-auto_linklocal ifdisabled"
+ fi
+
+ ifconfig $1 inet6 ${_ipv6_opts}
+
+ # ifconfig_IF_ipv6
+ ifconfig_args=`ifconfig_getargs $1 ipv6`
+ if [ -n "${ifconfig_args}" ]; then
+ ifconfig $1 inet6 -ifdisabled
+ ifconfig $1 ${ifconfig_args}
+ _cfg=0
+ fi
+
+ # backward compatiblity: $ipv6_ifconfig_IF
+ ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF`
+ if [ -n "${ifconfig_args}" ]; then
+ warn "\$ipv6_ifconfig_$1 is obsolete." \
+ " Use ifconfig_$1_ipv6 instead."
+ ifconfig $1 inet6 -ifdisabled
+ ifconfig $1 inet6 ${ifconfig_args}
+ _cfg=0
+ fi
+ fi
+
+ if [ ${_cfg} -eq 0 ]; then
+ ifconfig $1 up
+ fi
+
if wpaif $1; then
/etc/rc.d/wpa_supplicant start $1
_cfg=0 # XXX: not sure this should count
@@ -114,7 +154,7 @@ ifconfig_up()
#
ifconfig_down()
{
- [ -z "$1" ] && return 1
+ local _cfg
_cfg=1
if wpaif $1; then
@@ -143,6 +183,8 @@ ifconfig_down()
# $default if given.
get_if_var()
{
+ local _if _punct _var _default prefix suffix
+
if [ $# -ne 2 -a $# -ne 3 ]; then
err 3 'USAGE: get_if_var name var [default]'
fi
@@ -160,26 +202,30 @@ get_if_var()
eval echo \${${prefix}${_if}${suffix}-${_default}}
}
-# _ifconfig_getargs if
+# _ifconfig_getargs if [af]
# Echos the arguments for the supplied interface to stdout.
# returns 1 if empty. In general, ifconfig_getargs should be used
# outside this file.
_ifconfig_getargs()
{
+ local _ifn _af
_ifn=$1
+ _af=${2+_$2}
+
if [ -z "$_ifn" ]; then
return 1
fi
- get_if_var $_ifn ifconfig_IF "$ifconfig_DEFAULT"
+ get_if_var $_ifn ifconfig_IF$_af "$ifconfig_DEFAULT"
}
-# ifconfig_getargs if
+# ifconfig_getargs if [af]
# Takes the result from _ifconfig_getargs and removes pseudo
# args such as DHCP and WPA.
ifconfig_getargs()
{
- _tmpargs=`_ifconfig_getargs $1`
+ local _tmpargs _arg _args
+ _tmpargs=`_ifconfig_getargs $1 $2`
if [ $? -eq 1 ]; then
return 1
fi
@@ -206,7 +252,9 @@ ifconfig_getargs()
# boot time and 1 otherwise.
autoif()
{
+ local _tmpargs _arg
_tmpargs=`_ifconfig_getargs $1`
+
for _arg in $_tmpargs; do
case $_arg in
[Nn][Oo][Aa][Uu][Tt][Oo])
@@ -214,6 +262,7 @@ autoif()
;;
esac
done
+
return 0
}
@@ -221,7 +270,9 @@ autoif()
# Returns 0 if the interface is a DHCP interface and 1 otherwise.
dhcpif()
{
+ local _tmpargs _arg
_tmpargs=`_ifconfig_getargs $1`
+
for _arg in $_tmpargs; do
case $_arg in
[Dd][Hh][Cc][Pp])
@@ -235,6 +286,7 @@ dhcpif()
;;
esac
done
+
return 1
}
@@ -243,7 +295,9 @@ dhcpif()
# 1 otherwise.
syncdhcpif()
{
+ local _tmpargs _arg
_tmpargs=`_ifconfig_getargs $1`
+
for _arg in $_tmpargs; do
case $_arg in
[Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
@@ -254,18 +308,17 @@ syncdhcpif()
;;
esac
done
- if checkyesno synchronous_dhclient; then
- return 0
- else
- return 1
- fi
+
+ checkyesno synchronous_dhclient
}
# wpaif if
# Returns 0 if the interface is a WPA interface and 1 otherwise.
wpaif()
{
+ local _tmpargs _arg
_tmpargs=`_ifconfig_getargs $1`
+
for _arg in $_tmpargs; do
case $_arg in
[Ww][Pp][Aa])
@@ -273,6 +326,54 @@ wpaif()
;;
esac
done
+
+ return 1
+}
+
+# afexists af
+# Returns 0 if the address family is enabled in the kernel
+# 1 otherwise.
+afexists()
+{
+ local _af
+ _af=$1
+
+ case ${_af} in
+ inet)
+ ${SYSCTL_N} net.inet > /dev/null 2>&1
+ ;;
+ inet6)
+ ${SYSCTL_N} net.inet6 > /dev/null 2>&1
+ ;;
+ *)
+ err 1 "afexists(): Unsupported address family: $_af"
+ ;;
+ esac
+}
+
+# noafif if
+# Returns 0 if the interface has no af configuration and 1 otherwise.
+noafif()
+{
+ local _if
+ _if=$1
+
+ case $_if in
+ pflog[0-9]*|\
+ pfsync[0-9]*|\
+ an[0-9]*|\
+ ath[0-9]*|\
+ ipw[0-9]*|\
+ iwi[0-9]*|\
+ iwn[0-9]*|\
+ ral[0-9]*|\
+ wi[0-9]*|\
+ wl[0-9]*|\
+ wpi[0-9]*)
+ return 0
+ ;;
+ esac
+
return 1
}
@@ -281,9 +382,20 @@ wpaif()
# 1 otherwise.
ipv6if()
{
- if ! checkyesno ipv6_enable; then
+ local _if i
+ _if=$1
+
+ if ! afexists inet6; then
return 1
fi
+
+ # lo0 is always IPv6-enabled
+ case $_if in
+ lo0)
+ return 0
+ ;;
+ esac
+
case "${ipv6_network_interfaces}" in
[Aa][Uu][Tt][Oo])
return 0
@@ -292,11 +404,53 @@ ipv6if()
return 1
;;
esac
- for v6if in ${ipv6_network_interfaces}; do
- if [ "${v6if}" = "${1}" ]; then
+
+ for i in ${ipv6_network_interfaces}; do
+ if [ "$i" = "$_if" ]; then
return 0
fi
done
+
+ return 1
+}
+
+# ipv6_autoconfif if
+# Returns 0 if the interface should be configured for IPv6 with
+# Stateless Address Configuration, 1 otherwise.
+ipv6_autoconfif()
+{
+ local _if _tmpargs _arg
+ _if=$1
+
+ if ! ipv6if $_if; then
+ return 1
+ fi
+ if noafif $_if; then
+ return 1
+ fi
+ if checkyesno ipv6_gateway_enable; then
+ return 1
+ fi
+
+ case $_if in
+ lo0|\
+ stf[0-9]*|\
+ faith[0-9]*|\
+ lp[0-9]*|\
+ sl[0-9]*)
+ return 1
+ ;;
+ esac
+
+ _tmpargs=`_ifconfig_getargs $_if ipv6`
+ for _arg in $_tmpargs; do
+ case $_arg in
+ accept_rtadv)
+ return 0
+ ;;
+ esac
+ done
+
return 1
}
@@ -304,6 +458,7 @@ ipv6if()
# Returns 0 if the interface exists and 1 otherwise.
ifexists()
{
+ [ -z "$1" ] && return 1
ifconfig -n $1 > /dev/null 2>&1
}
@@ -311,21 +466,48 @@ ifexists()
# add IPv4 addresses to the interface $if
ipv4_up()
{
+ local _if _ret
_if=$1
- ifalias_up ${_if}
- ipv4_addrs_common ${_if} alias
+ _ret=1
+
+ ifalias_up ${_if} inet && _ret=0
+ ipv4_addrs_common ${_if} alias && _ret=0
+
+ return $_ret
+}
+
+# ipv6_up if
+# add IPv6 addresses to the interface $if
+ipv6_up()
+{
+ local _if _ret
+ _if=$1
+ _ret=1
+
+ if ! ipv6if $_if; then
+ return 0
+ fi
+
+ ifalias_up ${_if} inet6 && _ret=0
+ ipv6_prefix_hostid_addr_up ${_if} && _ret=0
+ ipv6_accept_rtadv_up ${_if} && _ret=0
+
+ # wait for DAD
+ sleep `${SYSCTL_N} net.inet6.ip6.dad_count`
+ sleep 1
+
+ return $_ret
}
# ipv4_down if
# remove IPv4 addresses from the interface $if
ipv4_down()
{
+ local _if _ifs _ret inetList oldifs _inet
_if=$1
_ifs="^"
_ret=1
- ifexists ${_if} || return 1
-
inetList="`ifconfig ${_if} | grep 'inet ' | tr "\n" "$_ifs"`"
oldifs="$IFS"
@@ -343,17 +525,55 @@ ipv4_down()
done
IFS="$oldifs"
- ifalias_down ${_if} && _ret=0
+ ifalias_down ${_if} inet && _ret=0
ipv4_addrs_common ${_if} -alias && _ret=0
return $_ret
}
+# ipv6_down if
+# remove IPv6 addresses from the interface $if
+ipv6_down()
+{
+ local _if _ifs _ret inetList oldifs _inet6
+ _if=$1
+ _ifs="^"
+ _ret=1
+
+ if ! ipv6if $_if; then
+ return 0
+ fi
+
+ ipv6_accept_rtadv_down ${_if} && _ret=0
+ ifalias_down ${_if} inet6 && _ret=0
+
+ inetList="`ifconfig ${_if} | grep 'inet6 ' | tr "\n" "$_ifs"`"
+
+ oldifs="$IFS"
+ IFS="$_ifs"
+ for _inet6 in $inetList ; do
+ # get rid of extraneous line
+ [ -z "$_inet6" ] && break
+
+ _inet6=`expr "$_inet6" : '.*\(inet6 \([0-9a-f:]*\)\).*'`
+
+ IFS="$oldifs"
+ ifconfig ${_if} ${_inet6} -alias
+ IFS="$_ifs"
+ _ret=0
+ done
+ IFS="$oldifs"
+
+ return $_ret
+}
+
# ipv4_addrs_common if action
# Evaluate the ifconfig_if_ipv4 arguments for interface $if
# and use $action to add or remove IPv4 addresses from $if.
ipv4_addrs_common()
{
+ local _ret _if _action _cidr _cidr_addr
+ local _ipaddr _netmask _range _ipnet _iplow _iphigh _ipcount
_ret=1
_if=$1
_action=$2
@@ -386,53 +606,239 @@ ipv4_addrs_common()
fi
done
done
+
return $_ret
}
-# ifalias_up if
+# ifalias_up if af
# Configure aliases for network interface $if.
# It returns 0 if at least one alias was configured or
# 1 if there were none.
#
ifalias_up()
{
+ local _ret
+ _ret=1
+
+ case "$2" in
+ inet)
+ _ret=`ifalias_ipv4_up "$1"`
+ ;;
+ inet6)
+ _ret=`ifalias_ipv6_up "$1"`
+ ;;
+ esac
+
+ return $_ret
+}
+
+# ifalias_ipv4_up if
+# Helper function for ifalias_up(). Handles IPv4.
+#
+ifalias_ipv4_up()
+{
+ local _ret alias ifconfig_args
_ret=1
+
+ # ifconfig_IF_aliasN which starts with "inet"
alias=0
while : ; do
ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
- if [ -n "${ifconfig_args}" ]; then
- ifconfig $1 ${ifconfig_args} alias
+ case "${ifconfig_args}" in
+ inet\ *)
+ ifconfig $1 ${ifconfig_args} alias && _ret=0
+ ;;
+ "")
+ break
+ ;;
+ esac
alias=$((${alias} + 1))
- _ret=0
- else
+ done
+
+ return $_ret
+}
+
+# ifalias_ipv6_up if
+# Helper function for ifalias_up(). Handles IPv6.
+#
+ifalias_ipv6_up()
+{
+ local _ret alias ifconfig_args
+ _ret=1
+
+ # ifconfig_IF_aliasN which starts with "inet6"
+ alias=0
+ while : ; do
+ ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
+ case "${ifconfig_args}" in
+ inet6\ *)
+ ifconfig $1 ${ifconfig_args} alias && _ret=0
+ ;;
+ "")
break
- fi
+ ;;
+ esac
+ alias=$((${alias} + 1))
+ done
+
+ # backward compatibility: ipv6_ifconfig_IF_aliasN.
+ alias=0
+ while : ; do
+ ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF_alias${alias}`
+ case "${ifconfig_args}" in
+ "")
+ break
+ ;;
+ *)
+ ifconfig $1 inet6 ${ifconfig_args} alias && _ret=0
+ warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete."
+ " Use ifconfig_$1_aliasN instead."
+ ;;
+ esac
+ alias=$((${alias} + 1))
done
+
return $_ret
}
-#ifalias_down if
+#ifalias_down if af
# Remove aliases for network interface $if.
# It returns 0 if at least one alias was removed or
# 1 if there were none.
#
ifalias_down()
{
+ local _ret
+ _ret=1
+
+ case "$2" in
+ inet)
+ _ret=`ifalias_ipv4_down "$1"`
+ ;;
+ inet6)
+ _ret=`ifalias_ipv6_down "$1"`
+ ;;
+ esac
+
+ return $_ret
+}
+
+#ifalias_ipv4_down if
+# Helper function for ifalias_down(). Handles IPv4.
+#
+ifalias_ipv4_down()
+{
+ local _ret alias ifconfig_args
_ret=1
+
+ # ifconfig_IF_aliasN which starts with "inet"
alias=0
while : ; do
ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
- if [ -n "${ifconfig_args}" ]; then
- ifconfig $1 ${ifconfig_args} -alias
+ case "${ifconfig_args}" in
+ inet\ *)
+ ifconfig $1 ${ifconfig_args} -alias && _ret=0
+ ;;
+ "")
+ break
+ ;;
+ esac
alias=$((${alias} + 1))
- _ret=0
- else
+ done
+
+ return $_ret
+}
+
+#ifalias_ipv6_down if
+# Helper function for ifalias_down(). Handles IPv6.
+#
+ifalias_ipv6_down()
+{
+ local _ret alias ifconfig_args
+ _ret=1
+
+ # ifconfig_IF_aliasN which starts with "inet6"
+ alias=0
+ while : ; do
+ ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
+ case "${ifconfig_args}" in
+ inet6\ *)
+ ifconfig $1 ${ifconfig_args} -alias && _ret=0
+ ;;
+ "")
break
- fi
+ ;;
+ esac
+ alias=$((${alias} + 1))
+ done
+
+ # backward compatibility: ipv6_ifconfig_IF_aliasN.
+ while : ; do
+ ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF_alias${alias}`
+ case "${ifconfig_args}" in
+ "")
+ break
+ ;;
+ *)
+ ifconfig $1 inet6 ${ifconfig_args} -alias
+ alias=$((${alias} + 1))
+ warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete."
+ " Use ifconfig_$1_aliasN instead."
+ _ret=0
+ ;;
+ esac
done
+
return $_ret
}
+# ipv6_prefix_hostid_addr_up if
+# add IPv6 prefix + hostid addr to the interface $if
+ipv6_prefix_hostid_addr_up()
+{
+ local _if prefix laddr hostid j address
+ _if=$1
+ prefix=`get_if_var ${_if} ipv6_prefix_IF`
+
+ if [ -n "${prefix}" ]; then
+ laddr=`network6_getladdr ${_if}`
+ hostid=${laddr#fe80::}
+ hostid=${hostid%\%*}
+
+ for j in ${prefix}; do
+ address=$j\:${hostid}
+ ifconfig ${_if} inet6 ${address} prefixlen 64 alias
+
+ # if I am a router, add subnet router
+ # anycast address (RFC 2373).
+ if checkyesno ipv6_gateway_enable; then
+ ifconfig ${_if} inet6 $j:: prefixlen 64 \
+ alias anycast
+ fi
+ done
+ fi
+}
+
+# ipv6_accept_rtadv_up if
+# Enable accepting Router Advertisement and send Router
+# Solicitation message
+ipv6_accept_rtadv_up()
+{
+ if ipv6_autoconfif $1; then
+ ifconfig $1 inet6 accept_rtadv up
+ rtsol ${rtsol_flags} $1
+ fi
+}
+
+# ipv6_accept_rtadv_down if
+# Disable accepting Router Advertisement
+ipv6_accept_rtadv_down()
+{
+ if ipv6_autoconfif $1; then
+ ifconfig $1 inet6 -accept_rtadv
+ fi
+}
+
# ifscript_up if
# Evaluate a startup script for the $if interface.
# It returns 0 if a script was found and processed or
@@ -443,8 +849,9 @@ ifscript_up()
if [ -r /etc/start_if.$1 ]; then
. /etc/start_if.$1
return 0
+ else
+ return 1
fi
- return 1
}
# ifscript_down if
@@ -457,16 +864,20 @@ ifscript_down()
if [ -r /etc/stop_if.$1 ]; then
. /etc/stop_if.$1
return 0
+ else
+ return 1
fi
- return 1
}
# Create cloneable interfaces.
#
clone_up()
{
+ local _prefix _list ifn
_prefix=
_list=
+
+ # create_args_IF
for ifn in ${cloned_interfaces}; do
ifconfig ${ifn} create `get_if_var ${ifn} create_args_IF`
if [ $? -eq 0 ]; then
@@ -482,8 +893,10 @@ clone_up()
#
clone_down()
{
+ local _prefix _list ifn
_prefix=
_list=
+
for ifn in ${cloned_interfaces}; do
ifconfig ${ifn} destroy
if [ $? -eq 0 ]; then
@@ -501,7 +914,6 @@ childif_create()
{
local cfg child child_wlans create_args debug_flags ifn i
cfg=1
-
ifn=$1
# Create wireless interfaces
@@ -536,11 +948,14 @@ childif_create()
childif_destroy()
{
local cfg child child_wlans ifn
+ cfg=1
child_wlans="`get_if_var $ifn wlans_IF` `get_if_var $ifn vaps_IF`"
for child in ${child_wlans}; do
ifconfig $child destroy && cfg=0
done
+
+ return ${cfg}
}
# Create netgraph nodes.
@@ -553,6 +968,8 @@ EOF
}
ng_create_one() {
+ local t
+
ng_mkpeer $* | while read line; do
t=`expr "${line}" : '.* name="\([a-z]*[0-9]*\)" .*'`
if [ -n "${t}" ]; then
@@ -563,6 +980,8 @@ ng_create_one() {
}
gif_up() {
+ local i peers
+
for i in ${gif_interfaces}; do
peers=`get_if_var $i gifconfig_IF`
case ${peers} in
@@ -586,7 +1005,8 @@ gif_up() {
# ng_fec_create ifn
# Configure Fast EtherChannel for interface $ifn. Returns 0 if FEC
# arguments were found and configured; returns !0 otherwise.
-ng_fec_create() {
+ng_fec_create()
+{
local req_iface iface bogus
req_iface="$1"
@@ -610,6 +1030,8 @@ ng_fec_create() {
}
fec_up() {
+ local i j
+
for i in ${fec_interfaces}; do
ng_fec_create $i
for j in `get_if_var $i fecconfig_IF`; do
@@ -632,12 +1054,16 @@ fec_up() {
#
ipx_up()
{
+ local ifn
ifn="$1"
- ifconfig_args=`get_if_var $ifn ifconfig_IF_ipx`
+
+ # ifconfig_IF_ipx
+ ifconfig_args=`_ifconfig_getargs $ifn ipx`
if [ -n "${ifconfig_args}" ]; then
ifconfig ${ifn} ${ifconfig_args}
return 0
fi
+
return 1
}
@@ -647,15 +1073,13 @@ ipx_up()
#
ipx_down()
{
- [ -z "$1" ] && return 1
+ local _if _ifs _ret ipxList oldifs _ipx
+ _if=$1
_ifs="^"
_ret=1
-
- ifexists $1 || return 1
-
- ipxList="`ifconfig $1 | grep 'ipx ' | tr "\n" "$_ifs"`"
-
+ ipxList="`ifconfig ${_if} | grep 'ipx ' | tr "\n" "$_ifs"`"
oldifs="$IFS"
+
IFS="$_ifs"
for _ipx in $ipxList ; do
# get rid of extraneous line
@@ -664,7 +1088,7 @@ ipx_down()
_ipx=`expr "$_ipx" : '.*\(ipx [0-9a-h]\{1,8\}H*\.[0-9a-h]\{1,12\}\).*'`
IFS="$oldifs"
- ifconfig $1 ${_ipx} delete
+ ifconfig ${_if} ${_ipx} delete
IFS="$_ifs"
_ret=0
done
@@ -678,25 +1102,29 @@ ipx_down()
#
ifnet_rename()
{
+ local _if _ifname
- _ifn_list="`ifconfig -l`"
- [ -z "$_ifn_list" ] && return 0
- for _if in ${_ifn_list} ; do
+ # ifconfig_IF_name
+ for _if in `ifconfig -l`; do
_ifname=`get_if_var $_if ifconfig_IF_name`
if [ ! -z "$_ifname" ]; then
ifconfig $_if name $_ifname
fi
done
+
return 0
}
-#
# list_net_interfaces type
# List all network interfaces. The type of interface returned
# can be controlled by the type argument. The type
# argument can be any of the following:
# nodhcp - all interfaces, excluding DHCP configured interfaces
# dhcp - list only DHCP configured interfaces
+# noautoconf - all interfaces, excluding IPv6 Stateless
+# Address Autoconf configured interfaces
+# autoconf - list only IPv6 Stateless Address Autoconf
+# configured interfaces
# If no argument is specified all network interfaces are output.
# Note that the list will include cloned interfaces if applicable.
# Cloned interfaces must already exist to have a chance to appear
@@ -704,13 +1132,14 @@ ifnet_rename()
#
list_net_interfaces()
{
+ local type _tmplist _list _autolist _lo _if
type=$1
# Get a list of ALL the interfaces and make lo0 first if it's there.
#
+ _tmplist=
case ${network_interfaces} in
[Aa][Uu][Tt][Oo])
- _prefix=''
_autolist="`ifconfig -l`"
_lo=
for _if in ${_autolist} ; do
@@ -718,12 +1147,11 @@ list_net_interfaces()
if [ "$_if" = "lo0" ]; then
_lo="lo0 "
else
- _tmplist="${_tmplist}${_prefix}${_if}"
- [ -z "$_prefix" ] && _prefix=' '
+ _tmplist="${_tmplist} ${_if}"
fi
fi
done
- _tmplist="${_lo}${_tmplist}"
+ _tmplist="${_lo}${_tmplist# }"
;;
*)
_tmplist="${network_interfaces} ${cloned_interfaces}"
@@ -737,33 +1165,45 @@ list_net_interfaces()
;;
esac
- if [ -z "$type" ]; then
- echo $_tmplist
- return 0
+ _list=
+ case "$type" in
+ nodhcp)
+ for _if in ${_tmplist} ; do
+ if ! dhcpif $_if && \
+ [ -n "`_ifconfig_getargs $_if`" ]; then
+ _list="${_list# } ${_if}"
fi
-
- # Separate out dhcp and non-dhcp interfaces
- #
- _aprefix=
- _bprefix=
+ done
+ ;;
+ dhcp)
for _if in ${_tmplist} ; do
if dhcpif $_if; then
- _dhcplist="${_dhcplist}${_aprefix}${_if}"
- [ -z "$_aprefix" ] && _aprefix=' '
- elif [ -n "`_ifconfig_getargs $_if`" ]; then
- _nodhcplist="${_nodhcplist}${_bprefix}${_if}"
- [ -z "$_bprefix" ] && _bprefix=' '
+ _list="${_list# } ${_if}"
fi
done
-
- case "$type" in
- nodhcp)
- echo $_nodhcplist
;;
- dhcp)
- echo $_dhcplist
+ noautoconf)
+ for _if in ${_tmplist} ; do
+ if ! ipv6_autoconfif $_if && \
+ [ -n "`_ifconfig_getargs $_if ipv6`" ]; then
+ _list="${_list# } ${_if}"
+ fi
+ done
+ ;;
+ autoconf)
+ for _if in ${_tmplist} ; do
+ if ipv6_autoconfif $_if; then
+ _list="${_list# } ${_if}"
+ fi
+ done
+ ;;
+ *)
+ _list=${_tmplist}
;;
esac
+
+ echo $_list
+
return 0
}
@@ -773,12 +1213,12 @@ list_net_interfaces()
#
get_default_if()
{
- routeget="`route -n get $1 default 2>/dev/null`"
+ local routeget oldifs defif line
+ defif=
oldifs="$IFS"
IFS="
"
- defif=
- for line in $routeget ; do
+ for line in `route -n get $1 default 2>/dev/null`; do
case $line in
*interface:*)
defif=${line##*: }
@@ -808,12 +1248,13 @@ hexdigit()
hexprint()
{
+ local val str dig
val=$1
str=''
-
dig=`hexdigit $((${val} & 15))`
str=${dig}${str}
val=$((${val} >> 4))
+
while [ ${val} -gt 0 ]; do
dig=`hexdigit $((${val} & 15))`
str=${dig}${str}
@@ -834,255 +1275,9 @@ is_wired_interface()
test "$media" = "Ethernet"
}
-# Setup the interfaces for IPv6
-network6_interface_setup()
-{
- interfaces=$*
- rtsol_interfaces=''
- case ${ipv6_gateway_enable} in
- [Yy][Ee][Ss])
- rtsol_available=no
- ;;
- *)
- rtsol_available=yes
- ;;
- esac
- for i in $interfaces; do
- rtsol_interface=yes
- prefix=`get_if_var $i ipv6_prefix_IF`
- if [ -n "${prefix}" ]; then
- rtsol_available=no
- rtsol_interface=no
- laddr=`network6_getladdr $i`
- hostid=`expr "${laddr}" : 'fe80::\(.*\)%\(.*\)'`
- for j in ${prefix}; do
- address=$j\:${hostid}
- ifconfig $i inet6 ${address} prefixlen 64 alias
-
- case ${ipv6_gateway_enable} in
- [Yy][Ee][Ss])
- # subnet-router anycast address
- # (rfc2373)
- ifconfig $i inet6 $j:: prefixlen 64 \
- alias anycast
- ;;
- esac
- done
- fi
- ipv6_ifconfig=`get_if_var $i ipv6_ifconfig_IF`
- if [ -n "${ipv6_ifconfig}" ]; then
- rtsol_available=no
- rtsol_interface=no
- ifconfig $i inet6 ${ipv6_ifconfig} alias
- fi
-
- # Wireless NIC cards are virtualized through the wlan interface
- if ! is_wired_interface ${i}; then
- case "${i}" in
- wlan*) rtsol_interface=yes ;;
- *) rtsol_interface=no ;;
- esac
- fi
-
- if [ ${rtsol_available} = yes -a ${rtsol_interface} = yes ]
- then
- case ${i} in
- lo0|gif[0-9]*|stf[0-9]*|faith[0-9]*|lp[0-9]*|sl[0-9]*|tun[0-9]*|pflog[0-9]*|pfsync[0-9]*)
- ;;
- *)
- rtsol_interfaces="${rtsol_interfaces} ${i}"
- ;;
- esac
- else
- ifconfig $i inet6
- fi
- done
-
- if [ ${rtsol_available} = yes -a -n "${rtsol_interfaces}" ]; then
- # Act as endhost - automatically configured.
- # You can configure only single interface, as
- # specification assumes that autoconfigured host has
- # single interface only.
- sysctl net.inet6.ip6.accept_rtadv=1
- set ${rtsol_interfaces}
- ifconfig $1 up
- rtsol ${rtsol_flags} $1
- fi
-
- for i in $interfaces; do
- alias=0
- while : ; do
- ipv6_ifconfig=`get_if_var $i ipv6_ifconfig_IF_alias${alias}`
- if [ -z "${ipv6_ifconfig}" ]; then
- break;
- fi
- ifconfig $i inet6 ${ipv6_ifconfig} alias
- alias=$((${alias} + 1))
- done
- done
-}
-
-# Setup IPv6 to IPv4 mapping
-network6_stf_setup()
-{
- case ${stf_interface_ipv4addr} in
- [Nn][Oo] | '')
- ;;
- *)
- # assign IPv6 addr and interface route for 6to4 interface
- stf_prefixlen=$((16+${stf_interface_ipv4plen:-0}))
- OIFS="$IFS"
- IFS=".$IFS"
- set ${stf_interface_ipv4addr}
- IFS="$OIFS"
- hexfrag1=`hexprint $(($1*256 + $2))`
- hexfrag2=`hexprint $(($3*256 + $4))`
- ipv4_in_hexformat="${hexfrag1}:${hexfrag2}"
- case ${stf_interface_ipv6_ifid} in
- [Aa][Uu][Tt][Oo] | '')
- for i in ${ipv6_network_interfaces}; do
- laddr=`network6_getladdr ${i}`
- case ${laddr} in
- '')
- ;;
- *)
- break
- ;;
- esac
- done
- stf_interface_ipv6_ifid=`expr "${laddr}" : \
- 'fe80::\(.*\)%\(.*\)'`
- case ${stf_interface_ipv6_ifid} in
- '')
- stf_interface_ipv6_ifid=0:0:0:1
- ;;
- esac
- ;;
- esac
- ifconfig stf0 create >/dev/null 2>&1
- ifconfig stf0 inet6 2002:${ipv4_in_hexformat}:${stf_interface_ipv6_slaid:-0}:${stf_interface_ipv6_ifid} \
- prefixlen ${stf_prefixlen}
- # disallow packets to malicious 6to4 prefix
- route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject
- route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject
- route add -inet6 2002:0000:: -prefixlen 24 ::1 -reject
- route add -inet6 2002:ff00:: -prefixlen 24 ::1 -reject
- ;;
- esac
-}
-
-# Setup static routes
-network6_static_routes_setup()
-{
- # Set up any static routes.
- case ${ipv6_defaultrouter} in
- [Nn][Oo] | '')
- ;;
- *)
- ipv6_static_routes="default ${ipv6_static_routes}"
- ipv6_route_default="default ${ipv6_defaultrouter}"
- ;;
- esac
- case ${ipv6_static_routes} in
- [Nn][Oo] | '')
- ;;
- *)
- for i in ${ipv6_static_routes}; do
- ipv6_route_args=`get_if_var $i ipv6_route_IF`
- route add -inet6 ${ipv6_route_args}
- done
- ;;
- esac
-}
-
-# Setup faith
-network6_faith_setup()
-{
- case ${ipv6_faith_prefix} in
- [Nn][Oo] | '')
- ;;
- *)
- sysctl net.inet6.ip6.keepfaith=1
- ifconfig faith0 create >/dev/null 2>&1
- ifconfig faith0 up
- for prefix in ${ipv6_faith_prefix}; do
- prefixlen=`expr "${prefix}" : ".*/\(.*\)"`
- case ${prefixlen} in
- '')
- prefixlen=96
- ;;
- *)
- prefix=`expr "${prefix}" : \
- "\(.*\)/${prefixlen}"`
- ;;
- esac
- route add -inet6 ${prefix} -prefixlen ${prefixlen} ::1
- route change -inet6 ${prefix} -prefixlen ${prefixlen} \
- -ifp faith0
- done
- ;;
- esac
-}
-
-# Install the "default interface" to kernel, which will be used
-# as the default route when there's no router.
-network6_default_interface_setup()
-{
- # Choose IPv6 default interface if it is not clearly specified.
- case ${ipv6_default_interface} in
- '')
- for i in ${ipv6_network_interfaces}; do
- case $i in
- lo0|faith[0-9]*)
- continue
- ;;
- esac
- laddr=`network6_getladdr $i exclude_tentative`
- case ${laddr} in
- '')
- ;;
- *)
- ipv6_default_interface=$i
- break
- ;;
- esac
- done
- ;;
- esac
-
- # Disallow unicast packets without outgoing scope identifiers,
- # or route such packets to a "default" interface, if it is specified.
- route add -inet6 fe80:: -prefixlen 10 ::1 -reject
- case ${ipv6_default_interface} in
- [Nn][Oo] | '')
- route add -inet6 ff02:: -prefixlen 16 ::1 -reject
- ;;
- *)
- laddr=`network6_getladdr ${ipv6_default_interface}`
- route add -inet6 ff02:: ${laddr} -prefixlen 16 -interface \
- -cloning
-
- # Disable installing the default interface with the
- # case net.inet6.ip6.forwarding=0 and
- # net.inet6.ip6.accept_rtadv=0, due to avoid conflict
- # between the default router list and the manual
- # configured default route.
- case ${ipv6_gateway_enable} in
- [Yy][Ee][Ss])
- ;;
- *)
- if [ `sysctl -n net.inet6.ip6.accept_rtadv` -eq 1 ]
- then
- ndp -I ${ipv6_default_interface}
- fi
- ;;
- esac
- ;;
- esac
-}
-
network6_getladdr()
{
+ local proto addr rest
ifconfig $1 2>/dev/null | while read proto addr rest; do
case ${proto} in
inet6)
OpenPOWER on IntegriCloud