The branch stable/14 has been updated by tuexen:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=52df18d91b83038d870c595799a47d983d7da645

commit 52df18d91b83038d870c595799a47d983d7da645
Author:     Michael Tuexen <[email protected]>
AuthorDate: 2025-11-10 15:34:53 +0000
Commit:     Michael Tuexen <[email protected]>
CommitDate: 2025-11-12 08:39:01 +0000

    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:              [email protected]
    Differential Revision:  https://reviews.freebsd.org/D53629
    
    (cherry picked from commit 4c50ac68166caf7e08c5a9984d63fa91490fa50d)
---
 sys/dev/virtio/network/if_vtnet.c | 28 ++++++++++++++++++++++++----
 1 file 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)) {

Reply via email to