Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Jan 2024 17:53:02 GMT
From:      Michael Tuexen <tuexen@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: f6aae554b076 - stable/13 - if_tuntap: trigger the bpf hook on transmitting for the tap interface
Message-ID:  <202401121753.40CHr2DF099422@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by tuexen:

URL: https://cgit.FreeBSD.org/src/commit/?id=f6aae554b0764dcf9fcb9fe886bdf722f3856e0d

commit f6aae554b0764dcf9fcb9fe886bdf722f3856e0d
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2023-11-05 19:32:46 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2024-01-12 17:52:36 +0000

    if_tuntap: trigger the bpf hook on transmitting for the tap interface
    
    The tun interface triggers the bpf hook when a packet is transmitted,
    the tap interface triggers it when the packet is read from the
    character device. This is inconsistent.
    So fix the tap device such that it behaves like the tun device.
    This is needed for adding support for the tap device to packetdrill.
    
    Reviewed by:            kevans, rscheff
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D42467
    
    (cherry picked from commit 35af22ac986c4f3e8160c943a478492e748b6f23)
---
 sys/net/if_tuntap.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/sys/net/if_tuntap.c b/sys/net/if_tuntap.c
index d9243ae8bb6c..29e9c05e52bc 100644
--- a/sys/net/if_tuntap.c
+++ b/sys/net/if_tuntap.c
@@ -926,6 +926,16 @@ tunstart_l2(struct ifnet *ifp)
 	TUN_UNLOCK(tp);
 } /* tunstart_l2 */
 
+static int
+tap_transmit(struct ifnet *ifp, struct mbuf *m)
+{
+	int error;
+
+	BPF_MTAP(ifp, m);
+	IFQ_HANDOFF(ifp, m, error);
+	return (error);
+}
+
 /* XXX: should return an error code so it can fail. */
 static void
 tuncreate(struct cdev *dev)
@@ -965,6 +975,8 @@ tuncreate(struct cdev *dev)
 	if ((tp->tun_flags & TUN_L2) != 0) {
 		ifp->if_init = tunifinit;
 		ifp->if_start = tunstart_l2;
+		ifp->if_transmit = tap_transmit;
+		ifp->if_qflush = if_qflush;
 
 		ether_gen_addr(ifp, &eaddr);
 		ether_ifattach(ifp, eaddr.octet);
@@ -1706,9 +1718,6 @@ tunread(struct cdev *dev, struct uio *uio, int flag)
 	}
 	TUN_UNLOCK(tp);
 
-	if ((tp->tun_flags & TUN_L2) != 0)
-		BPF_MTAP(ifp, m);
-
 	len = min(tp->tun_vhdrlen, uio->uio_resid);
 	if (len > 0) {
 		struct virtio_net_hdr_mrg_rxbuf vhdr;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202401121753.40CHr2DF099422>