|
@@ -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:
|