Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[cascardo/linux.git] / net / core / utils.c
index eed3433..efc76dd 100644 (file)
@@ -306,16 +306,14 @@ EXPORT_SYMBOL(in6_pton);
 void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
                              __be32 from, __be32 to, int pseudohdr)
 {
-       __be32 diff[] = { ~from, to };
        if (skb->ip_summed != CHECKSUM_PARTIAL) {
-               *sum = csum_fold(csum_partial(diff, sizeof(diff),
-                               ~csum_unfold(*sum)));
+               *sum = csum_fold(csum_add(csum_sub(~csum_unfold(*sum), from),
+                                to));
                if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr)
-                       skb->csum = ~csum_partial(diff, sizeof(diff),
-                                               ~skb->csum);
+                       skb->csum = ~csum_add(csum_sub(~(skb->csum), from), to);
        } else if (pseudohdr)
-               *sum = ~csum_fold(csum_partial(diff, sizeof(diff),
-                               csum_unfold(*sum)));
+               *sum = ~csum_fold(csum_add(csum_sub(csum_unfold(*sum), from),
+                                 to));
 }
 EXPORT_SYMBOL(inet_proto_csum_replace4);