net/mlx5: fix sriov flag
[dpdk.git] / drivers / net / virtio / virtio_user / vhost_user.c
index a159ece..91c6449 100644 (file)
@@ -1,34 +1,5 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2016 Intel Corporation
  */
 
 #include <sys/socket.h>
 #include <errno.h>
 
 #include "vhost.h"
+#include "virtio_user_dev.h"
+
+/* The version of the protocol we support */
+#define VHOST_USER_VERSION    0x1
+
+#define VHOST_MEMORY_MAX_NREGIONS 8
+struct vhost_memory {
+       uint32_t nregions;
+       uint32_t padding;
+       struct vhost_memory_region regions[VHOST_MEMORY_MAX_NREGIONS];
+};
+
+struct vhost_user_msg {
+       enum vhost_user_request request;
+
+#define VHOST_USER_VERSION_MASK     0x3
+#define VHOST_USER_REPLY_MASK       (0x1 << 2)
+       uint32_t flags;
+       uint32_t size; /* the following payload size */
+       union {
+#define VHOST_USER_VRING_IDX_MASK   0xff
+#define VHOST_USER_VRING_NOFD_MASK  (0x1 << 8)
+               uint64_t u64;
+               struct vhost_vring_state state;
+               struct vhost_vring_addr addr;
+               struct vhost_memory memory;
+       } payload;
+       int fds[VHOST_MEMORY_MAX_NREGIONS];
+} __attribute((packed));
+
+#define VHOST_USER_HDR_SIZE offsetof(struct vhost_user_msg, payload.u64)
+#define VHOST_USER_PAYLOAD_SIZE \
+       (sizeof(struct vhost_user_msg) - VHOST_USER_HDR_SIZE)
 
 static int
 vhost_user_write(int fd, void *buf, int len, int *fds, int fd_num)
@@ -97,6 +101,10 @@ vhost_user_read(int fd, struct vhost_user_msg *msg)
        }
 
        sz_payload = msg->size;
+
+       if ((size_t)sz_payload > sizeof(msg->payload))
+               goto fail;
+
        if (sz_payload) {
                ret = recv(fd, (void *)((char *)msg + sz_hdr), sz_payload, 0);
                if (ret < sz_payload) {
@@ -181,7 +189,7 @@ get_hugepage_file_info(struct hugepage_file_info huges[], int max)
                }
                huges[idx].addr = v_start;
                huges[idx].size = v_end - v_start;
-               strcpy(huges[idx].path, tmp);
+               snprintf(huges[idx].path, PATH_MAX, "%s", tmp);
                idx++;
        }
 
@@ -223,24 +231,25 @@ prepare_vhost_memory_user(struct vhost_user_msg *msg, int fds[])
 
 static struct vhost_user_msg m;
 
