umb(4) is a hardware p2p driver, it just has ip coming in, so we can do the same thing we do for the address family and input processing as other p2p interfaces.
the short packet check that umb_input does is already done by the ip stacks, so we're not losing anything. i havent got a umb(4), so i need someone to test this. oks are nice too. Index: if_umb.c =================================================================== RCS file: /cvs/src/sys/dev/usb/if_umb.c,v retrieving revision 1.51 diff -u -p -r1.51 if_umb.c --- if_umb.c 18 Apr 2023 22:01:23 -0000 1.51 +++ if_umb.c 25 Aug 2023 10:36:19 -0000 @@ -138,7 +138,6 @@ void umb_close_bulkpipes(struct umb_so int umb_ioctl(struct ifnet *, u_long, caddr_t); int umb_output(struct ifnet *, struct mbuf *, struct sockaddr *, struct rtentry *); -void umb_input(struct ifnet *, struct mbuf *); void umb_start(struct ifnet *); void umb_rtrequest(struct ifnet *, int, struct rtentry *); void umb_watchdog(struct ifnet *); @@ -610,7 +609,8 @@ umb_attach(struct device *parent, struct sizeof (struct ncm_pointer16); ifp->if_mtu = 1500; /* use a common default */ ifp->if_hardmtu = sc->sc_maxpktlen; - ifp->if_input = umb_input; + ifp->if_bpf_mtap = p2p_bpf_mtap; + ifp->if_input = p2p_input; ifp->if_output = umb_output; if_attach(ifp); if_alloc_sadl(ifp); @@ -910,48 +910,6 @@ umb_output(struct ifnet *ifp, struct mbu return if_enqueue(ifp, m); } -void -umb_input(struct ifnet *ifp, struct mbuf *m) -{ - uint32_t af; - - if ((ifp->if_flags & IFF_UP) == 0) { - m_freem(m); - return; - } - if (m->m_pkthdr.len < sizeof (struct ip) + sizeof(af)) { - ifp->if_ierrors++; - DPRINTFN(4, "%s: dropping short packet (len %d)\n", __func__, - m->m_pkthdr.len); - m_freem(m); - return; - } - m->m_pkthdr.ph_rtableid = ifp->if_rdomain; - - /* pop off DLT_LOOP header, no longer needed */ - af = *mtod(m, uint32_t *); - m_adj(m, sizeof (af)); - af = ntohl(af); - - ifp->if_ibytes += m->m_pkthdr.len; - switch (af) { - case AF_INET: - ipv4_input(ifp, m); - return; -#ifdef INET6 - case AF_INET6: - ipv6_input(ifp, m); - return; -#endif /* INET6 */ - default: - ifp->if_ierrors++; - DPRINTFN(4, "%s: dropping packet with bad IP version (af %d)\n", - __func__, af); - m_freem(m); - return; - } -} - static inline int umb_align(size_t bufsz, int offs, int alignment, int remainder) { @@ -2376,7 +2334,7 @@ umb_decap(struct umb_softc *sc, struct u struct ifnet *ifp = GET_IFP(sc); int s; void *buf; - uint32_t len, af = 0; + uint32_t len; char *dp; struct ncm_header16 *hdr16; struct ncm_header32 *hdr32; @@ -2499,20 +2457,14 @@ umb_decap(struct umb_softc *sc, struct u ifp->if_iqdrops++; continue; } - m = m_prepend(m, sizeof(uint32_t), M_DONTWAIT); - if (m == NULL) { - ifp->if_iqdrops++; - continue; - } switch (*dp & 0xf0) { case 4 << 4: - af = htonl(AF_INET); + m->m_pkthdr.ph_family = AF_INET; break; case 6 << 4: - af = htonl(AF_INET6); + m->m_pkthdr.ph_family = AF_INET6; break; } - *mtod(m, uint32_t *) = af; ml_enqueue(&ml, m); } done: