Index: if_tap.c =================================================================== RCS file: /cvsroot/src/sys/net/if_tap.c,v retrieving revision 1.99.6.2 diff -u -p -u -r1.99.6.2 if_tap.c --- if_tap.c 10 Dec 2017 10:10:25 -0000 1.99.6.2 +++ if_tap.c 23 Nov 2019 18:50:18 -0000 @@ -524,6 +524,7 @@ tap_start(struct ifnet *ifp) return; ifp->if_opackets++; + ifp->if_obytes += m0->m_len; bpf_mtap(ifp, m0); m_freem(m0); @@ -892,6 +893,7 @@ tap_dev_close(struct tap_softc *sc) break; ifp->if_opackets++; + ifp->if_obytes += m->m_len; bpf_mtap(ifp, m); m_freem(m); } @@ -989,8 +991,14 @@ tap_dev_read(int unit, struct uio *uio, } ifp->if_opackets++; + ifp->if_obytes += m->m_len; bpf_mtap(ifp, m); + if ((error = pfil_run_hooks(ifp->if_pfil, &m, ifp, PFIL_OUT)) != 0) + goto out; + if (m == NULL) + goto out; + /* * One read is one packet. */ @@ -1060,6 +1068,7 @@ tap_dev_write(int unit, struct uio *uio, device_lookup_private(&tap_cd, unit); struct ifnet *ifp; struct mbuf *m, **mp; + size_t len = 0; int error = 0; int s; @@ -1087,6 +1096,7 @@ tap_dev_write(int unit, struct uio *uio, } } (*mp)->m_len = min(MHLEN, uio->uio_resid); + len += (*mp)->m_len; error = uiomove(mtod(*mp, void *), (*mp)->m_len, uio); mp = &(*mp)->m_next; } @@ -1098,6 +1108,15 @@ tap_dev_write(int unit, struct uio *uio, m_set_rcvif(m, ifp); + ifp->if_ipackets++; + ifp->if_ibytes += len; + bpf_mtap(ifp, m); + + if ((error = pfil_run_hooks(ifp->if_pfil, &m, ifp, PFIL_IN)) != 0) + return error; + if (m == NULL) + return 0; + s = splnet(); if_input(ifp, m); splx(s);