Libvirt wants to know about the guest-side connection state of some
virtio-serial ports (in particular the one(s) assigned to guest agent(s)).
Introduce a new property that allows libvirt to request connection state
reporting, and report the state via new monitor events.

RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376
Signed-off-by: Laszlo Ersek <ler...@redhat.com>
---
 include/monitor/monitor.h |  2 ++
 hw/char/virtio-console.c  | 20 +++++++++++++++++---
 monitor.c                 |  2 ++
 docs/qmp/qmp-events.txt   | 34 ++++++++++++++++++++++++++++++++++
 4 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index 1c1f56f..4fcb5b4 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -51,6 +51,8 @@ typedef enum MonitorEvent {
     QEVENT_BLOCK_IMAGE_CORRUPTED,
     QEVENT_QUORUM_FAILURE,
     QEVENT_QUORUM_REPORT_BAD,
+    QEVENT_VSERPORT_CONNECTED,
+    QEVENT_VSERPORT_DISCONNECTED,
 
     /* Add to 'monitor_event_names' array in monitor.c when
      * defining new events here */
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
index 6c8be0f..acca3d9 100644
--- a/hw/char/virtio-console.c
+++ b/hw/char/virtio-console.c
@@ -14,6 +14,8 @@
 #include "qemu/error-report.h"
 #include "trace.h"
 #include "hw/virtio/virtio-serial.h"
+#include "monitor/monitor.h"
+#include "qapi/qmp/qjson.h"
 
 #define TYPE_VIRTIO_CONSOLE_SERIAL_PORT "virtserialport"
 #define VIRTIO_CONSOLE(obj) \
@@ -24,6 +26,7 @@ typedef struct VirtConsole {
 
     CharDriverState *chr;
     guint watch;
+    bool report_connstate;
 } VirtConsole;
 
 /*
@@ -81,11 +84,21 @@ static ssize_t flush_buf(VirtIOSerialPort *port,
 static void set_guest_connected(VirtIOSerialPort *port, int guest_connected)
 {
     VirtConsole *vcon = VIRTIO_CONSOLE(port);
+    DeviceState *dev = DEVICE(port);
 
-    if (!vcon->chr) {
-        return;
+    if (vcon->chr) {
+        qemu_chr_fe_set_open(vcon->chr, guest_connected);
+    }
+
+    if (vcon->report_connstate && dev->id) {
+        QObject *data;
+
+        data = qobject_from_jsonf("{ 'id': %s }", dev->id);
+        monitor_protocol_event(guest_connected ? QEVENT_VSERPORT_CONNECTED :
+                                                 QEVENT_VSERPORT_DISCONNECTED,
+                               data);
+        qobject_decref(data);
     }
-    qemu_chr_fe_set_open(vcon->chr, guest_connected);
 }
 
 /* Readiness of the guest to accept data on a port */
@@ -169,6 +182,7 @@ static const TypeInfo virtconsole_info = {
 
 static Property virtserialport_properties[] = {
     DEFINE_PROP_CHR("chardev", VirtConsole, chr),
+    DEFINE_PROP_BOOL("report_connstate", VirtConsole, report_connstate, false),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/monitor.c b/monitor.c
index 593679a..be83399 100644
--- a/monitor.c
+++ b/monitor.c
@@ -485,6 +485,8 @@ static const char *monitor_event_names[] = {
     [QEVENT_BLOCK_IMAGE_CORRUPTED] = "BLOCK_IMAGE_CORRUPTED",
     [QEVENT_QUORUM_FAILURE] = "QUORUM_FAILURE",
     [QEVENT_QUORUM_REPORT_BAD] = "QUORUM_REPORT_BAD",
+    [QEVENT_VSERPORT_CONNECTED] = "VSERPORT_CONNECTED",
+    [QEVENT_VSERPORT_DISCONNECTED] = "VSERPORT_DISCONNECTED",
 };
 QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX)
 
diff --git a/docs/qmp/qmp-events.txt b/docs/qmp/qmp-events.txt
index 145402e..9a17716 100644
--- a/docs/qmp/qmp-events.txt
+++ b/docs/qmp/qmp-events.txt
@@ -509,6 +509,40 @@ Example:
                     "host": "127.0.0.1", "sasl_username": "luiz" } },
         "timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
 
+VSERPORT_CONNECTED
+------------------
+
+Emitted when the guest opens a virtio-serial port for which connection state
+reporting has been requested with the "virtserialport.report_connstate"
+property.
+
+Data:
+
+- "id": device identifier of the virtio-serial port (json-string)
+
+Example:
+
+{ "event": "VSERPORT_CONNECTED",
+    "data": { "id": "channel0" },
+    "timestamp": { "seconds": 1401385853, "microseconds": 601928 } }
+
+VSERPORT_DISCONNECTED
+---------------------
+
+Emitted when the guest closes a virtio-serial port for which connection state
+reporting has been requested with the "virtserialport.report_connstate"
+property.
+
+Data:
+
+- "id": device identifier of the virtio-serial port (json-string)
+
+Example:
+
+{ "event": "VSERPORT_DISCONNECTED",
+    "data": { "id": "channel0" },
+    "timestamp": { "seconds": 1401385907, "microseconds": 422329 } }
+
 WAKEUP
 ------
 
-- 
1.8.3.1



Reply via email to