qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH RFC] net: add a flag to disable mac/vlan filtering
@ 2010-03-09 13:15 Michael S. Tsirkin
  2010-03-09 14:43 ` Anthony Liguori
  2010-03-09 15:19 ` [Qemu-devel] " Alex Williamson
  0 siblings, 2 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2010-03-09 13:15 UTC (permalink / raw)
  To: qemu-devel, Alex Williamson, Andreas Plesner Jacobsen

New bridge in linux 2.6.34 adds IGMP snooping support,
after which bridge should not normally flood any packets.
While we still need mac table to arm forwarding tables
after migration, we can thus ignore it for rx datapath.

For vlan, it's possible to do filtering down the
stack simply by using bridge per guest and binding said bridge
to vlan device, which some people do.

Since qemu has no easy way to check IGMP snooping
support in bridge or how it's connected, add options
to disable rx filtering, so that management can set it
as appropriate.
Use these options to optimise virtio-net rx path.
We still ask guest for the list of vlans/macs for
migration.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Cc: Alex Williamson <alex.williamson@hp.com>
Cc: Andreas Plesner Jacobsen <apj@mutt.dk>
---
 hw/virtio-net.c |   10 +++++++++-
 net.h           |   12 +++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index 5c0093e..01b45ed 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -47,6 +47,7 @@ typedef struct VirtIONet
     uint8_t nomulti;
     uint8_t nouni;
     uint8_t nobcast;
+    uint32_t filtering;
     struct {
         int in_use;
         int first_multi;
@@ -475,12 +476,17 @@ static int receive_filter(VirtIONet *n, const uint8_t *buf, int size)
         ptr += sizeof(struct virtio_net_hdr);
     }
 
-    if (!memcmp(&ptr[12], vlan, sizeof(vlan))) {
+    if ((n->filtering & (0x1 << NICCONF_F_VLAN_FILTERING)) &&
+        !memcmp(&ptr[12], vlan, sizeof(vlan))) {
         int vid = be16_to_cpup((uint16_t *)(ptr + 14)) & 0xfff;
         if (!(n->vlans[vid >> 5] & (1U << (vid & 0x1f))))
             return 0;
     }
 
+    if (!(n->filtering & (0x1 << NICCONF_F_MAC_FILTERING))) {
+            return 1;
+    }
+
     if (ptr[0] & 1) { // multicast
         if (!memcmp(ptr, bcast, sizeof(bcast))) {
             return !n->nobcast;
@@ -863,6 +869,8 @@ VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf)
 
     n->mac_table.macs = qemu_mallocz(MAC_TABLE_ENTRIES * ETH_ALEN);
 
+    n->filtering = conf->filtering;
+
     n->vlans = qemu_mallocz(MAX_VLAN >> 3);
 
     register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION,
diff --git a/net.h b/net.h
index 33a1eaf..459ede5 100644
--- a/net.h
+++ b/net.h
@@ -18,12 +18,22 @@ typedef struct NICConf {
     MACAddr macaddr;
     VLANState *vlan;
     VLANClientState *peer;
+    uint32_t filtering;
 } NICConf;
 
+enum {
+    NICCONF_F_MAC_FILTERING = 0,
+    NICCONF_F_VLAN_FILTERING = 1
+};
+
 #define DEFINE_NIC_PROPERTIES(_state, _conf)                            \
     DEFINE_PROP_MACADDR("mac",   _state, _conf.macaddr),                \
     DEFINE_PROP_VLAN("vlan",     _state, _conf.vlan),                   \
-    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer)
+    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer),                    \
+    DEFINE_PROP_BIT("mac_filtering", _state, _conf.filtering,           \
+                     NICCONF_F_MAC_FILTERING, true)                     \
+    DEFINE_PROP_BIT("vlan_filtering", _state, _conf.filtering,          \
+                     NICCONF_F_VLAN_FILTERING, true)                    \
 
 /* VLANs support */
 
-- 
1.7.0.18.g0d53a5

^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2010-03-09 16:57 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-09 13:15 [Qemu-devel] [PATCH RFC] net: add a flag to disable mac/vlan filtering Michael S. Tsirkin
2010-03-09 14:43 ` Anthony Liguori
2010-03-09 15:09   ` Alex Williamson
2010-03-09 15:54     ` Paul Brook
2010-03-09 15:10   ` Michael S. Tsirkin
2010-03-09 15:19 ` [Qemu-devel] " Alex Williamson
2010-03-09 15:30   ` Michael S. Tsirkin
2010-03-09 15:48     ` Michael S. Tsirkin
2010-03-09 16:11     ` Alex Williamson
2010-03-09 16:18       ` Michael S. Tsirkin
2010-03-09 16:56         ` Alex Williamson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).