mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'net-pull-request' of https://github.com/jasowang/qemu into staging
# -----BEGIN PGP SIGNATURE----- # Version: GnuPG v1 # # iQEcBAABAgAGBQJlB/SLAAoJEO8Ells5jWIR7EQH/1kAbxHcSGJXDOgQAXJ/rOZi # UKn3ugJzD0Hxd4Xz8cvdVLM+9/JoEEOK1uB+NIG7Ask/gA5D7eUYzaLtp1OJ8VNO # mamfKmn3EIBWJoLSHH19TKzfW2tGMJHQ0Nj+sbDQRkK5f2c7hwLTRXa1EmlJd4dB # VoVzX4OiJtrQyv4OVmpP/PSETXJDvYYX/DNcRl9/3ccKtQW/wVDI3YzrMzXrsgyc # w9ItJi8k+19mVH6RgQwciqRvTbVMdzkOxqvU//LY0TxnjsHfbyHr+KlNAa2WTY2N # QgpAlMZhHqUG6/XXAs0o2VEtA66zmw932Xfy/CZUEcdGWfkG/9CEVfbuT4CKGY4= # =tF7K # -----END PGP SIGNATURE----- # gpg: Signature made Mon 18 Sep 2023 02:56:11 EDT # gpg: using RSA key EF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" [full] # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * tag 'net-pull-request' of https://github.com/jasowang/qemu: net/tap: Avoid variable-length array net/dump: Avoid variable length array hw/net/rocker: Avoid variable length array hw/net/fsl_etsec/rings.c: Avoid variable length array net: add initial support for AF_XDP network backend tests: bump libvirt-ci for libasan and libxdp e1000e: rename e1000e_ba_state and e1000e_write_hdr_to_rx_buffers igb: packet-split descriptors support igb: add IPv6 extended headers traffic detection igb: RX payload guest writting refactoring igb: RX descriptors guest writting refactoring igb: rename E1000E_RingInfo_st igb: remove TCP ACK detection virtio-net: Add support for USO features virtio-net: Add USO flags to vhost support. tap: Add check for USO features tap: Add USO support to tap device. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
@@ -2957,6 +2957,10 @@ W: http://info.iet.unipi.it/~luigi/netmap/
|
||||
S: Maintained
|
||||
F: net/netmap.c
|
||||
|
||||
AF_XDP network backend
|
||||
R: Ilya Maximets <i.maximets@ovn.org>
|
||||
F: net/af-xdp.c
|
||||
|
||||
Host Memory Backends
|
||||
M: David Hildenbrand <david@redhat.com>
|
||||
M: Igor Mammedov <imammedo@redhat.com>
|
||||
|
||||
@@ -1296,6 +1296,9 @@ ERST
|
||||
.name = "netdev_add",
|
||||
.args_type = "netdev:O",
|
||||
.params = "[user|tap|socket|stream|dgram|vde|bridge|hubport|netmap|vhost-user"
|
||||
#ifdef CONFIG_AF_XDP
|
||||
"|af-xdp"
|
||||
#endif
|
||||
#ifdef CONFIG_VMNET
|
||||
"|vmnet-host|vmnet-shared|vmnet-bridged"
|
||||
#endif
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "exec/confidential-guest-support.h"
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "hw/virtio/virtio-pci.h"
|
||||
#include "hw/virtio/virtio-net.h"
|
||||
|
||||
GlobalProperty hw_compat_8_1[] = {};
|
||||
const size_t hw_compat_8_1_len = G_N_ELEMENTS(hw_compat_8_1);
|
||||
@@ -45,6 +46,9 @@ const size_t hw_compat_8_1_len = G_N_ELEMENTS(hw_compat_8_1);
|
||||
GlobalProperty hw_compat_8_0[] = {
|
||||
{ "migration", "multifd-flush-after-each-section", "on"},
|
||||
{ TYPE_PCI_DEVICE, "x-pcie-ari-nextfn-1", "on" },
|
||||
{ TYPE_VIRTIO_NET, "host_uso", "off"},
|
||||
{ TYPE_VIRTIO_NET, "guest_uso4", "off"},
|
||||
{ TYPE_VIRTIO_NET, "guest_uso6", "off"},
|
||||
};
|
||||
const size_t hw_compat_8_0_len = G_N_ELEMENTS(hw_compat_8_0);
|
||||
|
||||
|
||||
+42
-38
@@ -810,24 +810,24 @@ e1000e_txdesc_writeback(E1000ECore *core, dma_addr_t base,
|
||||
return e1000e_tx_wb_interrupt_cause(core, queue_idx);
|
||||
}
|
||||
|
||||
typedef struct E1000E_RingInfo_st {
|
||||
typedef struct E1000ERingInfo {
|
||||
int dbah;
|
||||
int dbal;
|
||||
int dlen;
|
||||
int dh;
|
||||
int dt;
|
||||
int idx;
|
||||
} E1000E_RingInfo;
|
||||
} E1000ERingInfo;
|
||||
|
||||
static inline bool
|
||||
e1000e_ring_empty(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
e1000e_ring_empty(E1000ECore *core, const E1000ERingInfo *r)
|
||||
{
|
||||
return core->mac[r->dh] == core->mac[r->dt] ||
|
||||
core->mac[r->dt] >= core->mac[r->dlen] / E1000_RING_DESC_LEN;
|
||||
}
|
||||
|
||||
static inline uint64_t
|
||||
e1000e_ring_base(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
e1000e_ring_base(E1000ECore *core, const E1000ERingInfo *r)
|
||||
{
|
||||
uint64_t bah = core->mac[r->dbah];
|
||||
uint64_t bal = core->mac[r->dbal];
|
||||
@@ -836,13 +836,13 @@ e1000e_ring_base(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
}
|
||||
|
||||
static inline uint64_t
|
||||
e1000e_ring_head_descr(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
e1000e_ring_head_descr(E1000ECore *core, const E1000ERingInfo *r)
|
||||
{
|
||||
return e1000e_ring_base(core, r) + E1000_RING_DESC_LEN * core->mac[r->dh];
|
||||
}
|
||||
|
||||
static inline void
|
||||
e1000e_ring_advance(E1000ECore *core, const E1000E_RingInfo *r, uint32_t count)
|
||||
e1000e_ring_advance(E1000ECore *core, const E1000ERingInfo *r, uint32_t count)
|
||||
{
|
||||
core->mac[r->dh] += count;
|
||||
|
||||
@@ -852,7 +852,7 @@ e1000e_ring_advance(E1000ECore *core, const E1000E_RingInfo *r, uint32_t count)
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
e1000e_ring_free_descr_num(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
e1000e_ring_free_descr_num(E1000ECore *core, const E1000ERingInfo *r)
|
||||
{
|
||||
trace_e1000e_ring_free_space(r->idx, core->mac[r->dlen],
|
||||
core->mac[r->dh], core->mac[r->dt]);
|
||||
@@ -871,19 +871,19 @@ e1000e_ring_free_descr_num(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
}
|
||||
|
||||
static inline bool
|
||||
e1000e_ring_enabled(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
e1000e_ring_enabled(E1000ECore *core, const E1000ERingInfo *r)
|
||||
{
|
||||
return core->mac[r->dlen] > 0;
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
e1000e_ring_len(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
e1000e_ring_len(E1000ECore *core, const E1000ERingInfo *r)
|
||||
{
|
||||
return core->mac[r->dlen];
|
||||
}
|
||||
|
||||
typedef struct E1000E_TxRing_st {
|
||||
const E1000E_RingInfo *i;
|
||||
const E1000ERingInfo *i;
|
||||
struct e1000e_tx *tx;
|
||||
} E1000E_TxRing;
|
||||
|
||||
@@ -896,7 +896,7 @@ e1000e_mq_queue_idx(int base_reg_idx, int reg_idx)
|
||||
static inline void
|
||||
e1000e_tx_ring_init(E1000ECore *core, E1000E_TxRing *txr, int idx)
|
||||
{
|
||||
static const E1000E_RingInfo i[E1000E_NUM_QUEUES] = {
|
||||
static const E1000ERingInfo i[E1000E_NUM_QUEUES] = {
|
||||
{ TDBAH, TDBAL, TDLEN, TDH, TDT, 0 },
|
||||
{ TDBAH1, TDBAL1, TDLEN1, TDH1, TDT1, 1 }
|
||||
};
|
||||
@@ -908,13 +908,13 @@ e1000e_tx_ring_init(E1000ECore *core, E1000E_TxRing *txr, int idx)
|
||||
}
|
||||
|
||||
typedef struct E1000E_RxRing_st {
|
||||
const E1000E_RingInfo *i;
|
||||
const E1000ERingInfo *i;
|
||||
} E1000E_RxRing;
|
||||
|
||||
static inline void
|
||||
e1000e_rx_ring_init(E1000ECore *core, E1000E_RxRing *rxr, int idx)
|
||||
{
|
||||
static const E1000E_RingInfo i[E1000E_NUM_QUEUES] = {
|
||||
static const E1000ERingInfo i[E1000E_NUM_QUEUES] = {
|
||||
{ RDBAH0, RDBAL0, RDLEN0, RDH0, RDT0, 0 },
|
||||
{ RDBAH1, RDBAL1, RDLEN1, RDH1, RDT1, 1 }
|
||||
};
|
||||
@@ -930,7 +930,7 @@ e1000e_start_xmit(E1000ECore *core, const E1000E_TxRing *txr)
|
||||
dma_addr_t base;
|
||||
struct e1000_tx_desc desc;
|
||||
bool ide = false;
|
||||
const E1000E_RingInfo *txi = txr->i;
|
||||
const E1000ERingInfo *txi = txr->i;
|
||||
uint32_t cause = E1000_ICS_TXQE;
|
||||
|
||||
if (!(core->mac[TCTL] & E1000_TCTL_EN)) {
|
||||
@@ -960,7 +960,7 @@ e1000e_start_xmit(E1000ECore *core, const E1000E_TxRing *txr)
|
||||
}
|
||||
|
||||
static bool
|
||||
e1000e_has_rxbufs(E1000ECore *core, const E1000E_RingInfo *r,
|
||||
e1000e_has_rxbufs(E1000ECore *core, const E1000ERingInfo *r,
|
||||
size_t total_size)
|
||||
{
|
||||
uint32_t bufs = e1000e_ring_free_descr_num(core, r);
|
||||
@@ -1397,17 +1397,17 @@ e1000e_pci_dma_write_rx_desc(E1000ECore *core, dma_addr_t addr,
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct e1000e_ba_state_st {
|
||||
typedef struct E1000EBAState {
|
||||
uint16_t written[MAX_PS_BUFFERS];
|
||||
uint8_t cur_idx;
|
||||
} e1000e_ba_state;
|
||||
} E1000EBAState;
|
||||
|
||||
static inline void
|
||||
e1000e_write_hdr_to_rx_buffers(E1000ECore *core,
|
||||
hwaddr ba[MAX_PS_BUFFERS],
|
||||
e1000e_ba_state *bastate,
|
||||
const char *data,
|
||||
dma_addr_t data_len)
|
||||
e1000e_write_hdr_frag_to_rx_buffers(E1000ECore *core,
|
||||
hwaddr ba[MAX_PS_BUFFERS],
|
||||
E1000EBAState *bastate,
|
||||
const char *data,
|
||||
dma_addr_t data_len)
|
||||
{
|
||||
assert(data_len <= core->rxbuf_sizes[0] - bastate->written[0]);
|
||||
|
||||
@@ -1418,11 +1418,11 @@ e1000e_write_hdr_to_rx_buffers(E1000ECore *core,
|
||||
}
|
||||
|
||||
static void
|
||||
e1000e_write_to_rx_buffers(E1000ECore *core,
|
||||
hwaddr ba[MAX_PS_BUFFERS],
|
||||
e1000e_ba_state *bastate,
|
||||
const char *data,
|
||||
dma_addr_t data_len)
|
||||
e1000e_write_payload_frag_to_rx_buffers(E1000ECore *core,
|
||||
hwaddr ba[MAX_PS_BUFFERS],
|
||||
E1000EBAState *bastate,
|
||||
const char *data,
|
||||
dma_addr_t data_len)
|
||||
{
|
||||
while (data_len > 0) {
|
||||
uint32_t cur_buf_len = core->rxbuf_sizes[bastate->cur_idx];
|
||||
@@ -1460,7 +1460,7 @@ e1000e_update_rx_stats(E1000ECore *core, size_t pkt_size, size_t pkt_fcs_size)
|
||||
}
|
||||
|
||||
static inline bool
|
||||
e1000e_rx_descr_threshold_hit(E1000ECore *core, const E1000E_RingInfo *rxi)
|
||||
e1000e_rx_descr_threshold_hit(E1000ECore *core, const E1000ERingInfo *rxi)
|
||||
{
|
||||
return e1000e_ring_free_descr_num(core, rxi) ==
|
||||
e1000e_ring_len(core, rxi) >> core->rxbuf_min_shift;
|
||||
@@ -1521,7 +1521,7 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
||||
struct iovec *iov = net_rx_pkt_get_iovec(pkt);
|
||||
size_t size = net_rx_pkt_get_total_len(pkt);
|
||||
size_t total_size = size + e1000x_fcs_len(core->mac);
|
||||
const E1000E_RingInfo *rxi;
|
||||
const E1000ERingInfo *rxi;
|
||||
size_t ps_hdr_len = 0;
|
||||
bool do_ps = e1000e_do_ps(core, pkt, &ps_hdr_len);
|
||||
bool is_first = true;
|
||||
@@ -1530,7 +1530,7 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
||||
|
||||
do {
|
||||
hwaddr ba[MAX_PS_BUFFERS];
|
||||
e1000e_ba_state bastate = { { 0 } };
|
||||
E1000EBAState bastate = { { 0 } };
|
||||
bool is_last = false;
|
||||
|
||||
desc_size = total_size - desc_offset;
|
||||
@@ -1568,8 +1568,10 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
||||
iov_copy = MIN(ps_hdr_len - ps_hdr_copied,
|
||||
iov->iov_len - iov_ofs);
|
||||
|
||||
e1000e_write_hdr_to_rx_buffers(core, ba, &bastate,
|
||||
iov->iov_base, iov_copy);
|
||||
e1000e_write_hdr_frag_to_rx_buffers(core, ba,
|
||||
&bastate,
|
||||
iov->iov_base,
|
||||
iov_copy);
|
||||
|
||||
copy_size -= iov_copy;
|
||||
ps_hdr_copied += iov_copy;
|
||||
@@ -1585,8 +1587,8 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
||||
} else {
|
||||
/* Leave buffer 0 of each descriptor except first */
|
||||
/* empty as per spec 7.1.5.1 */
|
||||
e1000e_write_hdr_to_rx_buffers(core, ba, &bastate,
|
||||
NULL, 0);
|
||||
e1000e_write_hdr_frag_to_rx_buffers(core, ba, &bastate,
|
||||
NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1594,8 +1596,10 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
||||
while (copy_size) {
|
||||
iov_copy = MIN(copy_size, iov->iov_len - iov_ofs);
|
||||
|
||||
e1000e_write_to_rx_buffers(core, ba, &bastate,
|
||||
iov->iov_base + iov_ofs, iov_copy);
|
||||
e1000e_write_payload_frag_to_rx_buffers(core, ba, &bastate,
|
||||
iov->iov_base +
|
||||
iov_ofs,
|
||||
iov_copy);
|
||||
|
||||
copy_size -= iov_copy;
|
||||
iov_ofs += iov_copy;
|
||||
@@ -1607,7 +1611,7 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
||||
|
||||
if (desc_offset + desc_size >= total_size) {
|
||||
/* Simulate FCS checksum presence in the last descriptor */
|
||||
e1000e_write_to_rx_buffers(core, ba, &bastate,
|
||||
e1000e_write_payload_frag_to_rx_buffers(core, ba, &bastate,
|
||||
(const char *) &fcs_pad, e1000x_fcs_len(core->mac));
|
||||
}
|
||||
}
|
||||
@@ -2852,7 +2856,7 @@ e1000e_update_rx_offloads(E1000ECore *core)
|
||||
|
||||
if (core->has_vnet) {
|
||||
qemu_set_offload(qemu_get_queue(core->owner_nic)->peer,
|
||||
cso_state, 0, 0, 0, 0);
|
||||
cso_state, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -372,6 +372,12 @@ void etsec_walk_tx_ring(eTSEC *etsec, int ring_nbr)
|
||||
etsec->regs[TSTAT].value |= 1 << (31 - ring_nbr);
|
||||
}
|
||||
|
||||
/*
|
||||
* rx_init_frame() ensures we never do more padding than this
|
||||
* (checksum plus minimum data packet size)
|
||||
*/
|
||||
#define MAX_RX_PADDING 64
|
||||
|
||||
static void fill_rx_bd(eTSEC *etsec,
|
||||
eTSEC_rxtx_bd *bd,
|
||||
const uint8_t **buf,
|
||||
@@ -380,9 +386,11 @@ static void fill_rx_bd(eTSEC *etsec,
|
||||
uint16_t to_write;
|
||||
hwaddr bufptr = bd->bufptr +
|
||||
((hwaddr)(etsec->regs[TBDBPH].value & 0xF) << 32);
|
||||
uint8_t padd[etsec->rx_padding];
|
||||
uint8_t padd[MAX_RX_PADDING];
|
||||
uint8_t rem;
|
||||
|
||||
assert(etsec->rx_padding <= MAX_RX_PADDING);
|
||||
|
||||
RING_DEBUG("eTSEC fill Rx buffer @ 0x%016" HWADDR_PRIx
|
||||
" size:%zu(padding + crc:%u) + fcb:%u\n",
|
||||
bufptr, *size, etsec->rx_padding, etsec->rx_fcb_size);
|
||||
@@ -426,7 +434,7 @@ static void fill_rx_bd(eTSEC *etsec,
|
||||
rem = MIN(etsec->regs[MRBLR].value - bd->length, etsec->rx_padding);
|
||||
|
||||
if (rem > 0) {
|
||||
memset(padd, 0x0, sizeof(padd));
|
||||
memset(padd, 0x0, rem);
|
||||
etsec->rx_padding -= rem;
|
||||
*size -= rem;
|
||||
bd->length += rem;
|
||||
|
||||
+527
-203
File diff suppressed because it is too large
Load Diff
+15
-5
@@ -452,6 +452,7 @@ union e1000_adv_rx_desc {
|
||||
#define E1000_SRRCTL_BSIZEHDRSIZE_MASK 0x00000F00
|
||||
#define E1000_SRRCTL_BSIZEHDRSIZE_SHIFT 2 /* Shift _left_ */
|
||||
#define E1000_SRRCTL_DESCTYPE_ADV_ONEBUF 0x02000000
|
||||
#define E1000_SRRCTL_DESCTYPE_HDR_SPLIT 0x04000000
|
||||
#define E1000_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS 0x0A000000
|
||||
#define E1000_SRRCTL_DESCTYPE_MASK 0x0E000000
|
||||
#define E1000_SRRCTL_DROP_EN 0x80000000
|
||||
@@ -692,11 +693,20 @@ union e1000_adv_rx_desc {
|
||||
|
||||
#define E1000_STATUS_NUM_VFS_SHIFT 14
|
||||
|
||||
#define E1000_ADVRXD_PKT_IP4 BIT(4)
|
||||
#define E1000_ADVRXD_PKT_IP6 BIT(6)
|
||||
#define E1000_ADVRXD_PKT_TCP BIT(8)
|
||||
#define E1000_ADVRXD_PKT_UDP BIT(9)
|
||||
#define E1000_ADVRXD_PKT_SCTP BIT(10)
|
||||
#define E1000_ADVRXD_PKT_IP4 BIT(0)
|
||||
#define E1000_ADVRXD_PKT_IP6 BIT(2)
|
||||
#define E1000_ADVRXD_PKT_IP6E BIT(3)
|
||||
#define E1000_ADVRXD_PKT_TCP BIT(4)
|
||||
#define E1000_ADVRXD_PKT_UDP BIT(5)
|
||||
#define E1000_ADVRXD_PKT_SCTP BIT(6)
|
||||
|
||||
#define IGB_MAX_PS_BUFFERS 2
|
||||
|
||||
#define E1000_ADVRXD_HDR_LEN_OFFSET (21 - 16)
|
||||
#define E1000_ADVRXD_ADV_HDR_LEN_MASK ((BIT(10) - 1) << \
|
||||
E1000_ADVRXD_HDR_LEN_OFFSET)
|
||||
#define E1000_ADVRXD_HDR_SPH BIT(15)
|
||||
#define E1000_ADVRXD_ST_ERR_HBO_OFFSET BIT(3 + 20)
|
||||
|
||||
static inline uint8_t igb_ivar_entry_rx(uint8_t i)
|
||||
{
|
||||
|
||||
@@ -1043,7 +1043,7 @@ static void of_dpa_flow_ig_tbl(OfDpaFlowContext *fc, uint32_t tbl_id)
|
||||
static ssize_t of_dpa_ig(World *world, uint32_t pport,
|
||||
const struct iovec *iov, int iovcnt)
|
||||
{
|
||||
struct iovec iov_copy[iovcnt + 2];
|
||||
g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 2);
|
||||
OfDpaFlowContext fc = {
|
||||
.of_dpa = world_private(world),
|
||||
.in_pport = pport,
|
||||
|
||||
+4
-2
@@ -278,9 +278,9 @@ igb_core_mdic_write_unhandled(uint32_t addr) "MDIC WRITE: PHY[%u] UNHANDLED"
|
||||
igb_link_set_ext_params(bool asd_check, bool speed_select_bypass, bool pfrstd) "Set extended link params: ASD check: %d, Speed select bypass: %d, PF reset done: %d"
|
||||
|
||||
igb_rx_desc_buff_size(uint32_t b) "buffer size: %u"
|
||||
igb_rx_desc_buff_write(uint64_t addr, uint16_t offset, const void* source, uint32_t len) "addr: 0x%"PRIx64", offset: %u, from: %p, length: %u"
|
||||
igb_rx_desc_buff_write(uint8_t idx, uint64_t addr, uint16_t offset, const void* source, uint32_t len) "buffer %u, addr: 0x%"PRIx64", offset: %u, from: %p, length: %u"
|
||||
|
||||
igb_rx_metadata_rss(uint32_t rss) "RSS data: 0x%X"
|
||||
igb_rx_metadata_rss(uint32_t rss, uint16_t rss_pkt_type) "RSS data: rss: 0x%X, rss_pkt_type: 0x%X"
|
||||
|
||||
igb_irq_icr_clear_gpie_nsicr(void) "Clearing ICR on read due to GPIE.NSICR enabled"
|
||||
igb_irq_set_iam(uint32_t icr) "Update IAM: 0x%x"
|
||||
@@ -295,6 +295,8 @@ igb_irq_eitr_set(uint32_t eitr_num, uint32_t val) "EITR[%u] = 0x%x"
|
||||
igb_set_pfmailbox(uint32_t vf_num, uint32_t val) "PFMailbox[%d]: 0x%x"
|
||||
igb_set_vfmailbox(uint32_t vf_num, uint32_t val) "VFMailbox[%d]: 0x%x"
|
||||
|
||||
igb_wrn_rx_desc_modes_not_supp(int desc_type) "Not supported descriptor type: %d"
|
||||
|
||||
# igbvf.c
|
||||
igbvf_wrn_io_addr_unknown(uint64_t addr) "IO unknown register 0x%"PRIx64
|
||||
|
||||
|
||||
@@ -78,6 +78,9 @@ static const int user_feature_bits[] = {
|
||||
VIRTIO_F_RING_RESET,
|
||||
VIRTIO_NET_F_RSS,
|
||||
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,
|
||||
|
||||
+32
-3
@@ -659,6 +659,15 @@ static int peer_has_ufo(VirtIONet *n)
|
||||
return n->has_ufo;
|
||||
}
|
||||
|
||||
static int peer_has_uso(VirtIONet *n)
|
||||
{
|
||||
if (!peer_has_vnet_hdr(n)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return qemu_has_uso(qemu_get_queue(n->nic)->peer);
|
||||
}
|
||||
|
||||
static void virtio_net_set_mrg_rx_bufs(VirtIONet *n, int mergeable_rx_bufs,
|
||||
int version_1, int hash_report)
|
||||
{
|
||||
@@ -796,6 +805,10 @@ static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features,
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO6);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_ECN);
|
||||
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_USO);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO6);
|
||||
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HASH_REPORT);
|
||||
}
|
||||
|
||||
@@ -804,6 +817,12 @@ static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features,
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_UFO);
|
||||
}
|
||||
|
||||
if (!peer_has_uso(n)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_USO);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO6);
|
||||
}
|
||||
|
||||
if (!get_vhost_net(nc->peer)) {
|
||||
return features;
|
||||
}
|
||||
@@ -859,17 +878,21 @@ static void virtio_net_apply_guest_offloads(VirtIONet *n)
|
||||
!!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO4)),
|
||||
!!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO6)),
|
||||
!!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_ECN)),
|
||||
!!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_UFO)));
|
||||
!!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_UFO)),
|
||||
!!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_USO4)),
|
||||
!!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_USO6)));
|
||||
}
|
||||
|
||||
static uint64_t virtio_net_guest_offloads_by_features(uint32_t features)
|
||||
static uint64_t virtio_net_guest_offloads_by_features(uint64_t features)
|
||||
{
|
||||
static const uint64_t guest_offloads_mask =
|
||||
(1ULL << VIRTIO_NET_F_GUEST_CSUM) |
|
||||
(1ULL << VIRTIO_NET_F_GUEST_TSO4) |
|
||||
(1ULL << VIRTIO_NET_F_GUEST_TSO6) |
|
||||
(1ULL << VIRTIO_NET_F_GUEST_ECN) |
|
||||
(1ULL << VIRTIO_NET_F_GUEST_UFO);
|
||||
(1ULL << VIRTIO_NET_F_GUEST_UFO) |
|
||||
(1ULL << VIRTIO_NET_F_GUEST_USO4) |
|
||||
(1ULL << VIRTIO_NET_F_GUEST_USO6);
|
||||
|
||||
return guest_offloads_mask & features;
|
||||
}
|
||||
@@ -3922,6 +3945,12 @@ static Property virtio_net_properties[] = {
|
||||
DEFINE_PROP_INT32("speed", VirtIONet, net_conf.speed, SPEED_UNKNOWN),
|
||||
DEFINE_PROP_STRING("duplex", VirtIONet, net_conf.duplex_str),
|
||||
DEFINE_PROP_BOOL("failover", VirtIONet, failover, false),
|
||||
DEFINE_PROP_BIT64("guest_uso4", VirtIONet, host_features,
|
||||
VIRTIO_NET_F_GUEST_USO4, true),
|
||||
DEFINE_PROP_BIT64("guest_uso6", VirtIONet, host_features,
|
||||
VIRTIO_NET_F_GUEST_USO6, true),
|
||||
DEFINE_PROP_BIT64("host_uso", VirtIONet, host_features,
|
||||
VIRTIO_NET_F_HOST_USO, true),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
||||
@@ -1341,6 +1341,8 @@ static void vmxnet3_update_features(VMXNET3State *s)
|
||||
s->lro_supported,
|
||||
s->lro_supported,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
+5
-2
@@ -54,11 +54,12 @@ typedef void (LinkStatusChanged)(NetClientState *);
|
||||
typedef void (NetClientDestructor)(NetClientState *);
|
||||
typedef RxFilterInfo *(QueryRxFilter)(NetClientState *);
|
||||
typedef bool (HasUfo)(NetClientState *);
|
||||
typedef bool (HasUso)(NetClientState *);
|
||||
typedef bool (HasVnetHdr)(NetClientState *);
|
||||
typedef bool (HasVnetHdrLen)(NetClientState *, int);
|
||||
typedef bool (GetUsingVnetHdr)(NetClientState *);
|
||||
typedef void (UsingVnetHdr)(NetClientState *, bool);
|
||||
typedef void (SetOffload)(NetClientState *, int, int, int, int, int);
|
||||
typedef void (SetOffload)(NetClientState *, int, int, int, int, int, int, int);
|
||||
typedef int (GetVnetHdrLen)(NetClientState *);
|
||||
typedef void (SetVnetHdrLen)(NetClientState *, int);
|
||||
typedef int (SetVnetLE)(NetClientState *, bool);
|
||||
@@ -84,6 +85,7 @@ typedef struct NetClientInfo {
|
||||
QueryRxFilter *query_rx_filter;
|
||||
NetPoll *poll;
|
||||
HasUfo *has_ufo;
|
||||
HasUso *has_uso;
|
||||
HasVnetHdr *has_vnet_hdr;
|
||||
HasVnetHdrLen *has_vnet_hdr_len;
|
||||
GetUsingVnetHdr *get_using_vnet_hdr;
|
||||
@@ -187,12 +189,13 @@ void qemu_set_info_str(NetClientState *nc,
|
||||
const char *fmt, ...) G_GNUC_PRINTF(2, 3);
|
||||
void qemu_format_nic_info_str(NetClientState *nc, uint8_t macaddr[6]);
|
||||
bool qemu_has_ufo(NetClientState *nc);
|
||||
bool qemu_has_uso(NetClientState *nc);
|
||||
bool qemu_has_vnet_hdr(NetClientState *nc);
|
||||
bool qemu_has_vnet_hdr_len(NetClientState *nc, int len);
|
||||
bool qemu_get_using_vnet_hdr(NetClientState *nc);
|
||||
void qemu_using_vnet_hdr(NetClientState *nc, bool enable);
|
||||
void qemu_set_offload(NetClientState *nc, int csum, int tso4, int tso6,
|
||||
int ecn, int ufo);
|
||||
int ecn, int ufo, int uso4, int uso6);
|
||||
int qemu_get_vnet_hdr_len(NetClientState *nc);
|
||||
void qemu_set_vnet_hdr_len(NetClientState *nc, int len);
|
||||
int qemu_set_vnet_le(NetClientState *nc, bool is_le);
|
||||
|
||||
@@ -1873,6 +1873,13 @@ if libbpf.found() and not cc.links('''
|
||||
endif
|
||||
endif
|
||||
|
||||
# libxdp
|
||||
libxdp = not_found
|
||||
if not get_option('af_xdp').auto() or have_system
|
||||
libxdp = dependency('libxdp', required: get_option('af_xdp'),
|
||||
version: '>=1.4.0', method: 'pkg-config')
|
||||
endif
|
||||
|
||||
# libdw
|
||||
libdw = not_found
|
||||
if not get_option('libdw').auto() or \
|
||||
@@ -2099,6 +2106,7 @@ config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_pars
|
||||
config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
|
||||
config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
|
||||
config_host_data.set('CONFIG_EBPF', libbpf.found())
|
||||
config_host_data.set('CONFIG_AF_XDP', libxdp.found())
|
||||
config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
|
||||
config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
|
||||
config_host_data.set('CONFIG_LIBNFS', libnfs.found())
|
||||
@@ -4270,6 +4278,7 @@ summary_info = {}
|
||||
if targetos == 'darwin'
|
||||
summary_info += {'vmnet.framework support': vmnet}
|
||||
endif
|
||||
summary_info += {'AF_XDP support': libxdp}
|
||||
summary_info += {'slirp support': slirp}
|
||||
summary_info += {'vde support': vde}
|
||||
summary_info += {'netmap support': have_netmap}
|
||||
|
||||
@@ -122,6 +122,8 @@ option('avx512bw', type: 'feature', value: 'auto',
|
||||
option('keyring', type: 'feature', value: 'auto',
|
||||
description: 'Linux keyring support')
|
||||
|
||||
option('af_xdp', type : 'feature', value : 'auto',
|
||||
description: 'AF_XDP network backend support')
|
||||
option('attr', type : 'feature', value : 'auto',
|
||||
description: 'attr/xattr support')
|
||||
option('auth_pam', type : 'feature', value : 'auto',
|
||||
|
||||
+526
File diff suppressed because it is too large
Load Diff
@@ -64,6 +64,11 @@ int net_init_netmap(const Netdev *netdev, const char *name,
|
||||
NetClientState *peer, Error **errp);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AF_XDP
|
||||
int net_init_af_xdp(const Netdev *netdev, const char *name,
|
||||
NetClientState *peer, Error **errp);
|
||||
#endif
|
||||
|
||||
int net_init_vhost_user(const Netdev *netdev, const char *name,
|
||||
NetClientState *peer, Error **errp);
|
||||
|
||||
|
||||
+1
-1
@@ -68,7 +68,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct iovec *iov, int cnt,
|
||||
int64_t ts;
|
||||
int caplen;
|
||||
size_t size = iov_size(iov, cnt) - offset;
|
||||
struct iovec dumpiov[cnt + 1];
|
||||
g_autofree struct iovec *dumpiov = g_new(struct iovec, cnt + 1);
|
||||
|
||||
/* Early return in case of previous error. */
|
||||
if (s->fd < 0) {
|
||||
|
||||
@@ -36,6 +36,9 @@ system_ss.add(when: vde, if_true: files('vde.c'))
|
||||
if have_netmap
|
||||
system_ss.add(files('netmap.c'))
|
||||
endif
|
||||
|
||||
system_ss.add(when: libxdp, if_true: files('af-xdp.c'))
|
||||
|
||||
if have_vhost_net_user
|
||||
system_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('vhost-user.c'), if_false: files('vhost-user-stub.c'))
|
||||
system_ss.add(when: 'CONFIG_ALL', if_true: files('vhost-user-stub.c'))
|
||||
|
||||
@@ -495,6 +495,15 @@ bool qemu_has_ufo(NetClientState *nc)
|
||||
return nc->info->has_ufo(nc);
|
||||
}
|
||||
|
||||
bool qemu_has_uso(NetClientState *nc)
|
||||
{
|
||||
if (!nc || !nc->info->has_uso) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return nc->info->has_uso(nc);
|
||||
}
|
||||
|
||||
bool qemu_has_vnet_hdr(NetClientState *nc)
|
||||
{
|
||||
if (!nc || !nc->info->has_vnet_hdr) {
|
||||
@@ -532,13 +541,13 @@ void qemu_using_vnet_hdr(NetClientState *nc, bool enable)
|
||||
}
|
||||
|
||||
void qemu_set_offload(NetClientState *nc, int csum, int tso4, int tso6,
|
||||
int ecn, int ufo)
|
||||
int ecn, int ufo, int uso4, int uso6)
|
||||
{
|
||||
if (!nc || !nc->info->set_offload) {
|
||||
return;
|
||||
}
|
||||
|
||||
nc->info->set_offload(nc, csum, tso4, tso6, ecn, ufo);
|
||||
nc->info->set_offload(nc, csum, tso4, tso6, ecn, ufo, uso4, uso6);
|
||||
}
|
||||
|
||||
int qemu_get_vnet_hdr_len(NetClientState *nc)
|
||||
@@ -1082,6 +1091,9 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
|
||||
#ifdef CONFIG_NETMAP
|
||||
[NET_CLIENT_DRIVER_NETMAP] = net_init_netmap,
|
||||
#endif
|
||||
#ifdef CONFIG_AF_XDP
|
||||
[NET_CLIENT_DRIVER_AF_XDP] = net_init_af_xdp,
|
||||
#endif
|
||||
#ifdef CONFIG_NET_BRIDGE
|
||||
[NET_CLIENT_DRIVER_BRIDGE] = net_init_bridge,
|
||||
#endif
|
||||
@@ -1186,6 +1198,9 @@ void show_netdevs(void)
|
||||
#ifdef CONFIG_NETMAP
|
||||
"netmap",
|
||||
#endif
|
||||
#ifdef CONFIG_AF_XDP
|
||||
"af-xdp",
|
||||
#endif
|
||||
#ifdef CONFIG_POSIX
|
||||
"vhost-user",
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user