xemu/hw
Ed Swierk via Qemu-devel d62644b46a e1000: Separate TSO and non-TSO contexts, fixing UDP TX corruption
The device is supposed to maintain two distinct contexts for transmit
offloads: one has parameters for both segmentation and checksum
offload, the other only for checksum offload. The guest driver can
send two context descriptors, one for each context (the TSE flag
specifies which). Then the guest can refer to one or the other context
in subsequent transmit data descriptors, depending on what offloads it
wants applied to each packet.

Currently the e1000 device stores just one context, and misinterprets
the TSE flags in the context and data descriptors. This is often okay:
Linux happens to send a fresh context descriptor before every data
descriptor, so forgetting the other context doesn't matter. Windows
does rely on separate contexts for TSO vs. non-TSO packets, but for
mostly-TCP traffic the two contexts have identical TCP-specific
offload parameters so confusing them doesn't matter.

One case where this confusion matters is when a Windows guest sets up
a TSO context for TCP and a non-TSO context for UDP, and then
transmits both TCP and UDP traffic in parallel. The e1000 device
sometimes ends up using TCP-specific parameters while doing checksum
offload on a UDP datagram: it writes the checksum to offset 16 (the
correct location for a TCP checksum), stomping on two bytes of UDP
data, and leaving the wrong value in the actual UDP checksum field at
offset 6. (Even worse, the host network stack may then recompute the
UDP checksum, "correcting" it to match the corrupt data before sending
it out a physical interface.)

Correct this by tracking the TSO context independently of the non-TSO
context, and selecting the appropriate context based on the TSE flag
in each transmit data descriptor.

