|
|
@@ -20,7 +20,7 @@ static int br_rports_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
{
|
|
|
struct net_bridge *br = netdev_priv(dev);
|
|
|
struct net_bridge_port *p;
|
|
|
- struct nlattr *nest;
|
|
|
+ struct nlattr *nest, *port_nest;
|
|
|
|
|
|
if (!br->multicast_router || hlist_empty(&br->router_list))
|
|
|
return 0;
|
|
|
@@ -30,8 +30,20 @@ static int br_rports_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
return -EMSGSIZE;
|
|
|
|
|
|
hlist_for_each_entry_rcu(p, &br->router_list, rlist) {
|
|
|
- if (p && nla_put_u32(skb, MDBA_ROUTER_PORT, p->dev->ifindex))
|
|
|
+ if (!p)
|
|
|
+ continue;
|
|
|
+ port_nest = nla_nest_start(skb, MDBA_ROUTER_PORT);
|
|
|
+ if (!port_nest)
|
|
|
goto fail;
|
|
|
+ if (nla_put_nohdr(skb, sizeof(u32), &p->dev->ifindex) ||
|
|
|
+ nla_put_u32(skb, MDBA_ROUTER_PATTR_TIMER,
|
|
|
+ br_timer_value(&p->multicast_router_timer)) ||
|
|
|
+ nla_put_u8(skb, MDBA_ROUTER_PATTR_TYPE,
|
|
|
+ p->multicast_router)) {
|
|
|
+ nla_nest_cancel(skb, port_nest);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ nla_nest_end(skb, port_nest);
|
|
|
}
|
|
|
|
|
|
nla_nest_end(skb, nest);
|