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);