Vitaliy Makkoveev:
> The ether_extract_headers() diff was reverted, because is wrong for the
> cases other than tcp/udp/icmp. We need to fix it and recommit again
> before continue.
I think (TCP or) UDP fragments are the problem. Fragments don't have
the protocol header but will still end up here:
case IPPROTO_UDP:
m = m_getptr(m, hoff + hlen, &hoff);
KASSERT(m != NULL && m->m_len - hoff >= sizeof(*ext->udp));
ext->udp = (struct udphdr *)(mtod(m, caddr_t) + hoff);
break;
If a tail fragment is too short, it will trigger the KASSERT().
Previously, this wasn't a problem, because if there was such a
KASSERT() as in ixl(4), it was behind a M_*_CSUM_OUT check, and we
never set those flags for fragments.
--
Christian "naddy" Weisgerber [email protected]