|
@@ -306,16 +306,14 @@ EXPORT_SYMBOL(in6_pton);
|
|
void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
|
|
void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
|
|
__be32 from, __be32 to, int pseudohdr)
|
|
__be32 from, __be32 to, int pseudohdr)
|
|
{
|
|
{
|
|
- __be32 diff[] = { ~from, to };
|
|
|
|
if (skb->ip_summed != CHECKSUM_PARTIAL) {
|
|
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)
|
|
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)
|
|
} 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);
|
|
EXPORT_SYMBOL(inet_proto_csum_replace4);
|
|
|
|
|