aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2008-05-23 03:22:04 -0400
committerDavid S. Miller <davem@davemloft.net>2008-05-23 03:27:50 -0400
commit289c79a4bd350e8a25065102563ad1a183d1b402 (patch)
tree2067cb054704c62c3debfe92a3f00dc551ff7162
parent7bece8155be133cd67c41eed2b31c60a310609de (diff)
vlan: Use bitmask of feature flags instead of seperate feature bits
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>
-rw-r--r--include/linux/netdevice.h9
-rw-r--r--net/8021q/vlan.c10
-rw-r--r--net/8021q/vlan.h2
-rw-r--r--net/8021q/vlan_dev.c5
4 files changed, 8 insertions, 18 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 2b0266484c84..f27fd2009334 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -514,12 +514,10 @@ struct net_device
514#define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */ 514#define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */
515#define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */ 515#define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */
516#define NETIF_F_LRO 32768 /* large receive offload */ 516#define NETIF_F_LRO 32768 /* large receive offload */
517#define NETIF_F_VLAN_TSO 65536 /* Supports TSO for VLANs */
518#define NETIF_F_VLAN_CSUM 131072 /* Supports TX checksumming for VLANs */
519 517
520 /* Segmentation offload features */ 518 /* Segmentation offload features */
521#define NETIF_F_GSO_SHIFT 20 519#define NETIF_F_GSO_SHIFT 16
522#define NETIF_F_GSO_MASK 0xfff00000 520#define NETIF_F_GSO_MASK 0xffff0000
523#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) 521#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
524#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT) 522#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
525#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) 523#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
@@ -747,6 +745,9 @@ struct net_device
747 /* rtnetlink link ops */ 745 /* rtnetlink link ops */
748 const struct rtnl_link_ops *rtnl_link_ops; 746 const struct rtnl_link_ops *rtnl_link_ops;
749 747
748 /* VLAN feature mask */
749 unsigned long vlan_features;
750
750 /* for setting kernel sock attribute on TCP connection setup */ 751 /* for setting kernel sock attribute on TCP connection setup */
751#define GSO_MAX_SIZE 65536 752#define GSO_MAX_SIZE 65536
752 unsigned int gso_max_size; 753 unsigned int gso_max_size;
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 51961300b586..ab2225da0ee2 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -387,14 +387,8 @@ static void vlan_transfer_features(struct net_device *dev,
387{ 387{
388 unsigned long old_features = vlandev->features; 388 unsigned long old_features = vlandev->features;
389 389
390 if (dev->features & NETIF_F_VLAN_TSO) { 390 vlandev->features &= ~dev->vlan_features;
391 vlandev->features &= ~VLAN_TSO_FEATURES; 391 vlandev->features |= dev->features & dev->vlan_features;
392 vlandev->features |= dev->features & VLAN_TSO_FEATURES;
393 }
394 if (dev->features & NETIF_F_VLAN_CSUM) {
395 vlandev->features &= ~NETIF_F_ALL_CSUM;
396 vlandev->features |= dev->features & NETIF_F_ALL_CSUM;
397 }
398 392
399 if (old_features != vlandev->features) 393 if (old_features != vlandev->features)
400 netdev_features_change(vlandev); 394 netdev_features_change(vlandev);
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h
index 79625696e86a..5229a72c7ea1 100644
--- a/net/8021q/vlan.h
+++ b/net/8021q/vlan.h
@@ -7,8 +7,6 @@
7#define VLAN_GRP_HASH_SIZE (1 << VLAN_GRP_HASH_SHIFT) 7#define VLAN_GRP_HASH_SIZE (1 << VLAN_GRP_HASH_SHIFT)
8#define VLAN_GRP_HASH_MASK (VLAN_GRP_HASH_SIZE - 1) 8#define VLAN_GRP_HASH_MASK (VLAN_GRP_HASH_SIZE - 1)
9 9
10#define VLAN_TSO_FEATURES (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_SG)
11
12/* Find a VLAN device by the MAC address of its Ethernet device, and 10/* Find a VLAN device by the MAC address of its Ethernet device, and
13 * it's VLAN ID. The default configuration is to have VLAN's scope 11 * it's VLAN ID. The default configuration is to have VLAN's scope
14 * to be box-wide, so the MAC will be ignored. The mac will only be 12 * to be box-wide, so the MAC will be ignored. The mac will only be
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index b1cfbaa88db2..5d055c242ed8 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
@@ -663,10 +663,7 @@ static int vlan_dev_init(struct net_device *dev)
663 (1<<__LINK_STATE_DORMANT))) | 663 (1<<__LINK_STATE_DORMANT))) |
664 (1<<__LINK_STATE_PRESENT); 664 (1<<__LINK_STATE_PRESENT);
665 665
666 if (real_dev->features & NETIF_F_VLAN_TSO) 666 dev->features |= real_dev->features & real_dev->vlan_features;
667 dev->features |= real_dev->features & VLAN_TSO_FEATURES;
668 if (real_dev->features & NETIF_F_VLAN_CSUM)
669 dev->features |= real_dev->features & NETIF_F_ALL_CSUM;
670 667
671 /* ipv6 shared card related stuff */ 668 /* ipv6 shared card related stuff */
672 dev->dev_id = real_dev->dev_id; 669 dev->dev_id = real_dev->dev_id;