Hi, m_resethdr() exists to clear information attached to a mbuf that has been accumulated during processing. Especially pf(4) data is removed. This feature used by pair(4) when a new input is started.
patrick@ has seen a mbuf going though lo(4) with an old inp attached. I think this should be fixed in a more general way. When a packet is reinserted to local input processing, start from scratch. Also the packet has to be in the routing doamin of the interface where it is insertet. I think was the case anyway, as the callers of if_input_local() do not change the interface. But as m_resethdr() clears the field, set the rtableid to the input interface. ok? bluhm Index: net/if.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/net/if.c,v retrieving revision 1.454 diff -u -p -r1.454 if.c --- net/if.c 9 Oct 2016 20:05:10 -0000 1.454 +++ net/if.c 13 Oct 2016 12:29:30 -0000 @@ -665,7 +665,9 @@ if_input_local(struct ifnet *ifp, struct bpf_mtap_af(if_bpf, af, m, BPF_DIRECTION_OUT); } #endif + m_resethdr(m); m->m_pkthdr.ph_ifidx = ifp->if_index; + m->m_pkthdr.ph_rtableid = ifp->if_rdomain; ifp->if_opackets++; ifp->if_obytes += m->m_pkthdr.len;