diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2006-06-27 16:22:38 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-06-29 19:57:53 -0400 |
commit | 576a30eb6453439b3c37ba24455ac7090c247b5a (patch) | |
tree | e0c427a61e3de5c93e797c09903d910f6f060e64 /include/linux/skbuff.h | |
parent | 68c1692e3ea5d79f24cb5cc566c4a73939d13d25 (diff) |
[NET]: Added GSO header verification
When GSO packets come from an untrusted source (e.g., a Xen guest domain),
we need to verify the header integrity before passing it to the hardware.
Since the first step in GSO is to verify the header, we can reuse that
code by adding a new bit to gso_type: SKB_GSO_DODGY. Packets with this
bit set can only be fed directly to devices with the corresponding bit
NETIF_F_GSO_ROBUST. If the device doesn't have that bit, then the skb
is fed to the GSO engine which will allow the packet to be sent to the
hardware if it passes the header check.
This patch changes the sg flag to a full features flag. The same method
can be used to implement TSO ECN support. We simply have to mark packets
with CWR set with SKB_GSO_ECN so that only hardware with a corresponding
NETIF_F_TSO_ECN can accept them. The GSO engine can either fully segment
the packet, or segment the first MTU and pass the rest to the hardware for
further segmentation.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r-- | include/linux/skbuff.h | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 16eef03ce0e..5fb72da7da0 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -172,6 +172,9 @@ enum { | |||
172 | enum { | 172 | enum { |
173 | SKB_GSO_TCPV4 = 1 << 0, | 173 | SKB_GSO_TCPV4 = 1 << 0, |
174 | SKB_GSO_UDPV4 = 1 << 1, | 174 | SKB_GSO_UDPV4 = 1 << 1, |
175 | |||
176 | /* This indicates the skb is from an untrusted source. */ | ||
177 | SKB_GSO_DODGY = 1 << 2, | ||
175 | }; | 178 | }; |
176 | 179 | ||
177 | /** | 180 | /** |
@@ -1299,7 +1302,7 @@ extern void skb_split(struct sk_buff *skb, | |||
1299 | struct sk_buff *skb1, const u32 len); | 1302 | struct sk_buff *skb1, const u32 len); |
1300 | 1303 | ||
1301 | extern void skb_release_data(struct sk_buff *skb); | 1304 | extern void skb_release_data(struct sk_buff *skb); |
1302 | extern struct sk_buff *skb_segment(struct sk_buff *skb, int sg); | 1305 | extern struct sk_buff *skb_segment(struct sk_buff *skb, int features); |
1303 | 1306 | ||
1304 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, | 1307 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, |
1305 | int len, void *buffer) | 1308 | int len, void *buffer) |