virti-net: Enable filtering based on MAC, promisc, broadcast and allmulti
RFC PATCH 4/5 virti-net: Enable filtering based on MAC, promisc, broadcast and allmulti
virti-net: Enable filtering based on MAC, promisc, broadcast and allmulti
Signed-off-by Alex Williamson <[email protected]>
---
hw/virtio-net.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-)
hw/virtio-net.c +22 -0
@@ -167,6 +167,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->status.bits.promisc) +return 1 ; + +if ((buf[0 ] &1 ) && n->status.bits.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;
@@ -176,6 +195,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 );