qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH RFC] net: add a flag to disable mac/vlan filteri


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH RFC] net: add a flag to disable mac/vlan filtering
Date: Tue, 09 Mar 2010 08:43:12 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091209 Fedora/3.0-4.fc12 Lightning/1.0pre Thunderbird/3.0

On 03/09/2010 07:15 AM, Michael S. Tsirkin wrote:
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<address@hidden>

Can't this be achieved by just disabling the feature bits?  IOW,

ctrl_vq=0,ctrl_vlan=0?

Regards,

Anthony Liguori

Cc: Alex Williamson<address@hidden>
Cc: Andreas Plesner Jacobsen<address@hidden>
---
  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 */






reply via email to

[Prev in Thread] Current Thread [Next in Thread]