Commit 160656d7 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller
Browse files

bridge: Allow setting per-{Port, VLAN} neighbor suppression state



Add a new bridge port attribute that allows user space to enable
per-{Port, VLAN} neighbor suppression. Example:

 # bridge -d -j -p link show dev swp1 | jq '.[]["neigh_vlan_suppress"]'
 false
 # bridge link set dev swp1 neigh_vlan_suppress on
 # bridge -d -j -p link show dev swp1 | jq '.[]["neigh_vlan_suppress"]'
 true
 # bridge link set dev swp1 neigh_vlan_suppress off
 # bridge -d -j -p link show dev swp1 | jq '.[]["neigh_vlan_suppress"]'
 false

Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 83f6d600
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -569,6 +569,7 @@ enum {
	IFLA_BRPORT_MAB,
	IFLA_BRPORT_MCAST_N_GROUPS,
	IFLA_BRPORT_MCAST_MAX_GROUPS,
	IFLA_BRPORT_NEIGH_VLAN_SUPPRESS,
	__IFLA_BRPORT_MAX
};
#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
+7 −1
Original line number Diff line number Diff line
@@ -189,6 +189,7 @@ static inline size_t br_port_info_size(void)
		+ nla_total_size(1)	/* IFLA_BRPORT_ISOLATED */
		+ 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(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 */
@@ -278,7 +279,9 @@ static int br_port_fill_attrs(struct sk_buff *skb,
		       !!(p->flags & BR_MRP_LOST_IN_CONT)) ||
	    nla_put_u8(skb, IFLA_BRPORT_ISOLATED, !!(p->flags & BR_ISOLATED)) ||
	    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_MAB, !!(p->flags & BR_PORT_MAB)) ||
	    nla_put_u8(skb, IFLA_BRPORT_NEIGH_VLAN_SUPPRESS,
		       !!(p->flags & BR_NEIGH_VLAN_SUPPRESS)))
		return -EMSGSIZE;

	timerval = br_timer_value(&p->message_age_timer);
@@ -891,6 +894,7 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = {
	[IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT] = { .type = NLA_U32 },
	[IFLA_BRPORT_MCAST_N_GROUPS] = { .type = NLA_REJECT },
	[IFLA_BRPORT_MCAST_MAX_GROUPS] = { .type = NLA_U32 },
	[IFLA_BRPORT_NEIGH_VLAN_SUPPRESS] = NLA_POLICY_MAX(NLA_U8, 1),
};

/* Change the state of the port and notify spanning tree */
@@ -957,6 +961,8 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[],
	br_set_port_flag(p, tb, IFLA_BRPORT_ISOLATED, BR_ISOLATED);
	br_set_port_flag(p, tb, IFLA_BRPORT_LOCKED, BR_PORT_LOCKED);
	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);

	if ((p->flags & BR_PORT_MAB) &&
	    (!(p->flags & BR_PORT_LOCKED) || !(p->flags & BR_LEARNING))) {
+1 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@
#include "dev.h"

#define RTNL_MAX_TYPE		50
#define RTNL_SLAVE_MAX_TYPE	42
#define RTNL_SLAVE_MAX_TYPE	43

struct rtnl_link {
	rtnl_doit_func		doit;