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:
parent
ff070f602a
commit
19d55a19a4
@ -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,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user