-static const char * const vhost_msg_strings[] = {
-       [VHOST_USER_SET_OWNER] = "VHOST_USER_SET_OWNER",
-       [VHOST_USER_RESET_OWNER] = "VHOST_USER_RESET_OWNER",
-       [VHOST_USER_SET_FEATURES] = "VHOST_USER_SET_FEATURES",
-       [VHOST_USER_GET_FEATURES] = "VHOST_USER_GET_FEATURES",
-       [VHOST_USER_SET_VRING_CALL] = "VHOST_USER_SET_VRING_CALL",
-       [VHOST_USER_SET_VRING_NUM] = "VHOST_USER_SET_VRING_NUM",
-       [VHOST_USER_SET_VRING_BASE] = "VHOST_USER_SET_VRING_BASE",
-       [VHOST_USER_GET_VRING_BASE] = "VHOST_USER_GET_VRING_BASE",
-       [VHOST_USER_SET_VRING_ADDR] = "VHOST_USER_SET_VRING_ADDR",
-       [VHOST_USER_SET_VRING_KICK] = "VHOST_USER_SET_VRING_KICK",
-       [VHOST_USER_SET_MEM_TABLE] = "VHOST_USER_SET_MEM_TABLE",
-       [VHOST_USER_SET_VRING_ENABLE] = "VHOST_USER_SET_VRING_ENABLE",
-       NULL,
+const char * const vhost_msg_strings[] = {
+       [VHOST_USER_SET_OWNER] = "VHOST_SET_OWNER",
+       [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER",
+       [VHOST_USER_SET_FEATURES] = "VHOST_SET_FEATURES",
+       [VHOST_USER_GET_FEATURES] = "VHOST_GET_FEATURES",
+       [VHOST_USER_SET_VRING_CALL] = "VHOST_SET_VRING_CALL",
+       [VHOST_USER_SET_VRING_NUM] = "VHOST_SET_VRING_NUM",
+       [VHOST_USER_SET_VRING_BASE] = "VHOST_SET_VRING_BASE",
+       [VHOST_USER_GET_VRING_BASE] = "VHOST_GET_VRING_BASE",
+       [VHOST_USER_SET_VRING_ADDR] = "VHOST_SET_VRING_ADDR",
+       [VHOST_USER_SET_VRING_KICK] = "VHOST_SET_VRING_KICK",
+       [VHOST_USER_SET_MEM_TABLE] = "VHOST_SET_MEM_TABLE",
+       [VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE",
 };
 
-int
-vhost_user_sock(int vhostfd, enum vhost_user_request req, void *arg)
+static int
+vhost_user_sock(struct virtio_user_dev *dev,
+               enum vhost_user_request req,
+               void *arg)
 {
        struct vhost_user_msg msg;
        struct vhost_vring_file *file = 0;
@@ -248,9 +257,9 @@ vhost_user_sock(int vhostfd, enum vhost_user_request req, void *arg)
        int fds[VHOST_MEMORY_MAX_NREGIONS];
        int fd_num = 0;
        int i, len;
+       int vhostfd = dev->vhostfd;
 
        RTE_SET_USED(m);
-       RTE_SET_USED(vhost_msg_strings);
 
        PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);
 
@@ -371,15 +380,13 @@ vhost_user_sock(int vhostfd, enum vhost_user_request req, void *arg)
 
 /**
  * Set up environment to talk with a vhost user backend.
- * @param path
- *   - The path to vhost user unix socket file.
  *
  * @return
- *   - (-1) if fail to set up;
- *   - (>=0) if successful, and it is the fd to vhostfd.
+ *   - (-1) if fail;
+ *   - (0) if succeed.
  */
-int
-vhost_user_setup(const char *path)
+static int
+vhost_user_setup(struct virtio_user_dev *dev)
 {
        int fd;
        int flag;
@@ -397,18 +404,21 @@ vhost_user_setup(const char *path)
 
        memset(&un, 0, sizeof(un));
        un.sun_family = AF_UNIX;
-       snprintf(un.sun_path, sizeof(un.sun_path), "%s", path);
+       snprintf(un.sun_path, sizeof(un.sun_path), "%s", dev->path);
        if (connect(fd, (struct sockaddr *)&un, sizeof(un)) < 0) {
                PMD_DRV_LOG(ERR, "connect error, %s", strerror(errno));
                close(fd);
                return -1;
        }
 
-       return fd;
+       dev->vhostfd = fd;
+       return 0;
 }
 
-int
-vhost_user_enable_queue_pair(int vhostfd, uint16_t pair_idx, int enable)
+static int
+vhost_user_enable_queue_pair(struct virtio_user_dev *dev,
+                            uint16_t pair_idx,
+                            int enable)
 {
        int i;
 
@@ -418,10 +428,15 @@ vhost_user_enable_queue_pair(int vhostfd, uint16_t pair_idx, int enable)
                        .num   = enable,
                };
 
-               if (vhost_user_sock(vhostfd,
-                                   VHOST_USER_SET_VRING_ENABLE, &state))
+               if (vhost_user_sock(dev, VHOST_USER_SET_VRING_ENABLE, &state))
                        return -1;
        }
 
        return 0;
 }
+
+struct virtio_user_backend_ops ops_user = {
+       .setup = vhost_user_setup,
+       .send_request = vhost_user_sock,
+       .enable_qp = vhost_user_enable_queue_pair
+};