diff options
author | David S. Miller <davem@davemloft.net> | 2013-06-05 18:56:43 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-06-05 19:37:30 -0400 |
commit | 6bc19fb82d4c05a9eee19d6d2aab2ce26e499ec2 (patch) | |
tree | 8b049ef383307f5dae91b5c9cf78dbfb9b74a4d1 /net/ipv6/udp_offload.c | |
parent | 11a164a04382d735230b01f4cc46ad78a7c4abf6 (diff) | |
parent | 4d3797d7e1861ac1af150a6189315786c5e1c820 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Merge 'net' bug fixes into 'net-next' as we have patches
that will build on top of them.
This merge commit includes a change from Emil Goode
(emilgoode@gmail.com) that fixes a warning that would
have been introduced by this merge. Specifically it
fixes the pingv6_ops method ipv6_chk_addr() to add a
"const" to the "struct net_device *dev" argument and
likewise update the dummy_ipv6_chk_addr() declaration.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/udp_offload.c')
-rw-r--r-- | net/ipv6/udp_offload.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c index 76d401a93c7a..5d1b8d7ac993 100644 --- a/net/ipv6/udp_offload.c +++ b/net/ipv6/udp_offload.c | |||
@@ -46,11 +46,12 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
46 | unsigned int mss; | 46 | unsigned int mss; |
47 | unsigned int unfrag_ip6hlen, unfrag_len; | 47 | unsigned int unfrag_ip6hlen, unfrag_len; |
48 | struct frag_hdr *fptr; | 48 | struct frag_hdr *fptr; |
49 | u8 *mac_start, *prevhdr; | 49 | u8 *packet_start, *prevhdr; |
50 | u8 nexthdr; | 50 | u8 nexthdr; |
51 | u8 frag_hdr_sz = sizeof(struct frag_hdr); | 51 | u8 frag_hdr_sz = sizeof(struct frag_hdr); |
52 | int offset; | 52 | int offset; |
53 | __wsum csum; | 53 | __wsum csum; |
54 | int tnl_hlen; | ||
54 | 55 | ||
55 | mss = skb_shinfo(skb)->gso_size; | 56 | mss = skb_shinfo(skb)->gso_size; |
56 | if (unlikely(skb->len <= mss)) | 57 | if (unlikely(skb->len <= mss)) |
@@ -84,9 +85,11 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
84 | skb->ip_summed = CHECKSUM_NONE; | 85 | skb->ip_summed = CHECKSUM_NONE; |
85 | 86 | ||
86 | /* Check if there is enough headroom to insert fragment header. */ | 87 | /* Check if there is enough headroom to insert fragment header. */ |
87 | if ((skb_mac_header(skb) < skb->head + frag_hdr_sz) && | 88 | tnl_hlen = skb_tnl_header_len(skb); |
88 | pskb_expand_head(skb, frag_hdr_sz, 0, GFP_ATOMIC)) | 89 | if (skb_headroom(skb) < (tnl_hlen + frag_hdr_sz)) { |
89 | goto out; | 90 | if (gso_pskb_expand_head(skb, tnl_hlen + frag_hdr_sz)) |
91 | goto out; | ||
92 | } | ||
90 | 93 | ||
91 | /* Find the unfragmentable header and shift it left by frag_hdr_sz | 94 | /* Find the unfragmentable header and shift it left by frag_hdr_sz |
92 | * bytes to insert fragment header. | 95 | * bytes to insert fragment header. |
@@ -94,11 +97,12 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
94 | unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr); | 97 | unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr); |
95 | nexthdr = *prevhdr; | 98 | nexthdr = *prevhdr; |
96 | *prevhdr = NEXTHDR_FRAGMENT; | 99 | *prevhdr = NEXTHDR_FRAGMENT; |
97 | unfrag_len = skb_network_header(skb) - skb_mac_header(skb) + | 100 | unfrag_len = (skb_network_header(skb) - skb_mac_header(skb)) + |
98 | unfrag_ip6hlen; | 101 | unfrag_ip6hlen + tnl_hlen; |
99 | mac_start = skb_mac_header(skb); | 102 | packet_start = (u8 *) skb->head + SKB_GSO_CB(skb)->mac_offset; |
100 | memmove(mac_start-frag_hdr_sz, mac_start, unfrag_len); | 103 | memmove(packet_start-frag_hdr_sz, packet_start, unfrag_len); |
101 | 104 | ||
105 | SKB_GSO_CB(skb)->mac_offset -= frag_hdr_sz; | ||
102 | skb->mac_header -= frag_hdr_sz; | 106 | skb->mac_header -= frag_hdr_sz; |
103 | skb->network_header -= frag_hdr_sz; | 107 | skb->network_header -= frag_hdr_sz; |
104 | 108 | ||