#define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
#endif
+#ifndef VHOST_USER_PROTOCOL_F_STATUS
+#define VHOST_USER_PROTOCOL_F_STATUS 16
+#endif
+
enum vhost_user_request {
VHOST_USER_NONE = 0,
VHOST_USER_GET_FEATURES = 1,
VHOST_USER_SET_PROTOCOL_FEATURES = 16,
VHOST_USER_GET_QUEUE_NUM = 17,
VHOST_USER_SET_VRING_ENABLE = 18,
+ VHOST_USER_SET_STATUS = 39,
+ VHOST_USER_GET_STATUS = 40,
VHOST_USER_MAX
};
[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",
+ [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS",
+ [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS",
};
static int
need_reply = 1;
break;
+ case VHOST_USER_SET_STATUS:
+ if (!(dev->protocol_features &
+ (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
+ return 0;
+
+ if (has_reply_ack)
+ msg.flags |= VHOST_USER_NEED_REPLY_MASK;
+ /* Fallthrough */
case VHOST_USER_SET_FEATURES:
case VHOST_USER_SET_PROTOCOL_FEATURES:
case VHOST_USER_SET_LOG_BASE:
#define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES \
(1ULL << VHOST_USER_PROTOCOL_F_MQ | \
- 1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)
+ 1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK | \
+ 1ULL << VHOST_USER_PROTOCOL_F_STATUS)
int
virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
__atomic_add_fetch(&vring->used->idx, 1, __ATOMIC_RELAXED);
}
}
+
+int
+virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status)
+{
+ int ret;
+ uint64_t arg = status;
+
+ /* Vhost-user only for now */
+ if (!is_vhost_user_by_type(dev->path))
+ return 0;
+
+ if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
+ return 0;
+
+ ret = dev->ops->send_request(dev, VHOST_USER_SET_STATUS, &arg);
+ if (ret) {
+ PMD_INIT_LOG(ERR, "VHOST_USER_SET_STATUS failed (%d): %s", ret,
+ strerror(errno));
+ return -1;
+ }
+
+ return 0;
+}
void virtio_user_handle_cq_packed(struct virtio_user_dev *dev,
uint16_t queue_idx);
uint8_t virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs);
+int virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status);
#endif
else if (status == VIRTIO_CONFIG_STATUS_RESET)
virtio_user_reset(hw);
dev->status = status;
+ virtio_user_send_status_update(dev, status);
}
static uint8_t