From: jan@openbsd.org Subject: Re: igc(4) tso To: Moritz Buhl Cc: tech@openbsd.org, bket@openbsd.org, bluhm@openbsd.org Date: Thu, 2 May 2024 21:27:07 +0200 On Thu, May 02, 2024 at 08:51:26PM GMT, Moritz Buhl wrote: > I addressed your comment and also noticed that the diff broke with > previous convention of using the ISSET macro. > > Is this ok? After talking with bluhm. We come to the conclusion, that this diff is better: Index: dev/pci//if_igc.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_igc.c,v diff -u -p -r1.20 if_igc.c --- dev/pci//if_igc.c 12 Apr 2024 19:27:43 -0000 1.20 +++ dev/pci//if_igc.c 2 May 2024 18:55:11 -0000 @@ -44,10 +44,14 @@ #include #include +#include #include #include #include +#include +#include +#include #if NBPFILTER > 0 #include @@ -796,6 +800,7 @@ igc_setup_interface(struct igc_softc *sc ifp->if_capabilities |= IFCAP_CSUM_IPv4; ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4; ifp->if_capabilities |= IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6; + ifp->if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6; /* Initialize ifmedia structures. */ ifmedia_init(&sc->media, IFM_IMASK, igc_media_change, igc_media_status); @@ -2025,13 +2030,11 @@ igc_tx_ctx_setup(struct tx_ring *txr, st { struct ether_extracted ext; struct igc_adv_tx_context_desc *txdesc; + uint32_t mss_l4len_idx = 0; uint32_t type_tucmd_mlhl = 0; uint32_t vlan_macip_lens = 0; int off = 0; - ether_extract_headers(mp, &ext); - vlan_macip_lens |= (sizeof(*ext.eh) << IGC_ADVTXD_MACLEN_SHIFT); - /* * In advanced descriptors the vlan tag must * be placed into the context descriptor. Hence @@ -2046,6 +2049,10 @@ igc_tx_ctx_setup(struct tx_ring *txr, st } #endif + ether_extract_headers(mp, &ext); + + vlan_macip_lens |= (sizeof(*ext.eh) << IGC_ADVTXD_MACLEN_SHIFT); + if (ext.ip4) { type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV4; if (ISSET(mp->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT)) { @@ -2056,6 +2063,9 @@ igc_tx_ctx_setup(struct tx_ring *txr, st } else if (ext.ip6) { type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV6; #endif + } else { + if (mp->m_pkthdr.csum_flags & M_TCP_TSO) + tcpstat_inc(tcps_outbadtso); } vlan_macip_lens |= ext.iphlen; @@ -2075,6 +2085,30 @@ igc_tx_ctx_setup(struct tx_ring *txr, st } } + if (mp->m_pkthdr.csum_flags & M_TCP_TSO) { + if (ext.tcp) { + uint32_t hdrlen, thlen, paylen, outlen; + + thlen = ext.tcphlen; + + outlen = mp->m_pkthdr.ph_mss; + mss_l4len_idx |= outlen << IGC_ADVTXD_MSS_SHIFT; + mss_l4len_idx |= thlen << IGC_ADVTXD_L4LEN_SHIFT; + + hdrlen = sizeof(*ext.eh) + ext.iphlen + thlen; + paylen = mp->m_pkthdr.len - hdrlen; + CLR(*olinfo_status, IGC_ADVTXD_PAYLEN_MASK); + *olinfo_status |= paylen << IGC_ADVTXD_PAYLEN_SHIFT; + + *cmd_type_len |= IGC_ADVTXD_DCMD_TSE; + off = 1; + + tcpstat_add(tcps_outpkttso, + (paylen + outlen - 1) / outlen); + } else + tcpstat_inc(tcps_outbadtso); + } + if (off == 0) return 0; @@ -2085,7 +2119,7 @@ igc_tx_ctx_setup(struct tx_ring *txr, st htolem32(&txdesc->vlan_macip_lens, vlan_macip_lens); htolem32(&txdesc->type_tucmd_mlhl, type_tucmd_mlhl); htolem32(&txdesc->seqnum_seed, 0); - htolem32(&txdesc->mss_l4len_idx, 0); + htolem32(&txdesc->mss_l4len_idx, mss_l4len_idx); return 1; } Index: dev/pci//igc_base.h =================================================================== RCS file: /cvs/src/sys/dev/pci/igc_base.h,v diff -u -p -r1.2 igc_base.h --- dev/pci//igc_base.h 25 Mar 2024 20:25:13 -0000 1.2 +++ dev/pci//igc_base.h 2 May 2024 19:20:23 -0000 @@ -66,6 +66,7 @@ struct igc_adv_tx_context_desc { #define IGC_ADVTXD_POPTS_ISCO_FULL 0x00001800 #define IGC_ADVTXD_POPTS_IPSEC 0x00000400 /* IPSec offload request */ #define IGC_ADVTXD_PAYLEN_SHIFT 14 /* Adv desc PAYLEN shift */ +#define IGC_ADVTXD_PAYLEN_MASK 0xFFFFD000 /* Adv desc PAYLEN mask */ /* Advanced Transmit Context Descriptor Config */ #define IGC_ADVTXD_MACLEN_SHIFT 9 /* Adv ctxt desc mac len shift */