From nobody Tue May 12 13:02:00 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gFGvf0mTKz6dclf for ; Tue, 12 May 2026 13:02:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gFGvd6mZHz4Dn0 for ; Tue, 12 May 2026 13:02:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1778590925; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=bs/zBvMaG/oAvERUrUZolhqYPLqheCL4h5whELKB12s=; b=X1TBiMdIvba/lxTP/Zk0aBiYjXxr3c5T8ntC1sV0/LXyHIEueuAzcxLomxkCRlGGQuwW7u BgB7Q+dfdmMIrGLQv6L5kr8dEuwzQ4TVTs0A+s/y841ia/Qzy+VPoNYbcS3kTYH8g+qAah PR2v/jDEu+M/dcSdNA25fe6KhC8beh6l7DJq4djvaYwNbbCcw//ZlcbAhM/sOIUN2HSwSF 2Cq/nDlzx+FfmJUMmw0dqsfxHIac7xwiul5vBhocNFmeRhtp9kXmsFTtzakC/FpjhLwYND vqv7g3Vi7yf2+rUtN8YKQMeUF3XnSL6zVjBGDP27qaVG+3allHcDBfkJjiPXSw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1778590925; a=rsa-sha256; cv=none; b=m0VEavd7HySxidIgYu9atQ1nw3BeDSqa4oWdstHcR+aWBrLbu7g1/JbyF2XPDNMPy9pNFA sr5nETKUz2ddSWdSzUQnloAXt//Rm52FftBtsqkDc75GzZhu/U3JXcLqxmJm+fbHiPLWeC T7XABekZcgFNKytQii45miedCyZTNaCEQJZOhWDFPJiwNaIkLraMNtbotUwMp31GGiRclA AjaIiiaIK/ACBe+33qZuWmR5DI1z2R9z5c6j27codj/sBXfS/vIuU5QGgLV31G9cl5RaAF SlUSOlBGX9+Z9FMTWG403Ayew0kmPu5LYD0uK3UymWP4L6G2RK3bRDbsATiAVA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1778590925; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=bs/zBvMaG/oAvERUrUZolhqYPLqheCL4h5whELKB12s=; b=sCi2XGvgu4yOYcNQ0BwjPUHuAxcEaZpJLTwphXGA3DQZaVDYPLkB2Jx81kDCkHy1/KO6Ho GVWJa+xY5W3ITqB5/HbdOkuDUjccQvW4fJhYmbkJUvjLjcTcKztz2NydF31kYyFavFZnTa NHSnGn3jV2fwEkCTYKLeukQhQ5Lhfkk4gG4HOVFt0Q7ngHrYEQSDmVGcUkUXgrQSYQ6RzY 3XYtr4lJLCypAiJUUyCq3ZkHSc62RrbRsDDLfyeQlZFGVwyZLYb5piMQFCn2sPtiDyitx+ NqHfa1uKewH4O4qkN3wmEj7nS/mfXkx320xORB2jMGcXGd6Ta+hxvizlv6F+AQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gFGvd67BRz13CJ for ; Tue, 12 May 2026 13:02:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1de2a by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 12 May 2026 13:02:00 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Gallatin Subject: git: 9f69446d4548 - main - lacp: fix link state with multiple aggregators List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: gallatin X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9f69446d45484c16d2b9b9bf71bbb2fca86cb6e5 Auto-Submitted: auto-generated Date: Tue, 12 May 2026 13:02:00 +0000 Message-Id: <6a0324c8.1de2a.5c820de6@gitrepo.freebsd.org> The branch main has been updated by gallatin: URL: https://cgit.FreeBSD.org/src/commit/?id=9f69446d45484c16d2b9b9bf71bbb2fca86cb6e5 commit 9f69446d45484c16d2b9b9bf71bbb2fca86cb6e5 Author: Andrew Gallatin AuthorDate: 2026-05-12 12:52:24 +0000 Commit: Andrew Gallatin CommitDate: 2026-05-12 12:52:24 +0000 lacp: fix link state with multiple aggregators When we have multiple aggregators, the link state should reflect the state of the active aggregator. This change was prompted by a script pruning 10GbE interfaces from an lacp bundle with 100GbE interfaces. Mixing speeds like this creates multiple aggregators. When the last 10GbE interface was removed, lagg0 would loose link because the current aggregator's port count would drop to 0, even though the 100GbE aggregator had active ports. This left the system in a hard to diagnose state where lagg0 reported "active", but all outgoing IP traffic was dropped, due to the RT_LINK_IS_UP() check noticing lagg0's if_link_state was marked as down. Reviewed by: zlei Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D56579 --- 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 281d16bc6c05..8c695f71cc0f 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); }