team: add fix_features
authorJiri Pirko <jpirko@redhat.com>
Thu, 17 Nov 2011 04:16:04 +0000 (04:16 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Nov 2011 19:54:59 +0000 (14:54 -0500)
do fix features in similar way as bonding code does

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

index f309274..5b169c1 100644 (file)
@@ -953,6 +953,27 @@ static int team_del_slave(struct net_device *dev, struct net_device *port_dev)
        return err;
 }
 
+static netdev_features_t team_fix_features(struct net_device *dev,
+                                          netdev_features_t features)
+{
+       struct team_port *port;
+       struct team *team = netdev_priv(dev);
+       netdev_features_t mask;
+
+       mask = features;
+       features &= ~NETIF_F_ONE_FOR_ALL;
+       features |= NETIF_F_ALL_FOR_ALL;
+
+       rcu_read_lock();
+       list_for_each_entry_rcu(port, &team->port_list, list) {
+               features = netdev_increment_features(features,
+                                                    port->dev->features,
+                                                    mask);
+       }
+       rcu_read_unlock();
+       return features;
+}
+
 static const struct net_device_ops team_netdev_ops = {
        .ndo_init               = team_init,
        .ndo_uninit             = team_uninit,
@@ -968,6 +989,7 @@ static const struct net_device_ops team_netdev_ops = {
        .ndo_vlan_rx_kill_vid   = team_vlan_rx_kill_vid,
        .ndo_add_slave          = team_add_slave,
        .ndo_del_slave          = team_del_slave,
+       .ndo_fix_features       = team_fix_features,
 };