On Tue, Feb 07, 2023 at 01:09:25AM +0100, Christian Weisgerber wrote: | Jan Klemkow: | | > > igc(4) has very similar code, but I don't have access to a machine | > > with that hardware. | > | > Send me an ssh-key and I give you access to this machine: | | Alternatively, here's the diff, so other people can test it.
Works well for me with: igc0 at pci2 dev 0 function 0 "Intel I225-V" rev 0x03, msix, 4 queues, address 60:be:b4:02:9e:70 Haven't been able to test at 2.5GB/s, so 1GB/s max for now. Paul 'WEiRD' de Weerd | diff a0c537a1c9d84e98322b55d8f71438a147aaa7c4 7d976644b87094d08f478fb087be35b91d2e38a7 | commit - a0c537a1c9d84e98322b55d8f71438a147aaa7c4 | commit + 7d976644b87094d08f478fb087be35b91d2e38a7 | blob - a904d43c66b767b162b7602f2ef35fa5dc6dae4f | blob + c172c137bf82cea95f6f7c0524cd7e72ced18018 | --- sys/dev/pci/if_igc.c | +++ sys/dev/pci/if_igc.c | @@ -2002,17 +2002,14 @@ igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, | igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, int prod, | uint32_t *olinfo_status) | { | + struct ether_extracted ext; | struct igc_adv_tx_context_desc *txdesc; | - struct ether_header *eh = mtod(mp, struct ether_header *); | - struct mbuf *m; | uint32_t type_tucmd_mlhl = 0; | uint32_t vlan_macip_lens = 0; | uint32_t iphlen; | - int hoff; | int off = 0; | - uint8_t ipproto; | | - vlan_macip_lens |= (sizeof(*eh) << IGC_ADVTXD_MACLEN_SHIFT); | + vlan_macip_lens |= (sizeof(*ext.eh) << IGC_ADVTXD_MACLEN_SHIFT); | | /* | * In advanced descriptors the vlan tag must | @@ -2029,62 +2026,41 @@ igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, | #endif | #endif | | - switch (ntohs(eh->ether_type)) { | - case ETHERTYPE_IP: { | - struct ip *ip; | + ether_extract_headers(mp, &ext); | | - m = m_getptr(mp, sizeof(*eh), &hoff); | - KASSERT(m != NULL && m->m_len - hoff >= sizeof(*ip)); | - ip = (struct ip *)(mtod(m, caddr_t) + hoff); | + if (ext.ip4) { | + iphlen = ext.ip4->ip_hl << 2; | | - iphlen = ip->ip_hl << 2; | - ipproto = ip->ip_p; | - | type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV4; | if (ISSET(mp->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT)) { | *olinfo_status |= IGC_TXD_POPTS_IXSM << 8; | off = 1; | } | - | - break; | - } | #ifdef INET6 | - case ETHERTYPE_IPV6: { | - struct ip6_hdr *ip6; | + } else if (ext.ip6) { | + iphlen = sizeof(*ext.ip6); | | - m = m_getptr(mp, sizeof(*eh), &hoff); | - KASSERT(m != NULL && m->m_len - hoff >= sizeof(*ip6)); | - ip6 = (struct ip6_hdr *)(mtod(m, caddr_t) + hoff); | - | - iphlen = sizeof(*ip6); | - ipproto = ip6->ip6_nxt; | - | type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV6; | - break; | - } | #endif | - default: | + } else { | return 0; | } | | vlan_macip_lens |= iphlen; | type_tucmd_mlhl |= IGC_ADVTXD_DCMD_DEXT | IGC_ADVTXD_DTYP_CTXT; | | - switch (ipproto) { | - case IPPROTO_TCP: | + if (ext.tcp) { | type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_L4T_TCP; | if (ISSET(mp->m_pkthdr.csum_flags, M_TCP_CSUM_OUT)) { | *olinfo_status |= IGC_TXD_POPTS_TXSM << 8; | off = 1; | } | - break; | - case IPPROTO_UDP: | + } else if (ext.udp) { | type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_L4T_UDP; | if (ISSET(mp->m_pkthdr.csum_flags, M_UDP_CSUM_OUT)) { | *olinfo_status |= IGC_TXD_POPTS_TXSM << 8; | off = 1; | } | - break; | } | | if (off == 0) | | -- | Christian "naddy" Weisgerber na...@mips.inka.de | -- >++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+ +++++++++++>-]<.>++[<------------>-]<+.--------------.[-] http://www.weirdnet.nl/