bonding: propogate vlan_features to bonding master
authorJay Vosburgh <fubar@us.ibm.com>
Fri, 28 Aug 2009 12:05:12 +0000 (12:05 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 29 Aug 2009 06:01:12 +0000 (23:01 -0700)
Propogate the vlan_features of the slave devices to the bonding
master device, using the same logic as for regular features.

Tested by Or Gerlitz <ogerlitz@voltaire.com>, who also removed
the debug logic from the original test patch.

Signed-off-by: Or Gerlitz <ogerlitz@voltaire.com>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_main.c

index 4798d30c954563fbdf64a04ba2b595a199661748..1aeb36c51478ba3c6ef5410e77224022fb98cded 100644 (file)
@@ -1331,6 +1331,7 @@ static int bond_compute_features(struct bonding *bond)
        struct slave *slave;
        struct net_device *bond_dev = bond->dev;
        unsigned long features = bond_dev->features;
+       unsigned long vlan_features = 0;
        unsigned short max_hard_header_len = max((u16)ETH_HLEN,
                                                bond_dev->hard_header_len);
        int i;
@@ -1343,10 +1344,14 @@ static int bond_compute_features(struct bonding *bond)
 
        features &= ~NETIF_F_ONE_FOR_ALL;
 
+       vlan_features = bond->first_slave->dev->vlan_features;
        bond_for_each_slave(bond, slave, i) {
                features = netdev_increment_features(features,
                                                     slave->dev->features,
                                                     NETIF_F_ONE_FOR_ALL);
+               vlan_features = netdev_increment_features(vlan_features,
+                                                       slave->dev->vlan_features,
+                                                       NETIF_F_ONE_FOR_ALL);
                if (slave->dev->hard_header_len > max_hard_header_len)
                        max_hard_header_len = slave->dev->hard_header_len;
        }
@@ -1354,6 +1359,7 @@ static int bond_compute_features(struct bonding *bond)
 done:
        features |= (bond_dev->features & BOND_VLAN_FEATURES);
        bond_dev->features = netdev_fix_features(features, NULL);
+       bond_dev->vlan_features = netdev_fix_features(vlan_features, NULL);
        bond_dev->hard_header_len = max_hard_header_len;
 
        return 0;