Module Name:    src
Committed By:   christos
Date:           Mon Jan  6 20:31:35 UTC 2020

Modified Files:
        src/sys/net: if_tap.c

Log Message:
Add missing packet filter hooks, byte accounting.


To generate a diff of this commit:
cvs rdiff -u -r1.114 -r1.115 src/sys/net/if_tap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.114 src/sys/net/if_tap.c:1.115
--- src/sys/net/if_tap.c:1.114	Wed Oct 16 02:53:34 2019
+++ src/sys/net/if_tap.c	Mon Jan  6 15:31:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_tap.c,v 1.114 2019/10/16 06:53:34 knakahara Exp $	*/
+/*	$NetBSD: if_tap.c,v 1.115 2020/01/06 20:31:35 christos Exp $	*/
 
 /*
  *  Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.114 2019/10/16 06:53:34 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.115 2020/01/06 20:31:35 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 
@@ -525,6 +525,7 @@ tap_start(struct ifnet *ifp)
 				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 @@ tap_dev_close(struct tap_softc *sc)
 				break;
 
 			ifp->if_opackets++;
+			ifp->if_obytes += m->m_len;
 			bpf_mtap(ifp, m, BPF_D_OUT);
 			m_freem(m);
 		}
@@ -979,7 +981,12 @@ tap_dev_read(int unit, struct uio *uio, 
 	}
 
 	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 @@ 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;
 
 	if (sc == NULL)
@@ -1076,6 +1084,7 @@ tap_dev_write(int unit, struct uio *uio,
 			}
 		}
 		(*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 @@ tap_dev_write(int unit, struct uio *uio,
 
 	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;

Reply via email to