diff options
Diffstat (limited to 'platform/linux-generic/include/odp_packet_dpdk.h')
-rw-r--r-- | platform/linux-generic/include/odp_packet_dpdk.h | 118 |
1 files changed, 64 insertions, 54 deletions
diff --git a/platform/linux-generic/include/odp_packet_dpdk.h b/platform/linux-generic/include/odp_packet_dpdk.h index 5d80d84a3..d40cf7d95 100644 --- a/platform/linux-generic/include/odp_packet_dpdk.h +++ b/platform/linux-generic/include/odp_packet_dpdk.h @@ -1,68 +1,78 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2016-2018 Linaro Limited + * Copyright (c) 2019-2022 Nokia */ #ifndef ODP_PACKET_DPDK_H #define ODP_PACKET_DPDK_H +#include <stdint.h> + #include <odp/api/packet_io.h> -#include <odp/api/pool.h> -#include <odp/api/ticketlock.h> -#include <net/if.h> +#include <odp_packet_internal.h> +#include <odp_parse_internal.h> -#ifdef ODP_PKTIO_DPDK -#include <rte_config.h> #include <rte_mbuf.h> +#include <rte_version.h> -#define DPDK_MEMORY_MB 512 -#define DPDK_NB_MBUF 16384 -#define DPDK_MBUF_BUF_SIZE RTE_MBUF_DEFAULT_BUF_SIZE -#define DPDK_MEMPOOL_CACHE_SIZE 64 -#define DPDK_NM_RX_DESC 128 -#define DPDK_NM_TX_DESC 512 - -ODP_STATIC_ASSERT((DPDK_NB_MBUF % DPDK_MEMPOOL_CACHE_SIZE == 0) && - (DPDK_MEMPOOL_CACHE_SIZE <= RTE_MEMPOOL_CACHE_MAX_SIZE) && - (DPDK_MEMPOOL_CACHE_SIZE <= DPDK_MBUF_BUF_SIZE * 10 / 15) - , "DPDK mempool cache size failure"); +#if RTE_VERSION < RTE_VERSION_NUM(21, 11, 0, 0) + #define RTE_MBUF_F_RX_IP_CKSUM_MASK PKT_RX_IP_CKSUM_MASK + #define RTE_MBUF_F_RX_IP_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD + #define RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN + #define RTE_MBUF_F_RX_L4_CKSUM_MASK PKT_RX_L4_CKSUM_MASK + #define RTE_MBUF_F_RX_L4_CKSUM_GOOD PKT_RX_L4_CKSUM_GOOD + #define RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN PKT_RX_L4_CKSUM_UNKNOWN #endif -#define DPDK_IXGBE_MIN_RX_BURST 4 - -/** Cache for storing packets */ -struct pkt_cache_t { - /** array for storing extra RX packets */ - struct rte_mbuf *pkt[DPDK_IXGBE_MIN_RX_BURST]; - unsigned idx; /**< head of cache */ - unsigned count; /**< packets in cache */ -}; - -typedef union { - struct pkt_cache_t s; - uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct pkt_cache_t))]; -} pkt_cache_t ODP_ALIGNED_CACHE; - -/** Packet IO using DPDK interface */ -typedef struct { - odp_pool_t pool; /**< pool to alloc packets from */ - struct rte_mempool *pkt_pool; /**< DPDK packet pool */ - odp_pktio_capability_t capa; /**< interface capabilities */ - uint32_t data_room; /**< maximum packet length */ - uint16_t mtu; /**< maximum transmission unit */ - /** Use system call to get/set vdev promisc mode */ - odp_bool_t vdev_sysc_promisc; - uint8_t port_id; /**< DPDK port identifier */ - unsigned min_rx_burst; /**< minimum RX burst size */ - odp_pktin_hash_proto_t hash; /**< Packet input hash protocol */ - odp_bool_t lockless_rx; /**< no locking for rx */ - odp_bool_t lockless_tx; /**< no locking for tx */ - odp_ticketlock_t rx_lock[PKTIO_MAX_QUEUES]; /**< RX queue locks */ - odp_ticketlock_t tx_lock[PKTIO_MAX_QUEUES]; /**< TX queue locks */ - /** cache for storing extra RX packets */ - pkt_cache_t rx_cache[PKTIO_MAX_QUEUES]; -} pkt_dpdk_t; +#define IP4_CSUM_RESULT(ol_flags) ((ol_flags) & RTE_MBUF_F_RX_IP_CKSUM_MASK) +#define L4_CSUM_RESULT(ol_flags) ((ol_flags) & RTE_MBUF_F_RX_L4_CKSUM_MASK) + +/** Packet parser using DPDK interface */ +static inline +int _odp_dpdk_packet_parse_common(odp_packet_hdr_t *pkt_hdr, const uint8_t *ptr, + uint32_t frame_len, uint32_t seg_len, + struct rte_mbuf *mbuf, int layer, + odp_pktin_config_opt_t pktin_cfg) +{ + packet_parser_t *prs = &pkt_hdr->p; + uint64_t mbuf_ol = mbuf->ol_flags; + + if (odp_unlikely(layer == ODP_PROTO_LAYER_NONE)) + return 0; + + /* Assume valid L2 header, no CRC/FCS check in SW */ + prs->l2_offset = 0; + + if (layer >= ODP_PROTO_LAYER_L3) { + int ip_chksum = IP4_CSUM_RESULT(mbuf_ol); + + if (ip_chksum == RTE_MBUF_F_RX_IP_CKSUM_GOOD) { + prs->input_flags.l3_chksum_done = 1; + } else if (ip_chksum != RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN) { + prs->input_flags.l3_chksum_done = 1; + prs->flags.l3_chksum_err = 1; + } + } + + if (layer >= ODP_PROTO_LAYER_L4) { + int l4_chksum = L4_CSUM_RESULT(mbuf_ol); + + if (l4_chksum == RTE_MBUF_F_RX_L4_CKSUM_GOOD) { + prs->input_flags.l4_chksum_done = 1; + } else if (l4_chksum != RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN) { + prs->input_flags.l4_chksum_done = 1; + prs->flags.l4_chksum_err = 1; + } + } + + pktin_cfg.bit.ipv4_chksum = 0; + pktin_cfg.bit.udp_chksum = 0; + pktin_cfg.bit.tcp_chksum = 0; + pktin_cfg.bit.sctp_chksum = 0; + + return _odp_packet_parse_common(pkt_hdr, ptr, frame_len, seg_len, layer, + pktin_cfg); +} #endif |