From 41ef1ad50a7b9c209347ba7af77173bf71959693 Mon Sep 17 00:00:00 2001 From: Ivan Malov Date: Tue, 2 Apr 2019 10:28:42 +0100 Subject: [PATCH] net/sfc: factor out function to get IPv4 packet ID for TSO As a result, code duplication will be avoided in the current TSO implementations (EFX and EF10 native). The future patch to add support for tunnel TSO will also reuse the new function. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko --- drivers/net/sfc/sfc_ef10_tx.c | 9 ++------- drivers/net/sfc/sfc_tso.c | 9 ++------- drivers/net/sfc/sfc_tso.h | 12 ++++++++++++ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/net/sfc/sfc_ef10_tx.c b/drivers/net/sfc/sfc_ef10_tx.c index 9594084490..bcbd15d559 100644 --- a/drivers/net/sfc/sfc_ef10_tx.c +++ b/drivers/net/sfc/sfc_ef10_tx.c @@ -479,13 +479,8 @@ sfc_ef10_xmit_tso_pkt(struct sfc_ef10_txq * const txq, struct rte_mbuf *m_seg, * filled in in TSO mbuf. Use zero IPID if there is no IPv4 flag. * If the packet is still IPv4, HW will simply start from zero IPID. */ - if (first_m_seg->ol_flags & PKT_TX_IPV4) { - const struct ipv4_hdr *iphe4; - - iphe4 = (const struct ipv4_hdr *)(hdr_addr + iph_off); - rte_memcpy(&packet_id, &iphe4->packet_id, sizeof(uint16_t)); - packet_id = rte_be_to_cpu_16(packet_id); - } + if (first_m_seg->ol_flags & PKT_TX_IPV4) + packet_id = sfc_tso_ip4_get_ipid(hdr_addr, iph_off); th = (const struct tcp_hdr *)(hdr_addr + tcph_off); rte_memcpy(&sent_seq, &th->sent_seq, sizeof(uint32_t)); diff --git a/drivers/net/sfc/sfc_tso.c b/drivers/net/sfc/sfc_tso.c index a882e64dd2..1374aceaa6 100644 --- a/drivers/net/sfc/sfc_tso.c +++ b/drivers/net/sfc/sfc_tso.c @@ -146,13 +146,8 @@ sfc_efx_tso_do(struct sfc_efx_txq *txq, unsigned int idx, * IPv4 flag. If the packet is still IPv4, HW will simply start from * zero IPID. */ - if (m->ol_flags & PKT_TX_IPV4) { - const struct ipv4_hdr *iphe4; - - iphe4 = (const struct ipv4_hdr *)(tsoh + nh_off); - rte_memcpy(&packet_id, &iphe4->packet_id, sizeof(uint16_t)); - packet_id = rte_be_to_cpu_16(packet_id); - } + if (m->ol_flags & PKT_TX_IPV4) + packet_id = sfc_tso_ip4_get_ipid(tsoh, nh_off); /* Handle TCP header */ th = (const struct tcp_hdr *)(tsoh + tcph_off); diff --git a/drivers/net/sfc/sfc_tso.h b/drivers/net/sfc/sfc_tso.h index cd151782f4..8ecefdfd21 100644 --- a/drivers/net/sfc/sfc_tso.h +++ b/drivers/net/sfc/sfc_tso.h @@ -26,6 +26,18 @@ extern "C" { */ #define SFC_EF10_TSO_HDR_DESCS_NUM 1 +static inline uint16_t +sfc_tso_ip4_get_ipid(const uint8_t *pkt_hdrp, size_t ip_hdr_off) +{ + const struct ipv4_hdr *ip_hdrp; + uint16_t ipid; + + ip_hdrp = (const struct ipv4_hdr *)(pkt_hdrp + ip_hdr_off); + rte_memcpy(&ipid, &ip_hdrp->packet_id, sizeof(ipid)); + + return rte_be_to_cpu_16(ipid); +} + unsigned int sfc_tso_prepare_header(uint8_t *tsoh, size_t header_len, struct rte_mbuf **in_seg, size_t *in_off); -- 2.20.1