Author: hrs
Date: Sun Aug  4 06:36:17 2013
New Revision: 253924
URL: http://svnweb.freebsd.org/changeset/base/253924

Log:
  - Reimplement $gif_interfaces as a variant of $cloned_interfaces.
    Newly-configured systems should use $cloned_interfaces.
  
  - Call clone_{up,down}() and ifnet_rename() in rc.d/netif {start,stop}.
    ifnet_rename() now accepts an interface name list as its argument.
  
  - Add rc.d/netif clear.  The "clear" subcommand is basically equivalent to
    "stop" but it does not call clone_down().
  
  - Add "ifname:sticky" keyword into $cloned_interfaces.  If :sticky is
    specified, the interface will not be destroyed in rc.d/netif stop.
  
  - Add cloned_interfaces_sticky={YES,NO}.  This variable globally sets
    :sticky keyword above for all interfaces.  The default value is NO.
    When cloned_interfaces_sticky=YES, :nosticky keyword can be used to
    override it on per interface basis.

Modified:
  head/etc/network.subr
  head/etc/rc.d/netif
  head/share/man/man5/rc.conf.5

Modified: head/etc/network.subr
==============================================================================
--- head/etc/network.subr       Sun Aug  4 02:37:05 2013        (r253923)
+++ head/etc/network.subr       Sun Aug  4 06:36:17 2013        (r253924)
@@ -660,6 +660,11 @@ ipv4_down()
        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,18 +1197,62 @@ ifscript_down()
 #
 clone_up()
 {
-       local _prefix _list ifn
+       local _prefix _list ifn ifopt _iflist _n tmpargs
        _prefix=
        _list=
+       _iflist=$*
 
        # create_args_IF
        for ifn in ${cloned_interfaces}; do
+               # Parse ifn:ifopt.
+               OIFS=$IFS; IFS=:; set -- $ifn; ifn=$1; ifopt=$2; IFS=$OIFS
+               case $_iflist in
+               ""|$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
        done
+       if [ -n "$gif_interfaces" ]; then
+               warn "\$gif_interfaces is obsolete.  Use \$cloned_interfaces 
instead."
+       fi
+       for ifn in ${gif_interfaces}; do
+               # Parse ifn:ifopt.
+               OIFS=$IFS; IFS=:; set -- $ifn; ifn=$1; ifopt=$2; IFS=$OIFS
+               case $_iflist in
+               ""|$ifn|$ifn\ *|*\ $ifn\ *|*\ $ifn)     ;;
+               *)      continue ;;
+               esac
+               # Skip if ifn already exists.
+               if ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
+                       continue
+               fi
+               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
+       if [ -n "${_list}" ]; then
+               echo "Created clone interfaces: ${_list}."
+       fi
        debug "Cloned: ${_list}"
 }
 
@@ -1213,17 +1262,42 @@ clone_up()
 #
 clone_down()
 {
-       local _prefix _list ifn
+       local _prefix _list ifn ifopt _iflist _sticky
        _prefix=
        _list=
+       _iflist=$*
 
-       for ifn in ${cloned_interfaces}; do
+       : ${cloned_interfaces_sticky:=NO}
+       if checkyesno cloned_interfaces_sticky; then
+               _sticky=1
+       else
+               _sticky=0
+       fi
+       for ifn in ${cloned_interfaces} ${gif_interfaces}; do
+               # Parse ifn:ifopt.
+               OIFS=$IFS; IFS=:; set -- $ifn; ifn=$1; ifopt=$2; IFS=$OIFS
+               case $ifopt:$_sticky in
+               sticky:*)       continue ;;     # :sticky => not destroy
+               nosticky:*)     ;;              # :nosticky => destroy
+               *:1)            continue ;;     # global sticky knob == 1
+               esac
+               case $_iflist in
+               ""|$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
        done
+       if [ -n "${_list}" ]; then
+               echo "Destroyed clone interfaces: ${_list}."
+       fi
        debug "Destroyed clones: ${_list}"
 }
 
@@ -1347,32 +1421,6 @@ ng_create_one()
        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.
@@ -1470,15 +1518,15 @@ ipx_down()
        return $_ret
 }
 
