diff options
| author | Herbert Xu <herbert@gondor.apana.org.au> | 2006-06-22 05:40:14 -0400 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2006-06-23 05:07:29 -0400 |
| commit | 7967168cefdbc63bf332d6b1548eca7cd65ebbcc (patch) | |
| tree | c45759149ae0acdc89d746e556a0ae278d11776d /include/linux/netdevice.h | |
| parent | d4828d85d188dc70ed172802e798d3978bb6e29e (diff) | |
[NET]: Merge TSO/UFO fields in sk_buff
Having separate fields in sk_buff for TSO/UFO (tso_size/ufo_size) is not
going to scale if we add any more segmentation methods (e.g., DCCP). So
let's merge them.
They were used to tell the protocol of a packet. This function has been
subsumed by the new gso_type field. This is essentially a set of netdev
feature bits (shifted by 16 bits) that are required to process a specific
skb. As such it's easy to tell whether a given device can process a GSO
skb: you just have to and the gso_type field and the netdev's features
field.
I've made gso_type a conjunction. The idea is that you have a base type
(e.g., SKB_GSO_TCPV4) that can be modified further to support new features.
For example, if we add a hardware TSO type that supports ECN, they would
declare NETIF_F_TSO | NETIF_F_TSO_ECN. All TSO packets with CWR set would
have a gso_type of SKB_GSO_TCPV4 | SKB_GSO_TCPV4_ECN while all other TSO
packets would be SKB_GSO_TCPV4. This means that only the CWR packets need
to be emulated in software.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/netdevice.h')
| -rw-r--r-- | include/linux/netdevice.h | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index cead6be467..fa5671307b 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -308,9 +308,12 @@ struct net_device | |||
| 308 | #define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */ | 308 | #define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */ |
| 309 | #define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */ | 309 | #define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */ |
| 310 | #define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */ | 310 | #define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */ |
| 311 | #define NETIF_F_TSO 2048 /* Can offload TCP/IP segmentation */ | ||
| 312 | #define NETIF_F_LLTX 4096 /* LockLess TX */ | 311 | #define NETIF_F_LLTX 4096 /* LockLess TX */ |
| 313 | #define NETIF_F_UFO 8192 /* Can offload UDP Large Send*/ | 312 | |
| 313 | /* Segmentation offload features */ | ||
| 314 | #define NETIF_F_GSO_SHIFT 16 | ||
| 315 | #define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) | ||
| 316 | #define NETIF_F_UFO (SKB_GSO_UDPV4 << NETIF_F_GSO_SHIFT) | ||
| 314 | 317 | ||
| 315 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) | 318 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) |
| 316 | #define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) | 319 | #define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) |
| @@ -979,6 +982,13 @@ extern void dev_seq_stop(struct seq_file *seq, void *v); | |||
| 979 | 982 | ||
| 980 | extern void linkwatch_run_queue(void); | 983 | extern void linkwatch_run_queue(void); |
| 981 | 984 | ||
| 985 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) | ||
| 986 | { | ||
| 987 | int feature = skb_shinfo(skb)->gso_type << NETIF_F_GSO_SHIFT; | ||
| 988 | return skb_shinfo(skb)->gso_size && | ||
| 989 | (dev->features & feature) != feature; | ||
| 990 | } | ||
| 991 | |||
| 982 | #endif /* __KERNEL__ */ | 992 | #endif /* __KERNEL__ */ |
| 983 | 993 | ||
| 984 | #endif /* _LINUX_DEV_H */ | 994 | #endif /* _LINUX_DEV_H */ |
