mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:46:17 +00:00
net: Add get_vhost_net callback to NetClientInfo
The get_vhost_net() function previously contained a large switch statement to find the VHostNetState pointer based on the net client's type. This created a tight coupling, requiring the generic vhost layer to be aware of every specific backend that supported vhost, such as tap, vhost-user, and vhost-vdpa. This approach is not scalable and requires modifying a central function for any new backend. It also forced each backend to expose its internal getter function in a public header file. This patch refactors the logic by introducing a new get_vhost_net function pointer to the NetClientInfo struct. The central get_vhost_net() function is now a simple, generic dispatcher that invokes the callback provided by the net client. Each backend now implements its own private getter and registers it in its NetClientInfo. Signed-off-by: Laurent Vivier <lvivier@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
committed by
Jason Wang
parent
7136352b40
commit
8f6e5c620a
@@ -649,41 +649,18 @@ void vhost_net_config_mask(VHostNetState *net, VirtIODevice *dev, bool mask)
|
||||
{
|
||||
vhost_config_mask(&net->dev, dev, mask);
|
||||
}
|
||||
|
||||
VHostNetState *get_vhost_net(NetClientState *nc)
|
||||
{
|
||||
VHostNetState *vhost_net = 0;
|
||||
|
||||
if (!nc) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (nc->info->type) {
|
||||
case NET_CLIENT_DRIVER_TAP:
|
||||
vhost_net = tap_get_vhost_net(nc);
|
||||
/*
|
||||
* tap_get_vhost_net() can return NULL if a tap net-device backend is
|
||||
* created with 'vhost=off' option, 'vhostforce=off' or no vhost or
|
||||
* vhostforce or vhostfd options at all. Please see net_init_tap_one().
|
||||
* Hence, we omit the assertion here.
|
||||
*/
|
||||
break;
|
||||
#ifdef CONFIG_VHOST_NET_USER
|
||||
case NET_CLIENT_DRIVER_VHOST_USER:
|
||||
vhost_net = vhost_user_get_vhost_net(nc);
|
||||
assert(vhost_net);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_VHOST_NET_VDPA
|
||||
case NET_CLIENT_DRIVER_VHOST_VDPA:
|
||||
vhost_net = vhost_vdpa_get_vhost_net(nc);
|
||||
assert(vhost_net);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
if (nc->info->get_vhost_net) {
|
||||
return nc->info->get_vhost_net(nc);
|
||||
}
|
||||
|
||||
return vhost_net;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int vhost_net_set_vring_enable(NetClientState *nc, int enable)
|
||||
|
||||
@@ -67,6 +67,7 @@ typedef void (SocketReadStateFinalize)(SocketReadState *rs);
|
||||
typedef void (NetAnnounce)(NetClientState *);
|
||||
typedef bool (SetSteeringEBPF)(NetClientState *, int);
|
||||
typedef bool (NetCheckPeerType)(NetClientState *, ObjectClass *, Error **);
|
||||
typedef struct vhost_net *(GetVHostNet)(NetClientState *nc);
|
||||
|
||||
typedef struct NetClientInfo {
|
||||
NetClientDriver type;
|
||||
@@ -92,6 +93,7 @@ typedef struct NetClientInfo {
|
||||
NetAnnounce *announce;
|
||||
SetSteeringEBPF *set_steering_ebpf;
|
||||
NetCheckPeerType *check_peer_type;
|
||||
GetVHostNet *get_vhost_net;
|
||||
} NetClientInfo;
|
||||
|
||||
struct NetClientState {
|
||||
|
||||
@@ -33,7 +33,4 @@ int tap_disable(NetClientState *nc);
|
||||
|
||||
int tap_get_fd(NetClientState *nc);
|
||||
|
||||
struct vhost_net;
|
||||
struct vhost_net *tap_get_vhost_net(NetClientState *nc);
|
||||
|
||||
#endif /* QEMU_NET_TAP_H */
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#define VHOST_USER_H
|
||||
|
||||
struct vhost_net;
|
||||
struct vhost_net *vhost_user_get_vhost_net(NetClientState *nc);
|
||||
uint64_t vhost_user_get_acked_features(NetClientState *nc);
|
||||
void vhost_user_save_acked_features(NetClientState *nc);
|
||||
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
|
||||
#define TYPE_VHOST_VDPA "vhost-vdpa"
|
||||
|
||||
struct vhost_net *vhost_vdpa_get_vhost_net(NetClientState *nc);
|
||||
|
||||
extern const int vdpa_feature_bits[];
|
||||
|
||||
#endif /* VHOST_VDPA_H */
|
||||
|
||||
@@ -704,11 +704,6 @@ static void tap_win32_send(void *opaque)
|
||||
}
|
||||
}
|
||||
|
||||
struct vhost_net *tap_get_vhost_net(NetClientState *nc)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static NetClientInfo net_tap_win32_info = {
|
||||
.type = NET_CLIENT_DRIVER_TAP,
|
||||
.size = sizeof(TAPState),
|
||||
|
||||
20
net/tap.c
20
net/tap.c
@@ -329,6 +329,18 @@ int tap_get_fd(NetClientState *nc)
|
||||
return s->fd;
|
||||
}
|
||||
|
||||
/*
|
||||
* tap_get_vhost_net() can return NULL if a tap net-device backend is
|
||||
* created with 'vhost=off' option, 'vhostforce=off' or no vhost or
|
||||
* vhostforce or vhostfd options at all. Please see net_init_tap_one().
|
||||
*/
|
||||
static VHostNetState *tap_get_vhost_net(NetClientState *nc)
|
||||
{
|
||||
TAPState *s = DO_UPCAST(TAPState, nc, nc);
|
||||
assert(nc->info->type == NET_CLIENT_DRIVER_TAP);
|
||||
return s->vhost_net;
|
||||
}
|
||||
|
||||
/* fd support */
|
||||
|
||||
static NetClientInfo net_tap_info = {
|
||||
@@ -347,6 +359,7 @@ static NetClientInfo net_tap_info = {
|
||||
.set_vnet_le = tap_set_vnet_le,
|
||||
.set_vnet_be = tap_set_vnet_be,
|
||||
.set_steering_ebpf = tap_set_steering_ebpf,
|
||||
.get_vhost_net = tap_get_vhost_net,
|
||||
};
|
||||
|
||||
static TAPState *net_tap_fd_init(NetClientState *peer,
|
||||
@@ -980,13 +993,6 @@ free_fail:
|
||||
return 0;
|
||||
}
|
||||
|
||||
VHostNetState *tap_get_vhost_net(NetClientState *nc)
|
||||
{
|
||||
TAPState *s = DO_UPCAST(TAPState, nc, nc);
|
||||
assert(nc->info->type == NET_CLIENT_DRIVER_TAP);
|
||||
return s->vhost_net;
|
||||
}
|
||||
|
||||
int tap_enable(NetClientState *nc)
|
||||
{
|
||||
TAPState *s = DO_UPCAST(TAPState, nc, nc);
|
||||
|
||||
@@ -32,7 +32,7 @@ typedef struct NetVhostUserState {
|
||||
bool started;
|
||||
} NetVhostUserState;
|
||||
|
||||
VHostNetState *vhost_user_get_vhost_net(NetClientState *nc)
|
||||
static struct vhost_net *vhost_user_get_vhost_net(NetClientState *nc)
|
||||
{
|
||||
NetVhostUserState *s = DO_UPCAST(NetVhostUserState, nc, nc);
|
||||
assert(nc->info->type == NET_CLIENT_DRIVER_VHOST_USER);
|
||||
@@ -231,6 +231,7 @@ static NetClientInfo net_vhost_user_info = {
|
||||
.set_vnet_be = vhost_user_set_vnet_endianness,
|
||||
.set_vnet_le = vhost_user_set_vnet_endianness,
|
||||
.check_peer_type = vhost_user_check_peer_type,
|
||||
.get_vhost_net = vhost_user_get_vhost_net,
|
||||
};
|
||||
|
||||
static gboolean net_vhost_user_watch(void *do_not_use, GIOCondition cond,
|
||||
|
||||
@@ -132,7 +132,7 @@ static const uint64_t vdpa_svq_device_features =
|
||||
|
||||
#define VHOST_VDPA_NET_CVQ_ASID 1
|
||||
|
||||
VHostNetState *vhost_vdpa_get_vhost_net(NetClientState *nc)
|
||||
static struct vhost_net *vhost_vdpa_get_vhost_net(NetClientState *nc)
|
||||
{
|
||||
VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc);
|
||||
assert(nc->info->type == NET_CLIENT_DRIVER_VHOST_VDPA);
|
||||
@@ -432,6 +432,7 @@ static NetClientInfo net_vhost_vdpa_info = {
|
||||
.set_vnet_le = vhost_vdpa_set_vnet_le,
|
||||
.check_peer_type = vhost_vdpa_check_peer_type,
|
||||
.set_steering_ebpf = vhost_vdpa_set_steering_ebpf,
|
||||
.get_vhost_net = vhost_vdpa_get_vhost_net,
|
||||
};
|
||||
|
||||
static int64_t vhost_vdpa_get_vring_group(int device_fd, unsigned vq_index,
|
||||
@@ -1287,6 +1288,7 @@ static NetClientInfo net_vhost_vdpa_cvq_info = {
|
||||
.has_ufo = vhost_vdpa_has_ufo,
|
||||
.check_peer_type = vhost_vdpa_check_peer_type,
|
||||
.set_steering_ebpf = vhost_vdpa_set_steering_ebpf,
|
||||
.get_vhost_net = vhost_vdpa_get_vhost_net,
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user