aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/include/odp_packet_dpdk.h
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-generic/include/odp_packet_dpdk.h')
-rw-r--r--platform/linux-generic/include/odp_packet_dpdk.h118
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