Index: ip_input.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_input.c,v retrieving revision 1.348 diff -u -p -r1.348 ip_input.c --- ip_input.c 12 Apr 2020 11:56:52 -0000 1.348 +++ ip_input.c 4 Jul 2020 12:14:33 -0000 @@ -216,6 +216,28 @@ ipv4_input(struct ifnet *ifp, struct mbu KASSERT(nxt == IPPROTO_DONE); } +uint16_t +ip_cksum(const struct ip *ip) +{ + const uint32_t *w = (const uint32_t *)ip; + uint64_t s; + unsigned int i; + + s = (uint64_t)w[0] + + (uint64_t)w[1] + + (uint64_t)w[2] + + (uint64_t)w[3] + + (uint64_t)w[4]; + + for (i = 5; i < ip->ip_hl; i++) + s += (uint64_t)w[i]; + + s = (s >> 16) + (s & 0xffff); + s = (s >> 16) + (s & 0xffff); + + return (~s); +} + int ip_input_if(struct mbuf **mp, int *offp, int nxt, int af, struct ifnet *ifp) { @@ -267,7 +289,7 @@ ip_input_if(struct mbuf **mp, int *offp, } ipstat_inc(ips_inswcsum); - if (in_cksum(m, hlen) != 0) { + if (ip_cksum(ip) != 0x0000) { ipstat_inc(ips_badsum); goto bad; }