net: bridge: multicast: make tracked EHT hosts limit configurable
Add two new port attributes which make EHT hosts limit configurable and export the current number of tracked EHT hosts: - IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT: configure/retrieve current limit - IFLA_BRPORT_MCAST_EHT_HOSTS_CNT: current number of tracked hosts Setting IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT to 0 is currently not allowed. Note that we have to increase RTNL_SLAVE_MAX_TYPE to 38 minimum, I've increased it to 40 to have space for two more future entries. v2: move br_multicast_eht_set_hosts_limit() to br_multicast_eht.c, no functional change Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
89268b056e
commit
2dba407f99
@ -525,6 +525,8 @@ enum {
|
|||||||
IFLA_BRPORT_BACKUP_PORT,
|
IFLA_BRPORT_BACKUP_PORT,
|
||||||
IFLA_BRPORT_MRP_RING_OPEN,
|
IFLA_BRPORT_MRP_RING_OPEN,
|
||||||
IFLA_BRPORT_MRP_IN_OPEN,
|
IFLA_BRPORT_MRP_IN_OPEN,
|
||||||
|
IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT,
|
||||||
|
IFLA_BRPORT_MCAST_EHT_HOSTS_CNT,
|
||||||
__IFLA_BRPORT_MAX
|
__IFLA_BRPORT_MAX
|
||||||
};
|
};
|
||||||
#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
|
#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
|
||||||
|
@ -861,3 +861,18 @@ bool br_multicast_eht_handle(struct net_bridge_port_group *pg,
|
|||||||
out:
|
out:
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int br_multicast_eht_set_hosts_limit(struct net_bridge_port *p,
|
||||||
|
u32 eht_hosts_limit)
|
||||||
|
{
|
||||||
|
struct net_bridge *br = p->br;
|
||||||
|
|
||||||
|
if (!eht_hosts_limit)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
spin_lock_bh(&br->multicast_lock);
|
||||||
|
p->multicast_eht_hosts_limit = eht_hosts_limit;
|
||||||
|
spin_unlock_bh(&br->multicast_lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "br_private_stp.h"
|
#include "br_private_stp.h"
|
||||||
#include "br_private_cfm.h"
|
#include "br_private_cfm.h"
|
||||||
#include "br_private_tunnel.h"
|
#include "br_private_tunnel.h"
|
||||||
|
#include "br_private_mcast_eht.h"
|
||||||
|
|
||||||
static int __get_num_vlan_infos(struct net_bridge_vlan_group *vg,
|
static int __get_num_vlan_infos(struct net_bridge_vlan_group *vg,
|
||||||
u32 filter_mask)
|
u32 filter_mask)
|
||||||
@ -199,6 +200,8 @@ static inline size_t br_port_info_size(void)
|
|||||||
+ nla_total_size(sizeof(u16)) /* IFLA_BRPORT_GROUP_FWD_MASK */
|
+ nla_total_size(sizeof(u16)) /* IFLA_BRPORT_GROUP_FWD_MASK */
|
||||||
+ nla_total_size(sizeof(u8)) /* IFLA_BRPORT_MRP_RING_OPEN */
|
+ nla_total_size(sizeof(u8)) /* IFLA_BRPORT_MRP_RING_OPEN */
|
||||||
+ nla_total_size(sizeof(u8)) /* IFLA_BRPORT_MRP_IN_OPEN */
|
+ nla_total_size(sizeof(u8)) /* IFLA_BRPORT_MRP_IN_OPEN */
|
||||||
|
+ nla_total_size(sizeof(u32)) /* IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT */
|
||||||
|
+ nla_total_size(sizeof(u32)) /* IFLA_BRPORT_MCAST_EHT_HOSTS_CNT */
|
||||||
+ 0;
|
+ 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,7 +286,11 @@ static int br_port_fill_attrs(struct sk_buff *skb,
|
|||||||
|
|
||||||
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
|
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
|
||||||
if (nla_put_u8(skb, IFLA_BRPORT_MULTICAST_ROUTER,
|
if (nla_put_u8(skb, IFLA_BRPORT_MULTICAST_ROUTER,
|
||||||
p->multicast_router))
|
p->multicast_router) ||
|
||||||
|
nla_put_u32(skb, IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT,
|
||||||
|
p->multicast_eht_hosts_limit) ||
|
||||||
|
nla_put_u32(skb, IFLA_BRPORT_MCAST_EHT_HOSTS_CNT,
|
||||||
|
p->multicast_eht_hosts_cnt))
|
||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -820,6 +827,7 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = {
|
|||||||
[IFLA_BRPORT_NEIGH_SUPPRESS] = { .type = NLA_U8 },
|
[IFLA_BRPORT_NEIGH_SUPPRESS] = { .type = NLA_U8 },
|
||||||
[IFLA_BRPORT_ISOLATED] = { .type = NLA_U8 },
|
[IFLA_BRPORT_ISOLATED] = { .type = NLA_U8 },
|
||||||
[IFLA_BRPORT_BACKUP_PORT] = { .type = NLA_U32 },
|
[IFLA_BRPORT_BACKUP_PORT] = { .type = NLA_U32 },
|
||||||
|
[IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT] = { .type = NLA_U32 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Change the state of the port and notify spanning tree */
|
/* Change the state of the port and notify spanning tree */
|
||||||
@ -955,6 +963,15 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tb[IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT]) {
|
||||||
|
u32 hlimit;
|
||||||
|
|
||||||
|
hlimit = nla_get_u32(tb[IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT]);
|
||||||
|
err = br_multicast_eht_set_hosts_limit(p, hlimit);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (tb[IFLA_BRPORT_GROUP_FWD_MASK]) {
|
if (tb[IFLA_BRPORT_GROUP_FWD_MASK]) {
|
||||||
|
@ -57,6 +57,8 @@ bool br_multicast_eht_handle(struct net_bridge_port_group *pg,
|
|||||||
u32 nsrcs,
|
u32 nsrcs,
|
||||||
size_t addr_size,
|
size_t addr_size,
|
||||||
int grec_type);
|
int grec_type);
|
||||||
|
int br_multicast_eht_set_hosts_limit(struct net_bridge_port *p,
|
||||||
|
u32 eht_hosts_limit);
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
br_multicast_eht_should_del_pg(const struct net_bridge_port_group *pg)
|
br_multicast_eht_should_del_pg(const struct net_bridge_port_group *pg)
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <linux/sched/signal.h>
|
#include <linux/sched/signal.h>
|
||||||
|
|
||||||
#include "br_private.h"
|
#include "br_private.h"
|
||||||
|
#include "br_private_mcast_eht.h"
|
||||||
|
|
||||||
struct brport_attribute {
|
struct brport_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
@ -245,6 +246,29 @@ static int store_multicast_router(struct net_bridge_port *p,
|
|||||||
static BRPORT_ATTR(multicast_router, 0644, show_multicast_router,
|
static BRPORT_ATTR(multicast_router, 0644, show_multicast_router,
|
||||||
store_multicast_router);
|
store_multicast_router);
|
||||||
|
|
||||||
|
static ssize_t show_multicast_eht_hosts_limit(struct net_bridge_port *p,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
return sprintf(buf, "%u\n", p->multicast_eht_hosts_limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int store_multicast_eht_hosts_limit(struct net_bridge_port *p,
|
||||||
|
unsigned long v)
|
||||||
|
{
|
||||||
|
return br_multicast_eht_set_hosts_limit(p, v);
|
||||||
|
}
|
||||||
|
static BRPORT_ATTR(multicast_eht_hosts_limit, 0644,
|
||||||
|
show_multicast_eht_hosts_limit,
|
||||||
|
store_multicast_eht_hosts_limit);
|
||||||
|
|
||||||
|
static ssize_t show_multicast_eht_hosts_cnt(struct net_bridge_port *p,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
return sprintf(buf, "%u\n", p->multicast_eht_hosts_cnt);
|
||||||
|
}
|
||||||
|
static BRPORT_ATTR(multicast_eht_hosts_cnt, 0444, show_multicast_eht_hosts_cnt,
|
||||||
|
NULL);
|
||||||
|
|
||||||
BRPORT_ATTR_FLAG(multicast_fast_leave, BR_MULTICAST_FAST_LEAVE);
|
BRPORT_ATTR_FLAG(multicast_fast_leave, BR_MULTICAST_FAST_LEAVE);
|
||||||
BRPORT_ATTR_FLAG(multicast_to_unicast, BR_MULTICAST_TO_UNICAST);
|
BRPORT_ATTR_FLAG(multicast_to_unicast, BR_MULTICAST_TO_UNICAST);
|
||||||
#endif
|
#endif
|
||||||
@ -274,6 +298,8 @@ static const struct brport_attribute *brport_attrs[] = {
|
|||||||
&brport_attr_multicast_router,
|
&brport_attr_multicast_router,
|
||||||
&brport_attr_multicast_fast_leave,
|
&brport_attr_multicast_fast_leave,
|
||||||
&brport_attr_multicast_to_unicast,
|
&brport_attr_multicast_to_unicast,
|
||||||
|
&brport_attr_multicast_eht_hosts_limit,
|
||||||
|
&brport_attr_multicast_eht_hosts_cnt,
|
||||||
#endif
|
#endif
|
||||||
&brport_attr_proxyarp,
|
&brport_attr_proxyarp,
|
||||||
&brport_attr_proxyarp_wifi,
|
&brport_attr_proxyarp_wifi,
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
#include <net/net_namespace.h>
|
#include <net/net_namespace.h>
|
||||||
|
|
||||||
#define RTNL_MAX_TYPE 50
|
#define RTNL_MAX_TYPE 50
|
||||||
#define RTNL_SLAVE_MAX_TYPE 36
|
#define RTNL_SLAVE_MAX_TYPE 40
|
||||||
|
|
||||||
struct rtnl_link {
|
struct rtnl_link {
|
||||||
rtnl_doit_func doit;
|
rtnl_doit_func doit;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user