* [PATCH net-next 0/6] bridge: Add selective forwarding of gratuitous neighbor announcements
@ 2026-05-03 7:35 Danielle Ratson
2026-05-03 7:35 ` [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes Danielle Ratson
` (5 more replies)
0 siblings, 6 replies; 16+ messages in thread
From: Danielle Ratson @ 2026-05-03 7:35 UTC (permalink / raw)
To: netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, razor,
idosch, andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin,
fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest,
Danielle Ratson
The existing neighbor suppression unconditionally suppresses gratuitous
ARPs and unsolicited Neighbor Advertisements, which prevents fast
mobility of hosts between VTEPs.
This series adds a new neigh_forward_grat option that provides
independent control of gratuitous ARP and unsolicited NA forwarding.
When neigh_suppress is enabled but neigh_forward_grat is enabled,
regular neighbor discovery is suppressed while gratuitous announcements
are forwarded.
The implementation marks gratuitous ARPs and unsolicited NAs in
BR_INPUT_SKB_CB during input processing, then checks the per-output-port
neigh_forward_grat setting during flooding. This allows gratuitous
announcements from any input port to be selectively forwarded based on
each output port's individual configuration.
Both port-level control (via IFLA_BRPORT_NEIGH_FORWARD_GRAT) and
per-VLAN control (via BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT) are
provided. The default value of OFF preserves existing behavior.
This behavior is in accordance with RFC 9161 (Section 3.6), which
recommends that VTEPs forward gratuitous ARP and unsolicited NA messages
to avoid traffic disruption during host mobility events.
The new attributes use NLA_U8, although the kernel netlink guideline
recommends NLA_U32 as the minimum integer type on the grounds that
alignment makes smaller types equivalent on the wire. For a simple
on/off attribute there is no technical advantage to u32 over u8, and
keeping u8 preserves consistency with all surrounding bridge port
attributes and avoids introducing new helpers alongside the existing
infrastructure.
Patchset overview:
Patch #1: adds uapi headers.
Patches #2-#3: support selective forwarding of gratuitous ARP.
Patches #4-#5: add netlink handling.
Patch #6: adds tests.
Please see iproute related patches in the last 3 commits of:
https://github.com/daniellerts/iproute2
Danielle Ratson (6):
bridge: uapi: Add neigh_forward_grat netlink attributes
bridge: Add internal flags for neigh_forward_grat
bridge: Add selective forwarding of gratuitous neighbor announcements
bridge: Add port-level netlink handling for neigh_forward_grat
bridge: Add per-VLAN netlink handling for neigh_forward_grat
selftests: net: Add tests for neigh_forward_grat option
Documentation/netlink/specs/rt-link.yaml | 3 +
include/linux/if_bridge.h | 1 +
include/uapi/linux/if_bridge.h | 1 +
include/uapi/linux/if_link.h | 17 +
net/bridge/br_arp_nd_proxy.c | 22 ++
net/bridge/br_forward.c | 15 +-
net/bridge/br_netlink.c | 8 +-
net/bridge/br_private.h | 3 +
net/bridge/br_vlan.c | 1 +
net/bridge/br_vlan_options.c | 24 +-
net/core/rtnetlink.c | 2 +-
.../net/test_bridge_neigh_suppress.sh | 298 +++++++++++++++++-
12 files changed, 385 insertions(+), 10 deletions(-)
--
2.51.0
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes
2026-05-03 7:35 [PATCH net-next 0/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
@ 2026-05-03 7:35 ` Danielle Ratson
2026-05-04 7:41 ` Nikolay Aleksandrov
2026-05-06 2:00 ` Jakub Kicinski
2026-05-03 7:35 ` [PATCH net-next 2/6] bridge: Add internal flags for neigh_forward_grat Danielle Ratson
` (4 subsequent siblings)
5 siblings, 2 replies; 16+ messages in thread
From: Danielle Ratson @ 2026-05-03 7:35 UTC (permalink / raw)
To: netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, razor,
idosch, andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin,
fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest,
Danielle Ratson
Add netlink attributes for controlling gratuitous ARP and unsolicited NA
forwarding when neighbor suppression is enabled.
Add IFLA_BRPORT_NEIGH_FORWARD_GRAT for port-level control and
BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT for per-VLAN control.
The new attributes provide independent control of gratuitous ARP and
unsolicited NA packets. Operators can enable forwarding for those packets
for fast mobility across VTEPs while keeping general neighbor suppression
active.
Signed-off-by: Danielle Ratson <danieller@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
---
Documentation/netlink/specs/rt-link.yaml | 3 +++
include/uapi/linux/if_bridge.h | 1 +
include/uapi/linux/if_link.h | 17 +++++++++++++++++
net/core/rtnetlink.c | 2 +-
4 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/Documentation/netlink/specs/rt-link.yaml b/Documentation/netlink/specs/rt-link.yaml
index f23aa5f229c5..8d61e9485402 100644
--- a/Documentation/netlink/specs/rt-link.yaml
+++ b/Documentation/netlink/specs/rt-link.yaml
@@ -1700,6 +1700,9 @@ attribute-sets:
-
name: backup-nhid
type: u32
+ -
+ name: neigh-forward-grat
+ type: flag
-
name: linkinfo-gre-attrs
name-prefix: ifla-gre-
diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
index e52f8207ab27..21a700c02ef7 100644
--- a/include/uapi/linux/if_bridge.h
+++ b/include/uapi/linux/if_bridge.h
@@ -526,6 +526,7 @@ enum {
BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS,
BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS,
BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS,
+ BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT,
__BRIDGE_VLANDB_ENTRY_MAX,
};
#define BRIDGE_VLANDB_ENTRY_MAX (__BRIDGE_VLANDB_ENTRY_MAX - 1)
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
index 79ce4bc24cba..46413392b402 100644
--- a/include/uapi/linux/if_link.h
+++ b/include/uapi/linux/if_link.h
@@ -1085,6 +1085,22 @@ enum {
* Note that this option only takes effect when *IFLA_BRPORT_NEIGH_SUPPRESS*
* is enabled for a given port.
*
+ * @IFLA_BRPORT_NEIGH_FORWARD_GRAT
+ * Controls whether gratuitous ARP packets and unsolicited Neighbor
+ * Advertisement packets are forwarded on a given port even when neighbor
+ * suppression is enabled.
+ * By default this flag is off, meaning gratuitous ARP and unsolicited NA
+ * packets will be suppressed when neighbor suppression is enabled.
+ * Setting this flag to on allows these packets to be forwarded even
+ * when *IFLA_BRPORT_NEIGH_SUPPRESS* or *IFLA_BRPORT_NEIGH_VLAN_SUPPRESS*
+ * is enabled.
+ *
+ * Note that this option only takes effect when *IFLA_BRPORT_NEIGH_SUPPRESS*
+ * or *IFLA_BRPORT_NEIGH_VLAN_SUPPRESS* is enabled for a given port.
+ * When *IFLA_BRPORT_NEIGH_VLAN_SUPPRESS* is set, this port-level flag is
+ * ignored and per-VLAN control is available via
+ * *BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT*.
+ *
* @IFLA_BRPORT_BACKUP_NHID
* The FDB nexthop object ID to attach to packets being redirected to a
* backup port that has VLAN tunnel mapping enabled (via the
@@ -1137,6 +1153,7 @@ enum {
IFLA_BRPORT_MCAST_MAX_GROUPS,
IFLA_BRPORT_NEIGH_VLAN_SUPPRESS,
IFLA_BRPORT_BACKUP_NHID,
+ IFLA_BRPORT_NEIGH_FORWARD_GRAT,
__IFLA_BRPORT_MAX
};
#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 30951e5a9555..02ffe79a7e6d 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -63,7 +63,7 @@
#include "dev.h"
#define RTNL_MAX_TYPE 50
-#define RTNL_SLAVE_MAX_TYPE 44
+#define RTNL_SLAVE_MAX_TYPE 45
struct rtnl_link {
rtnl_doit_func doit;
--
2.51.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH net-next 2/6] bridge: Add internal flags for neigh_forward_grat
2026-05-03 7:35 [PATCH net-next 0/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
2026-05-03 7:35 ` [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes Danielle Ratson
@ 2026-05-03 7:35 ` Danielle Ratson
2026-05-04 7:41 ` Nikolay Aleksandrov
2026-05-03 7:35 ` [PATCH net-next 3/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
` (3 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Danielle Ratson @ 2026-05-03 7:35 UTC (permalink / raw)
To: netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, razor,
idosch, andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin,
fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest,
Danielle Ratson
Add internal flags for the neigh_forward_grat feature:
- BR_NEIGH_FORWARD_GRAT: Port-level flag
- BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED: Per-VLAN flag
These will be used to control whether gratuitous ARP and unsolicited NA
packets are forwarded when neighbor suppression is enabled.
Signed-off-by: Danielle Ratson <danieller@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
---
include/linux/if_bridge.h | 1 +
net/bridge/br_private.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h
index c5fe3b2a53e8..ec9ffea1e46e 100644
--- a/include/linux/if_bridge.h
+++ b/include/linux/if_bridge.h
@@ -61,6 +61,7 @@ struct br_ip_list {
#define BR_PORT_LOCKED BIT(21)
#define BR_PORT_MAB BIT(22)
#define BR_NEIGH_VLAN_SUPPRESS BIT(23)
+#define BR_NEIGH_FORWARD_GRAT BIT(24)
#define BR_DEFAULT_AGEING_TIME (300 * HZ)
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 31e317a3529c..677cd5d68dc7 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -187,6 +187,7 @@ enum {
BR_VLFLAG_GLOBAL_MCAST_ENABLED = BIT(3),
BR_VLFLAG_NEIGH_SUPPRESS_ENABLED = BIT(4),
BR_VLFLAG_TAGGING_BY_SWITCHDEV = BIT(5),
+ BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED = BIT(6),
};
/**
--
2.51.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH net-next 3/6] bridge: Add selective forwarding of gratuitous neighbor announcements
2026-05-03 7:35 [PATCH net-next 0/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
2026-05-03 7:35 ` [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes Danielle Ratson
2026-05-03 7:35 ` [PATCH net-next 2/6] bridge: Add internal flags for neigh_forward_grat Danielle Ratson
@ 2026-05-03 7:35 ` Danielle Ratson
2026-05-04 7:41 ` Nikolay Aleksandrov
2026-05-03 7:35 ` [PATCH net-next 4/6] bridge: Add port-level netlink handling for neigh_forward_grat Danielle Ratson
` (2 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Danielle Ratson @ 2026-05-03 7:35 UTC (permalink / raw)
To: netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, razor,
idosch, andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin,
fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest,
Danielle Ratson
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.
Signed-off-by: Danielle Ratson <danieller@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
---
net/bridge/br_arp_nd_proxy.c | 22 ++++++++++++++++++++++
net/bridge/br_forward.c | 15 +++++++++++----
net/bridge/br_private.h | 2 ++
3 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/net/bridge/br_arp_nd_proxy.c b/net/bridge/br_arp_nd_proxy.c
index 3205346f298c..5263232278b4 100644
--- a/net/bridge/br_arp_nd_proxy.c
+++ b/net/bridge/br_arp_nd_proxy.c
@@ -132,6 +132,7 @@ void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br,
__be32 sip, tip;
BR_INPUT_SKB_CB(skb)->proxyarp_replied = 0;
+ BR_INPUT_SKB_CB(skb)->grat_arp = 0;
if ((dev->flags & IFF_NOARP) ||
!pskb_may_pull(skb, arp_hdr_len(dev)))
@@ -167,6 +168,7 @@ void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br,
sip == tip) {
/* prevent flooding to neigh suppress ports */
BR_INPUT_SKB_CB(skb)->proxyarp_replied = 1;
+ BR_INPUT_SKB_CB(skb)->grat_arp = 1;
return;
}
}
@@ -419,6 +421,7 @@ void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br,
struct neighbour *n;
BR_INPUT_SKB_CB(skb)->proxyarp_replied = 0;
+ BR_INPUT_SKB_CB(skb)->grat_arp = 0;
if (br_is_neigh_suppress_enabled(p, vid))
return;
@@ -431,6 +434,7 @@ void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br,
!msg->icmph.icmp6_solicited) {
/* prevent flooding to neigh suppress ports */
BR_INPUT_SKB_CB(skb)->proxyarp_replied = 1;
+ BR_INPUT_SKB_CB(skb)->grat_arp = 1;
return;
}
@@ -522,3 +526,21 @@ bool br_is_neigh_suppress_enabled(const struct net_bridge_port *p, u16 vid)
return !!(p->flags & BR_NEIGH_SUPPRESS);
}
}
+
+bool br_is_neigh_forward_grat_enabled(const struct net_bridge_port *p, u16 vid)
+{
+ if (!vid)
+ return !!(p->flags & BR_NEIGH_FORWARD_GRAT);
+
+ if (p->flags & BR_NEIGH_VLAN_SUPPRESS) {
+ struct net_bridge_vlan_group *vg = nbp_vlan_group_rcu(p);
+ struct net_bridge_vlan *v;
+
+ v = br_vlan_find(vg, vid);
+ if (!v)
+ return false;
+ return !!(v->priv_flags & BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED);
+ } else {
+ return !!(p->flags & BR_NEIGH_FORWARD_GRAT);
+ }
+}
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)) {
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 677cd5d68dc7..377fd0933409 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -605,6 +605,7 @@ struct br_input_skb_cb {
u8 proxyarp_replied:1;
u8 src_port_isolated:1;
u8 promisc:1;
+ u8 grat_arp:1;
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
u8 vlan_filtered:1;
#endif
@@ -2366,4 +2367,5 @@ void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br,
u16 vid, struct net_bridge_port *p, struct nd_msg *msg);
struct nd_msg *br_is_nd_neigh_msg(const struct sk_buff *skb, struct nd_msg *m);
bool br_is_neigh_suppress_enabled(const struct net_bridge_port *p, u16 vid);
+bool br_is_neigh_forward_grat_enabled(const struct net_bridge_port *p, u16 vid);
#endif
--
2.51.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH net-next 4/6] bridge: Add port-level netlink handling for neigh_forward_grat
2026-05-03 7:35 [PATCH net-next 0/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
` (2 preceding siblings ...)
2026-05-03 7:35 ` [PATCH net-next 3/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
@ 2026-05-03 7:35 ` Danielle Ratson
2026-05-04 7:42 ` Nikolay Aleksandrov
2026-05-03 7:35 ` [PATCH net-next 5/6] bridge: Add per-VLAN " Danielle Ratson
2026-05-03 7:35 ` [PATCH net-next 6/6] selftests: net: Add tests for neigh_forward_grat option Danielle Ratson
5 siblings, 1 reply; 16+ messages in thread
From: Danielle Ratson @ 2026-05-03 7:35 UTC (permalink / raw)
To: netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, razor,
idosch, andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin,
fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest,
Danielle Ratson
Add netlink handlers for the port-level neigh_forward_grat option via
IFLA_BRPORT_NEIGH_FORWARD_GRAT attribute.
The default value of OFF preserves existing behavior, i.e. gratuitous ARP
and unsolicited NA are suppressed when neigh_suppress is enabled. Users can
explicitly set it to ON to allow these packets through.
Example for enabling control via 'bridge link' command:
# bridge link set dev eth0 neigh_suppress on
# bridge link set dev eth0 neigh_forward_grat on
Signed-off-by: Danielle Ratson <danieller@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
---
net/bridge/br_netlink.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index 6fd5386a1d64..898326c201ef 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -190,6 +190,7 @@ static inline size_t br_port_info_size(void)
+ nla_total_size(1) /* IFLA_BRPORT_LOCKED */
+ nla_total_size(1) /* IFLA_BRPORT_MAB */
+ nla_total_size(1) /* IFLA_BRPORT_NEIGH_VLAN_SUPPRESS */
+ + nla_total_size(1) /* IFLA_BRPORT_NEIGH_FORWARD_GRAT */
+ nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_ROOT_ID */
+ nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_BRIDGE_ID */
+ nla_total_size(sizeof(u16)) /* IFLA_BRPORT_DESIGNATED_PORT */
@@ -282,7 +283,9 @@ static int br_port_fill_attrs(struct sk_buff *skb,
nla_put_u8(skb, IFLA_BRPORT_LOCKED, !!(p->flags & BR_PORT_LOCKED)) ||
nla_put_u8(skb, IFLA_BRPORT_MAB, !!(p->flags & BR_PORT_MAB)) ||
nla_put_u8(skb, IFLA_BRPORT_NEIGH_VLAN_SUPPRESS,
- !!(p->flags & BR_NEIGH_VLAN_SUPPRESS)))
+ !!(p->flags & BR_NEIGH_VLAN_SUPPRESS)) ||
+ nla_put_u8(skb, IFLA_BRPORT_NEIGH_FORWARD_GRAT,
+ !!(p->flags & BR_NEIGH_FORWARD_GRAT)))
return -EMSGSIZE;
timerval = br_timer_value(&p->message_age_timer);
@@ -902,6 +905,7 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = {
[IFLA_BRPORT_MCAST_MAX_GROUPS] = { .type = NLA_U32 },
[IFLA_BRPORT_NEIGH_VLAN_SUPPRESS] = NLA_POLICY_MAX(NLA_U8, 1),
[IFLA_BRPORT_BACKUP_NHID] = { .type = NLA_U32 },
+ [IFLA_BRPORT_NEIGH_FORWARD_GRAT] = NLA_POLICY_MAX(NLA_U8, 1),
};
/* Change the state of the port and notify spanning tree */
@@ -970,6 +974,8 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[],
br_set_port_flag(p, tb, IFLA_BRPORT_MAB, BR_PORT_MAB);
br_set_port_flag(p, tb, IFLA_BRPORT_NEIGH_VLAN_SUPPRESS,
BR_NEIGH_VLAN_SUPPRESS);
+ br_set_port_flag(p, tb, IFLA_BRPORT_NEIGH_FORWARD_GRAT,
+ BR_NEIGH_FORWARD_GRAT);
if ((p->flags & BR_PORT_MAB) &&
(!(p->flags & BR_PORT_LOCKED) || !(p->flags & BR_LEARNING))) {
--
2.51.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH net-next 5/6] bridge: Add per-VLAN netlink handling for neigh_forward_grat
2026-05-03 7:35 [PATCH net-next 0/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
` (3 preceding siblings ...)
2026-05-03 7:35 ` [PATCH net-next 4/6] bridge: Add port-level netlink handling for neigh_forward_grat Danielle Ratson
@ 2026-05-03 7:35 ` Danielle Ratson
2026-05-04 7:43 ` Nikolay Aleksandrov
2026-05-03 7:35 ` [PATCH net-next 6/6] selftests: net: Add tests for neigh_forward_grat option Danielle Ratson
5 siblings, 1 reply; 16+ messages in thread
From: Danielle Ratson @ 2026-05-03 7:35 UTC (permalink / raw)
To: netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, razor,
idosch, andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin,
fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest,
Danielle Ratson
Add netlink handlers for the per-VLAN neigh_forward_grat option via
BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT attribute.
The per-VLAN option provides fine-grained control, allowing different
VLANs on the same port to have different gratuitous ARP/unsolicited NA
forwarding behavior.
This enables control via 'bridge' commands:
# bridge vlan set dev eth0 vid 10 neigh_suppress on
# bridge vlan set dev eth0 vid 10 neigh_forward_grat on
Signed-off-by: Danielle Ratson <danieller@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
---
net/bridge/br_vlan.c | 1 +
net/bridge/br_vlan_options.c | 24 ++++++++++++++++++++++--
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
index 84a180927eb7..5560afcaaca3 100644
--- a/net/bridge/br_vlan.c
+++ b/net/bridge/br_vlan.c
@@ -2176,6 +2176,7 @@ static const struct nla_policy br_vlan_db_policy[BRIDGE_VLANDB_ENTRY_MAX + 1] =
[BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS] = { .type = NLA_REJECT },
[BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS] = { .type = NLA_U32 },
[BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS] = NLA_POLICY_MAX(NLA_U8, 1),
+ [BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT] = NLA_POLICY_MAX(NLA_U8, 1),
};
static int br_vlan_rtm_process_one(struct net_device *dev,
diff --git a/net/bridge/br_vlan_options.c b/net/bridge/br_vlan_options.c
index 5514e1fc8d1f..92af1e558fda 100644
--- a/net/bridge/br_vlan_options.c
+++ b/net/bridge/br_vlan_options.c
@@ -54,7 +54,8 @@ bool br_vlan_opts_eq_range(const struct net_bridge_vlan *v_curr,
/* Check user-visible priv_flags that affect output */
if ((v_curr->priv_flags ^ range_end->priv_flags) &
- (BR_VLFLAG_NEIGH_SUPPRESS_ENABLED | BR_VLFLAG_MCAST_ENABLED))
+ (BR_VLFLAG_NEIGH_SUPPRESS_ENABLED | BR_VLFLAG_MCAST_ENABLED |
+ BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED))
return false;
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
@@ -74,7 +75,9 @@ bool br_vlan_opts_fill(struct sk_buff *skb, const struct net_bridge_vlan *v,
if (nla_put_u8(skb, BRIDGE_VLANDB_ENTRY_STATE, br_vlan_get_state(v)) ||
!__vlan_tun_put(skb, v) ||
nla_put_u8(skb, BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS,
- !!(v->priv_flags & BR_VLFLAG_NEIGH_SUPPRESS_ENABLED)))
+ !!(v->priv_flags & BR_VLFLAG_NEIGH_SUPPRESS_ENABLED)) ||
+ nla_put_u8(skb, BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT,
+ !!(v->priv_flags & BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED)))
return false;
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
@@ -103,6 +106,7 @@ size_t br_vlan_opts_nl_size(void)
+ nla_total_size(sizeof(u32)) /* BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS */
#endif
+ nla_total_size(sizeof(u8)) /* BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS */
+ + nla_total_size(sizeof(u8)) /* BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT */
+ 0;
}
@@ -277,6 +281,22 @@ static int br_vlan_process_one_opts(const struct net_bridge *br,
}
}
+ if (tb[BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT]) {
+ bool enabled = v->priv_flags & BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED;
+ bool val = nla_get_u8(tb[BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT]);
+
+ if (!p) {
+ NL_SET_ERR_MSG_MOD(extack,
+ "Can't set neigh_forward_grat for non-port vlans");
+ return -EINVAL;
+ }
+
+ if (val != enabled) {
+ v->priv_flags ^= BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED;
+ *changed = true;
+ }
+ }
+
return 0;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH net-next 6/6] selftests: net: Add tests for neigh_forward_grat option
2026-05-03 7:35 [PATCH net-next 0/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
` (4 preceding siblings ...)
2026-05-03 7:35 ` [PATCH net-next 5/6] bridge: Add per-VLAN " Danielle Ratson
@ 2026-05-03 7:35 ` Danielle Ratson
2026-05-04 7:44 ` Nikolay Aleksandrov
5 siblings, 1 reply; 16+ messages in thread
From: Danielle Ratson @ 2026-05-03 7:35 UTC (permalink / raw)
To: netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, razor,
idosch, andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin,
fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest,
Danielle Ratson
Add tests to validate the neigh_forward_grat bridge option for selective
forwarding of gratuitous neighbor announcements.
The tests verify per-port and per-VLAN control of gratuitous neighbor
announcement forwarding for both IPv4 (gratuitous ARP) and IPv6
(unsolicited NA):
- When neigh_suppress is enabled with neigh_forward_grat off (default),
gratuitous announcements are suppressed
- When neigh_forward_grat is enabled, gratuitous announcements are
forwarded while regular neighbor discovery remains suppressed
For IPv4, use arping to send gratuitous ARP packets. For IPv6, use
mausezahn to craft unsolicited Neighbor Advertisement packets.
For the per-port tests, the IPv4 test exercises the ip link interface,
while the IPv6 test exercises the bridge link interface.
The per-VLAN tests use the bridge interface throughout, as per-VLAN
attributes are only accessible via 'bridge vlan'.
Signed-off-by: Danielle Ratson <danieller@nvidia.com>
---
.../net/test_bridge_neigh_suppress.sh | 298 +++++++++++++++++-
1 file changed, 296 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/test_bridge_neigh_suppress.sh b/tools/testing/selftests/net/test_bridge_neigh_suppress.sh
index 4bc92078e173..67d0c773e6a6 100755
--- a/tools/testing/selftests/net/test_bridge_neigh_suppress.sh
+++ b/tools/testing/selftests/net/test_bridge_neigh_suppress.sh
@@ -58,6 +58,10 @@ TESTS="
neigh_vlan_suppress_ns
neigh_suppress_arp_probe
neigh_suppress_dad_ns
+ neigh_forward_grat_arp
+ neigh_forward_grat_na
+ neigh_vlan_forward_grat_arp
+ neigh_vlan_forward_grat_na
"
VERBOSE=0
PAUSE_ON_FAIL=no
@@ -76,7 +80,8 @@ log_test()
printf "TEST: %-60s [ OK ]\n" "${msg}"
nsuccess=$((nsuccess+1))
else
- ret=1
+ # shellcheck disable=SC2154
+ ret=$(ksft_exit_status_merge "$ret" "$ksft_fail")
nfail=$((nfail+1))
printf "TEST: %-60s [FAIL]\n" "${msg}"
if [ "$VERBOSE" = "1" ]; then
@@ -99,6 +104,7 @@ log_test()
fi
[ "$VERBOSE" = "1" ] && echo
+ return 0
}
run_cmd()
@@ -136,6 +142,15 @@ tc_check_packets()
[[ $pkts == $count ]]
}
+neigh_forward_grat_check()
+{
+ if ! bridge link help 2>&1 | grep -q "neigh_forward_grat"; then
+ echo "SKIP: iproute2 bridge too old, missing gratuitous ARP/unsolicited NA forwarding control support"
+ # shellcheck disable=SC2154
+ return "$ksft_skip"
+ fi
+}
+
################################################################################
# Setup
@@ -563,6 +578,17 @@ icmpv6_header_get()
echo $p
}
+icmpv6_na_header_get()
+{
+ local csum=$1; shift
+ local tip=$1; shift
+
+ # Type 136 (Neighbor Advertisement), hex format, Override flag set,
+ # Solicited flag clear (unsolicited NA).
+ # ICMPv6.type : ICMPv6.code : ICMPv6.checksum : Flags : Target Address
+ echo "88:00:$csum:20:00:00:00:$tip:"
+}
+
neigh_suppress_uc_ns_common()
{
local vid=$1; shift
@@ -1001,6 +1027,271 @@ neigh_suppress_dad_ns()
log_test $? 0 "DAD NS suppression"
}
+neigh_forward_grat_arp()
+{
+ local vid=10
+ local sip=192.0.2.1
+ local tip=$sip
+ local h2_mac
+
+ neigh_forward_grat_check || return $?
+
+ echo
+ echo "Gratuitous ARP forwarding"
+ echo "-------------------------"
+
+ run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
+ run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip arp_sip $sip arp_op request action pass"
+
+ h2_mac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
+ run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid"
+ run_cmd "ip -n $sw1 neigh replace $tip lladdr $h2_mac nud permanent dev br0.$vid"
+
+ # Enable neighbor suppression. Gratuitous ARP should be suppressed by
+ # default (neigh_forward_grat defaults to off).
+ run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_suppress on"
+ run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
+ log_test $? 0 "\"neigh_suppress\" is on"
+
+ # Send gratuitous ARP (sip == tip) and check it's suppressed.
+ run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 0
+ log_test $? 0 "Gratuitous ARP suppression"
+
+ # Explicitly enable neigh_forward_grat and verify gratuitous ARP is
+ # now forwarded.
+ run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_forward_grat on"
+ run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat on\""
+ log_test $? 0 "\"neigh_forward_grat\" is on"
+
+ run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 1
+ log_test $? 0 "Gratuitous ARP forwarding"
+
+ # Disable neigh_forward_grat and verify suppression resumes.
+ run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_forward_grat off"
+ run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat off\""
+ log_test $? 0 "\"neigh_forward_grat\" is off"
+
+ run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 1
+ log_test $? 0 "Gratuitous ARP suppression"
+}
+
+# neigh_forward_grat_arp() uses 'ip link' interface, and neigh_forward_grat_na()
+# uses 'bridge link' interface to exercise both paths.
+neigh_forward_grat_na()
+{
+ local vid=10
+ local saddr=2001:db8:1::1
+ local daddr=ff02::1
+ local full_addr=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01
+ local csum="fd:32"
+ local dmac=33:33:00:00:00:01
+ local h2_mac
+ local smac
+
+ neigh_forward_grat_check || return $?
+
+ echo
+ echo "Unsolicited NA forwarding"
+ echo "-------------------------"
+
+ smac=$(ip -n "$h1" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
+
+ run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
+ run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr type 136 code 0 action pass"
+
+ h2_mac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
+ run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid"
+ run_cmd "ip -n $sw1 neigh replace $saddr lladdr $h2_mac nud permanent dev br0.$vid"
+
+ # Enable neighbor suppression. Unsolicited NA should be suppressed by
+ # default (neigh_forward_grat defaults to off).
+ run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
+ run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
+ log_test $? 0 "\"neigh_suppress\" is on"
+
+ # Send unsolicited NA and check it's suppressed.
+ run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 0
+ log_test $? 0 "Unsolicited NA suppression"
+
+ # Explicitly enable neigh_forward_grat and verify unsolicited NA is
+ # now forwarded.
+ run_cmd "bridge -n $sw1 link set dev vx0 neigh_forward_grat on"
+ run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat on\""
+ log_test $? 0 "\"neigh_forward_grat\" is on"
+
+ run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 1
+ log_test $? 0 "Unsolicited NA forwarding"
+
+ # Disable neigh_forward_grat and verify suppression resumes.
+ run_cmd "bridge -n $sw1 link set dev vx0 neigh_forward_grat off"
+ run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat off\""
+ log_test $? 0 "\"neigh_forward_grat\" is off"
+
+ run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 1
+ log_test $? 0 "Unsolicited NA suppression"
+}
+
+neigh_vlan_forward_grat_arp()
+{
+ local vid1=10
+ local vid2=20
+ local sip1=192.0.2.1
+ local sip2=192.0.2.17
+ local h2_mac1
+ local h2_mac2
+
+ neigh_forward_grat_check || return $?
+
+ echo
+ echo "Per-VLAN gratuitous ARP forwarding"
+ echo "----------------------------------"
+
+ run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
+ run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $sip1 arp_sip $sip1 arp_op request action pass"
+ run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto 0x0806 flower indev swp1 arp_tip $sip2 arp_sip $sip2 arp_op request action pass"
+
+ h2_mac1=$(ip -n "$h2" -j -p link show eth0."$vid1" | jq -r '.[]["address"]')
+ h2_mac2=$(ip -n "$h2" -j -p link show eth0."$vid2" | jq -r '.[]["address"]')
+ run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1"
+ run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2"
+ run_cmd "ip -n $sw1 neigh replace $sip1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
+ run_cmd "ip -n $sw1 neigh replace $sip2 lladdr $h2_mac2 nud permanent dev br0.$vid2"
+
+ # Enable per-{Port, VLAN} neighbor suppression.
+ run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on"
+ run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\""
+ log_test $? 0 "\"neigh_vlan_suppress\" is on"
+
+ # Enable neighbor suppression on VLAN 10. Gratuitous ARP should be
+ # suppressed by default on VLAN 10 (neigh_forward_grat defaults to off)
+ # but not on VLAN 20.
+ run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on"
+ run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\""
+ log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)"
+
+ run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 0
+ log_test $? 0 "Gratuitous ARP suppression (VLAN $vid1)"
+
+ run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid2 $sip2"
+ tc_check_packets "$sw1" "dev vx0 egress" 102 1
+ log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid2)"
+
+ # Enable neigh_forward_grat on VLAN 10 and verify gratuitous ARP is
+ # now forwarded.
+ run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_forward_grat on"
+ run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_forward_grat on\""
+ log_test $? 0 "\"neigh_forward_grat\" is on (VLAN $vid1)"
+
+ run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 1
+ log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid1)"
+
+ # Enable neighbor suppression on VLAN 20 (neigh_forward_grat defaults to
+ # off), and verify gratuitous ARP is suppressed on VLAN 20.
+ run_cmd "bridge -n $sw1 vlan set vid $vid2 dev vx0 neigh_suppress on"
+ run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress on\""
+ log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid2)"
+
+ # VLAN 10 should still forward (neigh_forward_grat is on).
+ run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 2
+ log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid1)"
+
+ # VLAN 20 should suppress (neigh_forward_grat defaults to off).
+ run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid2 $sip2"
+ tc_check_packets "$sw1" "dev vx0 egress" 102 1
+ log_test $? 0 "Gratuitous ARP suppression (VLAN $vid2)"
+}
+
+neigh_vlan_forward_grat_na()
+{
+ local vid1=10
+ local vid2=20
+ local saddr1=2001:db8:1::1
+ local daddr=ff02::1
+ local full_addr1=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01
+ local csum1="fd:32"
+ local saddr2=2001:db8:2::1
+ local full_addr2=20:01:0d:b8:00:02:00:00:00:00:00:00:00:00:00:01
+ local csum2="fd:30"
+ local dmac=33:33:00:00:00:01
+ local h2_mac1
+ local h2_mac2
+ local smac
+
+ neigh_forward_grat_check || return $?
+
+ echo
+ echo "Per-VLAN unsolicited NA forwarding"
+ echo "----------------------------------"
+
+ smac=$(ip -n "$h1" -j -p link show eth0."$vid1" | jq -r '.[]["address"]')
+
+ run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
+ run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr1 type 136 code 0 action pass"
+ run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr2 type 136 code 0 action pass"
+
+ h2_mac1=$(ip -n "$h2" -j -p link show eth0."$vid1" | jq -r '.[]["address"]')
+ h2_mac2=$(ip -n "$h2" -j -p link show eth0."$vid2" | jq -r '.[]["address"]')
+ run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1"
+ run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2"
+ run_cmd "ip -n $sw1 neigh replace $saddr1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
+ run_cmd "ip -n $sw1 neigh replace $saddr2 lladdr $h2_mac2 nud permanent dev br0.$vid2"
+
+ # Enable per-{Port, VLAN} neighbor suppression.
+ run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on"
+ run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\""
+ log_test $? 0 "\"neigh_vlan_suppress\" is on"
+
+ # Enable neighbor suppression on VLAN 10. Unsolicited NA should be
+ # suppressed by default on VLAN 10 (neigh_forward_grat defaults to off)
+ # but not on VLAN 20.
+ run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on"
+ run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\""
+ log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)"
+
+ run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 0
+ log_test $? 0 "Unsolicited NA suppression (VLAN $vid1)"
+
+ run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid2 -c 1 -a $smac -b $dmac -A $saddr2 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum2" "$full_addr2") -q"
+ tc_check_packets "$sw1" "dev vx0 egress" 102 1
+ log_test $? 0 "Unsolicited NA forwarding (VLAN $vid2)"
+
+ # Enable neigh_forward_grat on VLAN 10 and verify unsolicited NA is
+ # now forwarded.
+ run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_forward_grat on"
+ run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_forward_grat on\""
+ log_test $? 0 "\"neigh_forward_grat\" is on (VLAN $vid1)"
+
+ run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 1
+ log_test $? 0 "Unsolicited NA forwarding (VLAN $vid1)"
+
+ # Enable neighbor suppression on VLAN 20 (neigh_forward_grat defaults to
+ # off), and verify unsolicited NA is suppressed on VLAN 20.
+ run_cmd "bridge -n $sw1 vlan set vid $vid2 dev vx0 neigh_suppress on"
+ run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress on\""
+ log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid2)"
+
+ # VLAN 10 should still forward (neigh_forward_grat is on).
+ run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q"
+ tc_check_packets "$sw1" "dev vx0 egress" 101 2
+ log_test $? 0 "Unsolicited NA forwarding (VLAN $vid1)"
+
+ # VLAN 20 should suppress (neigh_forward_grat defaults to off).
+ run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid2 -c 1 -a $smac -b $dmac -A $saddr2 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum2" "$full_addr2") -q"
+ tc_check_packets "$sw1" "dev vx0 egress" 102 1
+ log_test $? 0 "Unsolicited NA suppression (VLAN $vid2)"
+}
+
################################################################################
# Usage
@@ -1087,7 +1378,10 @@ cleanup
for t in $TESTS
do
- setup; $t; cleanup;
+ setup
+ $t
+ ret=$(ksft_exit_status_merge "$ret" $?)
+ cleanup
done
if [ "$TESTS" != "none" ]; then
--
2.51.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes
2026-05-03 7:35 ` [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes Danielle Ratson
@ 2026-05-04 7:41 ` Nikolay Aleksandrov
2026-05-06 2:00 ` Jakub Kicinski
1 sibling, 0 replies; 16+ messages in thread
From: Nikolay Aleksandrov @ 2026-05-04 7:41 UTC (permalink / raw)
To: Danielle Ratson, netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, idosch,
andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin, fmaurer,
sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest
On 03/05/2026 10:35, Danielle Ratson wrote:
> Add netlink attributes for controlling gratuitous ARP and unsolicited NA
> forwarding when neighbor suppression is enabled.
>
> Add IFLA_BRPORT_NEIGH_FORWARD_GRAT for port-level control and
> BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT for per-VLAN control.
>
> The new attributes provide independent control of gratuitous ARP and
> unsolicited NA packets. Operators can enable forwarding for those packets
> for fast mobility across VTEPs while keeping general neighbor suppression
> active.
>
> Signed-off-by: Danielle Ratson <danieller@nvidia.com>
> Reviewed-by: Ido Schimmel <idosch@nvidia.com>
> Reviewed-by: Petr Machata <petrm@nvidia.com>
> ---
> Documentation/netlink/specs/rt-link.yaml | 3 +++
> include/uapi/linux/if_bridge.h | 1 +
> include/uapi/linux/if_link.h | 17 +++++++++++++++++
> net/core/rtnetlink.c | 2 +-
> 4 files changed, 22 insertions(+), 1 deletion(-)
>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH net-next 2/6] bridge: Add internal flags for neigh_forward_grat
2026-05-03 7:35 ` [PATCH net-next 2/6] bridge: Add internal flags for neigh_forward_grat Danielle Ratson
@ 2026-05-04 7:41 ` Nikolay Aleksandrov
0 siblings, 0 replies; 16+ messages in thread
From: Nikolay Aleksandrov @ 2026-05-04 7:41 UTC (permalink / raw)
To: Danielle Ratson, netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, idosch,
andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin, fmaurer,
sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest
On 03/05/2026 10:35, Danielle Ratson wrote:
> Add internal flags for the neigh_forward_grat feature:
>
> - BR_NEIGH_FORWARD_GRAT: Port-level flag
> - BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED: Per-VLAN flag
>
> These will be used to control whether gratuitous ARP and unsolicited NA
> packets are forwarded when neighbor suppression is enabled.
>
> Signed-off-by: Danielle Ratson <danieller@nvidia.com>
> Reviewed-by: Petr Machata <petrm@nvidia.com>
> Reviewed-by: Ido Schimmel <idosch@nvidia.com>
> ---
> include/linux/if_bridge.h | 1 +
> net/bridge/br_private.h | 1 +
> 2 files changed, 2 insertions(+)
>
> diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h
> index c5fe3b2a53e8..ec9ffea1e46e 100644
> --- a/include/linux/if_bridge.h
> +++ b/include/linux/if_bridge.h
> @@ -61,6 +61,7 @@ struct br_ip_list {
> #define BR_PORT_LOCKED BIT(21)
> #define BR_PORT_MAB BIT(22)
> #define BR_NEIGH_VLAN_SUPPRESS BIT(23)
> +#define BR_NEIGH_FORWARD_GRAT BIT(24)
>
> #define BR_DEFAULT_AGEING_TIME (300 * HZ)
>
> diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
> index 31e317a3529c..677cd5d68dc7 100644
> --- a/net/bridge/br_private.h
> +++ b/net/bridge/br_private.h
> @@ -187,6 +187,7 @@ enum {
> BR_VLFLAG_GLOBAL_MCAST_ENABLED = BIT(3),
> BR_VLFLAG_NEIGH_SUPPRESS_ENABLED = BIT(4),
> BR_VLFLAG_TAGGING_BY_SWITCHDEV = BIT(5),
> + BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED = BIT(6),
> };
>
> /**
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH net-next 3/6] bridge: Add selective forwarding of gratuitous neighbor announcements
2026-05-03 7:35 ` [PATCH net-next 3/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
@ 2026-05-04 7:41 ` Nikolay Aleksandrov
0 siblings, 0 replies; 16+ messages in thread
From: Nikolay Aleksandrov @ 2026-05-04 7:41 UTC (permalink / raw)
To: Danielle Ratson, netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, idosch,
andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin, fmaurer,
sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest
On 03/05/2026 10:35, Danielle Ratson wrote:
> 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.
>
> Signed-off-by: Danielle Ratson <danieller@nvidia.com>
> Reviewed-by: Ido Schimmel <idosch@nvidia.com>
> Reviewed-by: Petr Machata <petrm@nvidia.com>
> ---
> net/bridge/br_arp_nd_proxy.c | 22 ++++++++++++++++++++++
> net/bridge/br_forward.c | 15 +++++++++++----
> net/bridge/br_private.h | 2 ++
> 3 files changed, 35 insertions(+), 4 deletions(-)
>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH net-next 4/6] bridge: Add port-level netlink handling for neigh_forward_grat
2026-05-03 7:35 ` [PATCH net-next 4/6] bridge: Add port-level netlink handling for neigh_forward_grat Danielle Ratson
@ 2026-05-04 7:42 ` Nikolay Aleksandrov
0 siblings, 0 replies; 16+ messages in thread
From: Nikolay Aleksandrov @ 2026-05-04 7:42 UTC (permalink / raw)
To: Danielle Ratson, netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, idosch,
andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin, fmaurer,
sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest
On 03/05/2026 10:35, Danielle Ratson wrote:
> Add netlink handlers for the port-level neigh_forward_grat option via
> IFLA_BRPORT_NEIGH_FORWARD_GRAT attribute.
>
> The default value of OFF preserves existing behavior, i.e. gratuitous ARP
> and unsolicited NA are suppressed when neigh_suppress is enabled. Users can
> explicitly set it to ON to allow these packets through.
>
> Example for enabling control via 'bridge link' command:
> # bridge link set dev eth0 neigh_suppress on
> # bridge link set dev eth0 neigh_forward_grat on
>
> Signed-off-by: Danielle Ratson <danieller@nvidia.com>
> Reviewed-by: Ido Schimmel <idosch@nvidia.com>
> Reviewed-by: Petr Machata <petrm@nvidia.com>
> ---
> net/bridge/br_netlink.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
> index 6fd5386a1d64..898326c201ef 100644
> --- a/net/bridge/br_netlink.c
> +++ b/net/bridge/br_netlink.c
> @@ -190,6 +190,7 @@ static inline size_t br_port_info_size(void)
> + nla_total_size(1) /* IFLA_BRPORT_LOCKED */
> + nla_total_size(1) /* IFLA_BRPORT_MAB */
> + nla_total_size(1) /* IFLA_BRPORT_NEIGH_VLAN_SUPPRESS */
> + + nla_total_size(1) /* IFLA_BRPORT_NEIGH_FORWARD_GRAT */
> + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_ROOT_ID */
> + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_BRIDGE_ID */
> + nla_total_size(sizeof(u16)) /* IFLA_BRPORT_DESIGNATED_PORT */
> @@ -282,7 +283,9 @@ static int br_port_fill_attrs(struct sk_buff *skb,
> nla_put_u8(skb, IFLA_BRPORT_LOCKED, !!(p->flags & BR_PORT_LOCKED)) ||
> nla_put_u8(skb, IFLA_BRPORT_MAB, !!(p->flags & BR_PORT_MAB)) ||
> nla_put_u8(skb, IFLA_BRPORT_NEIGH_VLAN_SUPPRESS,
> - !!(p->flags & BR_NEIGH_VLAN_SUPPRESS)))
> + !!(p->flags & BR_NEIGH_VLAN_SUPPRESS)) ||
> + nla_put_u8(skb, IFLA_BRPORT_NEIGH_FORWARD_GRAT,
> + !!(p->flags & BR_NEIGH_FORWARD_GRAT)))
> return -EMSGSIZE;
>
> timerval = br_timer_value(&p->message_age_timer);
> @@ -902,6 +905,7 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = {
> [IFLA_BRPORT_MCAST_MAX_GROUPS] = { .type = NLA_U32 },
> [IFLA_BRPORT_NEIGH_VLAN_SUPPRESS] = NLA_POLICY_MAX(NLA_U8, 1),
> [IFLA_BRPORT_BACKUP_NHID] = { .type = NLA_U32 },
> + [IFLA_BRPORT_NEIGH_FORWARD_GRAT] = NLA_POLICY_MAX(NLA_U8, 1),
> };
>
> /* Change the state of the port and notify spanning tree */
> @@ -970,6 +974,8 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[],
> br_set_port_flag(p, tb, IFLA_BRPORT_MAB, BR_PORT_MAB);
> br_set_port_flag(p, tb, IFLA_BRPORT_NEIGH_VLAN_SUPPRESS,
> BR_NEIGH_VLAN_SUPPRESS);
> + br_set_port_flag(p, tb, IFLA_BRPORT_NEIGH_FORWARD_GRAT,
> + BR_NEIGH_FORWARD_GRAT);
>
> if ((p->flags & BR_PORT_MAB) &&
> (!(p->flags & BR_PORT_LOCKED) || !(p->flags & BR_LEARNING))) {
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH net-next 5/6] bridge: Add per-VLAN netlink handling for neigh_forward_grat
2026-05-03 7:35 ` [PATCH net-next 5/6] bridge: Add per-VLAN " Danielle Ratson
@ 2026-05-04 7:43 ` Nikolay Aleksandrov
0 siblings, 0 replies; 16+ messages in thread
From: Nikolay Aleksandrov @ 2026-05-04 7:43 UTC (permalink / raw)
To: Danielle Ratson, netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, idosch,
andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin, fmaurer,
sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest
On 03/05/2026 10:35, Danielle Ratson wrote:
> Add netlink handlers for the per-VLAN neigh_forward_grat option via
> BRIDGE_VLANDB_ENTRY_NEIGH_FORWARD_GRAT attribute.
>
> The per-VLAN option provides fine-grained control, allowing different
> VLANs on the same port to have different gratuitous ARP/unsolicited NA
> forwarding behavior.
>
> This enables control via 'bridge' commands:
> # bridge vlan set dev eth0 vid 10 neigh_suppress on
> # bridge vlan set dev eth0 vid 10 neigh_forward_grat on
>
> Signed-off-by: Danielle Ratson <danieller@nvidia.com>
> Reviewed-by: Ido Schimmel <idosch@nvidia.com>
> Reviewed-by: Petr Machata <petrm@nvidia.com>
> ---
> net/bridge/br_vlan.c | 1 +
> net/bridge/br_vlan_options.c | 24 ++++++++++++++++++++++--
> 2 files changed, 23 insertions(+), 2 deletions(-)
>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH net-next 6/6] selftests: net: Add tests for neigh_forward_grat option
2026-05-03 7:35 ` [PATCH net-next 6/6] selftests: net: Add tests for neigh_forward_grat option Danielle Ratson
@ 2026-05-04 7:44 ` Nikolay Aleksandrov
0 siblings, 0 replies; 16+ messages in thread
From: Nikolay Aleksandrov @ 2026-05-04 7:44 UTC (permalink / raw)
To: Danielle Ratson, netdev
Cc: donald.hunter, kuba, davem, edumazet, pabeni, horms, idosch,
andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin, fmaurer,
sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest
On 03/05/2026 10:35, Danielle Ratson wrote:
> Add tests to validate the neigh_forward_grat bridge option for selective
> forwarding of gratuitous neighbor announcements.
>
> The tests verify per-port and per-VLAN control of gratuitous neighbor
> announcement forwarding for both IPv4 (gratuitous ARP) and IPv6
> (unsolicited NA):
> - When neigh_suppress is enabled with neigh_forward_grat off (default),
> gratuitous announcements are suppressed
> - When neigh_forward_grat is enabled, gratuitous announcements are
> forwarded while regular neighbor discovery remains suppressed
>
> For IPv4, use arping to send gratuitous ARP packets. For IPv6, use
> mausezahn to craft unsolicited Neighbor Advertisement packets.
>
> For the per-port tests, the IPv4 test exercises the ip link interface,
> while the IPv6 test exercises the bridge link interface.
> The per-VLAN tests use the bridge interface throughout, as per-VLAN
> attributes are only accessible via 'bridge vlan'.
>
> Signed-off-by: Danielle Ratson <danieller@nvidia.com>
> ---
> .../net/test_bridge_neigh_suppress.sh | 298 +++++++++++++++++-
> 1 file changed, 296 insertions(+), 2 deletions(-)
>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes
2026-05-03 7:35 ` [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes Danielle Ratson
2026-05-04 7:41 ` Nikolay Aleksandrov
@ 2026-05-06 2:00 ` Jakub Kicinski
2026-05-06 7:03 ` Ido Schimmel
1 sibling, 1 reply; 16+ messages in thread
From: Jakub Kicinski @ 2026-05-06 2:00 UTC (permalink / raw)
To: Danielle Ratson
Cc: netdev, donald.hunter, davem, edumazet, pabeni, horms, razor,
idosch, andrew+netdev, shuah, ast, liuhangbin, daniel, aroulin,
fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz, alasdair,
johannes.wiesboeck, petrm, linux-kernel, bridge, linux-kselftest
On Sun, 3 May 2026 10:35:27 +0300 Danielle Ratson wrote:
> --- a/Documentation/netlink/specs/rt-link.yaml
> +++ b/Documentation/netlink/specs/rt-link.yaml
> @@ -1700,6 +1700,9 @@ attribute-sets:
> -
> name: backup-nhid
> type: u32
> + -
> + name: neigh-forward-grat
> + type: flag
I think this should be u8 ? neigh-vlan-suppress looks buggy too
flag is a type without a payload, the presence of the attr is
the entire information
None of the AIs seem to catch this, I think you may have over-split
this submission a little bit. This patch may have been better off
squashed into patch 4 ?
--
pw-bot: cr
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes
2026-05-06 2:00 ` Jakub Kicinski
@ 2026-05-06 7:03 ` Ido Schimmel
2026-05-06 8:31 ` Danielle Ratson
0 siblings, 1 reply; 16+ messages in thread
From: Ido Schimmel @ 2026-05-06 7:03 UTC (permalink / raw)
To: Jakub Kicinski
Cc: Danielle Ratson, netdev, donald.hunter, davem, edumazet, pabeni,
horms, razor, andrew+netdev, shuah, ast, liuhangbin, daniel,
aroulin, fmaurer, sdf.kernel, sd, kees, nickgarlis, amorenoz,
alasdair, johannes.wiesboeck, petrm, linux-kernel, bridge,
linux-kselftest
On Tue, May 05, 2026 at 07:00:44PM -0700, Jakub Kicinski wrote:
> On Sun, 3 May 2026 10:35:27 +0300 Danielle Ratson wrote:
> > --- a/Documentation/netlink/specs/rt-link.yaml
> > +++ b/Documentation/netlink/specs/rt-link.yaml
> > @@ -1700,6 +1700,9 @@ attribute-sets:
> > -
> > name: backup-nhid
> > type: u32
> > + -
> > + name: neigh-forward-grat
> > + type: flag
>
> I think this should be u8 ? neigh-vlan-suppress looks buggy too
I pointed this out during internal review, but assumed I am missing
something since almost all the attributes use flag when they are in fact
u8. We can fix neigh-forward-grat to use u8 in v2 and change the rest in
net. To be clear, I believe the following should be converted from flag
to u8:
mode, guard, protect, fast-leave, learning, unicast-flood, proxyarp,
learning-sync, proxyarp-wifi, mcast-flood, mcast-to-ucast, vlan-tunnel,
bcast-flood, neigh-suppress, isolated, mrp-ring-open, mrp-in-open,
locked, mab, neigh-vlan-suppress
> flag is a type without a payload, the presence of the attr is
> the entire information
>
> None of the AIs seem to catch this, I think you may have over-split
> this submission a little bit. This patch may have been better off
> squashed into patch 4 ?
Related: The AI also did not catch that the spec was missing (easy to
forget for rtnetlink). Do you think it's worth adding to review-prompts?
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes
2026-05-06 7:03 ` Ido Schimmel
@ 2026-05-06 8:31 ` Danielle Ratson
0 siblings, 0 replies; 16+ messages in thread
From: Danielle Ratson @ 2026-05-06 8:31 UTC (permalink / raw)
To: Ido Schimmel, Jakub Kicinski
Cc: netdev@vger.kernel.org, donald.hunter@gmail.com,
davem@davemloft.net, edumazet@google.com, pabeni@redhat.com,
horms@kernel.org, razor@blackwall.org, andrew+netdev@lunn.ch,
shuah@kernel.org, ast@fiberby.net, liuhangbin@gmail.com,
daniel@iogearbox.net, Andy Roulin, fmaurer@redhat.com,
sdf.kernel@gmail.com, sd@queasysnail.net, kees@kernel.org,
nickgarlis@gmail.com, amorenoz@redhat.com, alasdair@mcwilliam.dev,
johannes.wiesboeck@aisec.fraunhofer.de, Petr Machata,
linux-kernel@vger.kernel.org, bridge@lists.linux.dev,
linux-kselftest@vger.kernel.org
> -----Original Message-----
> From: Ido Schimmel <idosch@nvidia.com>
> Sent: Wednesday, 6 May 2026 10:04
> To: Jakub Kicinski <kuba@kernel.org>
> Cc: Danielle Ratson <danieller@nvidia.com>; netdev@vger.kernel.org;
> donald.hunter@gmail.com; davem@davemloft.net; edumazet@google.com;
> pabeni@redhat.com; horms@kernel.org; razor@blackwall.org;
> andrew+netdev@lunn.ch; shuah@kernel.org; ast@fiberby.net;
> liuhangbin@gmail.com; daniel@iogearbox.net; Andy Roulin
> <aroulin@nvidia.com>; fmaurer@redhat.com; sdf.kernel@gmail.com;
> sd@queasysnail.net; kees@kernel.org; nickgarlis@gmail.com;
> amorenoz@redhat.com; alasdair@mcwilliam.dev;
> johannes.wiesboeck@aisec.fraunhofer.de; Petr Machata
> <petrm@nvidia.com>; linux-kernel@vger.kernel.org; bridge@lists.linux.dev;
> linux-kselftest@vger.kernel.org
> Subject: Re: [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat
> netlink attributes
>
> On Tue, May 05, 2026 at 07:00:44PM -0700, Jakub Kicinski wrote:
> > On Sun, 3 May 2026 10:35:27 +0300 Danielle Ratson wrote:
> > > --- a/Documentation/netlink/specs/rt-link.yaml
> > > +++ b/Documentation/netlink/specs/rt-link.yaml
> > > @@ -1700,6 +1700,9 @@ attribute-sets:
> > > -
> > > name: backup-nhid
> > > type: u32
> > > + -
> > > + name: neigh-forward-grat
> > > + type: flag
> >
> > I think this should be u8 ? neigh-vlan-suppress looks buggy too
>
> I pointed this out during internal review, but assumed I am missing something
> since almost all the attributes use flag when they are in fact u8. We can fix
This is in fact the reason why I also changed it myself to use flag before sending.
> neigh-forward-grat to use u8 in v2 and change the rest in net. To be clear, I
> believe the following should be converted from flag to u8:
>
> mode, guard, protect, fast-leave, learning, unicast-flood, proxyarp, learning-
> sync, proxyarp-wifi, mcast-flood, mcast-to-ucast, vlan-tunnel, bcast-flood,
> neigh-suppress, isolated, mrp-ring-open, mrp-in-open, locked, mab, neigh-
> vlan-suppress
>
So should we proceed as Ido suggested?
> > flag is a type without a payload, the presence of the attr is the
> > entire information
> >
> > None of the AIs seem to catch this, I think you may have over-split
> > this submission a little bit. This patch may have been better off
> > squashed into patch 4 ?
It seems like the patch has enough content, but I can squash. I guess ill split the commit between patches 4 and 5 accordingly.
>
> Related: The AI also did not catch that the spec was missing (easy to forget for
> rtnetlink). Do you think it's worth adding to review-prompts?
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-05-06 8:31 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-03 7:35 [PATCH net-next 0/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
2026-05-03 7:35 ` [PATCH net-next 1/6] bridge: uapi: Add neigh_forward_grat netlink attributes Danielle Ratson
2026-05-04 7:41 ` Nikolay Aleksandrov
2026-05-06 2:00 ` Jakub Kicinski
2026-05-06 7:03 ` Ido Schimmel
2026-05-06 8:31 ` Danielle Ratson
2026-05-03 7:35 ` [PATCH net-next 2/6] bridge: Add internal flags for neigh_forward_grat Danielle Ratson
2026-05-04 7:41 ` Nikolay Aleksandrov
2026-05-03 7:35 ` [PATCH net-next 3/6] bridge: Add selective forwarding of gratuitous neighbor announcements Danielle Ratson
2026-05-04 7:41 ` Nikolay Aleksandrov
2026-05-03 7:35 ` [PATCH net-next 4/6] bridge: Add port-level netlink handling for neigh_forward_grat Danielle Ratson
2026-05-04 7:42 ` Nikolay Aleksandrov
2026-05-03 7:35 ` [PATCH net-next 5/6] bridge: Add per-VLAN " Danielle Ratson
2026-05-04 7:43 ` Nikolay Aleksandrov
2026-05-03 7:35 ` [PATCH net-next 6/6] selftests: net: Add tests for neigh_forward_grat option Danielle Ratson
2026-05-04 7:44 ` Nikolay Aleksandrov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox