|
@@ -727,13 +727,12 @@ EXPORT_SYMBOL(udp_flush_pending_frames);
|
|
|
void udp4_hwcsum(struct sk_buff *skb, __be32 src, __be32 dst)
|
|
|
{
|
|
|
struct udphdr *uh = udp_hdr(skb);
|
|
|
- struct sk_buff *frags = skb_shinfo(skb)->frag_list;
|
|
|
int offset = skb_transport_offset(skb);
|
|
|
int len = skb->len - offset;
|
|
|
int hlen = len;
|
|
|
__wsum csum = 0;
|
|
|
|
|
|
- if (!frags) {
|
|
|
+ if (!skb_has_frag_list(skb)) {
|
|
|
/*
|
|
|
* Only one fragment on the socket.
|
|
|
*/
|
|
@@ -742,15 +741,17 @@ void udp4_hwcsum(struct sk_buff *skb, __be32 src, __be32 dst)
|
|
|
uh->check = ~csum_tcpudp_magic(src, dst, len,
|
|
|
IPPROTO_UDP, 0);
|
|
|
} else {
|
|
|
+ struct sk_buff *frags;
|
|
|
+
|
|
|
/*
|
|
|
* HW-checksum won't work as there are two or more
|
|
|
* fragments on the socket so that all csums of sk_buffs
|
|
|
* should be together
|
|
|
*/
|
|
|
- do {
|
|
|
+ skb_walk_frags(skb, frags) {
|
|
|
csum = csum_add(csum, frags->csum);
|
|
|
hlen -= frags->len;
|
|
|
- } while ((frags = frags->next));
|
|
|
+ }
|
|
|
|
|
|
csum = skb_checksum(skb, offset, hlen, csum);
|
|
|
skb->ip_summed = CHECKSUM_NONE;
|