All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@oss.qualcomm.com>
To: qemu-devel@nongnu.org
Subject: [PULL 17/56] hw/net/rtl8139: Fix handling of VLAN tags on incoming short packets
Date: Sun, 16 Aug 2026 16:45:16 +0200	[thread overview]
Message-ID: <20260816144556.69009-18-philmd@oss.qualcomm.com> (raw)
In-Reply-To: <20260816144556.69009-1-philmd@oss.qualcomm.com>

From: Peter Maydell <peter.maydell@linaro.org>

The rtl8139 receive code handles VLAN tags in incoming packets by
copying the VLAN tag to a special field in the receive descriptor,
and copying only the actual payload data to the receive buffer.  This
code tries to ensure that it pads out the payload to at least
MIN_BUF_SIZE bytes.

In commit 63b901bfd30 we removed the main "pad short frames" code
from this device because we switched to requiring net backends to do
the padding.  However we didn't notice that this broke the VLAN tag
handling, which relied on the old code making the buffer at least
MIN_BUF_SIZE + VLAN_HLEN bytes so that it could copy MIN_BUF_SIZE
bytes into the receive buffer even after removing the VLAN tag.  The
result is that the guest can make us read 4 bytes off the end of a
buffer by feeding itself a suitable short packet in loopback mode.

The old behaviour is actually not correct, because the IEEE802.1Q
standard says that the minimum ethernet frame size remains 64 bytes
including the 4 checksum bytes, and so when a tag is present the
payload data only needs to be 56 bytes.  (A bridge implementation can
choose to pad tagged frames out to 68 bytes, but it doesn't have to,
and so all devices have to correctly handle incoming tagged frames
that are 64 bytes long.)

The RTL8139 datasheet isn't very communicative on this topic, but
there's nothing that suggests it adds extra padding on receive that
didn't exist in the incoming packet.

Drop the last remnants of the padding handling from this device;
this avoids overcopying into the guest when we receive a short
VLAN tagged packet.

Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3518
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Bin Meng <bin.meng@processmission.com>
Message-ID: <20260731093618.2961031-2-peter.maydell@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 hw/net/rtl8139.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
index 424af73a18f..2b61c171f2a 100644
--- a/hw/net/rtl8139.c
+++ b/hw/net/rtl8139.c
@@ -778,7 +778,6 @@ static void rtl8139_write_buffer(RTL8139State *s, const void *buf, int size)
     s->RxBufAddr += size;
 }
 
-#define MIN_BUF_SIZE 60
 static inline dma_addr_t rtl8139_addr64(uint32_t low, uint32_t high)
 {
     return low | ((uint64_t)high << 32);
@@ -1007,10 +1006,6 @@ static ssize_t rtl8139_receive(NetClientState *nc,
             lduw_be_p(&buf[ETH_ALEN * 2]) == ETH_P_VLAN) {
             dot1q_buf = &buf[ETH_ALEN * 2];
             size -= VLAN_HLEN;
-            /* if too small buffer, use the tailroom added duing expansion */
-            if (size < MIN_BUF_SIZE) {
-                size = MIN_BUF_SIZE;
-            }
 
             rxdw1 &= ~CP_RX_VLAN_TAG_MASK;
             /* BE + ~le_to_cpu()~ + cpu_to_le() = BE */
-- 
2.53.0



  parent reply	other threads:[~2026-08-16 14:49 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-16 14:44 [PULL 00/56] Misc HW patches for 2026-08-16 Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 01/56] hw/qdev: Remove DEFINE_PROP_DMAADDR() and 'hw/qdev-dma.h' Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 02/56] hw/mem/nvdimm: fix "size" property typename Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 03/56] qdev: Make qdev_is_realized() take a const DeviceState * Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 04/56] hw/hyperv/balloon: Use qdev_is_realized() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 05/56] hw/intc/apic: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 06/56] hw/mem/memory-device: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 07/56] hw/mem/pc-dimm: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 08/56] hw/nvram: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 09/56] hw/ppc/pnv_xscom: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 10/56] hw/vfio: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 11/56] hw/virtio/virtio-mem: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 12/56] hw/virtio/virtio-qmp: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 13/56] target/i386/cpu: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 14/56] target/s390x: " Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 15/56] hw/qdev: Parent device before setting parent bus Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 16/56] hw/i386/pc: xen: reinstate the "xenfv" machine alias Philippe Mathieu-Daudé
