svn commit: r256039 - in head/etc: . rc.d

Hiroki Sato hrs at FreeBSD.org
Fri Oct 4 02:44:05 UTC 2013


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)


More information about the svn-src-head mailing list