diff options
author | Tom Herbert <tom@herbertland.com> | 2015-08-17 16:42:26 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-08-18 00:33:06 -0400 |
commit | abc5d1ff3e8f9b4a9d274818459b123e31981dc9 (patch) | |
tree | bfe90be833065a4707499800e25c8b65bcbb25b0 /net/core/utils.c | |
parent | 4b048d6d9d0b0b90e1e94f2393796bbf1fa8df4e (diff) |
net: Add inet_proto_csum_replace_by_diff utility function
This function updates a checksum field value and skb->csum based on
a value which is the difference between the old and new checksum.
Signed-off-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/utils.c')
-rw-r--r-- | net/core/utils.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/net/core/utils.c b/net/core/utils.c index cd7d202f340e..3dffce953c39 100644 --- a/net/core/utils.c +++ b/net/core/utils.c | |||
@@ -336,6 +336,19 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, | |||
336 | } | 336 | } |
337 | EXPORT_SYMBOL(inet_proto_csum_replace16); | 337 | EXPORT_SYMBOL(inet_proto_csum_replace16); |
338 | 338 | ||
339 | void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb, | ||
340 | __wsum diff, bool pseudohdr) | ||
341 | { | ||
342 | if (skb->ip_summed != CHECKSUM_PARTIAL) { | ||
343 | *sum = csum_fold(csum_add(diff, ~csum_unfold(*sum))); | ||
344 | if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) | ||
345 | skb->csum = ~csum_add(diff, ~skb->csum); | ||
346 | } else if (pseudohdr) { | ||
347 | *sum = ~csum_fold(csum_add(diff, csum_unfold(*sum))); | ||
348 | } | ||
349 | } | ||
350 | EXPORT_SYMBOL(inet_proto_csum_replace_by_diff); | ||
351 | |||
339 | struct __net_random_once_work { | 352 | struct __net_random_once_work { |
340 | struct work_struct work; | 353 | struct work_struct work; |
341 | struct static_key *key; | 354 | struct static_key *key; |