From owner-svn-src-head@FreeBSD.ORG Fri Oct 4 02:44:05 2013 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id C4C66E40; Fri, 4 Oct 2013 02:44:05 +0000 (UTC) (envelope-from hrs@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id A44822ECC; Fri, 4 Oct 2013 02:44:05 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r942i5JH006728; Fri, 4 Oct 2013 02:44:05 GMT (envelope-from hrs@svn.freebsd.org) Received: (from hrs@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r942i5bv006725; Fri, 4 Oct 2013 02:44:05 GMT (envelope-from hrs@svn.freebsd.org) Message-Id: <201310040244.r942i5bv006725@svn.freebsd.org> From: Hiroki Sato Date: Fri, 4 Oct 2013 02:44:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r256039 - in head/etc: . rc.d X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Oct 2013 02:44:05 -0000 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)