From: Alex Williamson <alex.williamson@hp.com>
To: kvm@vger.kernel.org
Cc: qemu-devel@nongnu.org, markmc@redhat.com
Subject: [PATCH 4/7] qemu:virtio-net: Add promiscuous and all-multicast mode bits
Date: Fri, 16 Jan 2009 14:10:15 -0700 [thread overview]
Message-ID: <20090116211015.16725.18939.stgit@kvm.aw> (raw)
In-Reply-To: <20090116210954.16725.44321.stgit@kvm.aw>
Add a new RX_MODE control virtqueue class with commands PROMISC and
ALLMULTI and usage documented in virtio-net.h allowing the guest to
manipulate packet receiving options.
Note, for compatibility with older guest drivers we need to default
to promiscuous.
Signed-off-by: Alex Williamson <alex.williamson@hp.com>
---
qemu/hw/virtio-net.c | 38 +++++++++++++++++++++++++++++++++++++-
qemu/hw/virtio-net.h | 9 +++++++++
2 files changed, 46 insertions(+), 1 deletions(-)
diff --git a/qemu/hw/virtio-net.c b/qemu/hw/virtio-net.c
index 3d8cba7..d34c299 100644
--- a/qemu/hw/virtio-net.c
+++ b/qemu/hw/virtio-net.c
@@ -21,7 +21,7 @@
#define TAP_VNET_HDR
-#define VIRTIO_NET_VM_VERSION 3
+#define VIRTIO_NET_VM_VERSION 4
#define ETH_ALEN 6
@@ -37,6 +37,8 @@ typedef struct VirtIONet
QEMUTimer *tx_timer;
int tx_timer_active;
int mergeable_rx_bufs;
+ int promisc;
+ int allmulti;
} VirtIONet;
/* TODO
@@ -131,8 +133,31 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint32_t features)
#endif
}
+static int virtio_net_handle_rx_mode(VirtIONet *n, uint8_t cmd,
+ VirtQueueElement *elem)
+{
+ uint8_t *on;
+
+ if (elem->out_num != 2 || elem->out_sg[1].iov_len != sizeof(*on)) {
+ fprintf(stderr, "virtio-net ctrl invalid rx mode command\n");
+ exit(1);
+ }
+
+ on = elem->out_sg[1].iov_base;
+
+ if (cmd == VIRTIO_NET_CTRL_RX_MODE_PROMISC)
+ n->promisc = *on;
+ else if (cmd == VIRTIO_NET_CTRL_RX_MODE_ALLMULTI)
+ n->allmulti = *on;
+ else
+ return VIRTIO_NET_ERR;
+
+ return VIRTIO_NET_OK;
+}
+
static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
{
+ VirtIONet *n = to_virtio_net(vdev);
struct virtio_net_ctrl_hdr *ctrl;
virtio_net_ctrl_ack *status;
VirtQueueElement elem;
@@ -153,6 +178,9 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
status = elem.in_sg[elem.in_num - 1].iov_base;
*status = VIRTIO_NET_ERR;
+ if (ctrl->class == VIRTIO_NET_CTRL_RX_MODE)
+ *status = virtio_net_handle_rx_mode(n, ctrl->cmd, &elem);
+
virtqueue_push(vq, &elem, sizeof(*status));
virtio_notify(vdev, vq);
}
@@ -435,6 +463,8 @@ static void virtio_net_save(QEMUFile *f, void *opaque)
#endif
qemu_put_be16(f, n->status);
+ qemu_put_be32(f, n->promisc);
+ qemu_put_be32(f, n->allmulti);
}
static int virtio_net_load(QEMUFile *f, void *opaque, int version_id)
@@ -459,6 +489,11 @@ static int virtio_net_load(QEMUFile *f, void *opaque, int version_id)
n->status = qemu_get_be16(f);
+ if (version_id >= 4) {
+ n->promisc = qemu_get_be32(f);
+ n->allmulti = qemu_get_be32(f);
+ }
+
if (n->tx_timer_active) {
qemu_mod_timer(n->tx_timer,
qemu_get_clock(vm_clock) + TX_TIMER_INTERVAL);
@@ -498,6 +533,7 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn)
n->tx_timer = qemu_new_timer(vm_clock, virtio_net_tx_timer, n);
n->tx_timer_active = 0;
n->mergeable_rx_bufs = 0;
+ n->promisc = 1; /* for compatibility */
register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION,
virtio_net_save, virtio_net_load, n);
diff --git a/qemu/hw/virtio-net.h b/qemu/hw/virtio-net.h
index 9a9641e..a4c4005 100644
--- a/qemu/hw/virtio-net.h
+++ b/qemu/hw/virtio-net.h
@@ -99,4 +99,13 @@ typedef uint8_t virtio_net_ctrl_ack;
#define VIRTIO_NET_OK 0
#define VIRTIO_NET_ERR 1
+/*
+ * Control the RX mode, ie. promisucous and allmulti. PROMISC and
+ * ALLMULTI commands require an "out" sg entry containing a 1 byte
+ * state value, zero = disable, non-zero = enable.
+ */
+#define VIRTIO_NET_CTRL_RX_MODE 0
+ #define VIRTIO_NET_CTRL_RX_MODE_PROMISC 0
+ #define VIRTIO_NET_CTRL_RX_MODE_ALLMULTI 1
+
#endif
next prev parent reply other threads:[~2009-01-16 21:12 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-16 21:09 [PATCH 0/7] qemu:virtio-net: Add MAC and VLAN filtering Alex Williamson
2009-01-16 21:09 ` [PATCH 1/7] qemu:virtio-net: Allow setting the MAC address via set_config Alex Williamson
2009-01-16 21:10 ` [PATCH 2/7] qemu:virtio-net: Define ETH_ALEN for use when manipulating MAC addresses Alex Williamson
2009-01-16 21:10 ` [PATCH 3/7] qemu:virtio-net: Add a virtqueue for control commands from the guest Alex Williamson
2009-01-16 21:10 ` Alex Williamson [this message]
2009-01-16 21:10 ` [PATCH 5/7] qemu:virtio-net: Enable filtering based on MAC, promisc, broadcast and allmulti Alex Williamson
2009-01-20 21:31 ` Alex Williamson
2009-01-16 21:10 ` [PATCH 6/7] qemu:virtio-net: Add additional MACs via a filter table Alex Williamson
2009-01-20 21:34 ` Alex Williamson
2009-01-16 21:10 ` [PATCH 7/7] qemu:virtio-net: Add VLAN filtering Alex Williamson
2009-01-20 16:45 ` Alex Williamson
2009-01-20 21:38 ` Alex Williamson
2009-01-19 9:45 ` [PATCH 0/7] qemu:virtio-net: Add MAC and " Mark McLoughlin
2009-01-20 2:27 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090116211015.16725.18939.stgit@kvm.aw \
--to=alex.williamson@hp.com \
--cc=kvm@vger.kernel.org \
--cc=markmc@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.