net/virtio-user: move vhost-user specific code
[dpdk.git] / drivers / net / virtio / virtio_user / vhost_user.c
index 2b34cac..295ce16 100644 (file)
 
 #include "vhost.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)
 {
@@ -181,7 +213,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++;
        }
 
@@ -235,11 +267,12 @@ static const char * const vhost_msg_strings[] = {
        [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,
 };
 
 int
-vhost_user_sock(int vhostfd, uint64_t req, void *arg)
+vhost_user_sock(int vhostfd, enum vhost_user_request req, void *arg)
 {
        struct vhost_user_msg msg;
        struct vhost_vring_file *file = 0;
@@ -287,6 +320,7 @@ vhost_user_sock(int vhostfd, uint64_t req, void *arg)
 
        case VHOST_USER_SET_VRING_NUM:
        case VHOST_USER_SET_VRING_BASE:
+       case VHOST_USER_SET_VRING_ENABLE:
                memcpy(&msg.payload.state, arg, sizeof(msg.payload.state));
                msg.size = sizeof(m.payload.state);
                break;
@@ -390,7 +424,8 @@ vhost_user_setup(const char *path)
        }
 
        flag = fcntl(fd, F_GETFD);
-       fcntl(fd, F_SETFD, flag | FD_CLOEXEC);
+       if (fcntl(fd, F_SETFD, flag | FD_CLOEXEC) < 0)
+               PMD_DRV_LOG(WARNING, "fcntl failed, %s", strerror(errno));
 
        memset(&un, 0, sizeof(un));
        un.sun_family = AF_UNIX;
@@ -403,3 +438,22 @@ vhost_user_setup(const char *path)
 
        return fd;
 }
+
+int
+vhost_user_enable_queue_pair(int vhostfd, uint16_t pair_idx, int enable)
+{
+       int i;
+
+       for (i = 0; i < 2; ++i) {
+               struct vhost_vring_state state = {
+                       .index = pair_idx * 2 + i,
+                       .num   = enable,
+               };
+
+               if (vhost_user_sock(vhostfd,
+                                   VHOST_USER_SET_VRING_ENABLE, &state))
+                       return -1;
+       }
+
+       return 0;
+}