The layer-2 hook (net.link.ether.ipfw) runs ipfw_chk() on the raw
Ethernet frame, which pulled up min(m_pkthdr.len, max_protohdr) bytes to
make the L2 and L3 base headers contiguous. A sender advertising
IFCAP_MEXTPG hands it an unmapped (M_EXTPG) sendfile(2) or KTLS chain
whose mapped head is 54 bytes; max_protohdr is 60, so m_pullup() walked
six bytes into the unmapped mbuf and dereferenced a NULL mtod(),
panicking the kernel.
Pull up only the Ethernet plus the largest L3 base header ipfw reads
inline; deeper headers are already pulled up on demand. This is the same
fix as bridge_pfil().
Assisted-by: Claude Code (Fable 5)