vhost-user: support protocol features
authorYuanhan Liu <yuanhan.liu@linux.intel.com>
Thu, 22 Oct 2015 12:35:49 +0000 (20:35 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 26 Oct 2015 20:22:27 +0000 (21:22 +0100)
The two protocol features messages are introduced by qemu vhost
maintainer(Michael) for extendting vhost-user interface. Here is
an excerpta from the vhost-user spec:

    Any protocol extensions are gated by protocol feature bits,
    which allows full backwards compatibility on both master
    and slave.

The vhost-user multiple queue features will be treated as a vhost-user
extension, hence, we have to implement the two messages first.

VHOST_USER_PROTOCOL_FEATURES is initialized to 0, as we don't support
any yet.

Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Acked-by: Flavio Leitner <fbl@sysclose.org>
Acked-by: Huawei Xie <huawei.xie@intel.com>
lib/librte_vhost/rte_virtio_net.h
lib/librte_vhost/vhost_user/vhost-net-user.c
lib/librte_vhost/vhost_user/vhost-net-user.h
lib/librte_vhost/vhost_user/virtio-net-user.c
lib/librte_vhost/vhost_user/virtio-net-user.h
lib/librte_vhost/virtio-net.c

index a037c15..e3a21e5 100644 (file)
@@ -99,6 +99,7 @@ struct virtio_net {
        struct vhost_virtqueue  *virtqueue[VIRTIO_QNUM];        /**< Contains all virtqueue information. */
        struct virtio_memory    *mem;           /**< QEMU memory and memory region information. */
        uint64_t                features;       /**< Negotiated feature set. */
+       uint64_t                protocol_features;      /**< Negotiated protocol feature set. */
        uint64_t                device_fh;      /**< device identifier. */
        uint32_t                flags;          /**< Device flags. Only used to check if device is running on data core. */
 #define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)
index d1f8877..bc2ad24 100644 (file)
@@ -95,7 +95,9 @@ static const char *vhost_message_str[VHOST_USER_MAX] = {
        [VHOST_USER_GET_VRING_BASE] = "VHOST_USER_GET_VRING_BASE",
        [VHOST_USER_SET_VRING_KICK] = "VHOST_USER_SET_VRING_KICK",
        [VHOST_USER_SET_VRING_CALL] = "VHOST_USER_SET_VRING_CALL",
-       [VHOST_USER_SET_VRING_ERR]  = "VHOST_USER_SET_VRING_ERR"
+       [VHOST_USER_SET_VRING_ERR]  = "VHOST_USER_SET_VRING_ERR",
+       [VHOST_USER_GET_PROTOCOL_FEATURES]  = "VHOST_USER_GET_PROTOCOL_FEATURES",
+       [VHOST_USER_SET_PROTOCOL_FEATURES]  = "VHOST_USER_SET_PROTOCOL_FEATURES",
 };
 
 /**
@@ -363,6 +365,15 @@ vserver_message_handler(int connfd, void *dat, int *remove)
                ops->set_features(ctx, &features);
                break;
 
+       case VHOST_USER_GET_PROTOCOL_FEATURES:
+               msg.payload.u64 = VHOST_USER_PROTOCOL_FEATURES;
+               msg.size = sizeof(msg.payload.u64);
+               send_vhost_message(connfd, &msg);
+               break;
+       case VHOST_USER_SET_PROTOCOL_FEATURES:
+               user_set_protocol_features(ctx, msg.payload.u64);
+               break;
+
        case VHOST_USER_SET_OWNER:
                ops->set_owner(ctx);
                break;
index 2e72f3c..4490d23 100644 (file)
@@ -63,6 +63,8 @@ typedef enum VhostUserRequest {
        VHOST_USER_SET_VRING_KICK = 12,
        VHOST_USER_SET_VRING_CALL = 13,
        VHOST_USER_SET_VRING_ERR = 14,
+       VHOST_USER_GET_PROTOCOL_FEATURES = 15,
+       VHOST_USER_SET_PROTOCOL_FEATURES = 16,
        VHOST_USER_MAX
 } VhostUserRequest;
 
index e0bc2a4..6da729d 100644 (file)
@@ -318,3 +318,16 @@ user_destroy_device(struct vhost_device_ctx ctx)
                dev->mem = NULL;
        }
 }
+
+void
+user_set_protocol_features(struct vhost_device_ctx ctx,
+                          uint64_t protocol_features)
+{
+       struct virtio_net *dev;
+
+       dev = get_device(ctx);
+       if (dev == NULL || protocol_features & ~VHOST_USER_PROTOCOL_FEATURES)
+               return;
+
+       dev->protocol_features = protocol_features;
+}
index df24860..e7a6ff4 100644 (file)
 #include "vhost-net.h"
 #include "vhost-net-user.h"
 
+#define VHOST_USER_PROTOCOL_FEATURES   0ULL
+
 int user_set_mem_table(struct vhost_device_ctx, struct VhostUserMsg *);
 
 void user_set_vring_call(struct vhost_device_ctx, struct VhostUserMsg *);
 
 void user_set_vring_kick(struct vhost_device_ctx, struct VhostUserMsg *);
 
+void user_set_protocol_features(struct vhost_device_ctx ctx,
+                               uint64_t protocol_features);
+
 int user_get_vring_base(struct vhost_device_ctx, struct vhost_vring_state *);
 
 void user_destroy_device(struct vhost_device_ctx);
index a6ab245..830f22a 100644 (file)
@@ -67,11 +67,14 @@ struct virtio_net_device_ops const *notify_ops;
 /* root address of the linked list of managed virtio devices */
 static struct virtio_net_config_ll *ll_root;
 
+#define VHOST_USER_F_PROTOCOL_FEATURES 30
+
 /* Features supported by this lib. */
 #define VHOST_SUPPORTED_FEATURES ((1ULL << VIRTIO_NET_F_MRG_RXBUF) | \
                                (1ULL << VIRTIO_NET_F_CTRL_VQ) | \
                                (1ULL << VIRTIO_NET_F_CTRL_RX) | \
-                               (1ULL << VHOST_F_LOG_ALL))
+                               (1ULL << VHOST_F_LOG_ALL)      | \
+                               (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))
 static uint64_t VHOST_FEATURES = VHOST_SUPPORTED_FEATURES;