-# ifnet_rename
-#      Rename all requested interfaces.
+# ifnet_rename [ifname]
+#      Rename interfaces if ifconfig_IF_name is defined.
 #
 ifnet_rename()
 {
        local _if _ifname
 
        # ifconfig_IF_name
-       for _if in `${IFCONFIG_CMD} -l`; do
+       for _if in ${*:-$(${IFCONFIG_CMD} -l)}; do
                _ifname=`get_if_var $_if ifconfig_IF_name`
                if [ ! -z "$_ifname" ]; then
                        ${IFCONFIG_CMD} $_if name $_ifname

Modified: head/etc/rc.d/netif
==============================================================================
--- head/etc/rc.d/netif Sun Aug  4 02:37:05 2013        (r253923)
+++ head/etc/rc.d/netif Sun Aug  4 06:36:17 2013        (r253924)
@@ -38,7 +38,8 @@ start_cmd="network_start"
 stop_cmd="network_stop"
 cloneup_cmd="clone_up"
 clonedown_cmd="clone_down"
-extra_commands="cloneup clonedown"
+clear_cmd="doclear"
+extra_commands="cloneup clonedown clear"
 cmdifn=
 
 set_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces
@@ -60,18 +61,15 @@ network_start()
                # 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
@@ -92,6 +90,18 @@ network_start()
 
 network_stop()
 {
+       _clone_down=1
+       network_stop0 $*
+}
+
+doclear()
+{
+       _clone_down=
+       network_stop0 $*
+}
+
+network_stop0()
+{
        local _if
 
        # Set the list of interfaces to work on.
@@ -101,6 +111,11 @@ network_stop()
        # Deconfigure the interface(s)
        network_common ifn_stop
 
+       # Destroy cloned interfaces
+       if [ -n "$_clone_down" ]; then
+               clone_down $cmdifn
+       fi
+
        if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then
                for _if in $cmdifn; do
                        /etc/rc.d/routing stop any $_if
@@ -142,6 +157,16 @@ network_common()
        _fail=
        _ok=
        for ifn in ${_cooked_list}; do
+               # Skip if ifn does not exist.
+               case $_func in
+               ifn_stop)
+                       if ! ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then
+                               warn "$ifn does not exist.  Skipped."
+                               _fail="${_fail} ${ifn}"
+                               continue
+                       fi
+               ;;
+               esac
                if ${_func} ${ifn} $2; then
                        _ok="${_ok} ${ifn}"
                        if ipv6if ${ifn}; then

Modified: head/share/man/man5/rc.conf.5
==============================================================================
--- head/share/man/man5/rc.conf.5       Sun Aug  4 02:37:05 2013        
(r253923)
+++ head/share/man/man5/rc.conf.5       Sun Aug  4 06:36:17 2013        
(r253924)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 12, 2013
+.Dd July 22, 2013
 .Dt RC.CONF 5
 .Os
 .Sh NAME
@@ -1651,11 +1651,33 @@ Further cloning arguments may be passed 
 command for each interface by setting the
 .Va create_args_ Ns Aq Ar interface
 variable.
+If an interface name is specified with
+.Dq :sticky
+keyword,
+the interface will not be destroyed even when
+.Pa rc.d/netif
+script is invoked with
+.Dq stop
+argument.
+This is useful when reconfiguring the interface without destroying it.
 Entries in
 .Va cloned_interfaces
 are automatically appended to
 .Va network_interfaces
 for configuration.
+.It Va cloned_interfaces_sticky
+.Pq Vt bool
+This variable is to globally enable functionality of
+.Dq :sticky
+keyword in
+.Va cloned_interfaces
+for all interfaces.
+The default value is
+.Dq NO .
+Even if this variable is specified to
+.Dq YES ,
+.Dq :nosticky
+keyword can be used to override it on per interface basis.
 .It Va fec_interfaces
 .Pq Vt str
 Set to the list of
@@ -1685,6 +1707,8 @@ ifconfig_fec0="DHCP"
 .Ed
 .It Va gif_interfaces
 .Pq Vt str
+This variable is deprecated in favor of
+.Va cloned_interfaces .
 Set to the list of
 .Xr gif 4
 tunnel interfaces to configure on this host.
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to