Author: hrs
Date: Fri Oct  4 02:44:04 2013
New Revision: 256039
URL: http://svnweb.freebsd.org/changeset/base/256039

Log:
  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)

Modified:
  head/etc/network.subr
  head/etc/rc.d/netif

Modified: head/etc/network.subr
==============================================================================
--- head/etc/network.subr       Fri Oct  4 02:21:39 2013        (r256038)
+++ head/etc/network.subr       Fri Oct  4 02:44:04 2013        (r256039)
@@ -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

Modified: head/etc/rc.d/netif
==============================================================================
--- head/etc/rc.d/netif Fri Oct  4 02:21:39 2013        (r256038)
+++ head/etc/rc.d/netif Fri Oct  4 02:44:04 2013        (r256039)
@@ -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)
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to