aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2025-11-10 15:34:53 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2025-11-12 08:39:01 +0000
commit52df18d91b83038d870c595799a47d983d7da645 (patch)
tree6f1f3c0c8d7385b9ef774941f74c2f291f30ce1c
parentca38822e05d7343aa0eab86ebed3685f15f5ac31 (diff)
vtnet: fix enabling/disabling tso
Transmit segment offloading depends on transmit checksum offloading. Enforce that constraint. This also fixes a bug, since if_hwassist bits are from the CSUM_ space, not from the IFCAP_ space. PR: 290773 Reviewed by: Timo Völker Tested by: lg@efficientip.com Differential Revision: https://reviews.freebsd.org/D53629 (cherry picked from commit 4c50ac68166caf7e08c5a9984d63fa91490fa50d)
-rw-r--r--sys/dev/virtio/network/if_vtnet.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/sys/dev/virtio/network/if_vtnet.c b/sys/dev/virtio/network/if_vtnet.c
index 8c08a81820e7..643353190966 100644
--- a/sys/dev/virtio/network/if_vtnet.c
+++ b/sys/dev/virtio/network/if_vtnet.c
@@ -1344,20 +1344,40 @@ vtnet_ioctl_ifcap(struct vtnet_softc *sc, struct ifreq *ifr)
VTNET_CORE_LOCK_ASSERT(sc);
if (mask & IFCAP_TXCSUM) {
+ if (if_getcapenable(ifp) & IFCAP_TXCSUM &&
+ if_getcapenable(ifp) & IFCAP_TSO4) {
+ /* Disable tso4, because txcsum will be disabled. */
+ if_setcapenablebit(ifp, 0, IFCAP_TSO4);
+ if_sethwassistbits(ifp, 0, CSUM_IP_TSO);
+ mask &= ~IFCAP_TSO4;
+ }
if_togglecapenable(ifp, IFCAP_TXCSUM);
if_togglehwassist(ifp, VTNET_CSUM_OFFLOAD);
}
if (mask & IFCAP_TXCSUM_IPV6) {
+ if (if_getcapenable(ifp) & IFCAP_TXCSUM_IPV6 &&
+ if_getcapenable(ifp) & IFCAP_TSO6) {
+ /* Disable tso6, because txcsum6 will be disabled. */
+ if_setcapenablebit(ifp, 0, IFCAP_TSO6);
+ if_sethwassistbits(ifp, 0, CSUM_IP6_TSO);
+ mask &= ~IFCAP_TSO6;
+ }
if_togglecapenable(ifp, IFCAP_TXCSUM_IPV6);
if_togglehwassist(ifp, VTNET_CSUM_OFFLOAD_IPV6);
}
if (mask & IFCAP_TSO4) {
- if_togglecapenable(ifp, IFCAP_TSO4);
- if_togglehwassist(ifp, IFCAP_TSO4);
+ if (if_getcapenable(ifp) & (IFCAP_TXCSUM | IFCAP_TSO4)) {
+ /* tso4 can only be enabled, if txcsum is enabled. */
+ if_togglecapenable(ifp, IFCAP_TSO4);
+ if_togglehwassist(ifp, CSUM_IP_TSO);
+ }
}
if (mask & IFCAP_TSO6) {
- if_togglecapenable(ifp, IFCAP_TSO6);
- if_togglehwassist(ifp, IFCAP_TSO6);
+ if (if_getcapenable(ifp) & (IFCAP_TXCSUM_IPV6 | IFCAP_TSO6)) {
+ /* tso6 can only be enabled, if txcsum6 is enabled. */
+ if_togglecapenable(ifp, IFCAP_TSO6);
+ if_togglehwassist(ifp, CSUM_IP6_TSO);
+ }
}
if (mask & (IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6 | IFCAP_LRO)) {