|
@@ -198,6 +198,19 @@ static bool vhost_user_has_ufo(NetClientState *nc)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static bool vhost_user_check_peer_type(NetClientState *nc, ObjectClass *oc,
|
|
|
+ Error **errp)
|
|
|
+{
|
|
|
+ const char *driver = object_class_get_name(oc);
|
|
|
+
|
|
|
+ if (!g_str_has_prefix(driver, "virtio-net-")) {
|
|
|
+ error_setg(errp, "vhost-user requires frontend driver virtio-net-*");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
static NetClientInfo net_vhost_user_info = {
|
|
|
.type = NET_CLIENT_DRIVER_VHOST_USER,
|
|
|
.size = sizeof(NetVhostUserState),
|
|
@@ -207,6 +220,7 @@ static NetClientInfo net_vhost_user_info = {
|
|
|
.has_ufo = vhost_user_has_ufo,
|
|
|
.set_vnet_be = vhost_user_set_vnet_endianness,
|
|
|
.set_vnet_le = vhost_user_set_vnet_endianness,
|
|
|
+ .check_peer_type = vhost_user_check_peer_type,
|
|
|
};
|
|
|
|
|
|
static gboolean net_vhost_user_watch(void *do_not_use, GIOCondition cond,
|
|
@@ -397,27 +411,6 @@ static Chardev *net_vhost_claim_chardev(
|
|
|
return chr;
|
|
|
}
|
|
|
|
|
|
-static int net_vhost_check_net(void *opaque, QemuOpts *opts, Error **errp)
|
|
|
-{
|
|
|
- const char *name = opaque;
|
|
|
- const char *driver, *netdev;
|
|
|
-
|
|
|
- driver = qemu_opt_get(opts, "driver");
|
|
|
- netdev = qemu_opt_get(opts, "netdev");
|
|
|
-
|
|
|
- if (!driver || !netdev) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (strcmp(netdev, name) == 0 &&
|
|
|
- !g_str_has_prefix(driver, "virtio-net-")) {
|
|
|
- error_setg(errp, "vhost-user requires frontend driver virtio-net-*");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
int net_init_vhost_user(const Netdev *netdev, const char *name,
|
|
|
NetClientState *peer, Error **errp)
|
|
|
{
|
|
@@ -433,12 +426,6 @@ int net_init_vhost_user(const Netdev *netdev, const char *name,
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- /* verify net frontend */
|
|
|
- if (qemu_opts_foreach(qemu_find_opts("device"), net_vhost_check_net,
|
|
|
- (char *)name, errp)) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
queues = vhost_user_opts->has_queues ? vhost_user_opts->queues : 1;
|
|
|
if (queues < 1 || queues > MAX_QUEUE_NUM) {
|
|
|
error_setg(errp,
|