From 2011187a052fd12d770845f84390408929b7ba9c Mon Sep 17 00:00:00 2001 From: mbuhl Date: Sat, 4 May 2024 13:35:26 +0000 Subject: [PATCH] Add TSO capabilites. Comments, suggestions and testing from bket@, jan@, and bluhm@ --- sys/dev/pci/if_igc.c | 41 ++++++++++++++++++++++++++++++++++++----- sys/dev/pci/igc_base.h | 3 ++- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/sys/dev/pci/if_igc.c b/sys/dev/pci/if_igc.c index 24cbccd0b91..359499a716f 100644 --- a/sys/dev/pci/if_igc.c +++ b/sys/dev/pci/if_igc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_igc.c,v 1.20 2024/04/12 19:27:43 jan Exp $ */ +/* $OpenBSD: if_igc.c,v 1.21 2024/05/04 13:35:26 mbuhl Exp $ */ /*- * SPDX-License-Identifier: BSD-2-Clause * @@ -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, struct mbuf *mp, int prod, { 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, struct mbuf *mp, int prod, } #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)) { @@ -2075,6 +2082,30 @@ igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, int prod, } } + if (ISSET(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 +2116,7 @@ igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, int prod, 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; } diff --git a/sys/dev/pci/igc_base.h b/sys/dev/pci/igc_base.h index b326237bf5d..a79dc94234e 100644 --- a/sys/dev/pci/igc_base.h +++ b/sys/dev/pci/igc_base.h @@ -1,4 +1,4 @@ -/* $OpenBSD: igc_base.h,v 1.2 2024/03/25 20:25:13 mbuhl Exp $ */ +/* $OpenBSD: igc_base.h,v 1.3 2024/05/04 13:35:26 mbuhl Exp $ */ /*- * Copyright 2021 Intel Corp * Copyright 2021 Rubicon Communications, LLC (Netgate) @@ -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 shift */ /* Advanced Transmit Context Descriptor Config */ #define IGC_ADVTXD_MACLEN_SHIFT 9 /* Adv ctxt desc mac len shift */ -- 2.20.1