net: Add remcsum_adjust as common function for remote checksum offload
authorTom Herbert <therbert@google.com>
Tue, 25 Nov 2014 19:21:19 +0000 (11:21 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 26 Nov 2014 17:25:43 +0000 (12:25 -0500)
This function does the work to update a checksum field as part of
remote checksum offload.

remcsum_adjust does the following:

1) Subtract out the calculated checksum from the beginning of the
   packet (ptr arg) to the start offset.
2) Adjust the checksum field indicated by offset based on the modified
   checksum value from above step.
3) Return the difference in the old checksum field value and the
   new one. The caller will use this to update skb->csum and NAPI csum.

Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/checksum.h

index 6465bae80a4f8ee451d175b3dc8022340d418709..e339a9513e2963ea9f5bfbf77a2851836d36cddc 100644 (file)
@@ -151,4 +151,20 @@ static inline void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb,
                                 (__force __be32)to, pseudohdr);
 }
 
+static inline __wsum remcsum_adjust(void *ptr, __wsum csum,
+                                   int start, int offset)
+{
+       __sum16 *psum = (__sum16 *)(ptr + offset);
+       __wsum delta;
+
+       /* Subtract out checksum up to start */
+       csum = csum_sub(csum, csum_partial(ptr, start, 0));
+
+       /* Set derived checksum in packet */
+       delta = csum_sub(csum_fold(csum), *psum);
+       *psum = csum_fold(csum);
+
+       return delta;
+}
+
 #endif