Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * 3 : : * Copyright(c) 2019-2021 Xilinx, Inc. 4 : : * Copyright(c) 2018-2019 Solarflare Communications Inc. 5 : : * 6 : : * This software was jointly developed between OKTET Labs (under contract 7 : : * for Solarflare) and Solarflare Communications, Inc. 8 : : */ 9 : : 10 : : #ifndef _SFC_TSO_H 11 : : #define _SFC_TSO_H 12 : : 13 : : #include <rte_udp.h> 14 : : 15 : : #ifdef __cplusplus 16 : : extern "C" { 17 : : #endif 18 : : 19 : : /** Standard TSO header length */ 20 : : #define SFC_TSOH_STD_LEN 256 21 : : 22 : : /** The number of TSO option descriptors that precede the packet descriptors */ 23 : : #define SFC_EF10_TSO_OPT_DESCS_NUM 2 24 : : 25 : : /** 26 : : * The number of DMA descriptors for TSO header that may or may not precede the 27 : : * packet's payload descriptors 28 : : */ 29 : : #define SFC_EF10_TSO_HDR_DESCS_NUM 1 30 : : 31 : : static inline uint16_t 32 : : sfc_tso_ip4_get_ipid(const uint8_t *pkt_hdrp, size_t ip_hdr_off) 33 : : { 34 : : const struct rte_ipv4_hdr *ip_hdrp; 35 : : uint16_t ipid; 36 : : 37 : 0 : ip_hdrp = (const struct rte_ipv4_hdr *)(pkt_hdrp + ip_hdr_off); 38 [ # # # # ]: 0 : rte_memcpy(&ipid, &ip_hdrp->packet_id, sizeof(ipid)); 39 : : 40 [ # # # # ]: 0 : return rte_be_to_cpu_16(ipid); 41 : : } 42 : : 43 : : static inline void 44 : 0 : sfc_tso_outer_udp_fix_len(const struct rte_mbuf *m, uint8_t *tsoh) 45 : : { 46 [ # # ]: 0 : rte_be16_t len = rte_cpu_to_be_16(m->l2_len + m->l3_len + m->l4_len + 47 : : m->tso_segsz); 48 : : 49 [ # # ]: 0 : rte_memcpy(tsoh + m->outer_l2_len + m->outer_l3_len + 50 : : offsetof(struct rte_udp_hdr, dgram_len), 51 : : &len, sizeof(len)); 52 : 0 : } 53 : : 54 : : static inline void 55 : 0 : sfc_tso_innermost_ip_fix_len(const struct rte_mbuf *m, uint8_t *tsoh, 56 : : size_t iph_ofst) 57 : : { 58 : 0 : size_t ip_payload_len = m->l4_len + m->tso_segsz; 59 : : size_t field_ofst; 60 : : rte_be16_t len; 61 : : 62 [ # # ]: 0 : if (m->ol_flags & RTE_MBUF_F_TX_IPV4) { 63 : : field_ofst = offsetof(struct rte_ipv4_hdr, total_length); 64 [ # # ]: 0 : len = rte_cpu_to_be_16(m->l3_len + ip_payload_len); 65 : : } else { 66 : : field_ofst = offsetof(struct rte_ipv6_hdr, payload_len); 67 [ # # ]: 0 : len = rte_cpu_to_be_16(ip_payload_len); 68 : : } 69 : : 70 [ # # ]: 0 : rte_memcpy(tsoh + iph_ofst + field_ofst, &len, sizeof(len)); 71 : 0 : } 72 : : 73 : : unsigned int sfc_tso_prepare_header(uint8_t *tsoh, size_t header_len, 74 : : struct rte_mbuf **in_seg, size_t *in_off); 75 : : 76 : : #ifdef __cplusplus 77 : : } 78 : : #endif 79 : : 80 : : #endif /* _SFC_TSO_H */