diff options
Diffstat (limited to 'net/ipv4/tcp_offload.c')
| -rw-r--r-- | net/ipv4/tcp_offload.c | 19 | 
1 files changed, 9 insertions, 10 deletions
diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c index 45dda7889387..4851211aa60d 100644 --- a/net/ipv4/tcp_offload.c +++ b/net/ipv4/tcp_offload.c @@ -60,12 +60,12 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,  	struct tcphdr *th;  	unsigned int thlen;  	unsigned int seq; -	__be32 delta;  	unsigned int oldlen;  	unsigned int mss;  	struct sk_buff *gso_skb = skb;  	__sum16 newcheck;  	bool ooo_okay, copy_destructor; +	__wsum delta;  	th = tcp_hdr(skb);  	thlen = th->doff * 4; @@ -75,7 +75,7 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,  	if (!pskb_may_pull(skb, thlen))  		goto out; -	oldlen = (u16)~skb->len; +	oldlen = ~skb->len;  	__skb_pull(skb, thlen);  	mss = skb_shinfo(skb)->gso_size; @@ -110,7 +110,7 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,  	if (skb_is_gso(segs))  		mss *= skb_shinfo(segs)->gso_segs; -	delta = htonl(oldlen + (thlen + mss)); +	delta = (__force __wsum)htonl(oldlen + thlen + mss);  	skb = segs;  	th = tcp_hdr(skb); @@ -119,8 +119,7 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,  	if (unlikely(skb_shinfo(gso_skb)->tx_flags & SKBTX_SW_TSTAMP))  		tcp_gso_tstamp(segs, skb_shinfo(gso_skb)->tskey, seq, mss); -	newcheck = ~csum_fold((__force __wsum)((__force u32)th->check + -					       (__force u32)delta)); +	newcheck = ~csum_fold(csum_add(csum_unfold(th->check), delta));  	while (skb->next) {  		th->fin = th->psh = 0; @@ -165,11 +164,11 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,  			WARN_ON_ONCE(refcount_sub_and_test(-delta, &skb->sk->sk_wmem_alloc));  	} -	delta = htonl(oldlen + (skb_tail_pointer(skb) - -				skb_transport_header(skb)) + -		      skb->data_len); -	th->check = ~csum_fold((__force __wsum)((__force u32)th->check + -				(__force u32)delta)); +	delta = (__force __wsum)htonl(oldlen + +				      (skb_tail_pointer(skb) - +				       skb_transport_header(skb)) + +				      skb->data_len); +	th->check = ~csum_fold(csum_add(csum_unfold(th->check), delta));  	if (skb->ip_summed == CHECKSUM_PARTIAL)  		gso_reset_checksum(skb, ~th->check);  	else  | 
