aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2023-11-05 19:32:46 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2024-01-12 16:51:40 +0000
commite0f22f9e1867e9a4a2fc90327a13265eb233c7f3 (patch)
tree5840a0bccc1f60d3685fb615940d3ae28fc23435
parente71e4d9ef1ba26f054894465fd53684c1fe2154d (diff)
downloadsrc-e0f22f9e1867e9a4a2fc90327a13265eb233c7f3.tar.gz
src-e0f22f9e1867e9a4a2fc90327a13265eb233c7f3.zip
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)
-rw-r--r--sys/net/if_tuntap.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/net/if_tuntap.c b/sys/net/if_tuntap.c
index 298f37bebc56..f273e4993dfd 100644
--- a/sys/net/if_tuntap.c
+++ b/sys/net/if_tuntap.c
@@ -933,6 +933,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)
@@ -972,6 +982,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);
@@ -1713,9 +1725,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;