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.
Unified · Split
| @@ -525,6 +525,7 @@ enum { · 524 unmodified lines | ||
| 525 | 525 | BRIDGE_VLANDB_ENTRY_MCAST_ROUTER, |
| 526 | 526 | BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS, |
| 527 | 527 | BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS, |
| 528 | + BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS, | |
| 528 | 529 | __BRIDGE_VLANDB_ENTRY_MAX, |
| 529 | 530 | }; |
| 530 | 531 | #define BRIDGE_VLANDB_ENTRY_MAX (__BRIDGE_VLANDB_ENTRY_MAX - 1) |
| @@ -2134,6 +2134,7 @@ static const struct nla_policy br_vlan_db_policy[BRIDGE_VLANDB_ENTRY_MAX + 1] = · 2133 unmodified lines | ||
| 2134 | 2134 | [BRIDGE_VLANDB_ENTRY_MCAST_ROUTER] = { .type = NLA_U8 }, |
| 2135 | 2135 | [BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS] = { .type = NLA_REJECT }, |
| 2136 | 2136 | [BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS] = { .type = NLA_U32 }, |
| 2137 | + [BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS] = NLA_POLICY_MAX(NLA_U8, 1), | |
| 2137 | 2138 | }; |
| 2138 | 2139 | |
| 2139 | 2140 | static int br_vlan_rtm_process_one(struct net_device *dev, |
| @@ -52,7 +52,9 @@ bool br_vlan_opts_fill(struct sk_buff *skb, const struct net_bridge_vlan *v, · 51 unmodified lines | ||
| 52 | 52 | const struct net_bridge_port *p) |
| 53 | 53 | { |
| 54 | 54 | 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))) | |
| 56 | 58 | return false; |
| 57 | 59 | |
| 58 | 60 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING |
| @@ -80,6 +82,7 @@ size_t br_vlan_opts_nl_size(void) · 21 unmodified lines | ||
| 80 | 82 | + nla_total_size(sizeof(u32)) /* BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS */ |
| 81 | 83 | + nla_total_size(sizeof(u32)) /* BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS */ |
| 82 | 84 | #endif |
| 85 | + + nla_total_size(sizeof(u8)) /* BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS */ | |
| 83 | 86 | + 0; |
| 84 | 87 | } |
| 85 | 88 | |
| @@ -239,6 +242,21 @@ static int br_vlan_process_one_opts(const struct net_bridge *br, · 153 unmodified lines | ||
| 239 | 242 | } |
| 240 | 243 | #endif |
| 241 | 244 | |
| 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 | + | |
| 242 | 260 | return 0; |
| 243 | 261 | } |
| 244 | 262 | |