[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 5/8] spice-qemu-char: add spiceport chardev
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 5/8] spice-qemu-char: add spiceport chardev |
Date: |
Mon, 17 Dec 2012 14:04:36 +0100 |
From: Marc-André Lureau <address@hidden>
Add a new spice chardev to allow arbitrary communication between the
host and the Spice client via the spice server.
Examples:
This allows the Spice client to have a special port for the qemu
monitor:
... -chardev spiceport,name=org.qemu.monitor,id=monitorport
-mon chardev=monitorport
v2:
- remove support for chardev to chardev linking
- conditionnaly compile with SPICE_SERVER_VERSION
Signed-off-by: Gerd Hoffmann <address@hidden>
---
qemu-char.c | 3 +++
qemu-options.hx | 13 +++++++++++++
spice-qemu-char.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
trace-events | 1 +
ui/qemu-spice.h | 3 +++
5 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index 242b799..9940701 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2762,6 +2762,9 @@ static const struct {
#endif
#ifdef CONFIG_SPICE
{ .name = "spicevmc", .open = qemu_chr_open_spice },
+#if SPICE_SERVER_VERSION >= 0x000c02
+ { .name = "spiceport", .open = qemu_chr_open_spice_port },
+#endif
#endif
};
diff --git a/qemu-options.hx b/qemu-options.hx
index 231cc4f..9df0cde 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1749,6 +1749,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
#endif
#if defined(CONFIG_SPICE)
"-chardev spicevmc,id=id,name=name[,debug=debug]\n"
+ "-chardev spiceport,id=id,name=name[,debug=debug]\n"
#endif
, QEMU_ARCH_ALL
)
@@ -1776,6 +1777,7 @@ Backend is one of:
@option{tty},
@option{parport},
@option{spicevmc}.
address@hidden
The specific backend will determine the applicable options.
All devices must have an id, which can be any string up to 127 characters long.
@@ -1961,6 +1963,17 @@ required.
Connect to a spice virtual machine channel, such as vdiport.
address@hidden -chardev spiceport ,address@hidden ,address@hidden,
address@hidden
+
address@hidden is only available when spice support is built in.
+
address@hidden debug level for spicevmc
+
address@hidden name of spice port to connect to
+
+Connect to a spice port, allowing a Spice client to handle the traffic
+identified by a name (preferably a fqdn).
+
@end table
ETEXI
diff --git a/spice-qemu-char.c b/spice-qemu-char.c
index b86e83a..4be75ba 100644
--- a/spice-qemu-char.c
+++ b/spice-qemu-char.c
@@ -3,6 +3,7 @@
#include "ui/qemu-spice.h"
#include <spice.h>
#include <spice-experimental.h>
+#include <spice/protocol.h>
#include "osdep.h"
@@ -67,6 +68,27 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t
*buf, int len)
return bytes;
}
+#if SPICE_SERVER_VERSION >= 0x000c02
+static void vmc_event(SpiceCharDeviceInstance *sin, uint8_t event)
+{
+ SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
+ int chr_event;
+
+ switch (event) {
+ case SPICE_PORT_EVENT_BREAK:
+ chr_event = CHR_EVENT_BREAK;
+ break;
+ default:
+ dprintf(scd, 2, "%s: unknown %d\n", __func__, event);
+ return;
+ }
+
+ dprintf(scd, 2, "%s: %d\n", __func__, event);
+ trace_spice_vmc_event(chr_event);
+ qemu_chr_be_event(scd->chr, chr_event);
+}
+#endif
+
static void vmc_state(SpiceCharDeviceInstance *sin, int connected)
{
SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
@@ -103,6 +125,9 @@ static SpiceCharDeviceInterface vmc_interface = {
.state = vmc_state,
.write = vmc_write,
.read = vmc_read,
+#if SPICE_SERVER_VERSION >= 0x000c02
+ .event = vmc_event,
+#endif
};
@@ -242,3 +267,23 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts)
return chr;
}
+
+#if SPICE_SERVER_VERSION >= 0x000c02
+CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts)
+{
+ CharDriverState *chr;
+ SpiceCharDriver *s;
+ const char *name = qemu_opt_get(opts, "name");
+
+ if (name == NULL) {
+ fprintf(stderr, "spice-qemu-char: missing name parameter\n");
+ return NULL;
+ }
+
+ chr = chr_open(opts, "port");
+ s = chr->opaque;
+ s->sin.portname = name;
+
+ return chr;
+}
+#endif
diff --git a/trace-events b/trace-events
index 6cb450a..bb7621e 100644
--- a/trace-events
+++ b/trace-events
@@ -535,6 +535,7 @@ spice_vmc_write(ssize_t out, int len) "spice wrottn %zd of
requested %d"
spice_vmc_read(int bytes, int len) "spice read %d of requested %d"
spice_vmc_register_interface(void *scd) "spice vmc registered interface %p"
spice_vmc_unregister_interface(void *scd) "spice vmc unregistered interface %p"
+spice_vmc_event(int event) "spice vmc event %d"
# hw/lm32_pic.c
lm32_pic_raise_irq(void) "Raise CPU interrupt"
diff --git a/ui/qemu-spice.h b/ui/qemu-spice.h
index 3299da8..5669767 100644
--- a/ui/qemu-spice.h
+++ b/ui/qemu-spice.h
@@ -46,6 +46,9 @@ void do_info_spice_print(Monitor *mon, const QObject *data);
void do_info_spice(Monitor *mon, QObject **ret_data);
CharDriverState *qemu_chr_open_spice(QemuOpts *opts);
+#if SPICE_SERVER_VERSION >= 0x000c02
+CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts);
+#endif
#else /* CONFIG_SPICE */
#include "monitor.h"
--
1.7.1
- [Qemu-devel] [PULL 0/8] spice patch queue, Gerd Hoffmann, 2012/12/17
- [Qemu-devel] [PATCH 4/8] spice-qemu-char: factor out CharDriverState creation, Gerd Hoffmann, 2012/12/17
- [Qemu-devel] [PATCH 3/8] spice-qemu-char: write to chardev whatever amount it can read, Gerd Hoffmann, 2012/12/17
- [Qemu-devel] [PATCH 6/8] spice-qemu-char: keep a list of spice chardev, Gerd Hoffmann, 2012/12/17
- [Qemu-devel] [PATCH 7/8] spice-qemu-char: register spicevmc ports during qemu_spice_init(), Gerd Hoffmann, 2012/12/17
- [Qemu-devel] [PATCH 8/8] docs: add spice-port-fqdn.txt, Gerd Hoffmann, 2012/12/17
- [Qemu-devel] [PATCH 2/8] qxl+vnc: register a vm state change handler for dummy spice_server, Gerd Hoffmann, 2012/12/17
- [Qemu-devel] [PATCH 5/8] spice-qemu-char: add spiceport chardev,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 1/8] qxl: save qemu_create_displaysurface_from result, Gerd Hoffmann, 2012/12/17
- Re: [Qemu-devel] [PULL 0/8] spice patch queue, Anthony Liguori, 2012/12/18