Hi,

I am not aware of any more limitations when enabling LRO for TCP
in the network drivers.  The feature allows to receive agregated
packets larger than the MTU.  Receiving TCP streams becomes much
faster.

As the network hardware is not aware whether a packet is received
locally or forwarded, everything is aggregated.  In case of forwarding
it is split on output to packets not larger than the original
packets.  So path MTU discovery should still work.  If the outgoing
interface supports TSO, the packet is chopped in hardware.

Currently only ix(4) and lo(4) support LRO, and ix(4) is limited
to IPv4 and newer than the old 82598 model.  If the interface is
added to a bridge(4) or aggr(4), LRO is automatically disabled.

So in case you possess any ix(4) hardware or do funky pf routing
on lo(4) please run this diff.  If you encounter problems, report
and turn LRO off per interface with ifconfig -tcplro.

bluhm

Index: sys/dev/pci/if_ix.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_ix.c,v
retrieving revision 1.198
diff -u -p -r1.198 if_ix.c
--- sys/dev/pci/if_ix.c 8 Jul 2023 09:01:30 -0000       1.198
+++ sys/dev/pci/if_ix.c 8 Jul 2023 13:51:26 -0000
@@ -1925,8 +1925,10 @@ ixgbe_setup_interface(struct ix_softc *s
        ifp->if_capabilities |= IFCAP_CSUM_IPv4;
 
        ifp->if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6;
-       if (sc->hw.mac.type != ixgbe_mac_82598EB)
+       if (sc->hw.mac.type != ixgbe_mac_82598EB) {
+               ifp->if_xflags |= IFXF_LRO;
                ifp->if_capabilities |= IFCAP_LRO;
+       }
 
        /*
         * Specify the media types supported by this sc and register
Index: sys/net/if_loop.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/if_loop.c,v
retrieving revision 1.95
diff -u -p -r1.95 if_loop.c
--- sys/net/if_loop.c   2 Jul 2023 19:59:15 -0000       1.95
+++ sys/net/if_loop.c   8 Jul 2023 13:51:26 -0000
@@ -172,11 +172,11 @@ loop_clone_create(struct if_clone *ifc, 
        ifp->if_softc = NULL;
        ifp->if_mtu = LOMTU;
        ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
-       ifp->if_xflags = IFXF_CLONED;
+       ifp->if_xflags = IFXF_CLONED | IFXF_LRO;
        ifp->if_capabilities = IFCAP_CSUM_IPv4 |
            IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4 |
            IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6 |
-           IFCAP_LRO;
+           IFCAP_LRO | IFCAP_TSOv4 | IFCAP_TSOv6;
        ifp->if_rtrequest = lortrequest;
        ifp->if_ioctl = loioctl;
        ifp->if_input = loinput;
Index: sbin/ifconfig/ifconfig.8
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sbin/ifconfig/ifconfig.8,v
retrieving revision 1.397
diff -u -p -r1.397 ifconfig.8
--- sbin/ifconfig/ifconfig.8    7 Jun 2023 18:42:40 -0000       1.397
+++ sbin/ifconfig/ifconfig.8    7 Jul 2023 19:57:09 -0000
@@ -519,7 +519,6 @@ or
 Changing this option will re-initialize the network interface.
 .It Cm -tcplro
 Disable LRO.
-LRO is disabled by default.
 .It Cm up
 Mark an interface
 .Dq up .

Reply via email to