Commit 2dba407f authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by Jakub Kicinski

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: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 89268b05
...@@ -525,6 +525,8 @@ enum { ...@@ -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, ...@@ -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 @@ ...@@ -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) ...@@ -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, ...@@ -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] = { ...@@ -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[]) ...@@ -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, ...@@ -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 @@ ...@@ -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, ...@@ -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[] = { ...@@ -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 @@ ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment