Add epair(4) support in $cloned_interfaces. One should be specified

as "epair0" in $cloned_interfaces and "epair0[ab]" in the others in
rc.conf like the following:

 cloned_interfaces="epair0"
 ifconfig_epair0a="inet 192.168.1.1/24"
 ifconfig_epair0b="inet 192.168.2.1/24"

/etc/rc.d/netif now accepts both "netif start epair0" and "netif start
epair0a".

Approved by:	re (kib)
This commit is contained in:
hrs 2013-10-04 02:44:04 +00:00
parent e1fc8db7f4
commit 1315bdcd1c
2 changed files with 118 additions and 47 deletions

View File

@ -1198,8 +1198,7 @@ ifscript_down()
#
clone_up()
{
local _prefix _list ifn ifopt _iflist _n tmpargs
_prefix=
local _list ifn ifopt _iflist _n tmpargs
_list=
_iflist=$*
@ -1211,15 +1210,34 @@ clone_up()
""|$ifn|$ifn\ *|*\ $ifn\ *|*\ $ifn) ;;
*) continue ;;
esac
# Skip if ifn already exists.
if ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
continue
fi
${IFCONFIG_CMD} ${ifn} create `get_if_var ${ifn} create_args_IF`
if [ $? -eq 0 ]; then
_list="${_list}${_prefix}${ifn}"
[ -z "$_prefix" ] && _prefix=' '
fi
case $ifn in
epair[0-9]*)
# epair(4) uses epair[0-9] for creation and
# epair[0-9][ab] for configuration.
#
# Skip if ${ifn}a or ${ifn}b already exist.
if ${IFCONFIG_CMD} ${ifn}a > /dev/null 2>&1; then
continue
elif ${IFCONFIG_CMD} ${ifn}b > /dev/null 2>&1; then
continue
fi
${IFCONFIG_CMD} ${ifn} create \
`get_if_var ${ifn} create_args_IF`
if [ $? -eq 0 ]; then
_list="$_list ${ifn}a ${ifn}b"
fi
;;
*)
# Skip if ${ifn} already exists.
if ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
continue
fi
${IFCONFIG_CMD} ${ifn} create \
`get_if_var ${ifn} create_args_IF`
if [ $? -eq 0 ]; then
_list="$_list $ifn"
fi
esac
done
if [ -n "$gif_interfaces" ]; then
warn "\$gif_interfaces is obsolete. Use \$cloned_interfaces instead."
@ -1245,16 +1263,15 @@ clone_up()
;;
esac
if [ $? -eq 0 ]; then
_list="${_list}${_prefix}${ifn}"
[ -z "$_prefix" ] && _prefix=' '
_list="$_list $ifn"
fi
tmpargs=$(get_if_var $ifn gifconfig_IF)
eval ifconfig_${ifn}=\"tunnel \$tmpargs\"
done
if [ -n "${_list}" ]; then
echo "Created clone interfaces: ${_list}."
if [ -n "${_list# }" ]; then
echo "Created clone interfaces: ${_list# }."
fi
debug "Cloned: ${_list}"
debug "Cloned: ${_list# }"
}
# clone_down
@ -1263,8 +1280,7 @@ clone_up()
#
clone_down()
{
local _prefix _list ifn ifopt _iflist _sticky
_prefix=
local _list ifn _difn ifopt _iflist _sticky
_list=
_iflist=$*
@ -1286,20 +1302,40 @@ clone_down()
""|$ifn|$ifn\ *|*\ $ifn\ *|*\ $ifn) ;;
*) continue ;;
esac
# Skip if ifn does not exist.
if ! ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
continue
fi
${IFCONFIG_CMD} -n ${ifn} destroy
if [ $? -eq 0 ]; then
_list="${_list}${_prefix}${ifn}"
[ -z "$_prefix" ] && _prefix=' '
fi
case $ifn in
epair[0-9]*)
# Note: epair(4) uses epair[0-9] for removal and
# epair[0-9][ab] for configuration.
#
# Skip if both of ${ifn}a and ${ifn}b do not exist.
if ${IFCONFIG_CMD} ${ifn}a > /dev/null 2>&1; then
_difn=${ifn}a
elif ${IFCONFIG_CMD} ${ifn}b > /dev/null 2>&1; then
_difn=${ifn}b
else
continue
fi
${IFCONFIG_CMD} -n $_difn destroy
if [ $? -eq 0 ]; then
_list="$_list ${ifn}a ${ifn}b"
fi
;;
*)
# Skip if ifn does not exist.
if ! ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
continue
fi
${IFCONFIG_CMD} -n ${ifn} destroy
if [ $? -eq 0 ]; then
_list="$_list $ifn"
fi
;;
esac
done
if [ -n "${_list}" ]; then
echo "Destroyed clone interfaces: ${_list}."
if [ -n "${_list# }" ]; then
echo "Destroyed clone interfaces: ${_list# }."
fi
debug "Destroyed clones: ${_list}"
debug "Destroyed clones: ${_list# }"
}
# childif_create
@ -1574,17 +1610,33 @@ list_net_interfaces()
fi
done
_tmplist="${_lo}${_tmplist# }"
;;
;;
*)
_tmplist="${network_interfaces} ${cloned_interfaces}"
for _if in ${network_interfaces} ${cloned_interfaces}; do
# epair(4) uses epair[0-9] for creation and
# epair[0-9][ab] for configuration.
case $_if in
epair[0-9]*)
_tmplist="$_tmplist ${_if}a ${_if}b"
;;
*)
_tmplist="$_tmplist $_if"
;;
esac
done
#
# lo0 is effectively mandatory, so help prevent foot-shooting
#
case "$_tmplist" in
lo0|'lo0 '*|*' lo0'|*' lo0 '*) ;; # This is fine, do nothing
*) _tmplist="lo0 ${_tmplist}" ;;
esac
lo0|'lo0 '*|*' lo0'|*' lo0 '*)
# This is fine, do nothing
_tmplist="${_tmplist# }"
;;
*)
_tmplist="lo0 ${_tmplist# }"
;;
esac
;;
esac
_list=
@ -1596,14 +1648,14 @@ list_net_interfaces()
_list="${_list# } ${_if}"
fi
done
;;
;;
dhcp)
for _if in ${_tmplist} ; do
if dhcpif $_if; then
_list="${_list# } ${_if}"
fi
done
;;
;;
noautoconf)
for _if in ${_tmplist} ; do
if ! ipv6_autoconfif $_if && \
@ -1611,17 +1663,17 @@ list_net_interfaces()
_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

View File

@ -72,7 +72,7 @@ network_start()
ifnet_rename $cmdifn
# Configure the interface(s).
network_common ifn_start
network_common ifn_start $cmdifn
if [ -f /etc/rc.d/ipfilter ] ; then
# Resync ipfilter
@ -109,7 +109,7 @@ network_stop0()
cmdifn=$*
# Deconfigure the interface(s)
network_common ifn_stop
network_common ifn_stop $cmdifn
# Destroy cloned interfaces
if [ -n "$_clone_down" ]; then
@ -129,7 +129,7 @@ network_stop0()
# an interface and then calls $routine.
network_common()
{
local _cooked_list _fail _func _ok _str
local _cooked_list _tmp_list _fail _func _ok _str _cmdifn
_func=
@ -137,26 +137,45 @@ network_common()
err 1 "network_common(): No function name specified."
else
_func="$1"
shift
fi
# Set the scope of the command (all interfaces or just one).
#
_cooked_list=
if [ -n "$cmdifn" ]; then
_tmp_list=
_cmdifn=$*
if [ -n "$_cmdifn" ]; then
# Don't check that the interface(s) exist. We need to run
# the down code even when the interface doesn't exist to
# kill off wpa_supplicant.
# XXXBED: is this really true or does wpa_supplicant die?
# if so, we should get rid of the devd entry
_cooked_list="$cmdifn"
_cooked_list="$_cmdifn"
else
_cooked_list="`list_net_interfaces`"
fi
# Expand epair[0-9] to epair[0-9][ab].
for ifn in $_cooked_list; do
case ${ifn#epair} in
[0-9]*[ab]) ;; # Skip epair[0-9]*[ab].
[0-9]*)
for _str in $_cooked_list; do
case $_str in
$ifn) _tmp_list="$_tmp_list ${ifn}a ${ifn}b" ;;
*) _tmp_list="$_tmp_list ${ifn}" ;;
esac
done
_cooked_list=${_tmp_list# }
;;
esac
done
_dadwait=
_fail=
_ok=
for ifn in ${_cooked_list}; do
for ifn in ${_cooked_list# }; do
# Skip if ifn does not exist.
case $_func in
ifn_stop)