[Midnightbsd-cvs] src [11692] trunk/etc/rc.d/netif: update netif

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sun Jul 8 16:30:37 EDT 2018


Revision: 11692
          http://svnweb.midnightbsd.org/src/?rev=11692
Author:   laffer1
Date:     2018-07-08 16:30:36 -0400 (Sun, 08 Jul 2018)
Log Message:
-----------
update netif

Modified Paths:
--------------
    trunk/etc/rc.d/netif

Modified: trunk/etc/rc.d/netif
===================================================================
--- trunk/etc/rc.d/netif	2018-07-08 20:30:04 UTC (rev 11691)
+++ trunk/etc/rc.d/netif	2018-07-08 20:30:36 UTC (rev 11692)
@@ -23,11 +23,10 @@
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 # $MidnightBSD$
-#
 
 # PROVIDE: netif
 # REQUIRE: atm1 FILESYSTEMS serial sppp sysctl
-# REQUIRE: ipfilter ipfs
+# REQUIRE: hostid ipfilter ipfs
 # KEYWORD: nojailvnet
 
 . /etc/rc.subr
@@ -38,7 +37,10 @@
 stop_cmd="network_stop"
 cloneup_cmd="clone_up"
 clonedown_cmd="clone_down"
-extra_commands="cloneup clonedown"
+clear_cmd="doclear"
+vnetup_cmd="vnet_up"
+vnetdown_cmd="vnet_down"
+extra_commands="cloneup clonedown clear vnetup vnetdown"
 cmdifn=
 
 set_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces
@@ -46,6 +48,8 @@
 
 network_start()
 {
+	local _if
+
 	# Set the list of interfaces to work on.
 	#
 	cmdifn=$*
@@ -58,21 +62,18 @@
 		# 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
+	network_common ifn_start $cmdifn
 
 	if [ -f /etc/rc.d/ipfilter ] ; then
 		# Resync ipfilter
@@ -81,18 +82,62 @@
 	if [ -f /etc/rc.d/bridge -a -n "$cmdifn" ] ; then
 		/etc/rc.d/bridge start $cmdifn
 	fi
+	if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then
+		for _if in $cmdifn; do
+			/etc/rc.d/routing static any $_if
+		done
+	fi
 }
 
 network_stop()
 {
+	_clone_down=1
+	network_stop0 $*
+}
+
+doclear()
+{
+	_clone_down=
+	network_stop0 $*
+}
+
+network_stop0()
+{
+	local _if
+
 	# Set the list of interfaces to work on.
 	#
 	cmdifn=$*
 
 	# Deconfigure the interface(s)
-	network_common ifn_stop
+	network_common ifn_stop $cmdifn
+
+	# 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
+		done
+	fi
 }
 
+vnet_up()
+{
+	cmdifn=$*
+
+	network_common ifn_vnetup $cmdifn
+}
+
+vnet_down()
+{
+	cmdifn=$*
+
+	network_common ifn_vnetdown $cmdifn
+}
+
 # network_common routine
 #	Common configuration subroutine for network interfaces. This
 #	routine takes all the preparatory steps needed for configuriing
@@ -99,7 +144,7 @@
 #	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=
 
@@ -107,43 +152,97 @@
 		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)
+			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
+				_dadwait=1
+			fi
 		else
 			_fail="${_fail} ${ifn}"
 		fi
 	done
 
+	# inet6 address configuration needs sleep for DAD.
+	case ${_func}:${_dadwait} in
+	ifn_start:1|ifn_vnetup:1|ifn_vnetdown:1)
+		sleep `${SYSCTL_N} net.inet6.ip6.dad_count`
+		sleep 1
+	;;
+	esac
+
 	_str=
 	if [ -n "${_ok}" ]; then
 		case ${_func} in
 		ifn_start)
 			_str='Starting'
-			;;
+		;;
 		ifn_stop)
 			_str='Stopping'
-			;;
+		;;
+		ifn_vnetup)
+			_str='Moving'
+		;;
+		ifn_vnetdown)
+			_str='Reclaiming'
+		;;
 		esac
 		echo "${_str} Network:${_ok}."
+		case ${_func} in
+		ifn_vnetup)
+			# Clear _ok not to do "ifconfig $ifn"
+			# because $ifn is no longer in the current vnet.
+			_ok=
+		;;
+		esac
 		if check_startmsgs; then
 			for ifn in ${_ok}; do
 				/sbin/ifconfig ${ifn}



More information about the Midnightbsd-cvs mailing list