aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/udp_offload.c29
-rw-r--r--net/ipv6/udp_offload.c11
2 files changed, 20 insertions, 20 deletions
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index b15c78ac3f23..d4f2daca0c33 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -214,6 +214,13 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb,
214 return segs; 214 return segs;
215 } 215 }
216 216
217 /* GSO partial and frag_list segmentation only requires splitting
218 * the frame into an MSS multiple and possibly a remainder, both
219 * cases return a GSO skb. So update the mss now.
220 */
221 if (skb_is_gso(segs))
222 mss *= skb_shinfo(segs)->gso_segs;
223
217 seg = segs; 224 seg = segs;
218 uh = udp_hdr(seg); 225 uh = udp_hdr(seg);
219 226
@@ -232,6 +239,12 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb,
232 uh->len = newlen; 239 uh->len = newlen;
233 uh->check = check; 240 uh->check = check;
234 241
242 if (seg->ip_summed == CHECKSUM_PARTIAL)
243 gso_reset_checksum(seg, ~check);
244 else
245 uh->check = gso_make_checksum(seg, ~check) ? :
246 CSUM_MANGLED_0;
247
235 seg = seg->next; 248 seg = seg->next;
236 uh = udp_hdr(seg); 249 uh = udp_hdr(seg);
237 } 250 }
@@ -244,6 +257,11 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb,
244 uh->len = newlen; 257 uh->len = newlen;
245 uh->check = check; 258 uh->check = check;
246 259
260 if (seg->ip_summed == CHECKSUM_PARTIAL)
261 gso_reset_checksum(seg, ~check);
262 else
263 uh->check = gso_make_checksum(seg, ~check) ? : CSUM_MANGLED_0;
264
247 /* update refcount for the packet */ 265 /* update refcount for the packet */
248 refcount_add(sum_truesize - gso_skb->truesize, &sk->sk_wmem_alloc); 266 refcount_add(sum_truesize - gso_skb->truesize, &sk->sk_wmem_alloc);
249 267
@@ -251,15 +269,6 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb,
251} 269}
252EXPORT_SYMBOL_GPL(__udp_gso_segment); 270EXPORT_SYMBOL_GPL(__udp_gso_segment);
253 271
254static struct sk_buff *__udp4_gso_segment(struct sk_buff *gso_skb,
255 netdev_features_t features)
256{
257 if (!can_checksum_protocol(features, htons(ETH_P_IP)))
258 return ERR_PTR(-EIO);
259
260 return __udp_gso_segment(gso_skb, features);
261}
262
263static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, 272static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb,
264 netdev_features_t features) 273 netdev_features_t features)
265{ 274{
@@ -283,7 +292,7 @@ static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb,
283 goto out; 292 goto out;
284 293
285 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) 294 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4)
286 return __udp4_gso_segment(skb, features); 295 return __udp_gso_segment(skb, features);
287 296
288 mss = skb_shinfo(skb)->gso_size; 297 mss = skb_shinfo(skb)->gso_size;
289 if (unlikely(skb->len <= mss)) 298 if (unlikely(skb->len <= mss))
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c
index 61e34f1d2fa2..03a2ff3fe1e6 100644
--- a/net/ipv6/udp_offload.c
+++ b/net/ipv6/udp_offload.c
@@ -17,15 +17,6 @@
17#include <net/ip6_checksum.h> 17#include <net/ip6_checksum.h>
18#include "ip6_offload.h" 18#include "ip6_offload.h"
19 19
20static struct sk_buff *__udp6_gso_segment(struct sk_buff *gso_skb,
21 netdev_features_t features)
22{
23 if (!can_checksum_protocol(features, htons(ETH_P_IPV6)))
24 return ERR_PTR(-EIO);
25
26 return __udp_gso_segment(gso_skb, features);
27}
28
29static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, 20static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
30 netdev_features_t features) 21 netdev_features_t features)
31{ 22{
@@ -58,7 +49,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
58 goto out; 49 goto out;
59 50
60 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) 51 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4)
61 return __udp6_gso_segment(skb, features); 52 return __udp_gso_segment(skb, features);
62 53
63 /* Do software UFO. Complete and fill in the UDP checksum as HW cannot 54 /* Do software UFO. Complete and fill in the UDP checksum as HW cannot
64 * do checksum of UDP packets sent as multiple IP fragments. 55 * do checksum of UDP packets sent as multiple IP fragments.