summaryrefslogtreecommitdiff
path: root/net/bridge/br_forward.c
diff options
context:
space:
mode:
authorDanielle Ratson <danieller@nvidia.com>2026-05-11 09:59:33 +0300
committerPaolo Abeni <pabeni@redhat.com>2026-05-14 12:42:11 +0200
commit27c082c600b1df749cafa57edf5815e951655a3c (patch)
tree045d557cf754db044ca5fc78c10abeff4828e822 /net/bridge/br_forward.c
parent3a28ccb9dd47d1b6f64c64a94c958a968299aa1d (diff)
downloadlinux-next-27c082c600b1df749cafa57edf5815e951655a3c.tar.gz
linux-next-27c082c600b1df749cafa57edf5815e951655a3c.zip
bridge: Add selective forwarding of gratuitous neighbor announcements
The existing neighbor suppression unconditionally suppresses gratuitous ARPs and unsolicited Neighbor Advertisements, which prevents fast mobility of hosts between VTEPs. Add the neigh_forward_grat option to allow selective control of gratuitous neighbor announcements. When neigh_suppress is enabled but neigh_forward_grat is disabled (default), gratuitous announcements are suppressed. When neigh_forward_grat is enabled, gratuitous announcements are forwarded while regular neighbor discovery remains suppressed. The implementation provides per-output-port control by: 1. Adding a 'grat_arp' flag to BR_INPUT_SKB_CB to mark gratuitous ARPs and unsolicited NAs. 2. Setting both grat_arp and proxyarp_replied flags in br_do_proxy_suppress_arp() and br_do_suppress_nd() when gratuitous packets are detected. 3. Checking neigh_forward_grat per output port during flooding: - For gratuitous ARPs/NAs: suppress unless the output port has neigh_forward_grat enabled. - For regular ARPs/NDs: maintain existing behavior. This allows gratuitous announcements from any input port to be selectively forwarded based on each output port's individual neigh_forward_grat setting, enabling gratuitous neighbor announcements to be flooded to the VXLAN fabric. Regular neighbor discovery (ARP requests, NS queries, solicited replies) remains controlled by neigh_suppress and is unaffected. Reviewed-by: Ido Schimmel <idosch@nvidia.com> Reviewed-by: Petr Machata <petrm@nvidia.com> Signed-off-by: Danielle Ratson <danieller@nvidia.com> Acked-by: Nikolay Aleksandrov <razor@blackwall.org> Link: https://patch.msgid.link/20260511065936.4173106-4-danieller@nvidia.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'net/bridge/br_forward.c')
-rw-r--r--net/bridge/br_forward.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
index dea09096ad0f..4a77d0743374 100644
--- a/net/bridge/br_forward.c
+++ b/net/bridge/br_forward.c
@@ -230,10 +230,17 @@ void br_flood(struct net_bridge *br, struct sk_buff *skb,
/* Do not flood to ports that enable proxy ARP */
if (p->flags & BR_PROXYARP)
continue;
- if (BR_INPUT_SKB_CB(skb)->proxyarp_replied &&
- ((p->flags & BR_PROXYARP_WIFI) ||
- br_is_neigh_suppress_enabled(p, vid)))
- continue;
+ if (BR_INPUT_SKB_CB(skb)->proxyarp_replied) {
+ if (p->flags & BR_PROXYARP_WIFI)
+ continue;
+ /* For gratuitous ARPs/NAs, check neigh_forward_grat.
+ * For regular ARPs/NDs, check only neigh_suppress.
+ */
+ if (br_is_neigh_suppress_enabled(p, vid) &&
+ (!BR_INPUT_SKB_CB(skb)->grat_arp ||
+ !br_is_neigh_forward_grat_enabled(p, vid)))
+ continue;
+ }
prev = maybe_deliver(prev, p, skb, local_orig);
if (IS_ERR(prev)) {