On Thu, Jan 26, 2023 at 11:37:51AM +0100, Christian Weisgerber wrote: > Jan Klemkow: > > > we have several drivers which have to parse the content of mbufs. This > > diff suggest a central parsing function for this. Thus, we can reduce > > redundant code. > > > > I just start with ix(4) and ixl(4) because it was easy to test for me. > > But, this could also improve em(4), igc(4), ale(4) and oce(4). > > Here's the corresponding change for em(4). > This only affects 82575, 82576, i350, and i210. > Tested on i210. > > ok?
All regress tests run with it on i386. OK bluhm@ > consolidate mbuf header parsing on device driver layer > > M sys/dev/pci/if_em.c | 12+ 34- > > 1 file changed, 12 insertions(+), 34 deletions(-) > > diff 7c601e62aaac9d63b4ccf68f98d354af760b41a9 > 1c186b4a689624833baafe23d82bb535c4d5ad93 > commit - 7c601e62aaac9d63b4ccf68f98d354af760b41a9 > commit + 1c186b4a689624833baafe23d82bb535c4d5ad93 > blob - 581c9fc2647dfed3e8514ab40b2a30885f63d752 > blob + 8f25ef5cc5f18c4540aa5b44df9bad1e64d375bd > --- 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