]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/bridge/br_netlink.c
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux.git] / net / bridge / br_netlink.c
index 225ef7d5370166baff69080996cf64ff68b055f6..574f78824d8a2ae53751bbe1849e53502bc575be 100644 (file)
@@ -133,6 +133,8 @@ static inline size_t br_port_info_size(void)
                + nla_total_size(1)     /* IFLA_BRPORT_MCAST_TO_UCAST */
                + nla_total_size(1)     /* IFLA_BRPORT_LEARNING */
                + nla_total_size(1)     /* IFLA_BRPORT_UNICAST_FLOOD */
+               + nla_total_size(1)     /* IFLA_BRPORT_MCAST_FLOOD */
+               + nla_total_size(1)     /* IFLA_BRPORT_BCAST_FLOOD */
                + nla_total_size(1)     /* IFLA_BRPORT_PROXYARP */
                + nla_total_size(1)     /* IFLA_BRPORT_PROXYARP_WIFI */
                + nla_total_size(1)     /* IFLA_BRPORT_VLAN_TUNNEL */
@@ -189,6 +191,8 @@ static int br_port_fill_attrs(struct sk_buff *skb,
                       !!(p->flags & BR_FLOOD)) ||
            nla_put_u8(skb, IFLA_BRPORT_MCAST_FLOOD,
                       !!(p->flags & BR_MCAST_FLOOD)) ||
+           nla_put_u8(skb, IFLA_BRPORT_BCAST_FLOOD,
+                      !!(p->flags & BR_BCAST_FLOOD)) ||
            nla_put_u8(skb, IFLA_BRPORT_PROXYARP, !!(p->flags & BR_PROXYARP)) ||
            nla_put_u8(skb, IFLA_BRPORT_PROXYARP_WIFI,
                       !!(p->flags & BR_PROXYARP_WIFI)) ||
@@ -631,6 +635,8 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = {
        [IFLA_BRPORT_PROXYARP_WIFI] = { .type = NLA_U8 },
        [IFLA_BRPORT_MULTICAST_ROUTER] = { .type = NLA_U8 },
        [IFLA_BRPORT_MCAST_TO_UCAST] = { .type = NLA_U8 },
+       [IFLA_BRPORT_MCAST_FLOOD] = { .type = NLA_U8 },
+       [IFLA_BRPORT_BCAST_FLOOD] = { .type = NLA_U8 },
 };
 
 /* Change the state of the port and notify spanning tree */
@@ -683,6 +689,7 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])
        br_set_port_flag(p, tb, IFLA_BRPORT_UNICAST_FLOOD, BR_FLOOD);
        br_set_port_flag(p, tb, IFLA_BRPORT_MCAST_FLOOD, BR_MCAST_FLOOD);
        br_set_port_flag(p, tb, IFLA_BRPORT_MCAST_TO_UCAST, BR_MULTICAST_TO_UNICAST);
+       br_set_port_flag(p, tb, IFLA_BRPORT_BCAST_FLOOD, BR_BCAST_FLOOD);
        br_set_port_flag(p, tb, IFLA_BRPORT_PROXYARP, BR_PROXYARP);
        br_set_port_flag(p, tb, IFLA_BRPORT_PROXYARP_WIFI, BR_PROXYARP_WIFI);
 
@@ -748,8 +755,8 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)
 
        if (p && protinfo) {
                if (protinfo->nla_type & NLA_F_NESTED) {
-                       err = nla_parse_nested(tb, IFLA_BRPORT_MAX,
-                                              protinfo, br_port_policy);
+                       err = nla_parse_nested(tb, IFLA_BRPORT_MAX, protinfo,
+                                              br_port_policy, NULL);
                        if (err)
                                return err;
 
@@ -828,6 +835,13 @@ static int br_validate(struct nlattr *tb[], struct nlattr *data[])
                        return -EPROTONOSUPPORT;
                }
        }
+
+       if (data[IFLA_BR_VLAN_DEFAULT_PVID]) {
+               __u16 defpvid = nla_get_u16(data[IFLA_BR_VLAN_DEFAULT_PVID]);
+
+               if (defpvid >= VLAN_VID_MASK)
+                       return -EINVAL;
+       }
 #endif
 
        return 0;