svn commit: r356613 - head/sys/dev/virtio/network
Ryan Libby
rlibby at freebsd.org
Sat Jan 11 06:06:14 UTC 2020
On Fri, Jan 10, 2020 at 1:22 PM Gleb Smirnoff <glebius at freebsd.org> wrote:
>
> Author: glebius
> Date: Fri Jan 10 21:22:03 2020
> New Revision: 356613
> URL: https://svnweb.freebsd.org/changeset/base/356613
>
> Log:
> Add pfil(9) hook to vtnet(4).
>
> The patch could be simplier, using only the second chunk to
> vtnet_rxq_eof(), that passes full mbufs to pfil(9). Packet
> filter would m_free() them in case of returning PFIL_DROPPED.
>
> However, we pretend to be a hardware driver, so we first try
> to pass a memory buffer via PFIL_MEMPTR feature. This is mostly
> done for debugging purposes, so that one can experiment in bhyve
> with packet filters utilizing same features as a true driver.
>
> Modified:
> head/sys/dev/virtio/network/if_vtnet.c
> head/sys/dev/virtio/network/if_vtnetvar.h
>
> Modified: head/sys/dev/virtio/network/if_vtnet.c
> ==============================================================================
> --- head/sys/dev/virtio/network/if_vtnet.c Fri Jan 10 20:53:58 2020 (r356612)
> +++ head/sys/dev/virtio/network/if_vtnet.c Fri Jan 10 21:22:03 2020 (r356613)
> @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
>
> #include <net/debugnet.h>
> #include <net/ethernet.h>
> +#include <net/pfil.h>
> #include <net/if.h>
> #include <net/if_var.h>
> #include <net/if_arp.h>
> @@ -935,6 +936,7 @@ static int
> vtnet_setup_interface(struct vtnet_softc *sc)
> {
> device_t dev;
> + struct pfil_head_args pa;
> struct ifnet *ifp;
>
> dev = sc->vtnet_dev;
> @@ -1038,6 +1040,12 @@ vtnet_setup_interface(struct vtnet_softc *sc)
>
> DEBUGNET_SET(ifp, vtnet);
>
> + pa.pa_version = PFIL_VERSION;
> + pa.pa_flags = PFIL_IN;
> + pa.pa_type = PFIL_TYPE_ETHERNET;
> + pa.pa_headname = ifp->if_xname;
> + sc->vtnet_pfil = pfil_head_register(&pa);
> +
> return (0);
> }
>
> @@ -1773,9 +1781,11 @@ vtnet_rxq_eof(struct vtnet_rxq *rxq)
> struct vtnet_softc *sc;
> struct ifnet *ifp;
> struct virtqueue *vq;
> - struct mbuf *m;
> + struct mbuf *m, *mr;
> struct virtio_net_hdr_mrg_rxbuf *mhdr;
> int len, deq, nbufs, adjsz, count;
> + pfil_return_t pfil;
> + bool pfil_done;
>
> sc = rxq->vtnrx_sc;
> vq = rxq->vtnrx_vq;
> @@ -1812,6 +1822,35 @@ vtnet_rxq_eof(struct vtnet_rxq *rxq)
> adjsz = sizeof(struct virtio_net_hdr_mrg_rxbuf);
> }
>
> + /*
> + * If we have enough data in first mbuf, run it through
> + * pfil as a memory buffer before dequeueing the rest.
> + */
> + if (PFIL_HOOKED_IN(sc->vtnet_pfil) &&
> + len - adjsz >= ETHER_HDR_LEN + max_protohdr) {
> + pfil = pfil_run_hooks(sc->vtnet_pfil,
> + m->m_data + adjsz, ifp,
> + len - adjsz | PFIL_MEMPTR | PFIL_IN, NULL);
Hi Gleb,
gcc wants (len - adjsz) paranthesized.
https://ci.freebsd.org/job/FreeBSD-head-amd64-gcc/12838/
--- if_vtnet.o ---
/workspace/src/sys/dev/virtio/network/if_vtnet.c: In function 'vtnet_rxq_eof':
/workspace/src/sys/dev/virtio/network/if_vtnet.c:1833:12: error:
suggest parentheses around arithmetic in operand of '|'
[-Werror=parentheses]
len - adjsz | PFIL_MEMPTR | PFIL_IN, NULL);
~~~~^~~~~~~
> + switch (pfil) {
> + case PFIL_REALLOCED:
> + mr = pfil_mem2mbuf(m->m_data + adjsz);
> + vtnet_rxq_input(rxq, mr, hdr);
> + /* FALLTHROUGH */
> + case PFIL_DROPPED:
> + case PFIL_CONSUMED:
> + vtnet_rxq_discard_buf(rxq, m);
> + if (nbufs > 1)
> + vtnet_rxq_discard_merged_bufs(rxq,
> + nbufs);
> + continue;
> + default:
> + KASSERT(pfil == PFIL_PASS,
> + ("Filter returned %d!\n", pfil));
> + };
> + pfil_done = true;
> + } else
> + pfil_done = false;
> +
> if (vtnet_rxq_replace_buf(rxq, m, len) != 0) {
> rxq->vtnrx_stats.vrxs_iqdrops++;
> vtnet_rxq_discard_buf(rxq, m);
> @@ -1841,6 +1880,19 @@ vtnet_rxq_eof(struct vtnet_rxq *rxq)
> */
> memcpy(hdr, mtod(m, void *), sizeof(struct virtio_net_hdr));
> m_adj(m, adjsz);
> +
> + if (PFIL_HOOKED_IN(sc->vtnet_pfil) && pfil_done == false) {
> + pfil = pfil_run_hooks(sc->vtnet_pfil, &m, ifp, PFIL_IN,
> + NULL);
> + switch (pfil) {
> + case PFIL_DROPPED:
> + case PFIL_CONSUMED:
> + continue;
> + default:
> + KASSERT(pfil == PFIL_PASS,
> + ("Filter returned %d!\n", pfil));
> + }
> + }
>
> vtnet_rxq_input(rxq, m, hdr);
>
>
> Modified: head/sys/dev/virtio/network/if_vtnetvar.h
> ==============================================================================
> --- head/sys/dev/virtio/network/if_vtnetvar.h Fri Jan 10 20:53:58 2020 (r356612)
> +++ head/sys/dev/virtio/network/if_vtnetvar.h Fri Jan 10 21:22:03 2020 (r356613)
> @@ -136,6 +136,7 @@ struct vtnet_softc {
> struct ifnet *vtnet_ifp;
> struct vtnet_rxq *vtnet_rxqs;
> struct vtnet_txq *vtnet_txqs;
> + pfil_head_t vtnet_pfil;
>
> uint32_t vtnet_flags;
> #define VTNET_FLAG_SUSPENDED 0x0001
> _______________________________________________
> svn-src-all at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-all
> To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
More information about the svn-src-all
mailing list