qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/2] spice: connection events.
Date: Wed, 01 Dec 2010 08:07:57 -0600	[thread overview]
Message-ID: <4CF656BD.9070308@codemonkey.ws> (raw)
In-Reply-To: <1291122714-2634-2-git-send-email-kraxel@redhat.com>

On 11/30/2010 07:11 AM, Gerd Hoffmann wrote:
> This patch adds support for connection events to spice.  The events are
> quite simliar to the vnc events.  Unlike vnc spice uses multiple tcp
> channels though.  qemu will report every single tcp connection (aka
> spice channel).  If you want track spice sessions only you can filter
> for the main channel (channel-type == 1).
>
> Signed-off-by: Gerd Hoffmann<kraxel@redhat.com>
>    

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

> ---
>   QMP/qmp-events.txt |   64 ++++++++++++++++++++++++++++++++++++++++++++
>   monitor.c          |   10 +++++++
>   monitor.h          |    3 ++
>   ui/spice-core.c    |   75 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>   4 files changed, 152 insertions(+), 0 deletions(-)
>
> diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt
> index aa20210..0ce5d4e 100644
> --- a/QMP/qmp-events.txt
> +++ b/QMP/qmp-events.txt
> @@ -182,6 +182,70 @@ Example:
>                       "host": "127.0.0.1", "sasl_username": "luiz" } },
>           "timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
>
> +SPICE_CONNECTED, SPICE_DISCONNECTED
> +-----------------------------------
> +
> +Emitted when a SPICE client connects or disconnects.
> +
> +Data:
> +
> +- "server": Server information (json-object)
> +  - "host": IP address (json-string)
> +  - "port": port number (json-string)
> +  - "family": address family (json-string, "ipv4" or "ipv6")
> +- "client": Client information (json-object)
> +  - "host": IP address (json-string)
> +  - "port": port number (json-string)
> +  - "family": address family (json-string, "ipv4" or "ipv6")
> +
> +Example:
> +
> +{ "timestamp": {"seconds": 1290688046, "microseconds": 388707},
> +  "event": "SPICE_CONNECTED",
> +  "data": {
> +    "server": { "port": "5920", "family": "ipv4", "host": "127.0.0.1"},
> +    "client": {"port": "52873", "family": "ipv4", "host": "127.0.0.1"}
> +}}
> +
> +
> +SPICE_INITIALIZED
> +-----------------
> +
> +Emitted after initial handshake and authentication takes place (if any)
> +and the SPICE channel is up'n'running
> +
> +Data:
> +
> +- "server": Server information (json-object)
> +  - "host": IP address (json-string)
> +  - "port": port number (json-string)
> +  - "family": address family (json-string, "ipv4" or "ipv6")
> +  - "auth": authentication method (json-string, optional)
> +- "client": Client information (json-object)
> +  - "host": IP address (json-string)
> +  - "port": port number (json-string)
> +  - "family": address family (json-string, "ipv4" or "ipv6")
> +  - "connection-id": spice connection id.  All channels with the same id
> +                     belong to the same spice session (json-int)
> +  - "channel-type": channel type.  "1" is the main control channel, filter for
> +                    this one if you want track spice sessions only (json-int)
> +  - "channel-id": channel id.  Usually "0", might be different needed when
> +                  multiple channels of the same type exist, such as multiple
> +                  display channels in a multihead setup (json-int)
> +  - "tls": whevener the channel is encrypted (json-bool)
> +
> +Example:
> +
> +{ "timestamp": {"seconds": 1290688046, "microseconds": 417172},
> +  "event": "SPICE_INITIALIZED",
> +  "data": {"server": {"auth": "spice", "port": "5921",
> +                      "family": "ipv4", "host": "127.0.0.1"},
> +           "client": {"port": "49004", "family": "ipv4", "channel-type": 3,
> +                      "connection-id": 1804289383, "host": "127.0.0.1",
> +                      "channel-id": 0, "tls": true}
> +}}
> +
> +
>   WATCHDOG
>   --------
>
> diff --git a/monitor.c b/monitor.c
> index 8cee35d..7eb8fca 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -59,6 +59,7 @@
>   #ifdef CONFIG_SIMPLE_TRACE
>   #include "trace.h"
>   #endif
> +#include "ui/qemu-spice.h"
>
>   //#define DEBUG
>   //#define DEBUG_COMPLETION
> @@ -459,6 +460,15 @@ void monitor_protocol_event(MonitorEvent event, QObject *data)
>           case QEVENT_WATCHDOG:
>               event_name = "WATCHDOG";
>               break;
> +        case QEVENT_SPICE_CONNECTED:
> +            event_name = "SPICE_CONNECTED";
> +            break;
> +        case QEVENT_SPICE_INITIALIZED:
> +            event_name = "SPICE_INITIALIZED";
> +            break;
> +        case QEVENT_SPICE_DISCONNECTED:
> +            event_name = "SPICE_DISCONNECTED";
> +            break;
>           default:
>               abort();
>               break;
> diff --git a/monitor.h b/monitor.h
> index 2d36bba..4f2d328 100644
> --- a/monitor.h
> +++ b/monitor.h
> @@ -32,6 +32,9 @@ typedef enum MonitorEvent {
>       QEVENT_BLOCK_IO_ERROR,
>       QEVENT_RTC_CHANGE,
>       QEVENT_WATCHDOG,
> +    QEVENT_SPICE_CONNECTED,
> +    QEVENT_SPICE_INITIALIZED,
> +    QEVENT_SPICE_DISCONNECTED,
>       QEVENT_MAX,
>   } MonitorEvent;
>
> diff --git a/ui/spice-core.c b/ui/spice-core.c
> index b7fa031..93461c6 100644
> --- a/ui/spice-core.c
> +++ b/ui/spice-core.c
> @@ -18,16 +18,24 @@
>   #include<spice.h>
>   #include<spice-experimental.h>
>
> +#include<netdb.h>
> +
>   #include "qemu-common.h"
>   #include "qemu-spice.h"
>   #include "qemu-timer.h"
>   #include "qemu-queue.h"
>   #include "qemu-x509.h"
> +#include "qemu_socket.h"
> +#include "qint.h"
> +#include "qbool.h"
> +#include "qstring.h"
> +#include "qjson.h"
>   #include "monitor.h"
>
>   /* core bits */
>
>   static SpiceServer *spice_server;
> +static const char *auth = "spice";
>   int using_spice = 0;
>
>   struct SpiceTimer {
> @@ -121,6 +129,68 @@ static void watch_remove(SpiceWatch *watch)
>       qemu_free(watch);
>   }
>
> +#if SPICE_INTERFACE_CORE_MINOR>= 3
> +
> +static void add_addr_info(QDict *dict, struct sockaddr *addr, int len)
> +{
> +    char host[NI_MAXHOST], port[NI_MAXSERV];
> +    const char *family;
> +
> +    getnameinfo(addr, len, host, sizeof(host), port, sizeof(port),
> +                NI_NUMERICHOST | NI_NUMERICSERV);
> +    family = inet_strfamily(addr->sa_family);
> +
> +    qdict_put(dict, "host", qstring_from_str(host));
> +    qdict_put(dict, "port", qstring_from_str(port));
> +    qdict_put(dict, "family", qstring_from_str(family));
> +}
> +
> +static void add_channel_info(QDict *dict, SpiceChannelEventInfo *info)
> +{
> +    int tls = info->flags&  SPICE_CHANNEL_EVENT_FLAG_TLS;
> +
> +    qdict_put(dict, "connection-id", qint_from_int(info->connection_id));
> +    qdict_put(dict, "channel-type", qint_from_int(info->type));
> +    qdict_put(dict, "channel-id", qint_from_int(info->id));
> +    qdict_put(dict, "tls", qbool_from_int(tls));
> +}
> +
> +static void channel_event(int event, SpiceChannelEventInfo *info)
> +{
> +    static const int qevent[] = {
> +        [ SPICE_CHANNEL_EVENT_CONNECTED    ] = QEVENT_SPICE_CONNECTED,
> +        [ SPICE_CHANNEL_EVENT_INITIALIZED  ] = QEVENT_SPICE_INITIALIZED,
> +        [ SPICE_CHANNEL_EVENT_DISCONNECTED ] = QEVENT_SPICE_DISCONNECTED,
> +    };
> +    QDict *server, *client;
> +    QObject *data;
> +
> +    client = qdict_new();
> +    add_addr_info(client,&info->paddr, info->plen);
> +
> +    server = qdict_new();
> +    add_addr_info(server,&info->laddr, info->llen);
> +
> +    if (event == SPICE_CHANNEL_EVENT_INITIALIZED) {
> +        qdict_put(server, "auth", qstring_from_str(auth));
> +        add_channel_info(client, info);
> +    }
> +
> +    data = qobject_from_jsonf("{ 'client': %p, 'server': %p }",
> +                              QOBJECT(client), QOBJECT(server));
> +    monitor_protocol_event(qevent[event], data);
> +    qobject_decref(data);
> +}
> +
> +#else /* SPICE_INTERFACE_CORE_MINOR>= 3 */
> +
> +static QList *channel_list_get(void)
> +{
> +    return NULL;
> +}
> +
> +#endif /* SPICE_INTERFACE_CORE_MINOR>= 3 */
> +
>   static SpiceCoreInterface core_interface = {
>       .base.type          = SPICE_INTERFACE_CORE,
>       .base.description   = "qemu core services",
> @@ -135,6 +205,10 @@ static SpiceCoreInterface core_interface = {
>       .watch_add          = watch_add,
>       .watch_update_mask  = watch_update_mask,
>       .watch_remove       = watch_remove,
> +
> +#if SPICE_INTERFACE_CORE_MINOR>= 3
> +    .channel_event      = channel_event,
> +#endif
>   };
>
>   /* config string parsing */
> @@ -316,6 +390,7 @@ void qemu_spice_init(void)
>           spice_server_set_ticket(spice_server, password, 0, 0, 0);
>       }
>       if (qemu_opt_get_bool(opts, "disable-ticketing", 0)) {
> +        auth = "none";
>           spice_server_set_noauth(spice_server);
>       }
>
>    

  parent reply	other threads:[~2010-12-01 14:08 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-30 13:11 [Qemu-devel] [PATCH 0/2] spice: connection events and monitor commands Gerd Hoffmann
2010-11-30 13:11 ` [Qemu-devel] [PATCH 1/2] spice: connection events Gerd Hoffmann
2010-12-01 14:07   ` Anthony Liguori
2010-12-01 14:07   ` Anthony Liguori [this message]
2010-11-30 13:11 ` [Qemu-devel] [PATCH 2/2] spice: add qmp 'query-spice' and hmp 'info spice' commands Gerd Hoffmann

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=4CF656BD.9070308@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=kraxel@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).