History

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.

Ido Schimmel committed 3 years ago

Commit 83f6d601 parent 412614b3 files · +21 −1Browse files

Unified · Split

3 files
  1. include/uapi/linux/if_bridge.h +1 −0
  2. net/bridge/br_vlan.c +1 −0
  3. net/bridge/br_vlan_options.c +19 −1
include/uapi/linux/if_bridge.h+1−0
@@ -525,6 +525,7 @@ enum { · 524 unmodified lines
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+1−0
@@ -2134,6 +2134,7 @@ static const struct nla_policy br_vlan_db_policy[BRIDGE_VLANDB_ENTRY_MAX + 1] = · 2133 unmodified lines
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+19−1
@@ -52,7 +52,9 @@ bool br_vlan_opts_fill(struct sk_buff *skb, const struct net_bridge_vlan *v, · 51 unmodified lines
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) · 21 unmodified lines
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, · 153 unmodified lines
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

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t