git: 020f7f6cf1ff - stable/15 - lacp: fix link state with multiple aggregators

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Mon, 06 Jul 2026 01:43:07 UTC
The branch stable/15 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=020f7f6cf1ff2ace74c84dbb1caaf8cd5e71209d

commit 020f7f6cf1ff2ace74c84dbb1caaf8cd5e71209d
Author:     Andrew Gallatin <gallatin@FreeBSD.org>
AuthorDate: 2026-05-12 12:52:24 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-07-06 01:35:54 +0000

    lacp: fix link state with multiple aggregators
    
    (cherry picked from commit 9f69446d45484c16d2b9b9bf71bbb2fca86cb6e5)
---
 sys/net/ieee8023ad_lacp.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sys/net/ieee8023ad_lacp.c b/sys/net/ieee8023ad_lacp.c
index 02aa1aaa0eee..9726b4c4dff8 100644
--- a/sys/net/ieee8023ad_lacp.c
+++ b/sys/net/ieee8023ad_lacp.c
@@ -682,6 +682,7 @@ static void
 lacp_disable_distributing(struct lacp_port *lp)
 {
 	struct lacp_aggregator *la = lp->lp_aggregator;
+	struct lacp_aggregator *la_active;
 	struct lacp_softc *lsc = lp->lp_lsc;
 	struct lagg_softc *sc = lsc->lsc_softc;
 	char buf[LACP_LAGIDSTR_MAX+1];
@@ -703,7 +704,6 @@ lacp_disable_distributing(struct lacp_port *lp)
 
 	TAILQ_REMOVE(&la->la_ports, lp, lp_dist_q);
 	la->la_nports--;
-	sc->sc_active = la->la_nports;
 
 	if (lsc->lsc_active_aggregator == la) {
 		lacp_suppress_distributing(lsc, la);
@@ -713,6 +713,8 @@ lacp_disable_distributing(struct lacp_port *lp)
 	}
 
 	lp->lp_state &= ~LACP_STATE_DISTRIBUTING;
+	la_active = lsc->lsc_active_aggregator;
+	sc->sc_active = la_active != NULL ? la_active->la_nports : 0;
 	if_link_state_change(sc->sc_ifp,
 	    sc->sc_active ? LINK_STATE_UP : LINK_STATE_DOWN);
 }
@@ -721,6 +723,7 @@ static void
 lacp_enable_distributing(struct lacp_port *lp)
 {
 	struct lacp_aggregator *la = lp->lp_aggregator;
+	struct lacp_aggregator *la_active;
 	struct lacp_softc *lsc = lp->lp_lsc;
 	struct lagg_softc *sc = lsc->lsc_softc;
 	char buf[LACP_LAGIDSTR_MAX+1];
@@ -739,7 +742,6 @@ lacp_enable_distributing(struct lacp_port *lp)
 	KASSERT(la->la_refcnt > la->la_nports, ("aggregator refcnt invalid"));
 	TAILQ_INSERT_HEAD(&la->la_ports, lp, lp_dist_q);
 	la->la_nports++;
-	sc->sc_active = la->la_nports;
 
 	lp->lp_state |= LACP_STATE_DISTRIBUTING;
 
@@ -750,6 +752,8 @@ lacp_enable_distributing(struct lacp_port *lp)
 		/* try to become the active aggregator */
 		lacp_select_active_aggregator(lsc);
 
+	la_active = lsc->lsc_active_aggregator;
+	sc->sc_active = la_active != NULL ? la_active->la_nports : 0;
 	if_link_state_change(sc->sc_ifp,
 	    sc->sc_active ? LINK_STATE_UP : LINK_STATE_DOWN);
 }