2026-08-16 14:45 ` Philippe Mathieu-Daudé [this message]
2026-08-16 14:45 ` [PULL 18/56] hw/net/rtl8139: Send whole of vlan-tagged packet when doing loopback Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 19/56] hw/block/pflash_cfi01: Restore ROMD mode after migration Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 20/56] hw/nvme: add SPDM_SOCKET Kconfig dependency Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 21/56] hw/cpu: Correct CPU_GET_CLASS() comment Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 22/56] hw/cpu: Include missing 'qemu/accel.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 23/56] hw/cpu: Move internal declarations to new 'cpu-internal.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 24/56] hw/cpu: Rename cpu_common_realizefn() -> cpu_exec_realize() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 25/56] hw/cpu: Rename cpu_exec_realizefn() -> cpu_common_realize() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 26/56] hw/cpu: Rename cpu_exec_unrealizefn() -> cpu_common_unrealize() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 27/56] hw/cpu: Extract cpu_exec_realize() out of cpu_common_realizefn() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 28/56] hw/cpu: Move system-specific cpu_exec_realize() to cpu-system.c Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 29/56] hw/nmi: Use object_child_foreach_recursive() in nmi_children() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 30/56] hw/s390x/virtio-ccw: Always inject NMI to first CPU Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 31/56] hw/nmi: Remove @cpu_index argument from NMIClass::nmi_monitor_handler() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 32/56] hw/nmi: Remove @cpu_index argument from nmi_inject() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 33/56] hw/nmi: Rename nmi_monitor_handler() -> raise_nmi() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 34/56] hw/nmi: Remove unused @errp argument from raise_nmi() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 35/56] hw/nmi: Raise NMI line only once Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 36/56] hexagon: Remove unnecessary 'monitor/monitor.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 37/56] net/vhost-vdpa: Include missing 'qemu/iov.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 38/56] tests/unit: Include 'qemu/main-loop.h' header in test-util-sockets.c Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 39/56] qapi/qmp-dispatch: Include 'qemu/aio-wait.h' and 'monitor/monitor.h' Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 40/56] qapi/qmp-registry: Remove unnecessary 'monitor/monitor.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 41/56] migration/hmp-cmds: Include 'block/block-global-state.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 42/56] monitor: Include missing 'qemu/aio-wait.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 43/56] monitor: Include missing 'qemu/lockable.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 44/56] monitor: Include missing 'qemu/coroutine-core.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 45/56] monitor: Reduce inclusion of 'qapi/qapi-emit-events.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 46/56] monitor: Remove unnecessary 'block/block.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 47/56] system: Remove unnecessary 'monitor/monitor.h' header Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 48/56] system/dirtylimit: Extract HMP code to dirtylimit-hmp-cmds.c Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 49/56] system: Move qmp_inject_nmi() to hw/core/machine-qmp-cmds.c Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 50/56] system: Extract QMP memsave/pmemsave commands to physmem-qmp-cmds.c Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 51/56] system: Move runstate-related code from cpus.c to runstate.c Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 52/56] monitor: Rename MonitorHMP @mon -> @hmp Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 53/56] monitor: Better express monitor_read()'s opaque arg is of Monitor type Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 54/56] monitor: Replace container_of(MonitorHMP, parent_obj) -> MONITOR_HMP() Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 55/56] hw/elf_ops: defend against weird elf headers Philippe Mathieu-Daudé
2026-08-16 14:45 ` [PULL 56/56] hw/core/machine: Move EHCI migration compat properties to 11.1 Philippe Mathieu-Daudé
2026-08-16 17:26 ` [PULL 00/56] Misc HW patches for 2026-08-16 Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260816144556.69009-18-philmd@oss.qualcomm.com \
    --to=philmd@oss.qualcomm.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.