summaryrefslogtreecommitdiff
path: root/src/checksum.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/checksum.h')
-rw-r--r--src/checksum.h27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/checksum.h b/src/checksum.h
new file mode 100644
index 0000000..d9e6bda
--- /dev/null
+++ b/src/checksum.h
@@ -0,0 +1,27 @@
+#include <stdint.h>
+
+static inline uint16_t do_csum(const char *buf, unsigned size) {
+ unsigned int sum = 0;
+ unsigned int i;
+
+ for (i = 0; i < size - 1; i += 2)
+ sum += *(uint16_t *)&buf[i];
+
+ if (size & 1)
+ sum += (uint8_t)buf[i];
+
+ while (sum >> 16)
+ sum = (sum & 0xFFFF) + (sum >> 16);
+
+ return ~sum;
+}
+
+static inline uint16_t csum_partial(const void *buff, int len, uint16_t wsum) {
+ unsigned int sum = (unsigned int)wsum;
+ unsigned int result = do_csum(buff, len);
+
+ result += sum;
+ if (sum > result)
+ result += 1;
+ return result;
+}