[libvirt] [PATCH v3 14/31] Introduce VIR_NET_STREAM_HOLE message type

Michal Privoznik mprivozn at redhat.com
Tue May 16 14:03:54 UTC 2017


This is a special type of stream packet, that is bidirectional
and will contain information on how much bytes are both sides
skipping in the stream.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 daemon/stream.c            |  3 ++-
 src/rpc/virnetclient.c     |  1 +
 src/rpc/virnetprotocol.x   | 12 +++++++++++-
 src/virnetprotocol-structs |  1 +
 4 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/daemon/stream.c b/daemon/stream.c
index 6465463ff..f44c21278 100644
--- a/daemon/stream.c
+++ b/daemon/stream.c
@@ -287,7 +287,8 @@ daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED,
 
     virMutexLock(&stream->priv->lock);
 
-    if (msg->header.type != VIR_NET_STREAM)
+    if (msg->header.type != VIR_NET_STREAM &&
+        msg->header.type != VIR_NET_STREAM_HOLE)
         goto cleanup;
 
     if (!virNetServerProgramMatches(stream->prog, msg))
diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index 837a8a707..95cd9a6c7 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -1284,6 +1284,7 @@ virNetClientCallDispatch(virNetClientPtr client)
         return virNetClientCallDispatchMessage(client);
 
     case VIR_NET_STREAM: /* Stream protocol */
+    case VIR_NET_STREAM_HOLE: /* Sparse stream protocol*/
         return virNetClientCallDispatchStream(client);
 
     default:
diff --git a/src/rpc/virnetprotocol.x b/src/rpc/virnetprotocol.x
index cab047cb0..ee9899059 100644
--- a/src/rpc/virnetprotocol.x
+++ b/src/rpc/virnetprotocol.x
@@ -143,6 +143,14 @@ const VIR_NET_MESSAGE_NUM_FDS_MAX = 32;
  *     * status == VIR_NET_ERROR
  *          remote_error    Error information
  *
+ *  - type == VIR_NET_STREAM_HOLE
+ *     * status == VIR_NET_CONTINUE
+ *          byte[]  hole data
+ *     * status == VIR_NET_ERROR
+ *          remote_error error information
+ *     * status == VIR_NET_OK
+ *          <empty>
+ *
  */
 enum virNetMessageType {
     /* client -> server. args from a method call */
@@ -156,7 +164,9 @@ enum virNetMessageType {
     /* client -> server. args from a method call, with passed FDs */
     VIR_NET_CALL_WITH_FDS = 4,
     /* server -> client. reply/error from a method call, with passed FDs */
-    VIR_NET_REPLY_WITH_FDS = 5
+    VIR_NET_REPLY_WITH_FDS = 5,
+    /* either direction, stream hole data packet */
+    VIR_NET_STREAM_HOLE = 6
 };
 
 enum virNetMessageStatus {
diff --git a/src/virnetprotocol-structs b/src/virnetprotocol-structs
index aa6e0602a..b36581f86 100644
--- a/src/virnetprotocol-structs
+++ b/src/virnetprotocol-structs
@@ -6,6 +6,7 @@ enum virNetMessageType {
         VIR_NET_STREAM = 3,
         VIR_NET_CALL_WITH_FDS = 4,
         VIR_NET_REPLY_WITH_FDS = 5,
+        VIR_NET_STREAM_HOLE = 6,
 };
 enum virNetMessageStatus {
         VIR_NET_OK = 0,
-- 
2.13.0




More information about the libvir-list mailing list