net: bridge: mdb: add support to extend add/del commands
Since the MDB add/del code expects an exact struct br_mdb_entry we can't really add any extensions, thus add a new nested attribute at the level of MDBA_SET_ENTRY called MDBA_SET_ENTRY_ATTRS which will be used to pass all new options via netlink attributes. This patch doesn't change anything functionally since the new attribute is not used yet, only parsed. Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
eab3227b12
commit
9c4258c78a
@@ -530,10 +530,22 @@ struct br_mdb_entry {
|
|||||||
enum {
|
enum {
|
||||||
MDBA_SET_ENTRY_UNSPEC,
|
MDBA_SET_ENTRY_UNSPEC,
|
||||||
MDBA_SET_ENTRY,
|
MDBA_SET_ENTRY,
|
||||||
|
MDBA_SET_ENTRY_ATTRS,
|
||||||
__MDBA_SET_ENTRY_MAX,
|
__MDBA_SET_ENTRY_MAX,
|
||||||
};
|
};
|
||||||
#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1)
|
#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1)
|
||||||
|
|
||||||
|
/* [MDBA_SET_ENTRY_ATTRS] = {
|
||||||
|
* [MDBE_ATTR_xxx]
|
||||||
|
* ...
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
MDBE_ATTR_UNSPEC,
|
||||||
|
__MDBE_ATTR_MAX,
|
||||||
|
};
|
||||||
|
#define MDBE_ATTR_MAX (__MDBE_ATTR_MAX - 1)
|
||||||
|
|
||||||
/* Embedded inside LINK_XSTATS_TYPE_BRIDGE */
|
/* Embedded inside LINK_XSTATS_TYPE_BRIDGE */
|
||||||
enum {
|
enum {
|
||||||
BRIDGE_XSTATS_UNSPEC,
|
BRIDGE_XSTATS_UNSPEC,
|
||||||
|
@@ -670,9 +670,12 @@ static bool is_valid_mdb_entry(struct br_mdb_entry *entry,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct nla_policy br_mdbe_attrs_pol[MDBE_ATTR_MAX + 1] = {
|
||||||
|
};
|
||||||
|
|
||||||
static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh,
|
static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
struct net_device **pdev, struct br_mdb_entry **pentry,
|
struct net_device **pdev, struct br_mdb_entry **pentry,
|
||||||
struct netlink_ext_ack *extack)
|
struct nlattr **mdb_attrs, struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
struct net *net = sock_net(skb->sk);
|
struct net *net = sock_net(skb->sk);
|
||||||
struct br_mdb_entry *entry;
|
struct br_mdb_entry *entry;
|
||||||
@@ -719,6 +722,17 @@ static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
*pentry = entry;
|
*pentry = entry;
|
||||||
|
|
||||||
|
if (tb[MDBA_SET_ENTRY_ATTRS]) {
|
||||||
|
err = nla_parse_nested(mdb_attrs, MDBE_ATTR_MAX,
|
||||||
|
tb[MDBA_SET_ENTRY_ATTRS],
|
||||||
|
br_mdbe_attrs_pol, extack);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
} else {
|
||||||
|
memset(mdb_attrs, 0,
|
||||||
|
sizeof(struct nlattr *) * (MDBE_ATTR_MAX + 1));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -803,6 +817,7 @@ static int __br_mdb_add(struct net *net, struct net_bridge *br,
|
|||||||
static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
|
static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct nlattr *mdb_attrs[MDBE_ATTR_MAX + 1];
|
||||||
struct net *net = sock_net(skb->sk);
|
struct net *net = sock_net(skb->sk);
|
||||||
struct net_bridge_vlan_group *vg;
|
struct net_bridge_vlan_group *vg;
|
||||||
struct net_bridge_port *p = NULL;
|
struct net_bridge_port *p = NULL;
|
||||||
@@ -812,7 +827,7 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||||||
struct net_bridge *br;
|
struct net_bridge *br;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = br_mdb_parse(skb, nlh, &dev, &entry, extack);
|
err = br_mdb_parse(skb, nlh, &dev, &entry, mdb_attrs, extack);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
@@ -921,6 +936,7 @@ unlock:
|
|||||||
static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
|
static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct nlattr *mdb_attrs[MDBE_ATTR_MAX + 1];
|
||||||
struct net *net = sock_net(skb->sk);
|
struct net *net = sock_net(skb->sk);
|
||||||
struct net_bridge_vlan_group *vg;
|
struct net_bridge_vlan_group *vg;
|
||||||
struct net_bridge_port *p = NULL;
|
struct net_bridge_port *p = NULL;
|
||||||
@@ -930,7 +946,7 @@ static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||||||
struct net_bridge *br;
|
struct net_bridge *br;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = br_mdb_parse(skb, nlh, &dev, &entry, extack);
|
err = br_mdb_parse(skb, nlh, &dev, &entry, mdb_attrs, extack);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user