aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/udp_offload.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-06-05 18:56:43 -0400
committerDavid S. Miller <davem@davemloft.net>2013-06-05 19:37:30 -0400
commit6bc19fb82d4c05a9eee19d6d2aab2ce26e499ec2 (patch)
tree8b049ef383307f5dae91b5c9cf78dbfb9b74a4d1 /net/ipv6/udp_offload.c
parent11a164a04382d735230b01f4cc46ad78a7c4abf6 (diff)
parent4d3797d7e1861ac1af150a6189315786c5e1c820 (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.c20
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