team: use vlan_vids_[addr/del]_by_dev
authorJiri Pirko <jpirko@redhat.com>
Thu, 8 Dec 2011 04:11:20 +0000 (04:11 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Dec 2011 00:52:43 +0000 (19:52 -0500)
So far when vlan id was added to team device befor port was added, this
vid was not added to port's vlan filter. Also after removal, vid stayed
in port device's vlan filter. Benefit of new vlan functions to handle
this work.

Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/team/team.c

index 79c2d1b52eb65ffb1bdb99f62fac72f48aa47b98..ed2a862b835df3d9a50b43ac64544ca3e5911036 100644 (file)
@@ -588,6 +588,13 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
                goto err_dev_open;
        }
 
+       err = vlan_vids_add_by_dev(port_dev, dev);
+       if (err) {
+               netdev_err(dev, "Failed to add vlan ids to device %s\n",
+                               portname);
+               goto err_vids_add;
+       }
+
        err = netdev_set_master(port_dev, dev);
        if (err) {
                netdev_err(dev, "Device %s failed to set master\n", portname);
@@ -615,6 +622,9 @@ err_handler_register:
        netdev_set_master(port_dev, NULL);
 
 err_set_master:
+       vlan_vids_del_by_dev(port_dev, dev);
+
+err_vids_add:
        dev_close(port_dev);
 
 err_dev_open:
@@ -648,6 +658,7 @@ static int team_port_del(struct team *team, struct net_device *port_dev)
        team_adjust_ops(team);
        netdev_rx_handler_unregister(port_dev);
        netdev_set_master(port_dev, NULL);
+       vlan_vids_del_by_dev(port_dev, dev);
        dev_close(port_dev);
        team_port_leave(team, port);
        team_port_set_orig_mac(port);