git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
net/mlx5: fix unlimited parsing of switch info
[dpdk.git]
/
drivers
/
net
/
virtio
/
virtio_user
/
vhost_user.c
diff --git
a/drivers/net/virtio/virtio_user/vhost_user.c
b/drivers/net/virtio/virtio_user/vhost_user.c
index
2c6eba0
..
ad48baf
100644
(file)
--- a/
drivers/net/virtio/virtio_user/vhost_user.c
+++ b/
drivers/net/virtio/virtio_user/vhost_user.c
@@
-11,8
+11,8
@@
#include <string.h>
#include <errno.h>
#include <string.h>
#include <errno.h>
+#include <rte_string_fns.h>
#include <rte_fbarray.h>
#include <rte_fbarray.h>
-#include <rte_eal_memconfig.h>
#include "vhost.h"
#include "virtio_user_dev.h"
#include "vhost.h"
#include "virtio_user_dev.h"
@@
-32,6
+32,7
@@
struct vhost_user_msg {
#define VHOST_USER_VERSION_MASK 0x3
#define VHOST_USER_REPLY_MASK (0x1 << 2)
#define VHOST_USER_VERSION_MASK 0x3
#define VHOST_USER_REPLY_MASK (0x1 << 2)
+#define VHOST_USER_NEED_REPLY_MASK (0x1 << 3)
uint32_t flags;
uint32_t size; /* the following payload size */
union {
uint32_t flags;
uint32_t size; /* the following payload size */
union {
@@
-43,7
+44,7
@@
struct vhost_user_msg {
struct vhost_memory memory;
} payload;
int fds[VHOST_MEMORY_MAX_NREGIONS];
struct vhost_memory memory;
} payload;
int fds[VHOST_MEMORY_MAX_NREGIONS];
-} __
attribute((packed))
;
+} __
rte_packed
;
#define VHOST_USER_HDR_SIZE offsetof(struct vhost_user_msg, payload.u64)
#define VHOST_USER_PAYLOAD_SIZE \
#define VHOST_USER_HDR_SIZE offsetof(struct vhost_user_msg, payload.u64)
#define VHOST_USER_PAYLOAD_SIZE \
@@
-241,6
+242,8
@@
const char * const vhost_msg_strings[] = {
[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",
[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",
+ [VHOST_USER_GET_PROTOCOL_FEATURES] = "VHOST_USER_GET_PROTOCOL_FEATURES",
+ [VHOST_USER_SET_PROTOCOL_FEATURES] = "VHOST_USER_SET_PROTOCOL_FEATURES",
};
static int
};
static int
@@
-251,6
+254,7
@@
vhost_user_sock(struct virtio_user_dev *dev,
struct vhost_user_msg msg;
struct vhost_vring_file *file = 0;
int need_reply = 0;
struct vhost_user_msg msg;
struct vhost_vring_file *file = 0;
int need_reply = 0;
+ int has_reply_ack = 0;
int fds[VHOST_MEMORY_MAX_NREGIONS];
int fd_num = 0;
int len;
int fds[VHOST_MEMORY_MAX_NREGIONS];
int fd_num = 0;
int len;
@@
-263,16
+267,21
@@
vhost_user_sock(struct virtio_user_dev *dev,
if (dev->is_server && vhostfd < 0)
return -1;
if (dev->is_server && vhostfd < 0)
return -1;
+ if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK))
+ has_reply_ack = 1;
+
msg.request = req;
msg.flags = VHOST_USER_VERSION;
msg.size = 0;
switch (req) {
case VHOST_USER_GET_FEATURES:
msg.request = req;
msg.flags = VHOST_USER_VERSION;
msg.size = 0;
switch (req) {
case VHOST_USER_GET_FEATURES:
+ case VHOST_USER_GET_PROTOCOL_FEATURES:
need_reply = 1;
break;
case VHOST_USER_SET_FEATURES:
need_reply = 1;
break;
case VHOST_USER_SET_FEATURES:
+ case VHOST_USER_SET_PROTOCOL_FEATURES:
case VHOST_USER_SET_LOG_BASE:
msg.payload.u64 = *((__u64 *)arg);
msg.size = sizeof(m.payload.u64);
case VHOST_USER_SET_LOG_BASE:
msg.payload.u64 = *((__u64 *)arg);
msg.size = sizeof(m.payload.u64);
@@
-289,6
+298,9
@@
vhost_user_sock(struct virtio_user_dev *dev,
msg.size = sizeof(m.payload.memory.nregions);
msg.size += sizeof(m.payload.memory.padding);
msg.size += fd_num * sizeof(struct vhost_memory_region);
msg.size = sizeof(m.payload.memory.nregions);
msg.size += sizeof(m.payload.memory.padding);
msg.size += fd_num * sizeof(struct vhost_memory_region);
+
+ if (has_reply_ack)
+ msg.flags |= VHOST_USER_NEED_REPLY_MASK;
break;
case VHOST_USER_SET_LOG_FD:
break;
case VHOST_USER_SET_LOG_FD:
@@
-337,7
+349,7
@@
vhost_user_sock(struct virtio_user_dev *dev,
return -1;
}
return -1;
}
- if (need_reply) {
+ if (need_reply
|| msg.flags & VHOST_USER_NEED_REPLY_MASK
) {
if (vhost_user_read(vhostfd, &msg) < 0) {
PMD_DRV_LOG(ERR, "Received msg failed: %s",
strerror(errno));
if (vhost_user_read(vhostfd, &msg) < 0) {
PMD_DRV_LOG(ERR, "Received msg failed: %s",
strerror(errno));
@@
-351,6
+363,7
@@
vhost_user_sock(struct virtio_user_dev *dev,
switch (req) {
case VHOST_USER_GET_FEATURES:
switch (req) {
case VHOST_USER_GET_FEATURES:
+ case VHOST_USER_GET_PROTOCOL_FEATURES:
if (msg.size != sizeof(m.payload.u64)) {
PMD_DRV_LOG(ERR, "Received bad msg size");
return -1;
if (msg.size != sizeof(m.payload.u64)) {
PMD_DRV_LOG(ERR, "Received bad msg size");
return -1;
@@
-366,8
+379,18
@@
vhost_user_sock(struct virtio_user_dev *dev,
sizeof(struct vhost_vring_state));
break;
default:
sizeof(struct vhost_vring_state));
break;
default:
- PMD_DRV_LOG(ERR, "Received unexpected msg type");
- return -1;
+ /* Reply-ack handling */
+ if (msg.size != sizeof(m.payload.u64)) {
+ PMD_DRV_LOG(ERR, "Received bad msg size");
+ return -1;
+ }
+
+ if (msg.payload.u64 != 0) {
+ PMD_DRV_LOG(ERR, "Slave replied NACK");
+ return -1;
+ }
+
+ break;
}
}
}
}
@@
-393,7
+416,10
@@
virtio_user_start_server(struct virtio_user_dev *dev, struct sockaddr_un *un)
return -1;
flag = fcntl(fd, F_GETFL);
return -1;
flag = fcntl(fd, F_GETFL);
- fcntl(fd, F_SETFL, flag | O_NONBLOCK);
+ if (fcntl(fd, F_SETFL, flag | O_NONBLOCK) < 0) {
+ PMD_DRV_LOG(ERR, "fcntl failed, %s", strerror(errno));
+ return -1;
+ }
return 0;
}
return 0;
}
@@
-424,7
+450,7
@@
vhost_user_setup(struct virtio_user_dev *dev)
memset(&un, 0, sizeof(un));
un.sun_family = AF_UNIX;
memset(&un, 0, sizeof(un));
un.sun_family = AF_UNIX;
- s
nprintf(un.sun_path, sizeof(un.sun_path), "%s", dev->path
);
+ s
trlcpy(un.sun_path, dev->path, sizeof(un.sun_path)
);
if (dev->is_server) {
dev->listenfd = fd;
if (dev->is_server) {
dev->listenfd = fd;
@@
-453,6
+479,9
@@
vhost_user_enable_queue_pair(struct virtio_user_dev *dev,
{
int i;
{
int i;
+ if (dev->qp_enabled[pair_idx] == enable)
+ return 0;
+
for (i = 0; i < 2; ++i) {
struct vhost_vring_state state = {
.index = pair_idx * 2 + i,
for (i = 0; i < 2; ++i) {
struct vhost_vring_state state = {
.index = pair_idx * 2 + i,
@@
-463,6
+492,7
@@
vhost_user_enable_queue_pair(struct virtio_user_dev *dev,
return -1;
}
return -1;
}
+ dev->qp_enabled[pair_idx] = enable;
return 0;
}
return 0;
}