Commit ef240c10 authored by David S. Miller's avatar David S. Miller

Merge branch 'bridge-mdb-attrs'

Nikolay Aleksandrov says:

====================
bridge: mdb: add support for extended attributes

This small set allows to extend the per mdb entry exported attributes,
before this set we had only a structure exported which couldn't be changed
because we would've broken user-space, after this we extend the attribute
that was used for the structure and add per-mdb entry attributes after the
struct has been added (see patch 02 for more details). Note that the reason
we can't simply add an attribute after MDBA_MDB_ENTRY_INFO is that current
users (e.g. iproute2) walk over the attribute list directly without
checking for the attribute type.
Patch 01 is a simple change to reduce one indentation level in order to
avoid over 80 char lines.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 6bbd9a05 21257156
...@@ -137,7 +137,10 @@ struct bridge_vlan_info { ...@@ -137,7 +137,10 @@ struct bridge_vlan_info {
/* Bridge multicast database attributes /* Bridge multicast database attributes
* [MDBA_MDB] = { * [MDBA_MDB] = {
* [MDBA_MDB_ENTRY] = { * [MDBA_MDB_ENTRY] = {
* [MDBA_MDB_ENTRY_INFO] * [MDBA_MDB_ENTRY_INFO] {
* struct br_mdb_entry
* [MDBA_MDB_EATTR attributes]
* }
* } * }
* } * }
* [MDBA_ROUTER] = { * [MDBA_ROUTER] = {
...@@ -166,6 +169,14 @@ enum { ...@@ -166,6 +169,14 @@ enum {
}; };
#define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1) #define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1)
/* per mdb entry additional attributes */
enum {
MDBA_MDB_EATTR_UNSPEC,
MDBA_MDB_EATTR_TIMER,
__MDBA_MDB_EATTR_MAX
};
#define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1)
enum { enum {
MDBA_ROUTER_UNSPEC, MDBA_ROUTER_UNSPEC,
MDBA_ROUTER_PORT, MDBA_ROUTER_PORT,
......
...@@ -88,26 +88,41 @@ static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb, ...@@ -88,26 +88,41 @@ static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
for (pp = &mp->ports; for (pp = &mp->ports;
(p = rcu_dereference(*pp)) != NULL; (p = rcu_dereference(*pp)) != NULL;
pp = &p->next) { pp = &p->next) {
struct nlattr *nest_ent;
struct br_mdb_entry e;
port = p->port; port = p->port;
if (port) { if (!port)
struct br_mdb_entry e; continue;
memset(&e, 0, sizeof(e));
e.ifindex = port->dev->ifindex; memset(&e, 0, sizeof(e));
e.vid = p->addr.vid; e.ifindex = port->dev->ifindex;
__mdb_entry_fill_flags(&e, p->flags); e.vid = p->addr.vid;
if (p->addr.proto == htons(ETH_P_IP)) __mdb_entry_fill_flags(&e, p->flags);
e.addr.u.ip4 = p->addr.u.ip4; if (p->addr.proto == htons(ETH_P_IP))
e.addr.u.ip4 = p->addr.u.ip4;
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
if (p->addr.proto == htons(ETH_P_IPV6)) if (p->addr.proto == htons(ETH_P_IPV6))
e.addr.u.ip6 = p->addr.u.ip6; e.addr.u.ip6 = p->addr.u.ip6;
#endif #endif
e.addr.proto = p->addr.proto; e.addr.proto = p->addr.proto;
if (nla_put(skb, MDBA_MDB_ENTRY_INFO, sizeof(e), &e)) { nest_ent = nla_nest_start(skb,
nla_nest_cancel(skb, nest2); MDBA_MDB_ENTRY_INFO);
err = -EMSGSIZE; if (!nest_ent) {
goto out; nla_nest_cancel(skb, nest2);
} err = -EMSGSIZE;
goto out;
}
if (nla_put_nohdr(skb, sizeof(e), &e) ||
nla_put_u32(skb,
MDBA_MDB_EATTR_TIMER,
br_timer_value(&p->timer))) {
nla_nest_cancel(skb, nest_ent);
nla_nest_cancel(skb, nest2);
err = -EMSGSIZE;
goto out;
} }
nla_nest_end(skb, nest_ent);
} }
nla_nest_end(skb, nest2); nla_nest_end(skb, nest2);
skip: skip:
......
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