qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v1 0/3] vhost-user: support safe protocol
@ 2015-02-13 12:00 linhaifeng
  2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 1/3] vhost-user: add reply let the portocol more safe linhaifeng
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: linhaifeng @ 2015-02-13 12:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

From: Linhaifeng <haifeng.lin@huawei.com>

Mostly the same as ioctl master need the return value to
decided going on or not.So we add these patches for more
safe communication.

Linhaifeng (3):
  vhost-user: add reply let the portocol more safe.
  vhost-user:update the version to 0x6
  vhost-user:add reply for other messages

 docs/specs/vhost-user.txt | 19 ++++++++++++--
 hw/virtio/vhost-user.c    | 64 ++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 69 insertions(+), 14 deletions(-)

-- 
1.7.12.4

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PATCH v1 1/3] vhost-user: add reply let the portocol more safe.
  2015-02-13 12:00 [Qemu-devel] [PATCH v1 0/3] vhost-user: support safe protocol linhaifeng
@ 2015-02-13 12:00 ` linhaifeng
  2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 2/3] vhost-user:update the version to 0x6 linhaifeng
  2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 3/3] vhost-user:add reply for other messages linhaifeng
  2 siblings, 0 replies; 4+ messages in thread
From: linhaifeng @ 2015-02-13 12:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

From: Linhaifeng <haifeng.lin@huawei.com>

Every messages need reply.

Signed-off-by: Linhaifeng <haifeng.lin@huawei.com>
---
 docs/specs/vhost-user.txt | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/docs/specs/vhost-user.txt b/docs/specs/vhost-user.txt
index 650bb18..4a14e63 100644
--- a/docs/specs/vhost-user.txt
+++ b/docs/specs/vhost-user.txt
@@ -23,6 +23,10 @@ be a software Ethernet switch running in user space, such as Snabbswitch.
 Master and slave can be either a client (i.e. connecting) or server (listening)
 in the socket communication.
 
+version 0x1: Supply base communication between master and slave.
+version 0x6: Add reply for more robust.
+
+
 Message Specification
 ---------------------
 
@@ -35,7 +39,7 @@ consists of 3 header fields and a payload:
 
  * Request: 32-bit type of the request
  * Flags: 32-bit bit field:
-   - Lower 2 bits are the version (currently 0x01)
+   - Lower 2 bits are the version (currently 0x06)
    - Bit 2 is the reply flag - needs to be sent on each reply from the slave
  * Size - 32-bit size of the payload
 
@@ -144,6 +148,7 @@ Message types
       Id: 2
       Ioctl: VHOST_SET_FEATURES
       Master payload: u64
+      Slave payload: u64 0:success else:fail
 
       Enable features in the underlying vhost implementation using a bitmask.
 
@@ -152,6 +157,7 @@ Message types
       Id: 3
       Equivalent ioctl: VHOST_SET_OWNER
       Master payload: N/A
+      Slave payload: u64 0:success else:fail
 
       Issued when a new connection is established. It sets the current Master
       as an owner of the session. This can be used on the Slave as a
@@ -162,6 +168,7 @@ Message types
       Id: 4
       Equivalent ioctl: VHOST_RESET_OWNER
       Master payload: N/A
+      Slave payload: u64 0:success else:fail
 
       Issued when a new connection is about to be closed. The Master will no
       longer own this connection (and will usually close it).
@@ -171,6 +178,7 @@ Message types
       Id: 5
       Equivalent ioctl: VHOST_SET_MEM_TABLE
       Master payload: memory regions description
+      Slave payload: u64 0:success else:fail
 
       Sets the memory map regions on the slave so it can translate the vring
       addresses. In the ancillary data there is an array of file descriptors
@@ -182,6 +190,7 @@ Message types
       Id: 6
       Equivalent ioctl: VHOST_SET_LOG_BASE
       Master payload: u64
+      Slave payload: u64 0:success else:fail
 
       Sets the logging base address.
 
@@ -190,6 +199,7 @@ Message types
       Id: 7
       Equivalent ioctl: VHOST_SET_LOG_FD
       Master payload: N/A
+      Slave payload: u64 0:success else:fail
 
       Sets the logging file descriptor, which is passed as ancillary data.
 
@@ -198,6 +208,7 @@ Message types
       Id: 8
       Equivalent ioctl: VHOST_SET_VRING_NUM
       Master payload: vring state description
+      Slave payload: u64 0:success else:fail
 
       Sets the number of vrings for this owner.
 
@@ -206,7 +217,7 @@ Message types
       Id: 9
       Equivalent ioctl: VHOST_SET_VRING_ADDR
       Master payload: vring address description
-      Slave payload: N/A
+      Slave payload: u64 0:success else:fail
 
       Sets the addresses of the different aspects of the vring.
 
@@ -215,6 +226,7 @@ Message types
       Id: 10
       Equivalent ioctl: VHOST_SET_VRING_BASE
       Master payload: vring state description
+      Slave payload: u64 0:success else:fail
 
       Sets the base offset in the available vring.
 
@@ -232,6 +244,7 @@ Message types
       Id: 12
       Equivalent ioctl: VHOST_SET_VRING_KICK
       Master payload: u64
+      Slave payload: u64 0:success else:fail
 
       Set the event file descriptor for adding buffers to the vring. It
       is passed in the ancillary data.
@@ -245,6 +258,7 @@ Message types
       Id: 13
       Equivalent ioctl: VHOST_SET_VRING_CALL
       Master payload: u64
+      Slave payload: u64 0:success else:fail
 
       Set the event file descriptor to signal when buffers are used. It
       is passed in the ancillary data.
@@ -258,6 +272,7 @@ Message types
       Id: 14
       Equivalent ioctl: VHOST_SET_VRING_ERR
       Master payload: u64
+      Slave payload: u64 0:success else:fail
 
       Set the event file descriptor to signal when error occurs. It
       is passed in the ancillary data.
-- 
1.7.12.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PATCH v1 2/3] vhost-user:update the version to 0x6
  2015-02-13 12:00 [Qemu-devel] [PATCH v1 0/3] vhost-user: support safe protocol linhaifeng
  2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 1/3] vhost-user: add reply let the portocol more safe linhaifeng
@ 2015-02-13 12:00 ` linhaifeng
  2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 3/3] vhost-user:add reply for other messages linhaifeng
  2 siblings, 0 replies; 4+ messages in thread
