Skip to content

Commit 83f6d60

Browse files
idoschdavem330
authored andcommitted
bridge: vlan: Allow setting VLAN neighbor suppression state
Add a new VLAN attribute that allows user space to set the neighbor suppression state of the port VLAN. Example: # bridge -d -j -p vlan show dev swp1 vid 10 | jq '.[]["vlans"][]["neigh_suppress"]' false # bridge vlan set vid 10 dev swp1 neigh_suppress on # bridge -d -j -p vlan show dev swp1 vid 10 | jq '.[]["vlans"][]["neigh_suppress"]' true # bridge vlan set vid 10 dev swp1 neigh_suppress off # bridge -d -j -p vlan show dev swp1 vid 10 | jq '.[]["vlans"][]["neigh_suppress"]' false # bridge vlan set vid 10 dev br0 neigh_suppress on Error: bridge: Can't set neigh_suppress for non-port vlans. Signed-off-by: Ido Schimmel <idosch@nvidia.com> Acked-by: Nikolay Aleksandrov <razor@blackwall.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 412614b commit 83f6d60

3 files changed

Lines changed: 21 additions & 1 deletion

File tree

include/uapi/linux/if_bridge.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ enum {
525525
BRIDGE_VLANDB_ENTRY_MCAST_ROUTER,
526526
BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS,
527527
BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS,
528+
BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS,
528529
__BRIDGE_VLANDB_ENTRY_MAX,
529530
};
530531
#define BRIDGE_VLANDB_ENTRY_MAX (__BRIDGE_VLANDB_ENTRY_MAX - 1)

net/bridge/br_vlan.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,6 +2134,7 @@ static const struct nla_policy br_vlan_db_policy[BRIDGE_VLANDB_ENTRY_MAX + 1] =
21342134
[BRIDGE_VLANDB_ENTRY_MCAST_ROUTER] = { .type = NLA_U8 },
21352135
[BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS] = { .type = NLA_REJECT },
21362136
[BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS] = { .type = NLA_U32 },
2137+
[BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS] = NLA_POLICY_MAX(NLA_U8, 1),
21372138
};
21382139

21392140
static int br_vlan_rtm_process_one(struct net_device *dev,

net/bridge/br_vlan_options.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ bool br_vlan_opts_fill(struct sk_buff *skb, const struct net_bridge_vlan *v,
5252
const struct net_bridge_port *p)
5353
{
5454
if (nla_put_u8(skb, BRIDGE_VLANDB_ENTRY_STATE, br_vlan_get_state(v)) ||
55-
!__vlan_tun_put(skb, v))
55+
!__vlan_tun_put(skb, v) ||
56+
nla_put_u8(skb, BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS,
57+
!!(v->priv_flags & BR_VLFLAG_NEIGH_SUPPRESS_ENABLED)))
5658
return false;
5759

5860
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
@@ -80,6 +82,7 @@ size_t br_vlan_opts_nl_size(void)
8082
+ nla_total_size(sizeof(u32)) /* BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS */
8183
+ nla_total_size(sizeof(u32)) /* BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS */
8284
#endif
85+
+ nla_total_size(sizeof(u8)) /* BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS */
8386
+ 0;
8487
}
8588

@@ -239,6 +242,21 @@ static int br_vlan_process_one_opts(const struct net_bridge *br,
239242
}
240243
#endif
241244

245+
if (tb[BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS]) {
246+
bool enabled = v->priv_flags & BR_VLFLAG_NEIGH_SUPPRESS_ENABLED;
247+
bool val = nla_get_u8(tb[BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS]);
248+
249+
if (!p) {
250+
NL_SET_ERR_MSG_MOD(extack, "Can't set neigh_suppress for non-port vlans");
251+
return -EINVAL;
252+
}
253+
254+
if (val != enabled) {
255+
v->priv_flags ^= BR_VLFLAG_NEIGH_SUPPRESS_ENABLED;
256+
*changed = true;
257+
}
258+
}
259+
242260
return 0;
243261
}
244262

0 commit comments

Comments
 (0)