Date: Mon, 22 Jul 2013 02:45:13 +0900 (JST) From: Hiroki Sato <hrs@FreeBSD.org> To: current@FreeBSD.org, freebsd-rc@FreeBSD.org Subject: CFT: cloned_interfaces and gifconfig in rc.d/netif Message-ID: <20130722.024513.95685108976349294.hrs@allbsd.org>
next in thread | raw e-mail | index | archive | help
----Security_Multipart0(Mon_Jul_22_02_45_13_2013_666)--
Content-Type: Multipart/Mixed;
boundary="--Next_Part(Mon_Jul_22_02_45_13_2013_191)--"
Content-Transfer-Encoding: 7bit
----Next_Part(Mon_Jul_22_02_45_13_2013_191)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Hi,
The attached patch allows rc.d/netif to create IFs in
$cloned_interfaces when interface name(s) is specified. For example,
when the following lines are in rc.conf:
cloned_interfaces="bridge0 bridge1"
ifconfig_bridge0="..."
ifconfig_bridge1="..."
The following commands create the interfaces and destroy them.
# /etc/rc.d/netif start bridge0 bridge1
# /etc/rc.d/netif stop bridge0 bridge1
netif cloneup/clonedown does this without the patch, but it cannot
configure the interfaces and does not support clean teardown.
Also, routines which handle $gif_interfaces are merged into ones for
$cloned_interfaces. ifconfig_gifN and other variants did not work
with gif interfaces defined in $gif_interfaces. The patch solves
this issue.
Basically there should be no functionality regression for the
existing configurations. Can anyone who are using $gif_interfaces
and/or $cloned_interfaces test this? I would like to know if there is
regression or not.
-- Hiroki
----Next_Part(Mon_Jul_22_02_45_13_2013_191)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="network.subr.gifconfig.20130722-1.diff"
Index: etc/network.subr
===================================================================
--- etc/network.subr (revision 253520)
+++ etc/network.subr (working copy)
@@ -660,6 +660,11 @@
IFS="$_ifs"
for _inet in $inetList ; do
# get rid of extraneous line
+ case $_inet in
+ "") break ;;
+ inet\ *) ;;
+ *) continue ;;
+ esac
[ -z "$_inet" ] && break
_inet=`expr "$_inet" : '.*\(inet \([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*'`
@@ -1192,12 +1197,17 @@
#
clone_up()
{
- local _prefix _list ifn
+ local _prefix _list ifn _iflist _n tmpargs
_prefix=
_list=
+ _iflist=$*
# create_args_IF
for ifn in ${cloned_interfaces}; do
+ case $_iflist in
+ ""|$ifn|$ifn\ *|*\ $ifn\ *|*\ $ifn) ;;
+ *) continue ;;
+ esac
${IFCONFIG_CMD} ${ifn} create `get_if_var ${ifn} create_args_IF`
if [ $? -eq 0 ]; then
_list="${_list}${_prefix}${ifn}"
@@ -1204,6 +1214,30 @@
[ -z "$_prefix" ] && _prefix=' '
fi
done
+ if [ -n "$gif_interfaces" ]; then
+ warn "\$gif_interfaces is obsolete. Use \$cloned_interfaces instead."
+ fi
+ for ifn in ${gif_interfaces}; do
+ case $_iflist in
+ ""|$ifn|$ifn\ *|*\ $ifn\ *|*\ $ifn) ;;
+ *) continue ;;
+ esac
+ case $ifn in
+ gif[0-9]*)
+ ${IFCONFIG_CMD} $ifn create
+ ;;
+ *)
+ _n=$(${IFCONFIG_CMD} gif create)
+ ${IFCONFIG_CMD} $_n name $ifn
+ ;;
+ esac
+ if [ $? -eq 0 ]; then
+ _list="${_list}${_prefix}${ifn}"
+ [ -z "$_prefix" ] && _prefix=' '
+ fi
+ tmpargs=$(get_if_var $ifn gifconfig_IF)
+ eval ifconfig_${ifn}=\"tunnel \$tmpargs\"
+ done
debug "Cloned: ${_list}"
}
@@ -1213,11 +1247,16 @@
#
clone_down()
{
- local _prefix _list ifn
+ local _prefix _list ifn _iflist
_prefix=
_list=
+ _iflist=$*
- for ifn in ${cloned_interfaces}; do
+ for ifn in ${cloned_interfaces} ${gif_interfaces}; do
+ case $_iflist in
+ ""|$ifn|$ifn\ *|*\ $ifn\ *|*\ $ifn) ;;
+ *) continue ;;
+ esac
${IFCONFIG_CMD} -n ${ifn} destroy
if [ $? -eq 0 ]; then
_list="${_list}${_prefix}${ifn}"
@@ -1224,6 +1263,9 @@
[ -z "$_prefix" ] && _prefix=' '
fi
done
+ if [ -n "${_list}" ]; then
+ echo "Destroyed clone interfaces: ${_list}."
+ fi
debug "Destroyed clones: ${_list}"
}
@@ -1347,32 +1389,6 @@
done
}
-# gif_up
-# Create gif(4) tunnel interfaces.
-gif_up()
-{
- local i peers
-
- for i in ${gif_interfaces}; do
- peers=`get_if_var $i gifconfig_IF`
- case ${peers} in
- '')
- continue
- ;;
- *)
- if expr $i : 'gif[0-9][0-9]*$' >/dev/null 2>&1; then
- ${IFCONFIG_CMD} $i create >/dev/null 2>&1
- else
- gif=`${IFCONFIG_CMD} gif create`
- ${IFCONFIG_CMD} $gif name $i
- fi
- ${IFCONFIG_CMD} $i tunnel ${peers}
- ${IFCONFIG_CMD} $i up
- ;;
- esac
- done
-}
-
# ng_fec_create ifn
# Configure Fast EtherChannel for interface $ifn. Returns 0 if
# FEC arguments were found and configured; returns !0 otherwise.
Index: etc/rc.d/netif
===================================================================
--- etc/rc.d/netif (revision 253505)
+++ etc/rc.d/netif (working copy)
@@ -60,18 +60,15 @@
# disable SIGINT (Ctrl-c) when running at startup
trap : 2
- # Create cloned interfaces
- clone_up
-
# Create Fast EtherChannel interfaces
fec_up
+ fi
- # Create IPv6<-->IPv4 tunnels
- gif_up
+ # Create cloned interfaces
+ clone_up $cmdifn
- # Rename interfaces.
- ifnet_rename
- fi
+ # Rename interfaces.
+ ifnet_rename $cmdifn
# Configure the interface(s).
network_common ifn_start
@@ -101,6 +98,9 @@
# Deconfigure the interface(s)
network_common ifn_stop
+ # Destroy cloned interfaces
+ clone_down $cmdifn
+
if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then
for _if in $cmdifn; do
/etc/rc.d/routing stop any $_if
----Next_Part(Mon_Jul_22_02_45_13_2013_191)----
----Security_Multipart0(Mon_Jul_22_02_45_13_2013_666)--
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.13 (FreeBSD)
iEYEABECAAYFAlHsHikACgkQTyzT2CeTzy0BogCdE5YAjK6IoMYAGLRNQtJb85kO
uusAoIAK/yibxY5FiY3h67CIL1oXaOjB
=uK+4
-----END PGP SIGNATURE-----
----Security_Multipart0(Mon_Jul_22_02_45_13_2013_666)----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130722.024513.95685108976349294.hrs>
