]> err.no Git - linux-2.6/commitdiff
vlan: Use bitmask of feature flags instead of seperate feature bits
authorPatrick McHardy <kaber@trash.net>
Fri, 23 May 2008 07:22:04 +0000 (00:22 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 May 2008 07:27:50 +0000 (00:27 -0700)
Herbert Xu points out that the use of seperate feature bits for features
to be propagated to VLAN devices is going to get messy real soon.
Replace the VLAN feature bits by a bitmask of feature flags to be
propagated and restore the old GSO_SHIFT/MASK values.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h
net/8021q/vlan.c
net/8021q/vlan.h
net/8021q/vlan_dev.c

index 2b0266484c8442f7d2571e848a5315ebe4bb11cc..f27fd2009334922325866c69d2abe42bb45bfd67 100644 (file)
@@ -514,12 +514,10 @@ struct net_device
 #define NETIF_F_NETNS_LOCAL    8192    /* Does not change network namespaces */
 #define NETIF_F_MULTI_QUEUE    16384   /* Has multiple TX/RX queues */
 #define NETIF_F_LRO            32768   /* large receive offload */
-#define NETIF_F_VLAN_TSO       65536   /* Supports TSO for VLANs */
-#define NETIF_F_VLAN_CSUM      131072  /* Supports TX checksumming for VLANs */
 
        /* Segmentation offload features */
-#define NETIF_F_GSO_SHIFT      20
-#define NETIF_F_GSO_MASK       0xfff00000
+#define NETIF_F_GSO_SHIFT      16
+#define NETIF_F_GSO_MASK       0xffff0000
 #define NETIF_F_TSO            (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
 #define NETIF_F_UFO            (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
 #define NETIF_F_GSO_ROBUST     (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
@@ -747,6 +745,9 @@ struct net_device
        /* rtnetlink link ops */
        const struct rtnl_link_ops *rtnl_link_ops;
 
+       /* VLAN feature mask */
+       unsigned long vlan_features;
+
        /* for setting kernel sock attribute on TCP connection setup */
 #define GSO_MAX_SIZE           65536
        unsigned int            gso_max_size;
index 51961300b586a578445c462ec73c8cf25fddaaa3..ab2225da0ee292e6931fa5faedeb7b3962e4e7d0 100644 (file)
@@ -387,14 +387,8 @@ static void vlan_transfer_features(struct net_device *dev,
 {
        unsigned long old_features = vlandev->features;
 
-       if (dev->features & NETIF_F_VLAN_TSO) {
-               vlandev->features &= ~VLAN_TSO_FEATURES;
-               vlandev->features |= dev->features & VLAN_TSO_FEATURES;
-       }
-       if (dev->features & NETIF_F_VLAN_CSUM) {
-               vlandev->features &= ~NETIF_F_ALL_CSUM;
-               vlandev->features |= dev->features & NETIF_F_ALL_CSUM;
-       }
+       vlandev->features &= ~dev->vlan_features;
+       vlandev->features |= dev->features & dev->vlan_features;
 
        if (old_features != vlandev->features)
                netdev_features_change(vlandev);
index 79625696e86a228c35eeac9e7457992b2f08ff9c..5229a72c7ea15ed421f6649ac55b5e66da5a9c28 100644 (file)
@@ -7,8 +7,6 @@
 #define VLAN_GRP_HASH_SIZE     (1 << VLAN_GRP_HASH_SHIFT)
 #define VLAN_GRP_HASH_MASK     (VLAN_GRP_HASH_SIZE - 1)
 
-#define VLAN_TSO_FEATURES      (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_SG)
-
 /*  Find a VLAN device by the MAC address of its Ethernet device, and
  *  it's VLAN ID.  The default configuration is to have VLAN's scope
  *  to be box-wide, so the MAC will be ignored.  The mac will only be
index b1cfbaa88db26dbeed4a68a3b26a79f0d46213bf..5d055c242ed8e224ea602bce5291c10f059af90c 100644 (file)
@@ -663,10 +663,7 @@ static int vlan_dev_init(struct net_device *dev)
                                          (1<<__LINK_STATE_DORMANT))) |
                      (1<<__LINK_STATE_PRESENT);
 
-       if (real_dev->features & NETIF_F_VLAN_TSO)
-               dev->features |= real_dev->features & VLAN_TSO_FEATURES;
-       if (real_dev->features & NETIF_F_VLAN_CSUM)
-               dev->features |= real_dev->features & NETIF_F_ALL_CSUM;
+       dev->features |= real_dev->features & real_dev->vlan_features;
 
        /* ipv6 shared card related stuff */
        dev->dev_id = real_dev->dev_id;