[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] xen/netback: Always pull through PKT_PROT_LEN bytes into the linear part of an skb
# HG changeset patch # User Keir Fraser <keir@xxxxxxx> # Date 1292604058 0 # Node ID 072d5b122c53852b4b09c33fdd63b6ca4b1c58e7 # Parent 5a403282fd93f8df9e7953358bf5c118daf033b9 xen/netback: Always pull through PKT_PROT_LEN bytes into the linear part of an skb Previously PKT_PROT_LEN would only have an effect on the first fragment. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> xen/netback: try to pull a minimum of 72 bytes into the skb data area ... when receiving a packet into netback. The previous number, 64, tended to place a fragment boundary in the middle of the TCP header options and led to unnecessary fragmentation in Windows <-> Windows networking. xen/netback: Re-define PKT_PROT_LEN to be bigger. Re-define PKT_PROT_LEN to be big enough to handle maximal IPv4 and TCP options and phrase the definition so that it's reasonably obvious that's what it's for. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> --- drivers/xen/netback/netback.c | 21 ++++++++++++++++++++- 1 files changed, 20 insertions(+), 1 deletion(-) diff -r 5a403282fd93 -r 072d5b122c53 drivers/xen/netback/netback.c --- a/drivers/xen/netback/netback.c Fri Dec 17 10:09:15 2010 +0000 +++ b/drivers/xen/netback/netback.c Fri Dec 17 16:40:58 2010 +0000 @@ -35,6 +35,8 @@ */ #include "common.h" +#include <linux/if_vlan.h> +#include <linux/tcp.h> #include <xen/balloon.h> #include <xen/interface/memory.h> @@ -105,7 +107,14 @@ static inline int netif_page_index(struc return idx; } -#define PKT_PROT_LEN 64 +/* + * This is the amount of packet we copy rather than map, so that the + * guest can't fiddle with the contents of the headers while we do + * packet processing on them (netfilter, routing, etc). + */ +#define PKT_PROT_LEN (ETH_HLEN + VLAN_HLEN + \ + sizeof(struct iphdr) + MAX_IPOPTLEN + \ + sizeof(struct tcphdr) + 40 /* MAX_TCP_OPTION_SPACE */) static struct pending_tx_info { netif_tx_request_t req; @@ -1457,6 +1466,16 @@ static void net_tx_action(unsigned long netbk_fill_frags(skb); + /* + * If the initial fragment was < PKT_PROT_LEN then + * pull through some bytes from the other fragments to + * increase the linear region to PKT_PROT_LEN bytes. + */ + if (skb_headlen(skb) < PKT_PROT_LEN && skb_is_nonlinear(skb)) { + int target = min_t(int, skb->len, PKT_PROT_LEN); + __pskb_pull_tail(skb, target - skb_headlen(skb)); + } + skb->dev = netif->dev; skb->protocol = eth_type_trans(skb, skb->dev); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |