From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LVCpf-0001Jd-DA for qemu-devel@nongnu.org; Thu, 05 Feb 2009 17:36:27 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LVCpe-0001HB-7t for qemu-devel@nongnu.org; Thu, 05 Feb 2009 17:36:26 -0500 Received: from [199.232.76.173] (port=44153 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LVCpd-0001GV-Uq for qemu-devel@nongnu.org; Thu, 05 Feb 2009 17:36:26 -0500 Received: from savannah.gnu.org ([199.232.41.3]:56509 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LVCpd-0005rM-K7 for qemu-devel@nongnu.org; Thu, 05 Feb 2009 17:36:25 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LVCpc-0000Sg-FA for qemu-devel@nongnu.org; Thu, 05 Feb 2009 22:36:24 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LVCpc-0000Sc-AA for qemu-devel@nongnu.org; Thu, 05 Feb 2009 22:36:24 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Thu, 05 Feb 2009 22:36:24 +0000 Subject: [Qemu-devel] [6538] qemu:virtio-net: Enable filtering based on MAC, promisc, broadcast and allmulti (Alex Williamson) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6538 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6538 Author: aliguori Date: 2009-02-05 22:36:24 +0000 (Thu, 05 Feb 2009) Log Message: ----------- qemu:virtio-net: Enable filtering based on MAC, promisc, broadcast and allmulti (Alex Williamson) Make use of the new RX_MODE control virtqueue class by dropping packets the guest doesn't want to see. Signed-off-by: Alex Williamson Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/hw/virtio-net.c Modified: trunk/hw/virtio-net.c =================================================================== --- trunk/hw/virtio-net.c 2009-02-05 22:36:20 UTC (rev 6537) +++ trunk/hw/virtio-net.c 2009-02-05 22:36:24 UTC (rev 6538) @@ -222,6 +222,31 @@ return offset; } +static int receive_filter(VirtIONet *n, const uint8_t *buf, int size) +{ + static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + uint8_t *ptr = (uint8_t *)buf; + + if (n->promisc) + return 1; + +#ifdef TAP_VNET_HDR + if (tap_has_vnet_hdr(n->vc->vlan->first_client)) + ptr += sizeof(struct virtio_net_hdr); +#endif + + if ((ptr[0] & 1) && n->allmulti) + return 1; + + if (!memcmp(ptr, bcast, sizeof(bcast))) + return 1; + + if (!memcmp(ptr, n->mac, ETH_ALEN)) + return 1; + + return 0; +} + static void virtio_net_receive(void *opaque, const uint8_t *buf, int size) { VirtIONet *n = opaque; @@ -231,6 +256,9 @@ 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);