bridge: add vlan filtering change for new bridged device
authorElad Raz <eladr@mellanox.com>
Wed, 6 Jan 2016 12:01:07 +0000 (13:01 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 Jan 2016 19:42:41 +0000 (14:42 -0500)
Notifying hardware about newly bridged port vlan-aware changes.

Signed-off-by: Elad Raz <eladr@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_vlan.c

index 190fb33..85e43af 100644 (file)
@@ -907,6 +907,12 @@ err_rhtbl:
 
 int nbp_vlan_init(struct net_bridge_port *p)
 {
+       struct switchdev_attr attr = {
+               .orig_dev = p->br->dev,
+               .id = SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
+               .flags = SWITCHDEV_F_SKIP_EOPNOTSUPP,
+               .u.vlan_filtering = p->br->vlan_enabled,
+       };
        struct net_bridge_vlan_group *vg;
        int ret = -ENOMEM;
 
@@ -914,6 +920,10 @@ int nbp_vlan_init(struct net_bridge_port *p)
        if (!vg)
                goto out;
 
+       ret = switchdev_port_attr_set(p->dev, &attr);
+       if (ret && ret != -EOPNOTSUPP)
+               goto err_vlan_enabled;
+
        ret = rhashtable_init(&vg->vlan_hash, &br_vlan_rht_params);
        if (ret)
                goto err_rhtbl;
@@ -933,6 +943,7 @@ err_vlan_add:
        RCU_INIT_POINTER(p->vlgrp, NULL);
        synchronize_rcu();
        rhashtable_destroy(&vg->vlan_hash);
+err_vlan_enabled:
 err_rhtbl:
        kfree(vg);