From: Louis Scalbert <louis.scalbert@6wind.com>
To: netdev@vger.kernel.org
Cc: andrew+netdev@lunn.ch, jv@jvosburgh.net, edumazet@google.com,
kuba@kernel.org, pabeni@redhat.com, fbl@redhat.com,
andy@greyhouse.net, shemminger@vyatta.com, maheshb@google.com,
jonas.gorski@gmail.com, horms@kernel.org,
Louis Scalbert <louis.scalbert@6wind.com>
Subject: [PATCH net v8 0/6] bonding: 3ad: fix carrier state with no usable slaves
Date: Wed, 3 Jun 2026 17:03:25 +0200 [thread overview]
Message-ID: <20260603150331.1919611-1-louis.scalbert@6wind.com> (raw)
Hi everyone,
This series addresses a blackholing issue and a subsequent link-flapping
issue in the 802.3ad bonding driver when dealing with inactive slaves
and the `min_links` parameter.
When an 802.3ad (LACP) bonding interface has no slaves in the
collecting/distributing state, the bonding master still reports
carrier as up as long as at least 'min_links' slaves have carrier.
In this situation, only one slave is effectively used for TX/RX,
while traffic received on other slaves is dropped. Upper-layer
daemons therefore consider the interface operational, even though
traffic may be blackholed if the lack of LACP negotiation means
the partner is not ready to deal with traffic.
This patchset introduces an optional behavior, widely adopted across
the industry, to address this issue. It consists of bringing the
bonding master interface down to signal to upper-layer processes
that it is not usable.
This patchset depends on the following iproute2 change:
ip/bond: add lacp_strict support
Link: https://lore.kernel.org/netdev/20260408152409.276358-1-louis.scalbert@6wind.com/
Patch 1 adds the missing IFLA_BOND_BROADCAST_NEIGH in if_link
UAPI header.
Patch 2 adds missing broadcast-neigh to YAML rt-link specs.
Patch 3 introduces the lacp_strict configuration knob, which is
applied in the subsequent patch. The default (off) mode preserves
the existing behavior, while the strict mode (on) is intended to force
the bonding master carrier down in this situation.
Patch 4 addresses the core issue when lacp_strict is set to strict.
It ensures that carrier is asserted only when at least 'min_links'
slaves are in the Collecting/Distributing state.
Patch 5 fixes a side effect of the previous patch. Tightening the carrier
logic exposes a state persistence bug: when a physical link goes down,
the LACP collecting/distributing flags remain set. When the link returns,
the interface briefly hallucinates that it is ready, bounces the carrier
up, and then drops it again once LACP renegotiation starts. Fix by
resetting Collecting and Distributing state as soon as the link goes
down.
Patch 6 adds a test for bonding lacp_strict both modes.
Changelog:
v7 -> v8
- Patch 3: addressed the Sashiko review comments, as requested by Simon
Horman. When transitioning to DETACHED Mux state, reset Collecting /
Distributing so the bonding carrier state is correctly re-evaluated.
Also, re-evaluate the bonding carrier state when moving from
Distributing to Collecting Mux state (coupled_control disabled).
Link: https://sashiko.dev/#/patchset/20260526084048.1696544-1-louis.scalbert%406wind.com
Link: https://lore.kernel.org/netdev/20260526084048.1696544-1-louis.scalbert@6wind.com/
v6 -> v7
- Add patch 1: sync missed IFLA_BOND_BROADCAST_NEIGH in if_link
UAPI header.
- Add patch 2: add missed broadcast-neigh to YAML rt-link specs.
- Patch 3 (was patch 1 in v6): add lacp-strict to YAML rt-link specs
and IFLA_BOND_LACP_STRICT to if_link UAPI header.
- Patch 6 (was patch 4 in v6): move bond_lacp_strict.sh in Makefile
to preserve the sort order.
Link: https://lore.kernel.org/netdev/20260520112539.798275-1-louis.scalbert@6wind.com/
v5 -> v6
- Patch 3: the v5 patch was compliant with 802.1ax-2020, but the target
specification is 802.1ax-2014. The fix has been reworked accordingly.
Collecting and Distributing were not cleared on port down because the
Receive state machine was not clearing the Partner Sync flag.
Link: https://lore.kernel.org/netdev/20260506161144.465485-1-louis.scalbert@6wind.com/
v4 -> v5
- Patch 4: replace the use of netem, which is not included in the
bonding selftests configuration. Instead, use a dedicated netns to
forward frames between the partner and DUT. The partner and DUT are
bridged within that netns. Since Linux bridges do not forward LACP
special frames by default, group_fwd_mask is configured on bridge
interfaces to allow them.
Link: https://lore.kernel.org/netdev/20260417140505.3860237-1-louis.scalbert@6wind.com/
v3 -> v4
- Rename the configuration knob to lacp_strict on/off instead of
lacp_fallback legacy/strict.
- Patch 1: change the command documentation accordingly and wrap
text at approximately 75 columns.
- Use "usable" wording instead "valid" for LACP Collecting /
Distributing state in code and commit log.
- Patch 2: test collecting and distributing state regardless of
coupled_control
- Patch 3: Reworked because removing the SELECTED flag was not
compliant with 802.1AX. Instead, to transition to the WAITING state
on port disabled, except when already in the DETACHED state.
And remove Collecting and Distributing state in WAITING state.
- Patch 4 is removed. It was a fix for patch 3 but it is no more
needed since patch 3 was reworked.
Link: https://lore.kernel.org/netdev/20260408152353.276204-1-louis.scalbert@6wind.com/
v2 -> v3
- Add an initial patch introducing the lacp_fallback configuration
knob (no behavior change yet).
- Patch 2 (was patch 1 in v2): apply the new behavior only when
lacp_fallback is set to strict, and re-evaluate the bonding
master carrier when the setting changes.
Link: https://lore.kernel.org/netdev/20260325134439.3048615-1-louis.scalbert@6wind.com/
v1 -> v2
- Patch 1: split a comment line that exceeded 80 characters.
- Move the change from patch 2 in __agg_ports_are_ready() into a third
patch, as it is actually a side effect of the fix introduced in
patch 2.
- Patch 2: Expand the commit message and add a code comment describing
the change in ad_port_selection_logic().
- Patch 3: Check the READY_N flag only on ports in the WAITING state,
rather than on all enabled ports. This more closely matches 802.3ad.
Link: https://lore.kernel.org/netdev/20260316131838.3257889-1-louis.scalbert@6wind.com/
Louis Scalbert (6):
tools: missed broadcast_neigh if_link uapi header
netlink: specs: rt-link: missed broadcast-neigh
bonding: 3ad: add lacp_strict configuration knob
bonding: 3ad: fix carrier when no usable slaves
bonding: 3ad: fix mux port state on oper down
selftests: bonding: add test for lacp_strict mode
Documentation/netlink/specs/rt-link.yaml | 6 +
Documentation/networking/bonding.rst | 23 ++
drivers/net/bonding/bond_3ad.c | 27 +-
drivers/net/bonding/bond_main.c | 1 +
drivers/net/bonding/bond_netlink.c | 16 +
drivers/net/bonding/bond_options.c | 27 ++
include/net/bond_options.h | 1 +
include/net/bonding.h | 1 +
include/uapi/linux/if_link.h | 1 +
tools/include/uapi/linux/if_link.h | 2 +
.../selftests/drivers/net/bonding/Makefile | 1 +
.../drivers/net/bonding/bond_lacp_strict.sh | 347 ++++++++++++++++++
12 files changed, 450 insertions(+), 3 deletions(-)
create mode 100755 tools/testing/selftests/drivers/net/bonding/bond_lacp_strict.sh
--
2.39.2
next reply other threads:[~2026-06-03 15:03 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-03 15:03 Louis Scalbert [this message]
2026-06-03 15:03 ` [PATCH net v8 1/6] tools: missed broadcast_neigh if_link uapi header Louis Scalbert
2026-06-08 21:16 ` Jay Vosburgh
2026-06-08 21:20 ` Jay Vosburgh
2026-06-03 15:03 ` [PATCH net v8 2/6] netlink: specs: rt-link: missed broadcast-neigh Louis Scalbert
2026-06-03 15:03 ` [PATCH net v8 3/6] bonding: 3ad: add lacp_strict configuration knob Louis Scalbert
2026-06-03 15:03 ` [PATCH net v8 4/6] bonding: 3ad: fix carrier when no usable slaves Louis Scalbert
2026-06-08 21:37 ` Jay Vosburgh
2026-06-09 7:56 ` Louis Scalbert
2026-06-09 8:54 ` Paolo Abeni
2026-06-03 15:03 ` [PATCH net v8 5/6] bonding: 3ad: fix mux port state on oper down Louis Scalbert
2026-06-03 15:03 ` [PATCH net v8 6/6] selftests: bonding: add test for lacp_strict mode Louis Scalbert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260603150331.1919611-1-louis.scalbert@6wind.com \
--to=louis.scalbert@6wind.com \
--cc=andrew+netdev@lunn.ch \
--cc=andy@greyhouse.net \
--cc=edumazet@google.com \
--cc=fbl@redhat.com \
--cc=horms@kernel.org \
--cc=jonas.gorski@gmail.com \
--cc=jv@jvosburgh.net \
--cc=kuba@kernel.org \
--cc=maheshb@google.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shemminger@vyatta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox