This diff passed a make release. I think it should be commited now, so that we can proceed with TSO in the driver layer.
bluhm On Mon, May 15, 2023 at 11:16:59PM +0200, Jan Klemkow wrote: > Index: sbin/ifconfig/ifconfig.8 > =================================================================== > RCS file: /cvs/src/sbin/ifconfig/ifconfig.8,v > retrieving revision 1.394 > diff -u -p -r1.394 ifconfig.8 > --- sbin/ifconfig/ifconfig.8 26 Apr 2023 02:38:08 -0000 1.394 > +++ sbin/ifconfig/ifconfig.8 15 May 2023 18:46:48 -0000 > @@ -282,8 +282,18 @@ tag. > As CSUM_TCPv4, but supports IPv6 datagrams. > .It Sy CSUM_UDPv6 > As above, for UDP. > -.It Sy TSO > -The device supports TCP segment offloading (TSO). > +.It Sy LRO > +The device supports TCP large receive offload (LRO). > +.It Sy TSOv4 > +The device supports IPv4 TCP segmentation offload (TSO). > +TSO is used by default. > +Use the > +.Xr sysctl 8 > +variable > +.Va net.inet.tcp.tso > +to disable this feature. > +.It Sy TSOv6 > +As above, for IPv6. > .It Sy WOL > The device supports Wake on LAN (WoL). > .It Sy hardmtu > @@ -491,25 +501,25 @@ Query and display information and diagno > modules installed in an interface. > It is only supported by drivers implementing the necessary functionality > on hardware which supports it. > -.It Cm tso > -Enable TCP segmentation offloading (TSO) if it's supported by the hardware; > see > +.It Cm tcprecvoffload > +Enable TCP large receive offload (LRO) if it's supported by the hardware; see > .Cm hwfeatures . > -TSO enabled NICs modify received TCP/IP packets. > +LRO enabled network interfaces modify received TCP/IP packets. > This will also affect traffic of upper layer interfaces, > such as > .Xr vlan 4 , > .Xr aggr 4 , > and > .Xr carp 4 . > -It is not possible to use TSO with interfaces attached to a > +It is not possible to use LRO with interfaces attached to a > .Xr bridge 4 , > .Xr veb 4 , > or > .Xr tpmr 4 . > Changing this option will re-initialize the network interface. > -.It Cm -tso > -Disable TSO. > -TSO is disabled by default. > +.It Cm -tcprecvoffload > +Disable LRO. > +LRO is disabled by default. > .It Cm up > Mark an interface > .Dq up . > Index: sbin/ifconfig/ifconfig.c > =================================================================== > RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v > retrieving revision 1.463 > diff -u -p -r1.463 ifconfig.c > --- sbin/ifconfig/ifconfig.c 12 May 2023 18:24:13 -0000 1.463 > +++ sbin/ifconfig/ifconfig.c 15 May 2023 20:27:51 -0000 > @@ -126,7 +126,7 @@ > #define HWFEATURESBITS > \ > "\024\1CSUM_IPv4\2CSUM_TCPv4\3CSUM_UDPv4" \ > "\5VLAN_MTU\6VLAN_HWTAGGING\10CSUM_TCPv6" \ > - "\11CSUM_UDPv6\17TSO\20WOL" > + "\11CSUM_UDPv6\15TSOv4\16TSOv6\17LSO\20WOL" > > struct ifencap { > unsigned int ife_flags; > @@ -469,8 +469,8 @@ const struct cmd { > { "-soii", IFXF_INET6_NOSOII, 0, setifxflags }, > { "monitor", IFXF_MONITOR, 0, setifxflags }, > { "-monitor", -IFXF_MONITOR, 0, setifxflags }, > - { "tso", IFXF_TSO, 0, setifxflags }, > - { "-tso", -IFXF_TSO, 0, setifxflags }, > + { "tcprecvoffload", IFXF_LRO, 0, setifxflags }, > + { "-tcprecvoffload", -IFXF_LRO, 0, setifxflags }, > #ifndef SMALL > { "hwfeatures", NEXTARG0, 0, printifhwfeatures }, > { "metric", NEXTARG, 0, setifmetric }, > @@ -674,7 +674,7 @@ const struct cmd { > "\7RUNNING\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX" \ > "\15LINK0\16LINK1\17LINK2\20MULTICAST" \ > "\23AUTOCONF6TEMP\24MPLS\25WOL\26AUTOCONF6\27INET6_NOSOII" \ > - "\30AUTOCONF4" "\31MONITOR" "\32TSO" > + "\30AUTOCONF4" "\31MONITOR" "\32LRO" > > int getinfo(struct ifreq *, int); > void getsock(int); > Index: sys/dev/pci/if_ix.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/if_ix.c,v > retrieving revision 1.193 > diff -u -p -r1.193 if_ix.c > --- sys/dev/pci/if_ix.c 28 Apr 2023 10:18:57 -0000 1.193 > +++ sys/dev/pci/if_ix.c 15 May 2023 21:09:13 -0000 > @@ -1925,7 +1925,7 @@ ixgbe_setup_interface(struct ix_softc *s > ifp->if_capabilities |= IFCAP_CSUM_IPv4; > > if (sc->hw.mac.type != ixgbe_mac_82598EB) > - ifp->if_capabilities |= IFCAP_TSO; > + ifp->if_capabilities |= IFCAP_LRO; > > /* > * Specify the media types supported by this sc and register > @@ -2873,13 +2873,13 @@ ixgbe_initialize_receive_units(struct ix > hlreg |= IXGBE_HLREG0_JUMBOEN; > IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg); > > - if (ISSET(ifp->if_xflags, IFXF_TSO)) { > + if (ISSET(ifp->if_xflags, IFXF_LRO)) { > rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); > > /* This field has to be set to zero. */ > rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE; > > - /* Enable TSO Receive Offloading */ > + /* RSC Coalescing on ACK Change */ > rdrxctl |= IXGBE_RDRXCTL_RSCACKC; > rdrxctl |= IXGBE_RDRXCTL_FCOE_WRFIX; > > @@ -2902,10 +2902,10 @@ ixgbe_initialize_receive_units(struct ix > srrctl = bufsz | IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF; > IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(i), srrctl); > > - if (ISSET(ifp->if_xflags, IFXF_TSO)) { > + if (ISSET(ifp->if_xflags, IFXF_LRO)) { > rdrxctl = IXGBE_READ_REG(&sc->hw, IXGBE_RSCCTL(i)); > > - /* Enable TSO Receive Side Coalescing */ > + /* Enable Receive Side Coalescing */ > rdrxctl |= IXGBE_RSCCTL_RSCEN; > rdrxctl |= IXGBE_RSCCTL_MAXDESC_16; > > @@ -3263,7 +3263,7 @@ ixgbe_setup_vlan_hw_support(struct ix_so > * We have to disable VLAN striping when using TCP offloading, due to a > * firmware bug. > */ > - if (ISSET(ifp->if_xflags, IFXF_TSO)) { > + if (ISSET(ifp->if_xflags, IFXF_LRO)) { > sc->vlan_stripping = 0; > return; > } > Index: sys/net/if.c > =================================================================== > RCS file: /cvs/src/sys/net/if.c,v > retrieving revision 1.696 > diff -u -p -r1.696 if.c > --- sys/net/if.c 14 May 2023 01:46:53 -0000 1.696 > +++ sys/net/if.c 15 May 2023 20:27:21 -0000 > @@ -2109,10 +2109,9 @@ ifioctl(struct socket *so, u_long cmd, c > error = ENOTSUP; > } > #endif > - > - if (ISSET(ifr->ifr_flags, IFXF_TSO) != > - ISSET(ifp->if_xflags, IFXF_TSO)) > - error = ifsettso(ifp, ISSET(ifr->ifr_flags, IFXF_TSO)); > + if (ISSET(ifr->ifr_flags, IFXF_LRO) != > + ISSET(ifp->if_xflags, IFXF_LRO)) > + error = ifsetlro(ifp, ISSET(ifr->ifr_flags, IFXF_LRO)); > > if (error == 0) > ifp->if_xflags = (ifp->if_xflags & IFXF_CANTCHANGE) | > @@ -3153,36 +3152,32 @@ ifpromisc(struct ifnet *ifp, int pswitch > return (error); > } > > -/* Set/clear TSO flag and restart interface if needed. */ > +/* Set/clear LRO flag and restart interface if needed. */ > int > -ifsettso(struct ifnet *ifp, int on) > +ifsetlro(struct ifnet *ifp, int on) > { > struct ifreq ifrq; > int error = 0; > int s = splnet(); > > + if (!ISSET(ifp->if_capabilities, IFCAP_LRO)) { > + error = ENOTSUP; > + goto out; > + } > + > NET_ASSERT_LOCKED(); /* for ioctl */ > KERNEL_ASSERT_LOCKED(); /* for if_flags */ > > - if (on && !ISSET(ifp->if_xflags, IFXF_TSO)) { > - if (!ISSET(ifp->if_capabilities, IFCAP_TSO)) { > - error = ENOTSUP; > - goto out; > - } > + if (on && !ISSET(ifp->if_xflags, IFXF_LRO)) { > if (ether_brport_isset(ifp)) { > error = EBUSY; > goto out; > } > - SET(ifp->if_xflags, IFXF_TSO); > - } else if (!on && ISSET(ifp->if_xflags, IFXF_TSO)) > - CLR(ifp->if_xflags, IFXF_TSO); > + SET(ifp->if_xflags, IFXF_LRO); > + } else if (!on && ISSET(ifp->if_xflags, IFXF_LRO)) > + CLR(ifp->if_xflags, IFXF_LRO); > else > goto out; > - > -#if NVLAN > 0 > - /* Change TSO flag also on attached vlan(4) interfaces. */ > - vlan_flags_from_parent(ifp, IFXF_TSO); > -#endif > > /* restart interface */ > if (ISSET(ifp->if_flags, IFF_UP)) { > Index: sys/net/if.h > =================================================================== > RCS file: /cvs/src/sys/net/if.h,v > retrieving revision 1.212 > diff -u -p -r1.212 if.h > --- sys/net/if.h 15 May 2023 16:34:56 -0000 1.212 > +++ sys/net/if.h 15 May 2023 20:28:25 -0000 > @@ -231,7 +231,7 @@ struct if_status_description { > #define IFXF_INET6_NOSOII 0x40 /* [N] don't do RFC 7217 */ > #define IFXF_AUTOCONF4 0x80 /* [N] v4 autoconf (aka dhcp) > enabled */ > #define IFXF_MONITOR 0x100 /* [N] only used for bpf */ > -#define IFXF_TSO 0x200 /* [N] XXX missnamed, should be > LRO */ > +#define IFXF_LRO 0x200 /* [N] TCP large recv offload */ > > #define IFXF_CANTCHANGE \ > (IFXF_MPSAFE|IFXF_CLONED) > @@ -253,7 +253,7 @@ struct if_status_description { > #define IFCAP_CSUM_UDPv6 0x00000100 /* can do IPv6/UDP > checksums */ > #define IFCAP_TSOv4 0x00001000 /* IPv4/TCP segment > offload */ > #define IFCAP_TSOv6 0x00002000 /* IPv6/TCP segment > offload */ > -#define IFCAP_TSO 0x00004000 /* XXX should be LRO */ > +#define IFCAP_LRO 0x00004000 /* TCP large recv > offload */ > #define IFCAP_WOL 0x00008000 /* can do wake on lan */ > > #define IFCAP_CSUM_MASK (IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | \ > @@ -546,7 +546,7 @@ void if_getdata(struct ifnet *, struct i > void ifinit(void); > int ifioctl(struct socket *, u_long, caddr_t, struct proc *); > int ifpromisc(struct ifnet *, int); > -int ifsettso(struct ifnet *, int); > +int ifsetlro(struct ifnet *, int); > struct ifg_group *if_creategroup(const char *); > int if_addgroup(struct ifnet *, const char *); > int if_delgroup(struct ifnet *, const char *); > Index: sys/net/if_aggr.c > =================================================================== > RCS file: /cvs/src/sys/net/if_aggr.c,v > retrieving revision 1.39 > diff -u -p -r1.39 if_aggr.c > --- sys/net/if_aggr.c 5 Feb 2022 03:56:16 -0000 1.39 > +++ sys/net/if_aggr.c 15 May 2023 18:46:48 -0000 > @@ -2618,6 +2618,9 @@ aggr_update_capabilities(struct aggr_sof > uint32_t capabilities = ~0; > int set = 0; > > + /* Do not inherit LRO capabilities. */ > + CLR(capabilities, IFCAP_LRO); > + > rw_enter_read(&sc->sc_lock); > TAILQ_FOREACH(p, &sc->sc_ports, p_entry) { > struct ifnet *ifp0 = p->p_ifp0; > Index: sys/net/if_bridge.c > =================================================================== > RCS file: /cvs/src/sys/net/if_bridge.c,v > retrieving revision 1.367 > diff -u -p -r1.367 if_bridge.c > --- sys/net/if_bridge.c 13 May 2023 13:35:17 -0000 1.367 > +++ sys/net/if_bridge.c 15 May 2023 20:27:21 -0000 > @@ -338,7 +338,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c > */ > > NET_LOCK(); > - ifsettso(ifs, 0); > + ifsetlro(ifs, 0); > NET_UNLOCK(); > > bif->bridge_sc = sc; > @@ -401,7 +401,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c > } > > NET_LOCK(); > - ifsettso(ifs, 0); > + ifsetlro(ifs, 0); > NET_UNLOCK(); > > bif->bridge_sc = sc; > Index: sys/net/if_tpmr.c > =================================================================== > RCS file: /cvs/src/sys/net/if_tpmr.c,v > retrieving revision 1.32 > diff -u -p -r1.32 if_tpmr.c > --- sys/net/if_tpmr.c 27 Feb 2023 09:35:32 -0000 1.32 > +++ sys/net/if_tpmr.c 15 May 2023 18:46:48 -0000 > @@ -521,7 +521,7 @@ tpmr_add_port(struct tpmr_softc *sc, con > goto put; > } > > - ifsettso(ifp0, 0); > + ifsetlro(ifp0, 0); > > p->p_ifp0 = ifp0; > p->p_tpmr = sc; > Index: sys/net/if_veb.c > =================================================================== > RCS file: /cvs/src/sys/net/if_veb.c,v > retrieving revision 1.30 > diff -u -p -r1.30 if_veb.c > --- sys/net/if_veb.c 27 Feb 2023 09:35:32 -0000 1.30 > +++ sys/net/if_veb.c 15 May 2023 18:46:48 -0000 > @@ -1465,7 +1465,7 @@ veb_add_port(struct veb_softc *sc, const > goto put; > } > > - ifsettso(ifp0, 0); > + ifsetlro(ifp0, 0); > > p->p_ifp0 = ifp0; > p->p_veb = sc; > Index: sys/net/if_vlan.c > =================================================================== > RCS file: /cvs/src/sys/net/if_vlan.c,v > retrieving revision 1.214 > diff -u -p -r1.214 if_vlan.c > --- sys/net/if_vlan.c 26 Apr 2023 00:14:21 -0000 1.214 > +++ sys/net/if_vlan.c 15 May 2023 20:54:34 -0000 > @@ -536,7 +536,8 @@ vlan_up(struct vlan_softc *sc) > * Chips that can do hardware-assisted VLAN encapsulation, can > * calculate the correct checksum for VLAN tagged packets. > */ > - ifp->if_capabilities = ifp0->if_capabilities & IFCAP_CSUM_MASK; > + ifp->if_capabilities = ifp0->if_capabilities & > + (IFCAP_CSUM_MASK | IFCAP_TSOv4 | IFCAP_TSOv6); > } > > /* commit the sc */ > @@ -560,9 +561,6 @@ vlan_up(struct vlan_softc *sc) > /* configure the parent to handle packets for this vlan */ > vlan_multi_apply(sc, ifp0, SIOCADDMULTI); > > - /* Inherit flags from parent interface. */ > - vlan_flags_from_parent(ifp0, IFXF_TSO); > - > /* we're running now */ > SET(ifp->if_flags, IFF_RUNNING); > vlan_link_state(sc, ifp0->if_link_state, ifp0->if_baudrate); > @@ -963,28 +961,6 @@ vlan_del_parent(struct vlan_softc *sc) > if_setlladdr(ifp, etheranyaddr); > > return (0); > -} > - > -void > -vlan_flags_from_parent(struct ifnet *ifp0, int flags) > -{ > - struct vlan_softc *sc; > - int i; > - > - for (i = 0; i < TAG_HASH_SIZE; i++) { > - SMR_SLIST_FOREACH_LOCKED(sc, &vlan_tagh[i], sc_list) { > - /* vlan and tso only works with hw tagging */ > - if (!ISSET(ifp0->if_capabilities, IFCAP_VLAN_HWTAGGING)) > - CLR(flags, IFXF_TSO); > - > - if (sc->sc_ifidx0 == ifp0->if_index) { > - if (ISSET(ifp0->if_xflags, flags)) > - SET(sc->sc_if.if_xflags, flags); > - else > - CLR(sc->sc_if.if_xflags, flags); > - } > - } > - } > } > > int > Index: sys/netinet/ip_carp.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_carp.c,v > retrieving revision 1.356 > diff -u -p -r1.356 ip_carp.c > --- sys/netinet/ip_carp.c 8 Mar 2023 04:43:09 -0000 1.356 > +++ sys/netinet/ip_carp.c 15 May 2023 20:28:55 -0000 > @@ -1693,7 +1693,7 @@ carp_set_ifp(struct carp_softc *sc, stru > > sc->sc_carpdevidx = ifp0->if_index; > sc->sc_if.if_capabilities = ifp0->if_capabilities & > - IFCAP_CSUM_MASK; > + (IFCAP_CSUM_MASK | IFCAP_TSOv4 | IFCAP_TSOv6); > > SRPL_FOREACH_LOCKED(vr, cif, sc_list) { > struct carp_vhost_entry *vrhead, *schead;