net: Consolidate vhost feature bits into vhost_net structure
Previously, the vhost_net_get_feature_bits() function in hw/net/vhost_net.c used a large switch statement to determine the appropriate feature bits based on the NetClientDriver type. This created unnecessary coupling between the generic vhost layer and specific network backends (like TAP, vhost-user, and vhost-vdpa). This patch moves the definition of vhost feature bits directly into the vhost_net structure for each relevant network client. Signed-off-by: Laurent Vivier <lvivier@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
8f6e5c620a
commit
effdacbf28
7 changed files with 69 additions and 90 deletions
19
net/tap.c
19
net/tap.c
|
|
@ -42,11 +42,29 @@
|
|||
#include "qemu/error-report.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/sockets.h"
|
||||
#include "hw/virtio/vhost.h"
|
||||
|
||||
#include "net/tap.h"
|
||||
|
||||
#include "net/vhost_net.h"
|
||||
|
||||
static const int kernel_feature_bits[] = {
|
||||
VIRTIO_F_NOTIFY_ON_EMPTY,
|
||||
VIRTIO_RING_F_INDIRECT_DESC,
|
||||
VIRTIO_RING_F_EVENT_IDX,
|
||||
VIRTIO_NET_F_MRG_RXBUF,
|
||||
VIRTIO_F_VERSION_1,
|
||||
VIRTIO_NET_F_MTU,
|
||||
VIRTIO_F_IOMMU_PLATFORM,
|
||||
VIRTIO_F_RING_PACKED,
|
||||
VIRTIO_F_RING_RESET,
|
||||
VIRTIO_F_IN_ORDER,
|
||||
VIRTIO_F_NOTIFICATION_DATA,
|
||||
VIRTIO_NET_F_RSC_EXT,
|
||||
VIRTIO_NET_F_HASH_REPORT,
|
||||
VHOST_INVALID_FEATURE_BIT
|
||||
};
|
||||
|
||||
typedef struct TAPState {
|
||||
NetClientState nc;
|
||||
int fd;
|
||||
|
|
@ -725,6 +743,7 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
|
|||
}
|
||||
options.opaque = (void *)(uintptr_t)vhostfd;
|
||||
options.nvqs = 2;
|
||||
options.feature_bits = kernel_feature_bits;
|
||||
|
||||
s->vhost_net = vhost_net_init(&options);
|
||||
if (!s->vhost_net) {
|
||||
|
|
|
|||
|
|
@ -12,7 +12,9 @@
|
|||
#include "clients.h"
|
||||
#include "net/vhost_net.h"
|
||||
#include "net/vhost-user.h"
|
||||
#include "hw/virtio/vhost.h"
|
||||
#include "hw/virtio/vhost-user.h"
|
||||
#include "standard-headers/linux/virtio_net.h"
|
||||
#include "chardev/char-fe.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-commands-net.h"
|
||||
|
|
@ -22,6 +24,46 @@
|
|||
#include "qemu/option.h"
|
||||
#include "trace.h"
|
||||
|
||||
static const int user_feature_bits[] = {
|
||||
VIRTIO_F_NOTIFY_ON_EMPTY,
|
||||
VIRTIO_F_NOTIFICATION_DATA,
|
||||
VIRTIO_RING_F_INDIRECT_DESC,
|
||||
VIRTIO_RING_F_EVENT_IDX,
|
||||
|
||||
VIRTIO_F_ANY_LAYOUT,
|
||||
VIRTIO_F_VERSION_1,
|
||||
VIRTIO_NET_F_CSUM,
|
||||
VIRTIO_NET_F_GUEST_CSUM,
|
||||
VIRTIO_NET_F_GSO,
|
||||
VIRTIO_NET_F_GUEST_TSO4,
|
||||
VIRTIO_NET_F_GUEST_TSO6,
|
||||
VIRTIO_NET_F_GUEST_ECN,
|
||||
VIRTIO_NET_F_GUEST_UFO,
|
||||
VIRTIO_NET_F_HOST_TSO4,
|
||||
VIRTIO_NET_F_HOST_TSO6,
|
||||
VIRTIO_NET_F_HOST_ECN,
|
||||
VIRTIO_NET_F_HOST_UFO,
|
||||
VIRTIO_NET_F_MRG_RXBUF,
|
||||
VIRTIO_NET_F_MTU,
|
||||
VIRTIO_F_IOMMU_PLATFORM,
|
||||
VIRTIO_F_RING_PACKED,
|
||||
VIRTIO_F_RING_RESET,
|
||||
VIRTIO_F_IN_ORDER,
|
||||
VIRTIO_NET_F_RSS,
|
||||
VIRTIO_NET_F_RSC_EXT,
|
||||
VIRTIO_NET_F_HASH_REPORT,
|
||||
VIRTIO_NET_F_GUEST_USO4,
|
||||
VIRTIO_NET_F_GUEST_USO6,
|
||||
VIRTIO_NET_F_HOST_USO,
|
||||
|
||||
/* This bit implies RARP isn't sent by QEMU out of band */
|
||||
VIRTIO_NET_F_GUEST_ANNOUNCE,
|
||||
|
||||
VIRTIO_NET_F_MQ,
|
||||
|
||||
VHOST_INVALID_FEATURE_BIT
|
||||
};
|
||||
|
||||
typedef struct NetVhostUserState {
|
||||
NetClientState nc;
|
||||
CharBackend chr; /* only queue index 0 */
|
||||
|
|
@ -96,6 +138,7 @@ static int vhost_user_start(int queues, NetClientState *ncs[],
|
|||
options.opaque = be;
|
||||
options.busyloop_timeout = 0;
|
||||
options.nvqs = 2;
|
||||
options.feature_bits = user_feature_bits;
|
||||
net = vhost_net_init(&options);
|
||||
if (!net) {
|
||||
error_report("failed to init vhost_net for queue %d", i);
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ typedef struct VhostVDPAState {
|
|||
* with the exception of VHOST_INVALID_FEATURE_BIT,
|
||||
* which should always be the last entry.
|
||||
*/
|
||||
const int vdpa_feature_bits[] = {
|
||||
static const int vdpa_feature_bits[] = {
|
||||
VIRTIO_F_ANY_LAYOUT,
|
||||
VIRTIO_F_IOMMU_PLATFORM,
|
||||
VIRTIO_F_NOTIFY_ON_EMPTY,
|
||||
|
|
@ -201,6 +201,7 @@ static int vhost_vdpa_add(NetClientState *ncs, void *be,
|
|||
options.opaque = be;
|
||||
options.busyloop_timeout = 0;
|
||||
options.nvqs = nvqs;
|
||||
options.feature_bits = vdpa_feature_bits;
|
||||
|
||||
net = vhost_net_init(&options);
|
||||
if (!net) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue