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;