Hi Pablo, On Mon, Sep 30, 2019 at 4:29 PM Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx> wrote: > > The level 4 protocol is part of the UDP and TCP calculations. > nfq_checksum_tcpudp_ipv4() was using IPPROTO_TCP in this calculation, > which gave the wrong answer for UDP. > > Based on patch from Alin Nastac, and patch description from Duncan Roe. > > Signed-off-by: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx> There was another issue that my patch fixed, on big endian platform checksum is incorrectly computed when payload length is odd. You have to include this changes as well in order to fix this: --- a/src/extra/checksum.c +++ b/src/extra/checksum.c @@ -11,6 +11,7 @@ #include <stdio.h> #include <stdbool.h> +#include <endian.h> #include <arpa/inet.h> #include <netinet/ip.h> #include <netinet/ip6.h> @@ -26,8 +27,13 @@ uint16_t nfq_checksum(uint32_t sum, uint16_t *buf, int size) sum += *buf++; size -= sizeof(uint16_t); } - if (size) - sum += *(uint8_t *)buf; + if (size) { +#if __BYTE_ORDER == __BIG_ENDIAN + sum += (uint16_t)*(uint8_t *)buf << 8; +#else + sum += (uint16_t)*(uint8_t *)buf; +#endif + } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >>16);