-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJWkzwIAAoJEO8Ells5jWIRJsIH/0xdLQwA8iyqtNSZNJJCjDx5 a4YQ7UkAg2m2XOL+M2WeN7uPiDgN02IEP1/OB6uJmhggngatqZQZDF2h2IX01XFL 8VE4L0mQcQz28e9bL7dlHk8UBbrOPRe3v1jAvMDE3Rg+IR1XTyp8ebGtb6h6ChJt aJbYdPxflC2/aYYnh/RipXHvkRrvM4VjfLstBXo4ZfRXG5CEIaGRSLQ2iVnsr+5y Poj1tN4CpB6p4avK+QgCd/DK17Wrzgp4H/sItEzbv7L/DWeqhPi/5I/WmjZooHWC +RKSJamch4vcq+EQGQ4v8uEn/n2oUPH3q4HPMTvfhswsWWrjvz+XMt8i+vUfgwo= =EQyg -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging # gpg: Signature made Mon 11 Jan 2016 05:22:16 GMT using RSA key ID 398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * remotes/jasowang/tags/net-pull-request: (24 commits) ether/slirp: Avoid redefinition of the same constants l2tpv3: fix cookie decoding net: ne2000: fix bounds check in ioport operations net: rocker: fix an incorrect array bounds check vmxnet3: Introduce 'x-disable-pcie' back-compat property vmxnet3: Report the Device Serial Number capability vmxnet3: The vmxnet3 device is a PCIE endpoint vmxnet3: coding: Introduce VMXNET3Class vmxnet3: Introduce 'x-old-msi-offsets' back-compat property vmxnet3: Change the offset of the MSIX PBA table vmxnet3: Change offsets of msi/msix pci capabilities net/filter: fix nf->netdev_id leak net/dump: fix nfds->filename leak net/vmxnet3: rename VMXNET3_DEVICE_VERSION to VMXNET3_UPT_REVISION net/vmxnet3: return 0 on unknown command net/vmxnet3: return correct value for VMXNET3_CMD_GET_DEV_EXTRA_INFO net/vmxnet3: return correct value for VMXNET3_CMD_GET_DID_* command net/vmxnet3: return 1 on device activation failure MAINTAINERS: Add an entry for the net/slirp.c file net: vmxnet3: avoid memory leakage in activate_device ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>stable-2.6
commit
cc06ca4c97
|
@ -1199,6 +1199,7 @@ SLIRP
|
||||||
M: Jan Kiszka <jan.kiszka@siemens.com>
|
M: Jan Kiszka <jan.kiszka@siemens.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: slirp/
|
F: slirp/
|
||||||
|
F: net/slirp.c
|
||||||
T: git git://git.kiszka.org/qemu.git queues/slirp
|
T: git git://git.kiszka.org/qemu.git queues/slirp
|
||||||
|
|
||||||
Tracing
|
Tracing
|
||||||
|
|
|
@ -467,8 +467,9 @@ static inline void ne2000_mem_writel(NE2000State *s, uint32_t addr,
|
||||||
uint32_t val)
|
uint32_t val)
|
||||||
{
|
{
|
||||||
addr &= ~1; /* XXX: check exact behaviour if not even */
|
addr &= ~1; /* XXX: check exact behaviour if not even */
|
||||||
if (addr < 32 ||
|
if (addr < 32
|
||||||
(addr >= NE2000_PMEM_START && addr < NE2000_MEM_SIZE)) {
|
|| (addr >= NE2000_PMEM_START
|
||||||
|
&& addr + sizeof(uint32_t) <= NE2000_MEM_SIZE)) {
|
||||||
stl_le_p(s->mem + addr, val);
|
stl_le_p(s->mem + addr, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -497,8 +498,9 @@ static inline uint32_t ne2000_mem_readw(NE2000State *s, uint32_t addr)
|
||||||
static inline uint32_t ne2000_mem_readl(NE2000State *s, uint32_t addr)
|
static inline uint32_t ne2000_mem_readl(NE2000State *s, uint32_t addr)
|
||||||
{
|
{
|
||||||
addr &= ~1; /* XXX: check exact behaviour if not even */
|
addr &= ~1; /* XXX: check exact behaviour if not even */
|
||||||
if (addr < 32 ||
|
if (addr < 32
|
||||||
(addr >= NE2000_PMEM_START && addr < NE2000_MEM_SIZE)) {
|
|| (addr >= NE2000_PMEM_START
|
||||||
|
&& addr + sizeof(uint32_t) <= NE2000_MEM_SIZE)) {
|
||||||
return ldl_le_p(s->mem + addr);
|
return ldl_le_p(s->mem + addr);
|
||||||
} else {
|
} else {
|
||||||
return 0xffffffff;
|
return 0xffffffff;
|
||||||
|
|
|
@ -232,6 +232,9 @@ static int tx_consume(Rocker *r, DescInfo *info)
|
||||||
frag_addr = rocker_tlv_get_le64(tlvs[ROCKER_TLV_TX_FRAG_ATTR_ADDR]);
|
frag_addr = rocker_tlv_get_le64(tlvs[ROCKER_TLV_TX_FRAG_ATTR_ADDR]);
|
||||||
frag_len = rocker_tlv_get_le16(tlvs[ROCKER_TLV_TX_FRAG_ATTR_LEN]);
|
frag_len = rocker_tlv_get_le16(tlvs[ROCKER_TLV_TX_FRAG_ATTR_LEN]);
|
||||||
|
|
||||||
|
if (iovcnt >= ROCKER_TX_FRAGS_MAX) {
|
||||||
|
goto err_too_many_frags;
|
||||||
|
}
|
||||||
iov[iovcnt].iov_len = frag_len;
|
iov[iovcnt].iov_len = frag_len;
|
||||||
iov[iovcnt].iov_base = g_malloc(frag_len);
|
iov[iovcnt].iov_base = g_malloc(frag_len);
|
||||||
if (!iov[iovcnt].iov_base) {
|
if (!iov[iovcnt].iov_base) {
|
||||||
|
@ -244,10 +247,7 @@ static int tx_consume(Rocker *r, DescInfo *info)
|
||||||
err = -ROCKER_ENXIO;
|
err = -ROCKER_ENXIO;
|
||||||
goto err_bad_io;
|
goto err_bad_io;
|
||||||
}
|
}
|
||||||
|
iovcnt++;
|
||||||
if (++iovcnt > ROCKER_TX_FRAGS_MAX) {
|
|
||||||
goto err_too_many_frags;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iovcnt) {
|
if (iovcnt) {
|
||||||
|
|
|
@ -74,7 +74,6 @@
|
||||||
( ( input ) & ( size - 1 ) )
|
( ( input ) & ( size - 1 ) )
|
||||||
|
|
||||||
#define ETHER_TYPE_LEN 2
|
#define ETHER_TYPE_LEN 2
|
||||||
#define ETH_HLEN (ETH_ALEN * 2 + ETHER_TYPE_LEN)
|
|
||||||
#define ETH_MTU 1500
|
#define ETH_MTU 1500
|
||||||
|
|
||||||
#define VLAN_TCI_LEN 2
|
#define VLAN_TCI_LEN 2
|
||||||
|
|
|
@ -18,10 +18,7 @@
|
||||||
#define VMWARE_UTILS_H
|
#define VMWARE_UTILS_H
|
||||||
|
|
||||||
#include "qemu/range.h"
|
#include "qemu/range.h"
|
||||||
|
#include "vmxnet_debug.h"
|
||||||
#ifndef VMW_SHPRN
|
|
||||||
#define VMW_SHPRN(fmt, ...) do {} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shared memory access functions with byte swap support
|
* Shared memory access functions with byte swap support
|
||||||
|
|
175
hw/net/vmxnet3.c
175
hw/net/vmxnet3.c
|
@ -36,12 +36,28 @@
|
||||||
#define VMXNET3_MSIX_BAR_SIZE 0x2000
|
#define VMXNET3_MSIX_BAR_SIZE 0x2000
|
||||||
#define MIN_BUF_SIZE 60
|
#define MIN_BUF_SIZE 60
|
||||||
|
|
||||||
|
/* Compatability flags for migration */
|
||||||
|
#define VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS_BIT 0
|
||||||
|
#define VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS \
|
||||||
|
(1 << VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS_BIT)
|
||||||
|
#define VMXNET3_COMPAT_FLAG_DISABLE_PCIE_BIT 1
|
||||||
|
#define VMXNET3_COMPAT_FLAG_DISABLE_PCIE \
|
||||||
|
(1 << VMXNET3_COMPAT_FLAG_DISABLE_PCIE_BIT)
|
||||||
|
|
||||||
|
#define VMXNET3_EXP_EP_OFFSET (0x48)
|
||||||
|
#define VMXNET3_MSI_OFFSET(s) \
|
||||||
|
((s)->compat_flags & VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS ? 0x50 : 0x84)
|
||||||
|
#define VMXNET3_MSIX_OFFSET(s) \
|
||||||
|
((s)->compat_flags & VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS ? 0 : 0x9c)
|
||||||
|
#define VMXNET3_DSN_OFFSET (0x100)
|
||||||
|
|
||||||
#define VMXNET3_BAR0_IDX (0)
|
#define VMXNET3_BAR0_IDX (0)
|
||||||
#define VMXNET3_BAR1_IDX (1)
|
#define VMXNET3_BAR1_IDX (1)
|
||||||
#define VMXNET3_MSIX_BAR_IDX (2)
|
#define VMXNET3_MSIX_BAR_IDX (2)
|
||||||
|
|
||||||
#define VMXNET3_OFF_MSIX_TABLE (0x000)
|
#define VMXNET3_OFF_MSIX_TABLE (0x000)
|
||||||
#define VMXNET3_OFF_MSIX_PBA (0x800)
|
#define VMXNET3_OFF_MSIX_PBA(s) \
|
||||||
|
((s)->compat_flags & VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS ? 0x800 : 0x1000)
|
||||||
|
|
||||||
/* Link speed in Mbps should be shifted by 16 */
|
/* Link speed in Mbps should be shifted by 16 */
|
||||||
#define VMXNET3_LINK_SPEED (1000 << 16)
|
#define VMXNET3_LINK_SPEED (1000 << 16)
|
||||||
|
@ -50,7 +66,7 @@
|
||||||
#define VMXNET3_LINK_STATUS_UP 0x1
|
#define VMXNET3_LINK_STATUS_UP 0x1
|
||||||
|
|
||||||
/* Least significant bit should be set for revision and version */
|
/* Least significant bit should be set for revision and version */
|
||||||
#define VMXNET3_DEVICE_VERSION 0x1
|
#define VMXNET3_UPT_REVISION 0x1
|
||||||
#define VMXNET3_DEVICE_REVISION 0x1
|
#define VMXNET3_DEVICE_REVISION 0x1
|
||||||
|
|
||||||
/* Number of interrupt vectors for non-MSIx modes */
|
/* Number of interrupt vectors for non-MSIx modes */
|
||||||
|
@ -108,9 +124,19 @@
|
||||||
|
|
||||||
#define VMXNET_FLAG_IS_SET(field, flag) (((field) & (flag)) == (flag))
|
#define VMXNET_FLAG_IS_SET(field, flag) (((field) & (flag)) == (flag))
|
||||||
|
|
||||||
|
typedef struct VMXNET3Class {
|
||||||
|
PCIDeviceClass parent_class;
|
||||||
|
DeviceRealize parent_dc_realize;
|
||||||
|
} VMXNET3Class;
|
||||||
|
|
||||||
#define TYPE_VMXNET3 "vmxnet3"
|
#define TYPE_VMXNET3 "vmxnet3"
|
||||||
#define VMXNET3(obj) OBJECT_CHECK(VMXNET3State, (obj), TYPE_VMXNET3)
|
#define VMXNET3(obj) OBJECT_CHECK(VMXNET3State, (obj), TYPE_VMXNET3)
|
||||||
|
|
||||||
|
#define VMXNET3_DEVICE_CLASS(klass) \
|
||||||
|
OBJECT_CLASS_CHECK(VMXNET3Class, (klass), TYPE_VMXNET3)
|
||||||
|
#define VMXNET3_DEVICE_GET_CLASS(obj) \
|
||||||
|
OBJECT_GET_CLASS(VMXNET3Class, (obj), TYPE_VMXNET3)
|
||||||
|
|
||||||
/* Cyclic ring abstraction */
|
/* Cyclic ring abstraction */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
hwaddr pa;
|
hwaddr pa;
|
||||||
|
@ -138,7 +164,7 @@ static inline void vmxnet3_ring_init(Vmxnet3Ring *ring,
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VMXNET3_RING_DUMP(macro, ring_name, ridx, r) \
|
#define VMXNET3_RING_DUMP(macro, ring_name, ridx, r) \
|
||||||
macro("%s#%d: base %" PRIx64 " size %lu cell_size %lu gen %d next %lu", \
|
macro("%s#%d: base %" PRIx64 " size %zu cell_size %zu gen %d next %zu", \
|
||||||
(ring_name), (ridx), \
|
(ring_name), (ridx), \
|
||||||
(r)->pa, (r)->size, (r)->cell_size, (r)->gen, (r)->next)
|
(r)->pa, (r)->size, (r)->cell_size, (r)->gen, (r)->next)
|
||||||
|
|
||||||
|
@ -313,6 +339,9 @@ typedef struct {
|
||||||
MACAddr *mcast_list;
|
MACAddr *mcast_list;
|
||||||
uint32_t mcast_list_len;
|
uint32_t mcast_list_len;
|
||||||
uint32_t mcast_list_buff_size; /* needed for live migration. */
|
uint32_t mcast_list_buff_size; /* needed for live migration. */
|
||||||
|
|
||||||
|
/* Compatability flags for migration */
|
||||||
|
uint32_t compat_flags;
|
||||||
} VMXNET3State;
|
} VMXNET3State;
|
||||||
|
|
||||||
/* Interrupt management */
|
/* Interrupt management */
|
||||||
|
@ -925,7 +954,7 @@ static void vmxnet3_rx_need_csum_calculate(struct VmxnetRxPkt *pkt,
|
||||||
|
|
||||||
/* Validate packet len: csum_start + scum_offset + length of csum field */
|
/* Validate packet len: csum_start + scum_offset + length of csum field */
|
||||||
if (pkt_len < (vhdr->csum_start + vhdr->csum_offset + 2)) {
|
if (pkt_len < (vhdr->csum_start + vhdr->csum_offset + 2)) {
|
||||||
VMW_PKPRN("packet len:%lu < csum_start(%d) + csum_offset(%d) + 2, "
|
VMW_PKPRN("packet len:%zu < csum_start(%d) + csum_offset(%d) + 2, "
|
||||||
"cannot calculate checksum",
|
"cannot calculate checksum",
|
||||||
pkt_len, vhdr->csum_start, vhdr->csum_offset);
|
pkt_len, vhdr->csum_start, vhdr->csum_offset);
|
||||||
return;
|
return;
|
||||||
|
@ -1194,8 +1223,13 @@ static void vmxnet3_reset_mac(VMXNET3State *s)
|
||||||
|
|
||||||
static void vmxnet3_deactivate_device(VMXNET3State *s)
|
static void vmxnet3_deactivate_device(VMXNET3State *s)
|
||||||
{
|
{
|
||||||
VMW_CBPRN("Deactivating vmxnet3...");
|
if (s->device_active) {
|
||||||
s->device_active = false;
|
VMW_CBPRN("Deactivating vmxnet3...");
|
||||||
|
vmxnet_tx_pkt_reset(s->tx_pkt);
|
||||||
|
vmxnet_tx_pkt_uninit(s->tx_pkt);
|
||||||
|
vmxnet_rx_pkt_uninit(s->rx_pkt);
|
||||||
|
s->device_active = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vmxnet3_reset(VMXNET3State *s)
|
static void vmxnet3_reset(VMXNET3State *s)
|
||||||
|
@ -1204,7 +1238,6 @@ static void vmxnet3_reset(VMXNET3State *s)
|
||||||
|
|
||||||
vmxnet3_deactivate_device(s);
|
vmxnet3_deactivate_device(s);
|
||||||
vmxnet3_reset_interrupt_states(s);
|
vmxnet3_reset_interrupt_states(s);
|
||||||
vmxnet_tx_pkt_reset(s->tx_pkt);
|
|
||||||
s->drv_shmem = 0;
|
s->drv_shmem = 0;
|
||||||
s->tx_sop = true;
|
s->tx_sop = true;
|
||||||
s->skip_current_tx_pkt = false;
|
s->skip_current_tx_pkt = false;
|
||||||
|
@ -1431,6 +1464,12 @@ static void vmxnet3_activate_device(VMXNET3State *s)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Verify if device is active */
|
||||||
|
if (s->device_active) {
|
||||||
|
VMW_CFPRN("Vmxnet3 device is active");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
vmxnet3_adjust_by_guest_type(s);
|
vmxnet3_adjust_by_guest_type(s);
|
||||||
vmxnet3_update_features(s);
|
vmxnet3_update_features(s);
|
||||||
vmxnet3_update_pm_state(s);
|
vmxnet3_update_pm_state(s);
|
||||||
|
@ -1627,7 +1666,7 @@ static void vmxnet3_handle_command(VMXNET3State *s, uint64_t cmd)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VMXNET3_CMD_QUIESCE_DEV:
|
case VMXNET3_CMD_QUIESCE_DEV:
|
||||||
VMW_CBPRN("Set: VMXNET3_CMD_QUIESCE_DEV - pause the device");
|
VMW_CBPRN("Set: VMXNET3_CMD_QUIESCE_DEV - deactivate the device");
|
||||||
vmxnet3_deactivate_device(s);
|
vmxnet3_deactivate_device(s);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1640,6 +1679,18 @@ static void vmxnet3_handle_command(VMXNET3State *s, uint64_t cmd)
|
||||||
"adaptive ring info flags");
|
"adaptive ring info flags");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VMXNET3_CMD_GET_DID_LO:
|
||||||
|
VMW_CBPRN("Set: Get lower part of device ID");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VMXNET3_CMD_GET_DID_HI:
|
||||||
|
VMW_CBPRN("Set: Get upper part of device ID");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VMXNET3_CMD_GET_DEV_EXTRA_INFO:
|
||||||
|
VMW_CBPRN("Set: Get device extra info");
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
VMW_CBPRN("Received unknown command: %" PRIx64, cmd);
|
VMW_CBPRN("Received unknown command: %" PRIx64, cmd);
|
||||||
break;
|
break;
|
||||||
|
@ -1652,13 +1703,14 @@ static uint64_t vmxnet3_get_command_status(VMXNET3State *s)
|
||||||
|
|
||||||
switch (s->last_command) {
|
switch (s->last_command) {
|
||||||
case VMXNET3_CMD_ACTIVATE_DEV:
|
case VMXNET3_CMD_ACTIVATE_DEV:
|
||||||
ret = (s->device_active) ? 0 : -1;
|
ret = (s->device_active) ? 0 : 1;
|
||||||
VMW_CFPRN("Device active: %" PRIx64, ret);
|
VMW_CFPRN("Device active: %" PRIx64, ret);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VMXNET3_CMD_RESET_DEV:
|
case VMXNET3_CMD_RESET_DEV:
|
||||||
case VMXNET3_CMD_QUIESCE_DEV:
|
case VMXNET3_CMD_QUIESCE_DEV:
|
||||||
case VMXNET3_CMD_GET_QUEUE_STATUS:
|
case VMXNET3_CMD_GET_QUEUE_STATUS:
|
||||||
|
case VMXNET3_CMD_GET_DEV_EXTRA_INFO:
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1683,9 +1735,17 @@ static uint64_t vmxnet3_get_command_status(VMXNET3State *s)
|
||||||
ret = VMXNET3_DISABLE_ADAPTIVE_RING;
|
ret = VMXNET3_DISABLE_ADAPTIVE_RING;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VMXNET3_CMD_GET_DID_LO:
|
||||||
|
ret = PCI_DEVICE_ID_VMWARE_VMXNET3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VMXNET3_CMD_GET_DID_HI:
|
||||||
|
ret = VMXNET3_DEVICE_REVISION;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
VMW_WRPRN("Received request for unknown command: %x", s->last_command);
|
VMW_WRPRN("Received request for unknown command: %x", s->last_command);
|
||||||
ret = -1;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1741,7 +1801,7 @@ vmxnet3_io_bar1_write(void *opaque,
|
||||||
* shared address only after we get the high part
|
* shared address only after we get the high part
|
||||||
*/
|
*/
|
||||||
if (val == 0) {
|
if (val == 0) {
|
||||||
s->device_active = false;
|
vmxnet3_deactivate_device(s);
|
||||||
}
|
}
|
||||||
s->temp_shared_guest_driver_memory = val;
|
s->temp_shared_guest_driver_memory = val;
|
||||||
s->drv_shmem = 0;
|
s->drv_shmem = 0;
|
||||||
|
@ -1816,7 +1876,7 @@ vmxnet3_io_bar1_read(void *opaque, hwaddr addr, unsigned size)
|
||||||
/* UPT Version Report Selection */
|
/* UPT Version Report Selection */
|
||||||
case VMXNET3_REG_UVRS:
|
case VMXNET3_REG_UVRS:
|
||||||
VMW_CBPRN("Read BAR1 [VMXNET3_REG_UVRS], size %d", size);
|
VMW_CBPRN("Read BAR1 [VMXNET3_REG_UVRS], size %d", size);
|
||||||
ret = VMXNET3_DEVICE_VERSION;
|
ret = VMXNET3_UPT_REVISION;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Command */
|
/* Command */
|
||||||
|
@ -1974,7 +2034,7 @@ vmxnet3_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
||||||
vmxnet_rx_pkt_attach_data(s->rx_pkt, buf, size, s->rx_vlan_stripping);
|
vmxnet_rx_pkt_attach_data(s->rx_pkt, buf, size, s->rx_vlan_stripping);
|
||||||
bytes_indicated = vmxnet3_indicate_packet(s) ? size : -1;
|
bytes_indicated = vmxnet3_indicate_packet(s) ? size : -1;
|
||||||
if (bytes_indicated < size) {
|
if (bytes_indicated < size) {
|
||||||
VMW_PKPRN("RX: %lu of %lu bytes indicated", bytes_indicated, size);
|
VMW_PKPRN("RX: %zu of %zu bytes indicated", bytes_indicated, size);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
VMW_PKPRN("Packet dropped by RX filter");
|
VMW_PKPRN("Packet dropped by RX filter");
|
||||||
|
@ -2021,9 +2081,7 @@ static bool vmxnet3_peer_has_vnet_hdr(VMXNET3State *s)
|
||||||
static void vmxnet3_net_uninit(VMXNET3State *s)
|
static void vmxnet3_net_uninit(VMXNET3State *s)
|
||||||
{
|
{
|
||||||
g_free(s->mcast_list);
|
g_free(s->mcast_list);
|
||||||
vmxnet_tx_pkt_reset(s->tx_pkt);
|
vmxnet3_deactivate_device(s);
|
||||||
vmxnet_tx_pkt_uninit(s->tx_pkt);
|
|
||||||
vmxnet_rx_pkt_uninit(s->rx_pkt);
|
|
||||||
qemu_del_nic(s->nic);
|
qemu_del_nic(s->nic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2043,7 +2101,7 @@ static void vmxnet3_net_init(VMXNET3State *s)
|
||||||
|
|
||||||
s->link_status_and_speed = VMXNET3_LINK_SPEED | VMXNET3_LINK_STATUS_UP;
|
s->link_status_and_speed = VMXNET3_LINK_SPEED | VMXNET3_LINK_STATUS_UP;
|
||||||
|
|
||||||
VMW_CFPRN("Permanent MAC: " MAC_FMT, MAC_ARG(s->perm_mac.a));
|
VMW_CFPRN("Permanent MAC: " VMXNET_MF, VMXNET_MA(s->perm_mac.a));
|
||||||
|
|
||||||
s->nic = qemu_new_nic(&net_vmxnet3_info, &s->conf,
|
s->nic = qemu_new_nic(&net_vmxnet3_info, &s->conf,
|
||||||
object_get_typename(OBJECT(s)),
|
object_get_typename(OBJECT(s)),
|
||||||
|
@ -2101,8 +2159,8 @@ vmxnet3_init_msix(VMXNET3State *s)
|
||||||
&s->msix_bar,
|
&s->msix_bar,
|
||||||
VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_TABLE,
|
VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_TABLE,
|
||||||
&s->msix_bar,
|
&s->msix_bar,
|
||||||
VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_PBA,
|
VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_PBA(s),
|
||||||
0);
|
VMXNET3_MSIX_OFFSET(s));
|
||||||
|
|
||||||
if (0 > res) {
|
if (0 > res) {
|
||||||
VMW_WRPRN("Failed to initialize MSI-X, error %d", res);
|
VMW_WRPRN("Failed to initialize MSI-X, error %d", res);
|
||||||
|
@ -2130,7 +2188,6 @@ vmxnet3_cleanup_msix(VMXNET3State *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VMXNET3_MSI_OFFSET (0x50)
|
|
||||||
#define VMXNET3_USE_64BIT (true)
|
#define VMXNET3_USE_64BIT (true)
|
||||||
#define VMXNET3_PER_VECTOR_MASK (false)
|
#define VMXNET3_PER_VECTOR_MASK (false)
|
||||||
|
|
||||||
|
@ -2140,7 +2197,7 @@ vmxnet3_init_msi(VMXNET3State *s)
|
||||||
PCIDevice *d = PCI_DEVICE(s);
|
PCIDevice *d = PCI_DEVICE(s);
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
res = msi_init(d, VMXNET3_MSI_OFFSET, VMXNET3_MAX_NMSIX_INTRS,
|
res = msi_init(d, VMXNET3_MSI_OFFSET(s), VMXNET3_MAX_NMSIX_INTRS,
|
||||||
VMXNET3_USE_64BIT, VMXNET3_PER_VECTOR_MASK);
|
VMXNET3_USE_64BIT, VMXNET3_PER_VECTOR_MASK);
|
||||||
if (0 > res) {
|
if (0 > res) {
|
||||||
VMW_WRPRN("Failed to initialize MSI, error %d", res);
|
VMW_WRPRN("Failed to initialize MSI, error %d", res);
|
||||||
|
@ -2197,6 +2254,22 @@ static const MemoryRegionOps b1_ops = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static uint8_t *vmxnet3_device_serial_num(VMXNET3State *s)
|
||||||
|
{
|
||||||
|
static uint64_t dsn_payload;
|
||||||
|
uint8_t *dsnp = (uint8_t *)&dsn_payload;
|
||||||
|
|
||||||
|
dsnp[0] = 0xfe;
|
||||||
|
dsnp[1] = s->conf.macaddr.a[3];
|
||||||
|
dsnp[2] = s->conf.macaddr.a[4];
|
||||||
|
dsnp[3] = s->conf.macaddr.a[5];
|
||||||
|
dsnp[4] = s->conf.macaddr.a[0];
|
||||||
|
dsnp[5] = s->conf.macaddr.a[1];
|
||||||
|
dsnp[6] = s->conf.macaddr.a[2];
|
||||||
|
dsnp[7] = 0xff;
|
||||||
|
return dsnp;
|
||||||
|
}
|
||||||
|
|
||||||
static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
|
static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
|
||||||
{
|
{
|
||||||
DeviceState *dev = DEVICE(pci_dev);
|
DeviceState *dev = DEVICE(pci_dev);
|
||||||
|
@ -2234,6 +2307,17 @@ static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
|
||||||
|
|
||||||
vmxnet3_net_init(s);
|
vmxnet3_net_init(s);
|
||||||
|
|
||||||
|
if (pci_is_express(pci_dev)) {
|
||||||
|
if (pci_bus_is_express(pci_dev->bus)) {
|
||||||
|
pcie_endpoint_cap_init(pci_dev, VMXNET3_EXP_EP_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
pcie_add_capability(pci_dev, PCI_EXT_CAP_ID_DSN, 0x1,
|
||||||
|
VMXNET3_DSN_OFFSET, PCI_EXT_CAP_DSN_SIZEOF);
|
||||||
|
memcpy(pci_dev->config + VMXNET3_DSN_OFFSET + 4,
|
||||||
|
vmxnet3_device_serial_num(s), sizeof(uint64_t));
|
||||||
|
}
|
||||||
|
|
||||||
register_savevm(dev, "vmxnet3-msix", -1, 1,
|
register_savevm(dev, "vmxnet3-msix", -1, 1,
|
||||||
vmxnet3_msix_save, vmxnet3_msix_load, s);
|
vmxnet3_msix_save, vmxnet3_msix_load, s);
|
||||||
}
|
}
|
||||||
|
@ -2503,6 +2587,29 @@ static const VMStateInfo int_state_info = {
|
||||||
.put = vmxnet3_put_int_state
|
.put = vmxnet3_put_int_state
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool vmxnet3_vmstate_need_pcie_device(void *opaque)
|
||||||
|
{
|
||||||
|
VMXNET3State *s = VMXNET3(opaque);
|
||||||
|
|
||||||
|
return !(s->compat_flags & VMXNET3_COMPAT_FLAG_DISABLE_PCIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool vmxnet3_vmstate_test_pci_device(void *opaque, int version_id)
|
||||||
|
{
|
||||||
|
return !vmxnet3_vmstate_need_pcie_device(opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const VMStateDescription vmstate_vmxnet3_pcie_device = {
|
||||||
|
.name = "vmxnet3/pcie",
|
||||||
|
.version_id = 1,
|
||||||
|
.minimum_version_id = 1,
|
||||||
|
.needed = vmxnet3_vmstate_need_pcie_device,
|
||||||
|
.fields = (VMStateField[]) {
|
||||||
|
VMSTATE_PCIE_DEVICE(parent_obj, VMXNET3State),
|
||||||
|
VMSTATE_END_OF_LIST()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static const VMStateDescription vmstate_vmxnet3 = {
|
static const VMStateDescription vmstate_vmxnet3 = {
|
||||||
.name = "vmxnet3",
|
.name = "vmxnet3",
|
||||||
.version_id = 1,
|
.version_id = 1,
|
||||||
|
@ -2510,7 +2617,9 @@ static const VMStateDescription vmstate_vmxnet3 = {
|
||||||
.pre_save = vmxnet3_pre_save,
|
.pre_save = vmxnet3_pre_save,
|
||||||
.post_load = vmxnet3_post_load,
|
.post_load = vmxnet3_post_load,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_PCI_DEVICE(parent_obj, VMXNET3State),
|
VMSTATE_STRUCT_TEST(parent_obj, VMXNET3State,
|
||||||
|
vmxnet3_vmstate_test_pci_device, 0,
|
||||||
|
vmstate_pci_device, PCIDevice),
|
||||||
VMSTATE_BOOL(rx_packets_compound, VMXNET3State),
|
VMSTATE_BOOL(rx_packets_compound, VMXNET3State),
|
||||||
VMSTATE_BOOL(rx_vlan_stripping, VMXNET3State),
|
VMSTATE_BOOL(rx_vlan_stripping, VMXNET3State),
|
||||||
VMSTATE_BOOL(lro_supported, VMXNET3State),
|
VMSTATE_BOOL(lro_supported, VMXNET3State),
|
||||||
|
@ -2545,19 +2654,38 @@ static const VMStateDescription vmstate_vmxnet3 = {
|
||||||
},
|
},
|
||||||
.subsections = (const VMStateDescription*[]) {
|
.subsections = (const VMStateDescription*[]) {
|
||||||
&vmxstate_vmxnet3_mcast_list,
|
&vmxstate_vmxnet3_mcast_list,
|
||||||
|
&vmstate_vmxnet3_pcie_device,
|
||||||
NULL
|
NULL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property vmxnet3_properties[] = {
|
static Property vmxnet3_properties[] = {
|
||||||
DEFINE_NIC_PROPERTIES(VMXNET3State, conf),
|
DEFINE_NIC_PROPERTIES(VMXNET3State, conf),
|
||||||
|
DEFINE_PROP_BIT("x-old-msi-offsets", VMXNET3State, compat_flags,
|
||||||
|
VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS_BIT, false),
|
||||||
|
DEFINE_PROP_BIT("x-disable-pcie", VMXNET3State, compat_flags,
|
||||||
|
VMXNET3_COMPAT_FLAG_DISABLE_PCIE_BIT, false),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void vmxnet3_realize(DeviceState *qdev, Error **errp)
|
||||||
|
{
|
||||||
|
VMXNET3Class *vc = VMXNET3_DEVICE_GET_CLASS(qdev);
|
||||||
|
PCIDevice *pci_dev = PCI_DEVICE(qdev);
|
||||||
|
VMXNET3State *s = VMXNET3(qdev);
|
||||||
|
|
||||||
|
if (!(s->compat_flags & VMXNET3_COMPAT_FLAG_DISABLE_PCIE)) {
|
||||||
|
pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
vc->parent_dc_realize(qdev, errp);
|
||||||
|
}
|
||||||
|
|
||||||
static void vmxnet3_class_init(ObjectClass *class, void *data)
|
static void vmxnet3_class_init(ObjectClass *class, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(class);
|
DeviceClass *dc = DEVICE_CLASS(class);
|
||||||
PCIDeviceClass *c = PCI_DEVICE_CLASS(class);
|
PCIDeviceClass *c = PCI_DEVICE_CLASS(class);
|
||||||
|
VMXNET3Class *vc = VMXNET3_DEVICE_CLASS(class);
|
||||||
|
|
||||||
c->realize = vmxnet3_pci_realize;
|
c->realize = vmxnet3_pci_realize;
|
||||||
c->exit = vmxnet3_pci_uninit;
|
c->exit = vmxnet3_pci_uninit;
|
||||||
|
@ -2567,6 +2695,8 @@ static void vmxnet3_class_init(ObjectClass *class, void *data)
|
||||||
c->class_id = PCI_CLASS_NETWORK_ETHERNET;
|
c->class_id = PCI_CLASS_NETWORK_ETHERNET;
|
||||||
c->subsystem_vendor_id = PCI_VENDOR_ID_VMWARE;
|
c->subsystem_vendor_id = PCI_VENDOR_ID_VMWARE;
|
||||||
c->subsystem_id = PCI_DEVICE_ID_VMWARE_VMXNET3;
|
c->subsystem_id = PCI_DEVICE_ID_VMWARE_VMXNET3;
|
||||||
|
vc->parent_dc_realize = dc->realize;
|
||||||
|
dc->realize = vmxnet3_realize;
|
||||||
dc->desc = "VMWare Paravirtualized Ethernet v3";
|
dc->desc = "VMWare Paravirtualized Ethernet v3";
|
||||||
dc->reset = vmxnet3_qdev_reset;
|
dc->reset = vmxnet3_qdev_reset;
|
||||||
dc->vmsd = &vmstate_vmxnet3;
|
dc->vmsd = &vmstate_vmxnet3;
|
||||||
|
@ -2577,6 +2707,7 @@ static void vmxnet3_class_init(ObjectClass *class, void *data)
|
||||||
static const TypeInfo vmxnet3_info = {
|
static const TypeInfo vmxnet3_info = {
|
||||||
.name = TYPE_VMXNET3,
|
.name = TYPE_VMXNET3,
|
||||||
.parent = TYPE_PCI_DEVICE,
|
.parent = TYPE_PCI_DEVICE,
|
||||||
|
.class_size = sizeof(VMXNET3Class),
|
||||||
.instance_size = sizeof(VMXNET3State),
|
.instance_size = sizeof(VMXNET3State),
|
||||||
.class_init = vmxnet3_class_init,
|
.class_init = vmxnet3_class_init,
|
||||||
.instance_init = vmxnet3_instance_init,
|
.instance_init = vmxnet3_instance_init,
|
||||||
|
|
|
@ -20,94 +20,127 @@
|
||||||
|
|
||||||
#define VMXNET_DEVICE_NAME "vmxnet3"
|
#define VMXNET_DEVICE_NAME "vmxnet3"
|
||||||
|
|
||||||
/* #define VMXNET_DEBUG_CB */
|
|
||||||
#define VMXNET_DEBUG_WARNINGS
|
#define VMXNET_DEBUG_WARNINGS
|
||||||
#define VMXNET_DEBUG_ERRORS
|
#define VMXNET_DEBUG_ERRORS
|
||||||
/* #define VMXNET_DEBUG_INTERRUPTS */
|
|
||||||
/* #define VMXNET_DEBUG_CONFIG */
|
|
||||||
/* #define VMXNET_DEBUG_RINGS */
|
|
||||||
/* #define VMXNET_DEBUG_PACKETS */
|
|
||||||
/* #define VMXNET_DEBUG_SHMEM_ACCESS */
|
|
||||||
|
|
||||||
#ifdef VMXNET_DEBUG_SHMEM_ACCESS
|
#undef VMXNET_DEBUG_CB
|
||||||
#define VMW_SHPRN(fmt, ...) \
|
#undef VMXNET_DEBUG_INTERRUPTS
|
||||||
do { \
|
#undef VMXNET_DEBUG_CONFIG
|
||||||
printf("[%s][SH][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
#undef VMXNET_DEBUG_RINGS
|
||||||
## __VA_ARGS__); \
|
#undef VMXNET_DEBUG_PACKETS
|
||||||
} while (0)
|
#undef VMXNET_DEBUG_SHMEM_ACCESS
|
||||||
#else
|
|
||||||
#define VMW_SHPRN(fmt, ...) do {} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VMXNET_DEBUG_CB
|
#ifdef VMXNET_DEBUG_CB
|
||||||
#define VMW_CBPRN(fmt, ...) \
|
# define VMXNET_DEBUG_CB_ENABLED 1
|
||||||
do { \
|
|
||||||
printf("[%s][CB][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
|
||||||
## __VA_ARGS__); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
#else
|
||||||
#define VMW_CBPRN(fmt, ...) do {} while (0)
|
# define VMXNET_DEBUG_CB_ENABLED 0
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VMXNET_DEBUG_PACKETS
|
|
||||||
#define VMW_PKPRN(fmt, ...) \
|
|
||||||
do { \
|
|
||||||
printf("[%s][PK][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
|
||||||
## __VA_ARGS__); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
#define VMW_PKPRN(fmt, ...) do {} while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VMXNET_DEBUG_WARNINGS
|
#ifdef VMXNET_DEBUG_WARNINGS
|
||||||
#define VMW_WRPRN(fmt, ...) \
|
# define VMXNET_DEBUG_WARNINGS_ENABLED 1
|
||||||
do { \
|
|
||||||
printf("[%s][WR][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
|
||||||
## __VA_ARGS__); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
#else
|
||||||
#define VMW_WRPRN(fmt, ...) do {} while (0)
|
# define VMXNET_DEBUG_WARNINGS_ENABLED 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VMXNET_DEBUG_ERRORS
|
#ifdef VMXNET_DEBUG_ERRORS
|
||||||
#define VMW_ERPRN(fmt, ...) \
|
# define VMXNET_DEBUG_ERRORS_ENABLED 1
|
||||||
do { \
|
|
||||||
printf("[%s][ER][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
|
||||||
## __VA_ARGS__); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
#else
|
||||||
#define VMW_ERPRN(fmt, ...) do {} while (0)
|
# define VMXNET_DEBUG_ERRORS_ENABLED 0
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef VMXNET_DEBUG_INTERRUPTS
|
|
||||||
#define VMW_IRPRN(fmt, ...) \
|
|
||||||
do { \
|
|
||||||
printf("[%s][IR][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
|
||||||
## __VA_ARGS__); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
#define VMW_IRPRN(fmt, ...) do {} while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VMXNET_DEBUG_CONFIG
|
#ifdef VMXNET_DEBUG_CONFIG
|
||||||
#define VMW_CFPRN(fmt, ...) \
|
# define VMXNET_DEBUG_CONFIG_ENABLED 1
|
||||||
do { \
|
|
||||||
printf("[%s][CF][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
|
||||||
## __VA_ARGS__); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
#else
|
||||||
#define VMW_CFPRN(fmt, ...) do {} while (0)
|
# define VMXNET_DEBUG_CONFIG_ENABLED 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VMXNET_DEBUG_RINGS
|
#ifdef VMXNET_DEBUG_RINGS
|
||||||
|
# define VMXNET_DEBUG_RINGS_ENABLED 1
|
||||||
|
#else
|
||||||
|
# define VMXNET_DEBUG_RINGS_ENABLED 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VMXNET_DEBUG_PACKETS
|
||||||
|
# define VMXNET_DEBUG_PACKETS_ENABLED 1
|
||||||
|
#else
|
||||||
|
# define VMXNET_DEBUG_PACKETS_ENABLED 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VMXNET_DEBUG_INTERRUPTS
|
||||||
|
# define VMXNET_DEBUG_INTERRUPTS_ENABLED 1
|
||||||
|
#else
|
||||||
|
# define VMXNET_DEBUG_INTERRUPTS_ENABLED 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VMXNET_DEBUG_SHMEM_ACCESS
|
||||||
|
# define VMXNET_DEBUG_SHMEM_ACCESS_ENABLED 1
|
||||||
|
#else
|
||||||
|
# define VMXNET_DEBUG_SHMEM_ACCESS_ENABLED 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VMW_SHPRN(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (VMXNET_DEBUG_SHMEM_ACCESS_ENABLED) { \
|
||||||
|
printf("[%s][SH][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
||||||
|
## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define VMW_CBPRN(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (VMXNET_DEBUG_CB_ENABLED) { \
|
||||||
|
printf("[%s][CB][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
||||||
|
## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define VMW_PKPRN(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (VMXNET_DEBUG_PACKETS_ENABLED) { \
|
||||||
|
printf("[%s][PK][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
||||||
|
## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define VMW_WRPRN(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (VMXNET_DEBUG_WARNINGS_ENABLED) { \
|
||||||
|
printf("[%s][WR][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
||||||
|
## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define VMW_ERPRN(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (VMXNET_DEBUG_ERRORS_ENABLED) { \
|
||||||
|
printf("[%s][ER][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
||||||
|
## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define VMW_IRPRN(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (VMXNET_DEBUG_INTERRUPTS_ENABLED) { \
|
||||||
|
printf("[%s][IR][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
||||||
|
## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define VMW_CFPRN(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (VMXNET_DEBUG_CONFIG_ENABLED) { \
|
||||||
|
printf("[%s][CF][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
||||||
|
## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define VMW_RIPRN(fmt, ...) \
|
#define VMW_RIPRN(fmt, ...) \
|
||||||
do { \
|
do { \
|
||||||
printf("[%s][RI][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
if (VMXNET_DEBUG_RINGS_ENABLED) { \
|
||||||
## __VA_ARGS__); \
|
printf("[%s][RI][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__, \
|
||||||
|
## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
|
||||||
#define VMW_RIPRN(fmt, ...) do {} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define VMXNET_MF "%02X:%02X:%02X:%02X:%02X:%02X"
|
#define VMXNET_MF "%02X:%02X:%02X:%02X:%02X:%02X"
|
||||||
#define VMXNET_MA(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
|
#define VMXNET_MA(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
|
||||||
|
|
|
@ -2,7 +2,15 @@
|
||||||
#define HW_COMPAT_H
|
#define HW_COMPAT_H
|
||||||
|
|
||||||
#define HW_COMPAT_2_5 \
|
#define HW_COMPAT_2_5 \
|
||||||
/* empty */
|
{\
|
||||||
|
.driver = "vmxnet3",\
|
||||||
|
.property = "x-old-msi-offsets",\
|
||||||
|
.value = "on",\
|
||||||
|
},{\
|
||||||
|
.driver = "vmxnet3",\
|
||||||
|
.property = "x-disable-pcie",\
|
||||||
|
.value = "on",\
|
||||||
|
},
|
||||||
|
|
||||||
#define HW_COMPAT_2_4 \
|
#define HW_COMPAT_2_4 \
|
||||||
{\
|
{\
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "qemu/iov.h"
|
#include "qemu/iov.h"
|
||||||
|
|
||||||
#define ETH_ALEN 6
|
#define ETH_ALEN 6
|
||||||
|
#define ETH_HLEN 14
|
||||||
|
|
||||||
struct eth_header {
|
struct eth_header {
|
||||||
uint8_t h_dest[ETH_ALEN]; /* destination eth addr */
|
uint8_t h_dest[ETH_ALEN]; /* destination eth addr */
|
||||||
|
@ -170,7 +171,8 @@ struct tcp_hdr {
|
||||||
#define IP_HEADER_VERSION(ip) \
|
#define IP_HEADER_VERSION(ip) \
|
||||||
((ip->ip_ver_len >> 4)&0xf)
|
((ip->ip_ver_len >> 4)&0xf)
|
||||||
|
|
||||||
#define ETH_P_IP (0x0800)
|
#define ETH_P_IP (0x0800) /* Internet Protocol packet */
|
||||||
|
#define ETH_P_ARP (0x0806) /* Address Resolution packet */
|
||||||
#define ETH_P_IPV6 (0x86dd)
|
#define ETH_P_IPV6 (0x86dd)
|
||||||
#define ETH_P_VLAN (0x8100)
|
#define ETH_P_VLAN (0x8100)
|
||||||
#define ETH_P_DVLAN (0x88a8)
|
#define ETH_P_DVLAN (0x88a8)
|
||||||
|
|
|
@ -329,6 +329,13 @@ static void filter_dump_instance_init(Object *obj)
|
||||||
file_dump_set_filename, NULL);
|
file_dump_set_filename, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void filter_dump_instance_finalize(Object *obj)
|
||||||
|
{
|
||||||
|
NetFilterDumpState *nfds = FILTER_DUMP(obj);
|
||||||
|
|
||||||
|
g_free(nfds->filename);
|
||||||
|
}
|
||||||
|
|
||||||
static void filter_dump_class_init(ObjectClass *oc, void *data)
|
static void filter_dump_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||||
|
@ -343,6 +350,7 @@ static const TypeInfo filter_dump_info = {
|
||||||
.parent = TYPE_NETFILTER,
|
.parent = TYPE_NETFILTER,
|
||||||
.class_init = filter_dump_class_init,
|
.class_init = filter_dump_class_init,
|
||||||
.instance_init = filter_dump_instance_init,
|
.instance_init = filter_dump_instance_init,
|
||||||
|
.instance_finalize = filter_dump_instance_finalize,
|
||||||
.instance_size = sizeof(NetFilterDumpState),
|
.instance_size = sizeof(NetFilterDumpState),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -204,6 +204,7 @@ static void netfilter_finalize(Object *obj)
|
||||||
if (nf->netdev && !QTAILQ_EMPTY(&nf->netdev->filters)) {
|
if (nf->netdev && !QTAILQ_EMPTY(&nf->netdev->filters)) {
|
||||||
QTAILQ_REMOVE(&nf->netdev->filters, nf, next);
|
QTAILQ_REMOVE(&nf->netdev->filters, nf, next);
|
||||||
}
|
}
|
||||||
|
g_free(nf->netdev_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void netfilter_class_init(ObjectClass *oc, void *data)
|
static void netfilter_class_init(ObjectClass *oc, void *data)
|
||||||
|
|
|
@ -325,7 +325,7 @@ static int l2tpv3_verify_header(NetL2TPV3State *s, uint8_t *buf)
|
||||||
if (s->cookie_is_64) {
|
if (s->cookie_is_64) {
|
||||||
cookie = ldq_be_p(buf + s->cookie_offset);
|
cookie = ldq_be_p(buf + s->cookie_offset);
|
||||||
} else {
|
} else {
|
||||||
cookie = ldl_be_p(buf + s->cookie_offset);
|
cookie = ldl_be_p(buf + s->cookie_offset) & 0xffffffffULL;
|
||||||
}
|
}
|
||||||
if (cookie != s->rx_cookie) {
|
if (cookie != s->rx_cookie) {
|
||||||
if (!s->header_mismatch) {
|
if (!s->header_mismatch) {
|
||||||
|
|
|
@ -135,6 +135,7 @@ void free(void *ptr);
|
||||||
|
|
||||||
#include "qemu/queue.h"
|
#include "qemu/queue.h"
|
||||||
#include "qemu/sockets.h"
|
#include "qemu/sockets.h"
|
||||||
|
#include "net/eth.h"
|
||||||
|
|
||||||
#include "libslirp.h"
|
#include "libslirp.h"
|
||||||
#include "ip.h"
|
#include "ip.h"
|
||||||
|
@ -158,12 +159,6 @@ void free(void *ptr);
|
||||||
#include "bootp.h"
|
#include "bootp.h"
|
||||||
#include "tftp.h"
|
#include "tftp.h"
|
||||||
|
|
||||||
#define ETH_ALEN 6
|
|
||||||
#define ETH_HLEN 14
|
|
||||||
|
|
||||||
#define ETH_P_IP 0x0800 /* Internet Protocol packet */
|
|
||||||
#define ETH_P_ARP 0x0806 /* Address Resolution packet */
|
|
||||||
|
|
||||||
#define ARPOP_REQUEST 1 /* ARP request */
|
#define ARPOP_REQUEST 1 /* ARP request */
|
||||||
#define ARPOP_REPLY 2 /* ARP reply */
|
#define ARPOP_REPLY 2 /* ARP reply */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue