tests/qtest: add a get_features op to vhost-user-test

As we expand this test for more virtio devices we will need to support
different feature sets. Add a mandatory op field to fetch the list of
features needed for the test itself.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20220802095010.3330793-22-alex.bennee@linaro.org>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Alex Bennée 2022-08-02 10:50:09 +01:00 committed by Michael S. Tsirkin
parent ff070f602a
commit 19d55a19a4

View file

@ -171,10 +171,11 @@ struct vhost_user_ops {
const char *chr_opts);
/* VHOST-USER commands. */
uint64_t (*get_features)(TestServer *s);
void (*set_features)(TestServer *s, CharBackend *chr,
VhostUserMsg *msg);
VhostUserMsg *msg);
void (*get_protocol_features)(TestServer *s,
CharBackend *chr, VhostUserMsg *msg);
CharBackend *chr, VhostUserMsg *msg);
};
static const char *init_hugepagefs(void);
@ -338,20 +339,22 @@ static void chr_read(void *opaque, const uint8_t *buf, int size)
switch (msg.request) {
case VHOST_USER_GET_FEATURES:
/* Mandatory for tests to define get_features */
g_assert(s->vu_ops->get_features);
/* send back features to qemu */
msg.flags |= VHOST_USER_REPLY_MASK;
msg.size = sizeof(m.payload.u64);
msg.payload.u64 = 0x1ULL << VHOST_F_LOG_ALL |
0x1ULL << VHOST_USER_F_PROTOCOL_FEATURES;
if (s->queues > 1) {
msg.payload.u64 |= 0x1ULL << VIRTIO_NET_F_MQ;
}
if (s->test_flags >= TEST_FLAGS_BAD) {
msg.payload.u64 = 0;
s->test_flags = TEST_FLAGS_END;
} else {
msg.payload.u64 = s->vu_ops->get_features(s);
}
p = (uint8_t *) &msg;
qemu_chr_fe_write_all(chr, p, VHOST_USER_HDR_SIZE + msg.size);
qemu_chr_fe_write_all(chr, (uint8_t *) &msg,
VHOST_USER_HDR_SIZE + msg.size);
break;
case VHOST_USER_SET_FEATURES:
@ -995,8 +998,21 @@ static void test_multiqueue(void *obj, void *arg, QGuestAllocator *alloc)
wait_for_rings_started(s, s->queues * 2);
}
static uint64_t vu_net_get_features(TestServer *s)
{
uint64_t features = 0x1ULL << VHOST_F_LOG_ALL |
0x1ULL << VHOST_USER_F_PROTOCOL_FEATURES;
if (s->queues > 1) {
features |= 0x1ULL << VIRTIO_NET_F_MQ;
}
return features;
}
static void vu_net_set_features(TestServer *s, CharBackend *chr,
VhostUserMsg *msg)
VhostUserMsg *msg)
{
g_assert(msg->payload.u64 & (0x1ULL << VHOST_USER_F_PROTOCOL_FEATURES));
if (s->test_flags == TEST_FLAGS_DISCONNECT) {
@ -1025,6 +1041,7 @@ static struct vhost_user_ops g_vu_net_ops = {
.append_opts = append_vhost_net_opts,
.get_features = vu_net_get_features,
.set_features = vu_net_set_features,
.get_protocol_features = vu_net_get_protocol_features,
};