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;