bridge: netlink: add support for port's multicast_router attribute
authorNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Tue, 6 Oct 2015 12:12:02 +0000 (14:12 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Oct 2015 11:49:34 +0000 (04:49 -0700)
Add IFLA_BRPORT_MULTICAST_ROUTER to allow setting/getting port's
multicast_router via netlink.

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/if_link.h
net/bridge/br_netlink.c

index fcea39a56095fe55d0e37b0a2a4b839b5ebaa4d7..e3b6217f34f1138644bc6d2ffc20448d68301a89 100644 (file)
@@ -304,6 +304,7 @@ enum {
        IFLA_BRPORT_FORWARD_DELAY_TIMER,
        IFLA_BRPORT_HOLD_TIMER,
        IFLA_BRPORT_FLUSH,
+       IFLA_BRPORT_MULTICAST_ROUTER,
        __IFLA_BRPORT_MAX
 };
 #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
index 6468166d6bdc9f0ef721a782e370187806b01984..d78b4429505a98898ceb4f4f30e5cbf9ebd89876 100644 (file)
@@ -138,6 +138,9 @@ static inline size_t br_port_info_size(void)
                + nla_total_size(sizeof(u64))   /* IFLA_BRPORT_MESSAGE_AGE_TIMER */
                + nla_total_size(sizeof(u64))   /* IFLA_BRPORT_FORWARD_DELAY_TIMER */
                + nla_total_size(sizeof(u64))   /* IFLA_BRPORT_HOLD_TIMER */
+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
+               + nla_total_size(sizeof(u8))    /* IFLA_BRPORT_MULTICAST_ROUTER */
+#endif
                + 0;
 }
 
@@ -196,6 +199,12 @@ static int br_port_fill_attrs(struct sk_buff *skb,
        if (nla_put_u64(skb, IFLA_BRPORT_HOLD_TIMER, timerval))
                return -EMSGSIZE;
 
+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
+       if (nla_put_u8(skb, IFLA_BRPORT_MULTICAST_ROUTER,
+                      p->multicast_router))
+               return -EMSGSIZE;
+#endif
+
        return 0;
 }
 
@@ -560,6 +569,7 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = {
        [IFLA_BRPORT_UNICAST_FLOOD] = { .type = NLA_U8 },
        [IFLA_BRPORT_PROXYARP]  = { .type = NLA_U8 },
        [IFLA_BRPORT_PROXYARP_WIFI] = { .type = NLA_U8 },
+       [IFLA_BRPORT_MULTICAST_ROUTER] = { .type = NLA_U8 },
 };
 
 /* Change the state of the port and notify spanning tree */
@@ -634,6 +644,15 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])
        if (tb[IFLA_BRPORT_FLUSH])
                br_fdb_delete_by_port(p->br, p, 0, 0);
 
+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
+       if (tb[IFLA_BRPORT_MULTICAST_ROUTER]) {
+               u8 mcast_router = nla_get_u8(tb[IFLA_BRPORT_MULTICAST_ROUTER]);
+
+               err = br_multicast_set_port_router(p, mcast_router);
+               if (err)
+                       return err;
+       }
+#endif
        br_port_flags_change(p, old_flags ^ p->flags);
        return 0;
 }