summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorChristian Weisgerber <naddy@cvs.openbsd.org>2023-02-09 21:21:28 +0000
committerChristian Weisgerber <naddy@cvs.openbsd.org>2023-02-09 21:21:28 +0000
commit93874bf08e2aaddd0dd69084d5f376045c2c5f6f (patch)
tree9f9294494d880c89d8b3fc0bbf41b25a6acb352e /sys/dev
parent776314e3d3ccc40e693915e295026c3087b1e887 (diff)
consolidate mbuf header parsing on device driver layer
em(4) ok jan@, bluhm@ igc(4) tested by weerd@
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/pci/if_em.c48
-rw-r--r--sys/dev/pci/if_igc.c46
2 files changed, 24 insertions, 70 deletions
diff --git a/sys/dev/pci/if_em.c b/sys/dev/pci/if_em.c
index c840377f0a3..5ed3332b6fa 100644
--- a/sys/dev/pci/if_em.c
+++ b/sys/dev/pci/if_em.c
@@ -31,7 +31,7 @@ POSSIBILITY OF SUCH DAMAGE.
***************************************************************************/
-/* $OpenBSD: if_em.c,v 1.364 2023/02/02 13:37:24 claudio Exp $ */
+/* $OpenBSD: if_em.c,v 1.365 2023/02/09 21:21:27 naddy Exp $ */
/* $FreeBSD: if_em.c,v 1.46 2004/09/29 18:28:28 mlaier Exp $ */
#include <dev/pci/if_em.h>
@@ -2398,12 +2398,11 @@ u_int
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, u_int head,
}
#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;
-
- m = m_getptr(mp, sizeof(*eh), &hoff);
- ip6 = (struct ip6_hdr *)(mtod(m, caddr_t) + hoff);
-
- iphlen = sizeof(*ip6);
- ipproto = ip6->ip6_nxt;
+ } else if (ext.ip6) {
+ iphlen = sizeof(*ext.ip6);
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, u_int head,
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)
diff --git a/sys/dev/pci/if_igc.c b/sys/dev/pci/if_igc.c
index a904d43c66b..c4efecf97b3 100644
--- a/sys/dev/pci/if_igc.c
+++ b/sys/dev/pci/if_igc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_igc.c,v 1.10 2022/11/11 16:41:44 mbuhl Exp $ */
+/* $OpenBSD: if_igc.c,v 1.11 2023/02/09 21:21:27 naddy Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
@@ -2002,17 +2002,14 @@ int
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, int prod,
#endif
#endif
- switch (ntohs(eh->ether_type)) {
- case ETHERTYPE_IP: {
- struct ip *ip;
-
- m = m_getptr(mp, sizeof(*eh), &hoff);
- KASSERT(m != NULL && m->m_len - hoff >= sizeof(*ip));
- ip = (struct ip *)(mtod(m, caddr_t) + hoff);
+ ether_extract_headers(mp, &ext);
- iphlen = ip->ip_hl << 2;
- ipproto = ip->ip_p;
+ if (ext.ip4) {
+ iphlen = ext.ip4->ip_hl << 2;
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;
-
- 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;
+ } else if (ext.ip6) {
+ iphlen = sizeof(*ext.ip6);
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)