From: linhaifeng @ 2015-02-13 12:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

From: Linhaifeng <haifeng.lin@huawei.com>

We not need the VHOST_USER_REPLY_MASK so the base version now is 0x5.
  - update the version to 0x6.
  - change the name form flag to version.

Signed-off-by: Linhaifeng <haifeng.lin@huawei.com>
---
 hw/virtio/vhost-user.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index aefe0bb..d56115a 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -59,10 +59,7 @@ typedef struct VhostUserMemory {
 
 typedef struct VhostUserMsg {
     VhostUserRequest request;
-
-#define VHOST_USER_VERSION_MASK     (0x3)
-#define VHOST_USER_REPLY_MASK       (0x1<<2)
-    uint32_t flags;
+    uint32_t version;
     uint32_t size; /* the following payload size */
     union {
 #define VHOST_USER_VRING_IDX_MASK   (0xff)
@@ -74,15 +71,18 @@ typedef struct VhostUserMsg {
     };
 } QEMU_PACKED VhostUserMsg;
 
+static uint32_t slave_version;
 static VhostUserMsg m __attribute__ ((unused));
 #define VHOST_USER_HDR_SIZE (sizeof(m.request) \
-                            + sizeof(m.flags) \
+                            + sizeof(m.version) \
                             + sizeof(m.size))
 
 #define VHOST_USER_PAYLOAD_SIZE (sizeof(m) - VHOST_USER_HDR_SIZE)
 
-/* The version of the protocol we support */
-#define VHOST_USER_VERSION    (0x1)
+/* The version of the protocol we support.
+ * Slaves' version should maller than  VHOST_USER_VERSION.
+ */
+#define VHOST_USER_VERSION    (0x6)
 
 static bool ioeventfd_enabled(void)
 {
@@ -134,12 +134,12 @@ static int vhost_user_read(struct vhost_dev *dev, VhostUserMsg *msg)
     }
 
     /* validate received flags */
-    if (msg->flags != (VHOST_USER_REPLY_MASK | VHOST_USER_VERSION)) {
-        error_report("Failed to read msg header."
-                " Flags 0x%x instead of 0x%x.\n", msg->flags,
-                VHOST_USER_REPLY_MASK | VHOST_USER_VERSION);
+    if (msg->version > VHOST_USER_VERSION) {
+        error_report("Invalid version 0x%x.\n"
+                "Vhost user version is 0x%x", msg->version, VHOST_USER_VERSION);
         goto fail;
     }
+    slave_version = msg->version;
 
     /* validate message size is sane */
     if (msg->size > VHOST_USER_PAYLOAD_SIZE) {
@@ -195,7 +195,7 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
 
     msg_request = vhost_user_request_translate(request);
     msg.request = msg_request;
-    msg.flags = VHOST_USER_VERSION;
+    msg.version = VHOST_USER_VERSION;
     msg.size = 0;
 
     switch (request) {
-- 
1.7.12.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PATCH v1 3/3] vhost-user:add reply for other messages
  2015-02-13 12:00 [Qemu-devel] [PATCH v1 0/3] vhost-user: support safe protocol linhaifeng
  2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 1/3] vhost-user: add reply let the portocol more safe linhaifeng
  2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 2/3] vhost-user:update the version to 0x6 linhaifeng
@ 2015-02-13 12:00 ` linhaifeng
  2 siblings, 0 replies; 4+ messages in thread
From: linhaifeng @ 2015-02-13 12:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

From: Linhaifeng <haifeng.lin@huawei.com>

If slave's version bigger than 0x5 we will wait for reply.

Signed-off-by: Linhaifeng <haifeng.lin@huawei.com>
---
 hw/virtio/vhost-user.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index d56115a..fdfd14b 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -82,8 +82,15 @@ static VhostUserMsg m __attribute__ ((unused));
 /* The version of the protocol we support.
  * Slaves' version should maller than  VHOST_USER_VERSION.
  */
+#define VHOST_USER_BASE       (0x5)
 #define VHOST_USER_VERSION    (0x6)
 
+#define VHOST_NEED_REPLY \
+{    \
+    if (slave_version > VHOST_USER_BASE)     \
+        need_reply = 1;    \
+}
+
 static bool ioeventfd_enabled(void)
 {
     return kvm_enabled() && kvm_eventfds_enabled();
@@ -207,6 +214,8 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
     case VHOST_SET_LOG_BASE:
         msg.u64 = *((__u64 *) arg);
         msg.size = sizeof(m.u64);
+
+        VHOST_NEED_REPLY;
         break;
 
     case VHOST_SET_OWNER:
@@ -244,16 +253,21 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
         msg.size += sizeof(m.memory.padding);
         msg.size += fd_num * sizeof(VhostUserMemoryRegion);
 
+        VHOST_NEED_REPLY;
         break;
 
     case VHOST_SET_LOG_FD:
         fds[fd_num++] = *((int *) arg);
+
+        VHOST_NEED_REPLY;
         break;
 
     case VHOST_SET_VRING_NUM:
     case VHOST_SET_VRING_BASE:
         memcpy(&msg.state, arg, sizeof(struct vhost_vring_state));
         msg.size = sizeof(m.state);
+
+        VHOST_NEED_REPLY;
         break;
 
     case VHOST_GET_VRING_BASE:
@@ -265,6 +279,8 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
     case VHOST_SET_VRING_ADDR:
         memcpy(&msg.addr, arg, sizeof(struct vhost_vring_addr));
         msg.size = sizeof(m.addr);
+
+        VHOST_NEED_REPLY;
         break;
 
     case VHOST_SET_VRING_KICK:
@@ -278,6 +294,8 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
         } else {
             msg.u64 |= VHOST_USER_VRING_NOFD_MASK;
         }
+
+        VHOST_NEED_REPLY;
         break;
     default:
         error_report("vhost-user trying to send unhandled ioctl\n");
@@ -315,6 +333,28 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
             }
             memcpy(arg, &msg.state, sizeof(struct vhost_vring_state));
             break;
+        case VHOST_USER_SET_FEATURES:
+        case VHOST_USER_SET_LOG_BASE:
+        case VHOST_USER_SET_OWNER:
+        case VHOST_USER_RESET_OWNER:
+        case VHOST_USER_SET_MEM_TABLE:
+        case VHOST_USER_SET_LOG_FD:
+        case VHOST_USER_SET_VRING_NUM:
+        case VHOST_USER_SET_VRING_BASE:
+        case VHOST_USER_SET_VRING_ADDR:
+        case VHOST_USER_SET_VRING_KICK:
+        case VHOST_USER_SET_VRING_CALL:
+        case VHOST_USER_SET_VRING_ERR:
+            if (msg.size != sizeof(m.u64)) {
+                error_report("Received bad msg size.");
+                return -1;
+            } else {
+                if (m.u64) {
+                    error_report("Failed to handle request %d.", msg_request);
+                    return -1;
+                }
+            }
+            break;
         default:
             error_report("Received unexpected msg type.\n");
             return -1;
-- 
1.7.12.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-02-13 12:01 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-13 12:00 [Qemu-devel] [PATCH v1 0/3] vhost-user: support safe protocol linhaifeng
2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 1/3] vhost-user: add reply let the portocol more safe linhaifeng
2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 2/3] vhost-user:update the version to 0x6 linhaifeng
2015-02-13 12:00 ` [Qemu-devel] [PATCH v1 3/3] vhost-user:add reply for other messages linhaifeng

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).