diff options
author | Matias Elo <matias.elo@nokia.com> | 2022-04-29 15:46:43 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2022-05-25 10:58:00 +0300 |
commit | d6f4f732b5477a74ceb5ffd089981b068ea499a6 (patch) | |
tree | b203a6cb7ef1aa1a38cf33234a17a80e8a77041d /platform | |
parent | 3360d226c2c6382caafb4024f7836bc3e72f997d (diff) |
Port ae347d563 "linux-gen: pktio: always call *_packet_parse_common()"
Port original commit from linux-generic.
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Reviewed-by: Tuomas Taipale <tuomas.taipale@nokia.com>
Diffstat (limited to 'platform')
-rw-r--r-- | platform/linux-dpdk/include/odp_packet_internal.h | 1 | ||||
-rw-r--r-- | platform/linux-dpdk/include/odp_packet_io_internal.h | 1 | ||||
-rw-r--r-- | platform/linux-dpdk/odp_packet_dpdk.c | 52 |
3 files changed, 21 insertions, 33 deletions
diff --git a/platform/linux-dpdk/include/odp_packet_internal.h b/platform/linux-dpdk/include/odp_packet_internal.h index f50250202..a381386fc 100644 --- a/platform/linux-dpdk/include/odp_packet_internal.h +++ b/platform/linux-dpdk/include/odp_packet_internal.h @@ -347,7 +347,6 @@ static inline void packet_parse_reset(odp_packet_hdr_t *pkt_hdr, int all) { /* Reset parser metadata before new parse */ pkt_hdr->p.input_flags.all = 0; - pkt_hdr->p.flags.all.error = 0; pkt_hdr->p.l2_offset = ODP_PACKET_OFFSET_INVALID; pkt_hdr->p.l3_offset = ODP_PACKET_OFFSET_INVALID; pkt_hdr->p.l4_offset = ODP_PACKET_OFFSET_INVALID; diff --git a/platform/linux-dpdk/include/odp_packet_io_internal.h b/platform/linux-dpdk/include/odp_packet_io_internal.h index f7383a745..8e06703fb 100644 --- a/platform/linux-dpdk/include/odp_packet_io_internal.h +++ b/platform/linux-dpdk/include/odp_packet_io_internal.h @@ -60,6 +60,7 @@ struct pktio_entry { /* These two locks together lock the whole pktio device */ odp_ticketlock_t rxl; /**< RX ticketlock */ odp_ticketlock_t txl; /**< TX ticketlock */ + odp_proto_layer_t parse_layer; uint16_t pktin_frame_offset; struct { diff --git a/platform/linux-dpdk/odp_packet_dpdk.c b/platform/linux-dpdk/odp_packet_dpdk.c index 45d8e65bc..f152d8fb6 100644 --- a/platform/linux-dpdk/odp_packet_dpdk.c +++ b/platform/linux-dpdk/odp_packet_dpdk.c @@ -1,5 +1,5 @@ /* Copyright (c) 2013-2018, Linaro Limited - * Copyright (c) 2019-2021, Nokia + * Copyright (c) 2019-2022, Nokia * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause @@ -29,6 +29,8 @@ #include <odp_debug_internal.h> #include <odp_errno_define.h> #include <odp_classification_internal.h> + +#include <odp_packet_internal.h> #include <odp_packet_io_internal.h> #include <odp_libconfig_internal.h> #include <odp/api/plat/packet_inlines.h> @@ -923,36 +925,38 @@ int _odp_input_pkts(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], int nu pkt_dpdk_t * const pkt_dpdk = pkt_priv(pktio_entry); uint16_t i; odp_pktin_config_opt_t pktin_cfg = pktio_entry->s.config.pktin; - odp_proto_layer_t parse_layer = pktio_entry->s.config.parser.layer; odp_pktio_t input = pktio_entry->s.handle; odp_time_t ts_val; odp_time_t *ts = NULL; uint16_t num_prefetch = RTE_MIN(num, NUM_RX_PREFETCH); + const odp_proto_layer_t layer = pktio_entry->s.parse_layer; for (i = 0; i < num_prefetch; i++) prefetch_pkt(pkt_table[i]); - if (pktio_entry->s.config.pktin.bit.ts_all || - pktio_entry->s.config.pktin.bit.ts_ptp) { + if (pktin_cfg.bit.ts_all || pktin_cfg.bit.ts_ptp) { ts_val = odp_time_global(); ts = &ts_val; } for (i = 0; i < num; ++i) { - odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt_table[i]); - struct rte_mbuf *mbuf = pkt_to_mbuf(pkt_table[i]); + odp_packet_t pkt = pkt_table[i]; + odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt); + struct rte_mbuf *mbuf = pkt_to_mbuf(pkt); if (odp_likely(i + num_prefetch < num)) prefetch_pkt(pkt_table[i + num_prefetch]); packet_init(pkt_hdr, input); - if (!pktio_cls_enabled(pktio_entry) && parse_layer != ODP_PROTO_LAYER_NONE) { - uint32_t ptypes = pkt_dpdk->supported_ptypes; - - if (_odp_dpdk_packet_parse_layer(pkt_hdr, mbuf, parse_layer, - ptypes, pktin_cfg)) { - odp_packet_free(pkt_table[i]); + if (layer != ODP_PROTO_LAYER_NONE) { + if (_odp_dpdk_packet_parse_common(&pkt_hdr->p, + rte_pktmbuf_mtod(mbuf, uint8_t *), + rte_pktmbuf_pkt_len(mbuf), + rte_pktmbuf_data_len(mbuf), + mbuf, layer, + pkt_dpdk->supported_ptypes, pktin_cfg)) { + odp_packet_free(pkt); continue; } } @@ -965,47 +969,31 @@ int _odp_input_pkts(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], int nu int failed = 0, success = 0; for (i = 0; i < num; i++) { - odp_packet_t new_pkt; odp_packet_t pkt = pkt_table[i]; odp_pool_t new_pool; uint8_t *data; - odp_packet_hdr_t parsed_hdr; odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt); - struct rte_mbuf *mbuf = pkt_to_mbuf(pkt); - uint32_t pkt_len = odp_packet_len(pkt); - uint32_t ptypes = pkt_dpdk->supported_ptypes; data = odp_packet_data(pkt); - packet_parse_reset(&parsed_hdr, 1); - packet_set_len(&parsed_hdr, pkt_len); - - if (_odp_dpdk_packet_parse_common(&parsed_hdr.p, data, pkt_len, pkt_len, - mbuf, ODP_PROTO_LAYER_ALL, ptypes, - pktin_cfg)) { - odp_packet_free(pkt); - continue; - } if (_odp_cls_classify_packet(pktio_entry, data, - &new_pool, &parsed_hdr)) { + &new_pool, pkt_hdr)) { odp_packet_free(pkt); continue; } if (new_pool != odp_packet_pool(pkt)) { - new_pkt = odp_packet_copy(pkt, new_pool); + odp_packet_t new_pkt = odp_packet_copy(pkt, new_pool); odp_packet_free(pkt); - if (new_pkt == ODP_PACKET_INVALID) { + if (odp_unlikely(new_pkt == ODP_PACKET_INVALID)) { failed++; continue; } pkt_table[i] = new_pkt; pkt = new_pkt; - pkt_hdr = packet_hdr(pkt); } - packet_set_ts(pkt_hdr, ts); + pktio_entry->s.stats.in_octets += odp_packet_len(pkt); - _odp_packet_copy_cls_md(pkt_hdr, &parsed_hdr); if (success != i) pkt_table[success] = pkt; ++success; |