#define _GNU_SOURCE #include #include #include "includes.h" #include "checksum.h" uint16_t checksum_generic(uint16_t *addr, uint32_t count) { register unsigned long sum = 0; for (sum = 0; count > 1; count -= 2) sum += *addr++; if (count == 1) sum += (char)*addr; sum = (sum >> 16) + (sum & 0xFFFF); sum += (sum >> 16); return ~sum; } uint16_t checksum_tcpudp(struct iphdr *iph, void *buff, uint16_t data_len, int len) { const uint16_t *buf = buff; uint32_t ip_src = iph->saddr; uint32_t ip_dst = iph->daddr; uint32_t sum = 0; int length = len; while (len > 1) { sum += *buf; buf++; len -= 2; } if (len == 1) sum += *((uint8_t *) buf); sum += (ip_src >> 16) & 0xFFFF; sum += ip_src & 0xFFFF; sum += (ip_dst >> 16) & 0xFFFF; sum += ip_dst & 0xFFFF; sum += htons(iph->protocol); sum += data_len; while (sum >> 16) sum = (sum & 0xFFFF) + (sum >> 16); return ((uint16_t) (~sum)); }