summaryrefslogtreecommitdiff
path: root/src/checksum.h
blob: d9e6bda14f5e6bd546457896455109a19570dbb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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;
}