958e1b
From b9295fa6535d7092f9234e63ed6b5670bd862d0c Mon Sep 17 00:00:00 2001
958e1b
From: Laszlo Ersek <lersek@redhat.com>
958e1b
Date: Tue, 22 Jul 2014 18:31:22 +0200
958e1b
Subject: [PATCH 02/11] virtio-serial: report frontend connection state via monitor
958e1b
958e1b
Message-id: <1406053883-21237-2-git-send-email-lersek@redhat.com>
958e1b
Patchwork-id: 60229
958e1b
O-Subject: [RHEL-7.1 qemu-kvm PATCH 1/2] virtio-serial: report frontend connection state via monitor
958e1b
Bugzilla: 1122151
958e1b
RH-Acked-by: Luiz Capitulino <lcapitulino@redhat.com>
958e1b
RH-Acked-by: Amit Shah <amit.shah@redhat.com>
958e1b
RH-Acked-by: Eric Blake <eblake@redhat.com>
958e1b
958e1b
Libvirt wants to know about the guest-side connection state of some
958e1b
virtio-serial ports (in particular the one(s) assigned to guest agent(s)).
958e1b
Report such states with a new monitor event.
958e1b
958e1b
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376
958e1b
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
958e1b
Reviewed-by: Eric Blake <eblake@redhat.com>
958e1b
Reviewed-by: Amit Shah <amit.shah@redhat.com>
958e1b
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
958e1b
958e1b
RHEL-7 notes: manual reimplementation of upstream commit
958e1b
e2ae6159de2482ee5e22532301eb7f2795828d07, because we don't have Wenchao
958e1b
Xia's qapi-event series.
958e1b
958e1b
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
958e1b
---
958e1b
 include/monitor/monitor.h |  1 +
958e1b
 hw/char/virtio-console.c  | 17 ++++++++++++++---
958e1b
 monitor.c                 |  2 ++
958e1b
 QMP/qmp-events.txt        | 16 ++++++++++++++++
958e1b
 4 files changed, 33 insertions(+), 3 deletions(-)
958e1b
958e1b
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
958e1b
---
958e1b
 QMP/qmp-events.txt        |   16 ++++++++++++++++
958e1b
 hw/char/virtio-console.c  |   17 ++++++++++++++---
958e1b
 include/monitor/monitor.h |    1 +
958e1b
 monitor.c                 |    2 ++
958e1b
 4 files changed, 33 insertions(+), 3 deletions(-)
958e1b
958e1b
diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt
958e1b
index fc4b7db..ec4e4b9 100644
958e1b
--- a/QMP/qmp-events.txt
958e1b
+++ b/QMP/qmp-events.txt
958e1b
@@ -485,6 +485,22 @@ Example:
958e1b
                     "host": "127.0.0.1", "sasl_username": "luiz" } },
958e1b
         "timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
958e1b
 
958e1b
+VSERPORT_CHANGE
958e1b
+---------------
958e1b
+
958e1b
+Emitted when the guest opens or closes a virtio-serial port.
958e1b
+
958e1b
+Data:
958e1b
+
958e1b
+- "id": device identifier of the virtio-serial port (json-string)
958e1b
+- "open": true if the guest has opened the virtio-serial port (json-bool)
958e1b
+
958e1b
+Example:
958e1b
+
958e1b
+{ "event": "VSERPORT_CHANGE",
958e1b
+    "data": { "id": "channel0",  "open": true },
958e1b
+    "timestamp": { "seconds": 1401385907, "microseconds": 422329 } }
958e1b
+
958e1b
 WAKEUP
958e1b
 ------
958e1b
 
958e1b
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
958e1b
index 2e00ad2..1b01dcd 100644
958e1b
--- a/hw/char/virtio-console.c
958e1b
+++ b/hw/char/virtio-console.c
958e1b
@@ -14,6 +14,8 @@
958e1b
 #include "qemu/error-report.h"
958e1b
 #include "trace.h"
958e1b
 #include "hw/virtio/virtio-serial.h"
958e1b
+#include "monitor/monitor.h"
958e1b
+#include "qapi/qmp/qjson.h"
958e1b
 
958e1b
 typedef struct VirtConsole {
958e1b
     VirtIOSerialPort port;
958e1b
@@ -76,11 +78,20 @@ static ssize_t flush_buf(VirtIOSerialPort *port,
958e1b
 static void set_guest_connected(VirtIOSerialPort *port, int guest_connected)
958e1b
 {
958e1b
     VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
958e1b
+    DeviceState *dev = DEVICE(port);
958e1b
 
958e1b
-    if (!vcon->chr) {
958e1b
-        return;
958e1b
+    if (vcon->chr) {
958e1b
+        qemu_chr_fe_set_open(vcon->chr, guest_connected);
958e1b
     }
958e1b
-    qemu_chr_fe_set_open(vcon->chr, guest_connected);
958e1b
+
958e1b
+    if (dev->id) {
958e1b
+        QObject *data;
958e1b
+
958e1b
+        data = qobject_from_jsonf("{ 'id': %s, 'open': %i }",
958e1b
+                                  dev->id, guest_connected);
958e1b
+        monitor_protocol_event(QEVENT_VSERPORT_CHANGE, data);
958e1b
+        qobject_decref(data);
958e1b
+     }
958e1b
 }
958e1b
 
958e1b
 /* Readiness of the guest to accept data on a port */
958e1b
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
958e1b
index dcce609..6c128e9 100644
958e1b
--- a/include/monitor/monitor.h
958e1b
+++ b/include/monitor/monitor.h
958e1b
@@ -52,6 +52,7 @@ typedef enum MonitorEvent {
958e1b
     QEVENT_SPICE_MIGRATE_COMPLETED,
958e1b
     QEVENT_GUEST_PANICKED,
958e1b
     QEVENT_BLOCK_IMAGE_CORRUPTED,
958e1b
+    QEVENT_VSERPORT_CHANGE,
958e1b
 
958e1b
     /* Add to 'monitor_event_names' array in monitor.c when
958e1b
      * defining new events here */
958e1b
diff --git a/monitor.c b/monitor.c
958e1b
index a6abfb5..798885d 100644
958e1b
--- a/monitor.c
958e1b
+++ b/monitor.c
958e1b
@@ -506,6 +506,7 @@ static const char *monitor_event_names[] = {
958e1b
     [QEVENT_SPICE_MIGRATE_COMPLETED] = "SPICE_MIGRATE_COMPLETED",
958e1b
     [QEVENT_GUEST_PANICKED] = "GUEST_PANICKED",
958e1b
     [QEVENT_BLOCK_IMAGE_CORRUPTED] = "BLOCK_IMAGE_CORRUPTED",
958e1b
+    [QEVENT_VSERPORT_CHANGE] = "VSERPORT_CHANGE",
958e1b
 };
958e1b
 QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX)
958e1b
 
958e1b
@@ -642,6 +643,7 @@ static void monitor_protocol_event_init(void)
958e1b
     monitor_protocol_event_throttle(QEVENT_RTC_CHANGE, 1000);
958e1b
     monitor_protocol_event_throttle(QEVENT_BALLOON_CHANGE, 1000);
958e1b
     monitor_protocol_event_throttle(QEVENT_WATCHDOG, 1000);
958e1b
+    monitor_protocol_event_throttle(QEVENT_VSERPORT_CHANGE, 1000);
958e1b
 }
958e1b
 
958e1b
 /**
958e1b
-- 
958e1b
1.7.1
958e1b