Index: if_tap.c =================================================================== RCS file: /cvsroot/src/sys/net/if_tap.c,v retrieving revision 1.114 diff -u -u -r1.114 if_tap.c --- if_tap.c 16 Oct 2019 06:53:34 -0000 1.114 +++ if_tap.c 23 Nov 2019 16:52:31 -0000 @@ -525,6 +525,7 @@ goto done; ifp->if_opackets++; + ifp->if_obytes += m0->m_len; bpf_mtap(ifp, m0, BPF_D_OUT); m_freem(m0); @@ -893,6 +894,7 @@ break; ifp->if_opackets++; + ifp->if_obytes += m->m_len; bpf_mtap(ifp, m, BPF_D_OUT); m_freem(m); } @@ -979,7 +981,12 @@ } ifp->if_opackets++; + ifp->if_obytes += m->m_len; // XXX: only first in chain bpf_mtap(ifp, m, BPF_D_OUT); + 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. @@ -1050,6 +1057,7 @@ device_lookup_private(&tap_cd, unit); struct ifnet *ifp; struct mbuf *m, **mp; + size_t len = 0; int error = 0; if (sc == NULL) @@ -1076,6 +1084,7 @@ } } (*mp)->m_len = uimin(MHLEN, uio->uio_resid); + len += (*mp)->m_len; error = uiomove(mtod(*mp, void *), (*mp)->m_len, uio); mp = &(*mp)->m_next; } @@ -1087,6 +1096,14 @@ m_set_rcvif(m, ifp); + ifp->if_ipackets++; + ifp->if_ibytes += len; + bpf_mtap(ifp, m, BPF_D_IN); + if ((error = pfil_run_hooks(ifp->if_pfil, &m, ifp, PFIL_IN)) != 0) + return error; + if (m == NULL) + return 0; + if_percpuq_enqueue(ifp->if_percpuq, m); return 0;