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 [email protected]
|
--
>++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+
+++++++++++>-]<.>++[<------------>-]<+.--------------.[-]
http://www.weirdnet.nl/