virtio-net: Enable filtering based on MAC, promisc, broadcast and allmulti
PATCH 4/5 virtio-net: Enable filtering based on MAC, promisc, broadcast and allmulti
Signed-off-by Alex Williamson <[email protected]>
---
qemu/hw/virtio-net.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-)
qemu/hw/virtio-net.c +22 -0
@@ -273,6 +273,25 @@ static int receive_header(VirtIONet *n, struct iovec *iov, int iovcnt,return offset; } +static int receive_filter (VirtIONet *n,const uint8_t *buf,int size) +{ +static uint8_t bcast[] = {0xff ,0xff ,0xff ,0xff ,0xff ,0xff }; + +if (n->promisc) +return 1 ; + +if ((buf[0 ] &1 ) && n->allmulti) +return 1 ; + +if (!memcmp (buf, bcast,sizeof (bcast))) +return 1 ; + +if (!memcmp (buf, n->mac,6 )) +return 1 ; + +return 0 ; +} +static void virtio_net_receive (void *opaque,const uint8_t *buf,int size) {VirtIONet *n = opaque;
@@ -282,6 +301,9 @@ static void virtio_net_receive(void *opaque, const uint8_t *buf, int size)if (!do_virtio_net_can_receive (n, size))return ; +if (!receive_filter (n, buf, size)) +return ; +/* hdr_len refers to the header we supply to the guest */ hdr_len = n->mergeable_rx_bufs ?sizeof (struct virtio_net_hdr_mrg_rxbuf ) :sizeof (struct virtio_net_hdr );