bridge: mcast: add support for more router port information dumping
Allow for more multicast router port information to be dumped such as timer and type attributes. For that that purpose we need to extend the MDBA_ROUTER_PORT attribute similar to how it was done for the mdb entries recently. The new format is thus: [MDBA_ROUTER_PORT] = { <- nested attribute u32 ifindex <- router port ifindex for user-space compatibility [MDBA_ROUTER_PATTR attributes] } This way it remains compatible with older users (they'll simply retrieve the u32 in the beginning) and new users can parse the remaining attributes. It would also allow to add future extensions to the router port without breaking compatibility. Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
a55d8246ab
Коммит
59f78f9f6c
|
@ -144,7 +144,10 @@ struct bridge_vlan_info {
|
|||
* }
|
||||
* }
|
||||
* [MDBA_ROUTER] = {
|
||||
* [MDBA_ROUTER_PORT]
|
||||
* [MDBA_ROUTER_PORT] = {
|
||||
* u32 ifindex
|
||||
* [MDBA_ROUTER_PATTR attributes]
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
enum {
|
||||
|
@ -192,6 +195,15 @@ enum {
|
|||
};
|
||||
#define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1)
|
||||
|
||||
/* router port attributes */
|
||||
enum {
|
||||
MDBA_ROUTER_PATTR_UNSPEC,
|
||||
MDBA_ROUTER_PATTR_TIMER,
|
||||
MDBA_ROUTER_PATTR_TYPE,
|
||||
__MDBA_ROUTER_PATTR_MAX
|
||||
};
|
||||
#define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1)
|
||||
|
||||
struct br_port_msg {
|
||||
__u8 family;
|
||||
__u32 ifindex;
|
||||
|
|
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче