From: Alex Williamson <alex.williamson@hp.com>
To: anthony@codemonkey.ws, qemu-devel@nongnu.org
Cc: markmc@redhat.com, alex.williamson@hp.com, kvm@vger.kernel.org
Subject: [Qemu-devel] [PATCH v3 4/8] qemu:virtio-net: Add a virtqueue for control commands from the guest
Date: Wed, 04 Feb 2009 17:18:11 -0700 [thread overview]
Message-ID: <20090205001811.27879.65803.stgit@kvm.aw> (raw)
In-Reply-To: <20090205001707.27879.22745.stgit@kvm.aw>
This will be used for RX mode, MAC table, VLAN table control, etc...
The control transaction consists of one or more "out" sg entries and
one or more "in" sg entries. The first out entry contains a header
defining the class and command. Additional out entries may provide
data for the command. A response via the ack entry is required
and the guest will typically be waiting for it.
Signed-off-by: Alex Williamson <alex.williamson@hp.com>
---
hw/virtio-net.c | 34 +++++++++++++++++++++++++++++++++-
hw/virtio-net.h | 18 ++++++++++++++++++
2 files changed, 51 insertions(+), 1 deletions(-)
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index 073f23a..5a8287b 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -25,6 +25,7 @@ typedef struct VirtIONet
uint16_t status;
VirtQueue *rx_vq;
VirtQueue *tx_vq;
+ VirtQueue *ctrl_vq;
VLANClientState *vc;
QEMUTimer *tx_timer;
int tx_timer_active;
@@ -79,7 +80,9 @@ static void virtio_net_set_link_status(VLANClientState *vc)
static uint32_t virtio_net_get_features(VirtIODevice *vdev)
{
- uint32_t features = (1 << VIRTIO_NET_F_MAC) | (1 << VIRTIO_NET_F_STATUS);
+ uint32_t features = (1 << VIRTIO_NET_F_MAC) |
+ (1 << VIRTIO_NET_F_STATUS) |
+ (1 << VIRTIO_NET_F_CTRL_VQ);
return features;
}
@@ -91,6 +94,34 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint32_t features)
n->mergeable_rx_bufs = !!(features & (1 << VIRTIO_NET_F_MRG_RXBUF));
}
+static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
+{
+ struct virtio_net_ctrl_hdr ctrl;
+ virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
+ VirtQueueElement elem;
+
+ while (virtqueue_pop(vq, &elem)) {
+ if ((elem.in_num < 1) || (elem.out_num < 1)) {
+ fprintf(stderr, "virtio-net ctrl missing headers\n");
+ exit(1);
+ }
+
+ if (elem.out_sg[0].iov_len < sizeof(ctrl) ||
+ elem.out_sg[elem.in_num - 1].iov_len < sizeof(status)) {
+ fprintf(stderr, "virtio-net ctrl header not in correct element\n");
+ exit(1);
+ }
+
+ ctrl.class = ldub_p(elem.out_sg[0].iov_base);
+ ctrl.cmd = ldub_p(elem.out_sg[0].iov_base + sizeof(ctrl.class));
+
+ stb_p(elem.in_sg[elem.in_num - 1].iov_base, status);
+
+ virtqueue_push(vq, &elem, sizeof(status));
+ virtio_notify(vdev, vq);
+ }
+}
+
/* RX */
static void virtio_net_handle_rx(VirtIODevice *vdev, VirtQueue *vq)
@@ -356,6 +387,7 @@ void virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn)
n->vdev.set_features = virtio_net_set_features;
n->rx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_rx);
n->tx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_tx);
+ n->ctrl_vq = virtio_add_queue(&n->vdev, 16, virtio_net_handle_ctrl);
memcpy(n->mac, nd->macaddr, ETH_ALEN);
n->status = VIRTIO_NET_S_LINK_UP;
n->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
diff --git a/hw/virtio-net.h b/hw/virtio-net.h
index 9dce663..119e38d 100644
--- a/hw/virtio-net.h
+++ b/hw/virtio-net.h
@@ -40,6 +40,7 @@
#define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */
#define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */
#define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */
+#define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */
#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
@@ -84,4 +85,21 @@ struct virtio_net_hdr_mrg_rxbuf
void virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn);
+/*
+ * Control virtqueue data structures
+ *
+ * The control virtqueue expects a header in the first sg entry
+ * and an ack/status response in the last entry. Data for the
+ * command goes in between.
+ */
+struct virtio_net_ctrl_hdr {
+ uint8_t class;
+ uint8_t cmd;
+};
+
+typedef uint8_t virtio_net_ctrl_ack;
+
+#define VIRTIO_NET_OK 0
+#define VIRTIO_NET_ERR 1
+
#endif
next prev parent reply other threads:[~2009-02-05 0:21 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-05 0:17 [Qemu-devel] [PATCH v3 0/8] qemu:virtio-net: Add MAC and VLAN filtering Alex Williamson
2009-02-05 0:17 ` [Qemu-devel] [PATCH v3 1/8] qemu:virtio-net: Save status and add some save infrastructure Alex Williamson
2009-02-05 22:36 ` [Qemu-devel] " Anthony Liguori
2009-02-05 0:18 ` [Qemu-devel] [PATCH v3 2/8] qemu:virtio-net: Allow setting the MAC address via set_config Alex Williamson
2009-02-05 0:18 ` [Qemu-devel] [PATCH v3 3/8] qemu:virtio-net: Define ETH_ALEN for use when manipulating MAC addresses Alex Williamson
2009-02-05 0:18 ` Alex Williamson [this message]
2009-02-05 0:18 ` [Qemu-devel] [PATCH v3 5/8] qemu:virtio-net: Add promiscuous and all-multicast mode bits Alex Williamson
2009-02-05 0:18 ` [Qemu-devel] [PATCH v3 6/8] qemu:virtio-net: Enable filtering based on MAC, promisc, broadcast and allmulti Alex Williamson
2009-02-05 0:18 ` [Qemu-devel] [PATCH v3 7/8] qemu:virtio-net: Add additional MACs via a filter table Alex Williamson
2009-02-05 0:18 ` [Qemu-devel] [PATCH v3 8/8] qemu:virtio-net: Add VLAN filtering Alex Williamson
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=20090205001811.27879.65803.stgit@kvm.aw \
--to=alex.williamson@hp.com \
--cc=anthony@codemonkey.ws \
--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 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).