Signed-off-by: Ed Swierk <eswierk@skyportsystems.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
2017-12-22 09:53:50 +08:00
..
9pfs 9pfs: fix v9fs_mark_fids_unreclaim() return value 2017-11-06 18:05:35 +01:00
acpi hw/acpi: ACPI_PM_* defines are not restricted to i386 arch 2017-12-18 17:07:02 +03:00
adc STM32F2xx: Add the ADC device 2016-10-04 13:28:07 +01:00
alpha hw/timer/mc146818: rename rtc_init() -> mc146818_rtc_init() 2017-12-18 17:07:02 +03:00
arm misc: remove duplicated includes 2017-12-18 17:07:02 +03:00
audio misc: remove old i386 dependency 2017-12-18 17:07:02 +03:00
block virtio-blk: reject configs with logical block size > physical block size 2017-12-19 10:25:09 +00:00
bt bt: stop the sdp memory allocation craziness 2017-08-01 17:27:33 +02:00
char misc: drop old i386 dependency 2017-12-18 17:07:03 +03:00
core Pull request 2017-12-20 11:30:55 +00:00
cpu hw: use "qemu/osdep.h" as first #include in source files 2017-12-18 17:07:02 +03:00
cris cris: use generic cpu_model parsing 2017-10-27 16:03:54 +02:00
display hw/display/vga: extract public API from i386/pc to "hw/display/vga.h" 2017-12-18 17:07:02 +03:00
dma sun4m_iommu: remove legacy sparc_iommu_memory_rw() function 2017-10-31 17:25:37 +00:00
gpio hw/gpio/omap_gpio.c: Don't use old_mmio 2017-09-21 16:34:27 +01:00
i2c hw/i2c: remove old i386 dependency 2017-12-18 17:07:02 +03:00
i386 hw/i386/vmport: fix missing definitions with non-log trace backends 2017-12-21 22:52:28 +00:00
ide hw/block: Use errp directly rather than local_err 2017-12-19 10:25:03 +00:00
input i386/pc: move vmmouse.c to hw/i386/ 2017-12-18 17:07:02 +03:00
intc i8259: move TYPE_INTERRUPT_STATS_PROVIDER upper 2017-12-21 09:30:32 +01:00
ipack pci: Add INTERFACE_CONVENTIONAL_PCI_DEVICE to Conventional PCI devices 2017-10-15 05:54:43 +03:00
ipmi hw/ipmi: remove old i386 dependency 2017-12-18 17:07:02 +03:00
isa hw/timer/mc146818: rename rtc_init() -> mc146818_rtc_init() 2017-12-18 17:07:02 +03:00
lm32 lm32: lm32_boards: use generic cpu_model parsing 2017-10-27 16:03:54 +02:00
m68k m68k: mcf5208: use generic cpu_model parsing 2017-10-27 16:03:54 +02:00
mem spapr: replace numa_get_node() with lookup in pc-dimm list 2017-12-15 09:49:24 +11:00
microblaze hw: Use new memory_region_init_{ram, rom, rom_device}() functions 2017-07-14 17:59:42 +01:00
mips hw/mips/boston: Remove workaround for writes to ROM aborting 2017-12-21 09:30:32 +01:00
misc i386/pc: move vmport.c to hw/i386/ 2017-12-18 17:07:02 +03:00
moxie hw/moxie/moxiesim: Add support for loading a BIOS on moxiesim 2017-12-21 09:30:31 +01:00
net e1000: Separate TSO and non-TSO contexts, fixing UDP TX corruption 2017-12-22 09:53:50 +08:00
nios2 nios2: remove duplicated includes (in code commented out) 2017-12-18 17:07:02 +03:00
nvram nvram: add AT24Cx i2c eeprom 2017-12-15 09:49:23 +11:00
openrisc openrisc: use generic cpu_model parsing 2017-10-27 16:03:54 +02:00
pci pci: Initialize pci_dev->name before use 2017-11-16 17:46:53 +02:00
pci-bridge misc: remove old i386 dependency 2017-12-18 17:07:02 +03:00
pci-host e500: fix pci host bridge class/type 2017-12-15 09:49:24 +11:00
pcmcia hw: Clean up includes 2016-01-29 15:07:25 +00:00
ppc hw/net/ne2000: extract ne2k-isa code from i386/pc to ne2000-isa.c 2017-12-18 17:07:02 +03:00
s390x misc: remove duplicated includes 2017-12-18 17:07:02 +03:00
scsi scsi: provide general-purpose functions to manage sense data 2017-12-21 09:30:32 +01:00
sd pci: Add INTERFACE_CONVENTIONAL_PCI_DEVICE to Conventional PCI devices 2017-10-15 05:54:43 +03:00
sh4 sh4: shix: use generic cpu_model parsing 2017-10-27 16:03:54 +02:00
smbios hw: use "qemu/osdep.h" as first #include in source files 2017-12-18 17:07:02 +03:00
sparc misc: drop old i386 dependency 2017-12-18 17:07:03 +03:00
sparc64 sparc: sun4u/sun4v/niagara: use generic cpu_model parsing 2017-10-27 16:04:27 +02:00
ssi hw/ssi/aspeed_smc: remove unused #include 2017-12-18 17:07:02 +03:00
timer hw/timer/mc146818: rename rtc_init() -> mc146818_rtc_init() 2017-12-18 17:07:02 +03:00
tpm tpm: move qdev_prop_tpm to hw/tpm/ 2017-12-19 06:40:04 -05:00
tricore tricore: use generic cpu_model parsing 2017-10-27 16:04:27 +02:00
unicore32 hw/unicore32: restrict hw addr defines to source file 2017-12-18 17:07:02 +03:00
usb dev-storage: Fix the unusual function name 2017-12-19 10:25:08 +00:00
vfio hw: use "qemu/osdep.h" as first #include in source files 2017-12-18 17:07:02 +03:00
virtio hw/virtio-balloon: remove old i386 dependency 2017-12-18 17:07:02 +03:00
watchdog misc: drop old i386 dependency 2017-12-18 17:07:03 +03:00
xen xen/pt: Set is_express to avoid out-of-bounds write 2017-12-14 16:11:53 -08:00
xenpv xenfb: remove xen_init_display "temporary" hack 2017-07-07 11:10:03 -07:00
xtensa xtensa: lx60/lx200/ml605/kc705: use generic cpu_model parsing 2017-10-27 16:04:27 +02:00
Makefile.objs 9pfs: fix dependencies 2017-08-30 18:23:25 +02:00