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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
ef240c10e0
|
@ -137,7 +137,10 @@ struct bridge_vlan_info {
|
|||
/* Bridge multicast database attributes
|
||||
* [MDBA_MDB] = {
|
||||
* [MDBA_MDB_ENTRY] = {
|
||||
* [MDBA_MDB_ENTRY_INFO]
|
||||
* [MDBA_MDB_ENTRY_INFO] {
|
||||
* struct br_mdb_entry
|
||||
* [MDBA_MDB_EATTR attributes]
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* [MDBA_ROUTER] = {
|
||||
|
@ -166,6 +169,14 @@ enum {
|
|||
};
|
||||
#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 {
|
||||
MDBA_ROUTER_UNSPEC,
|
||||
MDBA_ROUTER_PORT,
|
||||
|
|
|
@ -88,26 +88,41 @@ static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
|
|||
for (pp = &mp->ports;
|
||||
(p = rcu_dereference(*pp)) != NULL;
|
||||
pp = &p->next) {
|
||||
struct nlattr *nest_ent;
|
||||
struct br_mdb_entry e;
|
||||
|
||||
port = p->port;
|
||||
if (port) {
|
||||
struct br_mdb_entry e;
|
||||
memset(&e, 0, sizeof(e));
|
||||
e.ifindex = port->dev->ifindex;
|
||||
e.vid = p->addr.vid;
|
||||
__mdb_entry_fill_flags(&e, p->flags);
|
||||
if (p->addr.proto == htons(ETH_P_IP))
|
||||
e.addr.u.ip4 = p->addr.u.ip4;
|
||||
if (!port)
|
||||
continue;
|
||||
|
||||
memset(&e, 0, sizeof(e));
|
||||
e.ifindex = port->dev->ifindex;
|
||||
e.vid = p->addr.vid;
|
||||
__mdb_entry_fill_flags(&e, p->flags);
|
||||
if (p->addr.proto == htons(ETH_P_IP))
|
||||
e.addr.u.ip4 = p->addr.u.ip4;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (p->addr.proto == htons(ETH_P_IPV6))
|
||||
e.addr.u.ip6 = p->addr.u.ip6;
|
||||
if (p->addr.proto == htons(ETH_P_IPV6))
|
||||
e.addr.u.ip6 = p->addr.u.ip6;
|
||||
#endif
|
||||
e.addr.proto = p->addr.proto;
|
||||
if (nla_put(skb, MDBA_MDB_ENTRY_INFO, sizeof(e), &e)) {
|
||||
nla_nest_cancel(skb, nest2);
|
||||
err = -EMSGSIZE;
|
||||
goto out;
|
||||
}
|
||||
e.addr.proto = p->addr.proto;
|
||||
nest_ent = nla_nest_start(skb,
|
||||
MDBA_MDB_ENTRY_INFO);
|
||||
if (!nest_ent) {
|
||||
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);
|
||||
skip:
|
||||
|
|
Loading…
Reference in a new issue