On Mon, Feb 06, 2023 at 09:47:57PM +0100, Christian Weisgerber wrote: > Christian Weisgerber: > > > I also switched over em(4) to this and have successfully used it > > for a full 30-hour package build on the four amd64 ports machines > > with their I350 interfaces. Additionally, I've done some IPv6 > > testing at home over an I210. > > ok for this?
I tested it with I350. Diff look fine. ok jan@ > 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: http://obsd-lab.genua.de/hw/ot34.html Thanks, Jan > > diff f8646d27d4041e5f595c04e17a876f12600deea7 > > f3f95d0cc0957a2f1e961cace4c3c9dd869e8c9e > > commit - f8646d27d4041e5f595c04e17a876f12600deea7 > > commit + f3f95d0cc0957a2f1e961cace4c3c9dd869e8c9e > > blob - c840377f0a3f1ef3c3e3072657698d8085ffd3a0 > > blob + 523ed5b0a18718c50bb30e2995d293fa1d2199a6 > > --- sys/dev/pci/if_em.c > > +++ sys/dev/pci/if_em.c > > @@ -2398,12 +2398,11 @@ em_tx_ctx_setup(struct em_queue *que, struct mbuf > > *mp, > > em_tx_ctx_setup(struct em_queue *que, struct mbuf *mp, u_int head, > > u_int32_t *olinfo_status, u_int32_t *cmd_type_len) > > { > > + struct ether_extracted ext; > > struct e1000_adv_tx_context_desc *TD; > > - struct ether_header *eh = mtod(mp, struct ether_header *); > > - struct mbuf *m; > > uint32_t vlan_macip_lens = 0, type_tucmd_mlhl = 0, mss_l4len_idx = 0; > > - int off = 0, hoff; > > - uint8_t ipproto, iphlen; > > + int off = 0; > > + uint8_t iphlen; > > > > *olinfo_status = 0; > > *cmd_type_len = 0; > > @@ -2418,44 +2417,26 @@ em_tx_ctx_setup(struct em_queue *que, struct mbuf > > *mp, > > } > > #endif > > > > - vlan_macip_lens |= (sizeof(*eh) << E1000_ADVTXD_MACLEN_SHIFT); > > - > > - switch (ntohs(eh->ether_type)) { > > - case ETHERTYPE_IP: { > > - struct ip *ip; > > + ether_extract_headers(mp, &ext); > > > > - m = m_getptr(mp, sizeof(*eh), &hoff); > > - ip = (struct ip *)(mtod(m, caddr_t) + hoff); > > + vlan_macip_lens |= (sizeof(*ext.eh) << E1000_ADVTXD_MACLEN_SHIFT); > > > > - iphlen = ip->ip_hl << 2; > > - ipproto = ip->ip_p; > > + if (ext.ip4) { > > + iphlen = ext.ip4->ip_hl << 2; > > > > type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_IPV4; > > if (ISSET(mp->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT)) { > > *olinfo_status |= E1000_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); > > - ip6 = (struct ip6_hdr *)(mtod(m, caddr_t) + hoff); > > - > > - iphlen = sizeof(*ip6); > > - ipproto = ip6->ip6_nxt; > > - > > type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_IPV6; > > - break; > > - } > > #endif > > - default: > > + } else { > > iphlen = 0; > > - ipproto = 0; > > - break; > > } > > > > *cmd_type_len |= E1000_ADVTXD_DTYP_DATA | E1000_ADVTXD_DCMD_IFCS; > > @@ -2464,21 +2445,18 @@ em_tx_ctx_setup(struct em_queue *que, struct mbuf > > *mp, > > vlan_macip_lens |= iphlen; > > type_tucmd_mlhl |= E1000_ADVTXD_DCMD_DEXT | E1000_ADVTXD_DTYP_CTXT; > > > > - switch (ipproto) { > > - case IPPROTO_TCP: > > + if (ext.tcp) { > > type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_L4T_TCP; > > if (ISSET(mp->m_pkthdr.csum_flags, M_TCP_CSUM_OUT)) { > > *olinfo_status |= E1000_TXD_POPTS_TXSM << 8; > > off = 1; > > } > > - break; > > - case IPPROTO_UDP: > > + } else if (ext.udp) { > > type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_L4T_UDP; > > if (ISSET(mp->m_pkthdr.csum_flags, M_UDP_CSUM_OUT)) { > > *olinfo_status |= E1000_TXD_POPTS_TXSM << 8; > > off = 1; > > } > > - break; > > } > > > > if (!off) > > > > -- > Christian "naddy" Weisgerber na...@mips.inka.de >