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/                 

Reply via email to