diff options
Diffstat (limited to 'net/core/utils.c')
| -rw-r--r-- | net/core/utils.c | 12 | 
1 files changed, 7 insertions, 5 deletions
diff --git a/net/core/utils.c b/net/core/utils.c index 7b803884c162..a7732a068043 100644 --- a/net/core/utils.c +++ b/net/core/utils.c @@ -304,13 +304,15 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,  			      __be32 from, __be32 to, int pseudohdr)  {  	if (skb->ip_summed != CHECKSUM_PARTIAL) { -		*sum = csum_fold(csum_add(csum_sub(~csum_unfold(*sum), from), -				 to)); +		csum_replace4(sum, from, to);  		if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) -			skb->csum = ~csum_add(csum_sub(~(skb->csum), from), to); +			skb->csum = ~csum_add(csum_sub(~(skb->csum), +						       (__force __wsum)from), +					      (__force __wsum)to);  	} else if (pseudohdr) -		*sum = ~csum_fold(csum_add(csum_sub(csum_unfold(*sum), from), -				  to)); +		*sum = ~csum_fold(csum_add(csum_sub(csum_unfold(*sum), +						    (__force __wsum)from), +					   (__force __wsum)to));  }  EXPORT_SYMBOL(inet_proto_csum_replace4);  |