From 86799647b1afbaa0df36718b216efd876ffd2627 Mon Sep 17 00:00:00 2001 From: "Alex Xu (Hello71)" Date: Sat, 2 Jul 2016 19:47:51 -0400 Subject: Add start of checksumming. --- src/checksum.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/checksum.h (limited to 'src/checksum.h') 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 + +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; +} -- cgit v1.2.3-54-g00ecf