Module Name:    src
Committed By:   yamaguchi
Date:           Thu Mar 31 01:46:25 UTC 2022

Modified Files:
        src/sys/net/lagg: if_lagg.c

Log Message:
Switch ifp->if_output along with configuring ifp->if_lagg

lagg_port_output stored to ifp->if_output uses ifp->if_lagg.
Therefore, ifp->if_output switches to lagg_port_output after
ifp->if_lagg is configured, and restores in reverse order.

This missing order is pointed out by k-goda@IIJ


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/net/lagg/if_lagg.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/lagg/if_lagg.c
diff -u src/sys/net/lagg/if_lagg.c:1.33 src/sys/net/lagg/if_lagg.c:1.34
--- src/sys/net/lagg/if_lagg.c:1.33	Thu Mar 31 01:43:48 2022
+++ src/sys/net/lagg/if_lagg.c	Thu Mar 31 01:46:25 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_lagg.c,v 1.33 2022/03/31 01:43:48 yamaguchi Exp $	*/
+/*	$NetBSD: if_lagg.c,v 1.34 2022/03/31 01:46:25 yamaguchi Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006 Reyk Floeter <r...@openbsd.org>
@@ -20,7 +20,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_lagg.c,v 1.33 2022/03/31 01:43:48 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_lagg.c,v 1.34 2022/03/31 01:46:25 yamaguchi Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -2352,7 +2352,6 @@ lagg_port_setup(struct lagg_softc *sc,
 
 	ifp_port->if_type = if_type;
 	ifp_port->if_ioctl = lagg_port_ioctl;
-	ifp_port->if_output = lagg_port_output;
 
 	iftype_changed = (lp->lp_iftype != ifp_port->if_type);
 
@@ -2388,15 +2387,16 @@ lagg_port_setup(struct lagg_softc *sc,
 	lagg_port_syncmulti(sc, lp);
 	lagg_port_syncvlan(sc, lp);
 
+	IFNET_LOCK(ifp_port);
+	ifp_port->if_output = lagg_port_output;
 	if (stopped) {
-		IFNET_LOCK(ifp_port);
 		if (!ISSET(ifp_port->if_flags, IFF_RUNNING)) {
 			error = if_init(ifp_port);
 			if (error != 0)
 				goto remove_port;
 		}
-		IFNET_UNLOCK(ifp_port);
 	}
+	IFNET_UNLOCK(ifp_port);
 
 	lagg_config_promisc(sc, lp);
 	lagg_proto_startport(sc, lp);
@@ -2407,6 +2407,9 @@ lagg_port_setup(struct lagg_softc *sc,
 remove_port:
 	SIMPLEQ_REMOVE(&sc->sc_ports, lp, lagg_port, lp_entry);
 	sc->sc_nports--;
+	IFNET_LOCK(ifp_port);
+	ifp_port->if_output = lp->lp_output;
+	IFNET_UNLOCK(ifp_port);
 	atomic_store_release(&ifp_port->if_lagg, NULL);
 	pserialize_perform(sc->sc_psz);
 	lagg_port_purgemulti(sc, lp);
@@ -2432,7 +2435,6 @@ restore_ipv6lla:
 	ifp_port->if_type = lp->lp_iftype;
 	if (ifp_port->if_ioctl == lagg_port_ioctl)
 		ifp_port->if_ioctl = lp->lp_ioctl;
-	ifp_port->if_output = lp->lp_output;
 
 	IFNET_UNLOCK(ifp_port);
 
@@ -2465,6 +2467,17 @@ lagg_port_teardown(struct lagg_softc *sc
 		return;
 	}
 
+	lagg_proto_stopport(sc, lp);
+
+	IFNET_LOCK(ifp_port);
+	if (ISSET(ifp_port->if_flags, IFF_RUNNING) &&
+	    ifp_port->if_init != NULL) {
+		if_stop(ifp_port, 0);
+		stopped = true;
+	}
+	ifp_port->if_output = lp->lp_output;
+	IFNET_UNLOCK(ifp_port);
+
 	SIMPLEQ_REMOVE(&sc->sc_ports, lp, lagg_port, lp_entry);
 	sc->sc_nports--;
 	atomic_store_release(&ifp_port->if_lagg, NULL);
@@ -2473,7 +2486,6 @@ lagg_port_teardown(struct lagg_softc *sc
 	if_linkstate_change_disestablish(ifp_port,
 	    lp->lp_linkstate_hook, NULL);
 
-	lagg_proto_stopport(sc, lp);
 	psref_target_destroy(&lp->lp_psref, lagg_port_psref_class);
 
 	lagg_port_purgemulti(sc, lp);
@@ -2481,16 +2493,9 @@ lagg_port_teardown(struct lagg_softc *sc
 	lagg_teardown_lladdr(sc, lp);
 
 	IFNET_LOCK(ifp_port);
-	if (ISSET(ifp_port->if_flags, IFF_RUNNING) &&
-	    ifp_port->if_init != NULL) {
-		if_stop(ifp_port, 0);
-		stopped = true;
-	}
-
 	ifp_port->if_type = lp->lp_iftype;
 	if (ifp_port->if_ioctl == lagg_port_ioctl)
 		ifp_port->if_ioctl = lp->lp_ioctl;
-	ifp_port->if_output = lp->lp_output;
 	lagg_teardown_mtu(sc, lp);
 
 	if (stopped) {

Reply via email to