#include "inet.h" uint16_t ntohs(uint16_t val) { return val<<8|val>>8; } uint16_t htons(uint16_t val) { return val<<8|val>>8; } uint16_t checksum(void *addr, int count) { /* Compute Internet Checksum for "count" bytes * beginning at location "addr". * Taken from https://tools.ietf.org/html/rfc1071 */ register uint32_t sum = 0; uint16_t * ptr = addr; while( count > 1 ) { /* This is the inner loop */ sum += ntohs(* ptr++); count -= 2; } /* Add left-over byte, if any */ if( count > 0 ) sum += * (uint8_t *) ptr; /* Fold 32-bit sum to 16 bits */ while (sum>>16) sum = (sum & 0xffff) + (sum >> 16); return ~sum; }