From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:57908) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TkaNH-000515-1w for qemu-devel@nongnu.org; Mon, 17 Dec 2012 08:04:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TkaN9-0004Ea-Ry for qemu-devel@nongnu.org; Mon, 17 Dec 2012 08:04:50 -0500 Received: from mx1.redhat.com ([209.132.183.28]:11750) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TkaN9-0004EO-KH for qemu-devel@nongnu.org; Mon, 17 Dec 2012 08:04:43 -0500 From: Gerd Hoffmann Date: Mon, 17 Dec 2012 14:04:36 +0100 Message-Id: <1355749479-25470-6-git-send-email-kraxel@redhat.com> In-Reply-To: <1355749479-25470-1-git-send-email-kraxel@redhat.com> References: <1355749479-25470-1-git-send-email-kraxel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 5/8] spice-qemu-char: add spiceport chardev List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Gerd Hoffmann From: Marc-Andr=C3=A9 Lureau 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=3Dorg.qemu.monitor,id=3Dmonitorport -mon chardev=3Dmonitorport v2: - remove support for chardev to chardev linking - conditionnaly compile with SPICE_SERVER_VERSION Signed-off-by: Gerd Hoffmann --- 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 =3D "spicevmc", .open =3D qemu_chr_open_spice }, +#if SPICE_SERVER_VERSION >=3D 0x000c02 + { .name =3D "spiceport", .open =3D qemu_chr_open_spice_port }, +#endif #endif }; =20 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=3Did,name=3Dname[,debug=3Ddebug]\n" + "-chardev spiceport,id=3Did,name=3Dname[,debug=3Ddebug]\n" #endif , QEMU_ARCH_ALL ) @@ -1776,6 +1777,7 @@ Backend is one of: @option{tty}, @option{parport}, @option{spicevmc}. +@option{spiceport}. The specific backend will determine the applicable options. =20 All devices must have an id, which can be any string up to 127 character= s long. @@ -1961,6 +1963,17 @@ required. =20 Connect to a spice virtual machine channel, such as vdiport. =20 +@item -chardev spiceport ,id=3D@var{id} ,debug=3D@var{debug}, name=3D@va= r{name} + +@option{spiceport} is only available when spice support is built in. + +@option{debug} debug level for spicevmc + +@option{name} 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 =20 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 #include +#include =20 #include "osdep.h" =20 @@ -67,6 +68,27 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint= 8_t *buf, int len) return bytes; } =20 +#if SPICE_SERVER_VERSION >=3D 0x000c02 +static void vmc_event(SpiceCharDeviceInstance *sin, uint8_t event) +{ + SpiceCharDriver *scd =3D container_of(sin, SpiceCharDriver, sin); + int chr_event; + + switch (event) { + case SPICE_PORT_EVENT_BREAK: + chr_event =3D 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 =3D container_of(sin, SpiceCharDriver, sin); @@ -103,6 +125,9 @@ static SpiceCharDeviceInterface vmc_interface =3D { .state =3D vmc_state, .write =3D vmc_write, .read =3D vmc_read, +#if SPICE_SERVER_VERSION >=3D 0x000c02 + .event =3D vmc_event, +#endif }; =20 =20 @@ -242,3 +267,23 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts) =20 return chr; } + +#if SPICE_SERVER_VERSION >=3D 0x000c02 +CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts) +{ + CharDriverState *chr; + SpiceCharDriver *s; + const char *name =3D qemu_opt_get(opts, "name"); + + if (name =3D=3D NULL) { + fprintf(stderr, "spice-qemu-char: missing name parameter\n"); + return NULL; + } + + chr =3D chr_open(opts, "port"); + s =3D chr->opaque; + s->sin.portname =3D 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 interf= ace %p" +spice_vmc_event(int event) "spice vmc event %d" =20 # 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 *d= ata); void do_info_spice(Monitor *mon, QObject **ret_data); =20 CharDriverState *qemu_chr_open_spice(QemuOpts *opts); +#if SPICE_SERVER_VERSION >=3D 0x000c02 +CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts); +#endif =20 #else /* CONFIG_SPICE */ #include "monitor.h" --=20 1.7.1