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
MFC after:		1 week
Sponsored by:		Netflix, Inc.
Differential Revision:	https://reviews.freebsd.org/D42467
This commit is contained in:
Michael Tuexen 2023-11-05 20:32:46 +01:00
parent 03c3a70abe
commit 35af22ac98

View file

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