aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/pktio/dpdk.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-generic/pktio/dpdk.c')
-rw-r--r--platform/linux-generic/pktio/dpdk.c55
1 files changed, 26 insertions, 29 deletions
diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c
index 25dde7b2b..6d4e287bf 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -15,6 +15,7 @@
#include <odp/api/cpumask.h>
#include <odp_packet_io_internal.h>
+#include <odp_classification_internal.h>
#include <odp_packet_dpdk.h>
#include <odp_debug_internal.h>
@@ -706,6 +707,9 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
int nb_pkts = 0;
for (i = 0; i < num; i++) {
+ odp_pool_t pool = pktio_entry->s.pkt_dpdk.pool;
+ odp_packet_hdr_t parsed_hdr;
+
mbuf = mbuf_table[i];
if (odp_unlikely(mbuf->nb_segs != 1)) {
ODP_ERR("Segmented buffers not supported\n");
@@ -718,50 +722,43 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
pkt_len = rte_pktmbuf_pkt_len(mbuf);
if (pktio_cls_enabled(pktio_entry)) {
- int ret;
-
- ret = _odp_packet_cls_enq(pktio_entry,
- (const uint8_t *)buf,
- pkt_len, ts);
- if (ret && ret != -ENOENT)
- nb_pkts = ret;
- } else {
- pkt = packet_alloc(pktio_entry->s.pkt_dpdk.pool,
- pkt_len, 1);
- if (pkt == ODP_PACKET_INVALID) {
- ODP_ERR("packet_alloc failed\n");
+ if (cls_classify_packet(pktio_entry,
+ (const uint8_t *)buf,
+ pkt_len, &pool, &parsed_hdr))
goto fail;
- }
+ }
+ pkt = packet_alloc(pool, pkt_len, 1);
+ if (pkt == ODP_PACKET_INVALID)
+ goto fail;
- pkt_hdr = odp_packet_hdr(pkt);
+ pkt_hdr = odp_packet_hdr(pkt);
- /* For now copy the data in the mbuf,
- worry about zero-copy later */
- if (odp_packet_copy_from_mem(pkt, 0, pkt_len,
- buf) != 0) {
- ODP_ERR("odp_packet_copy_from_mem failed\n");
- odp_packet_free(pkt);
- goto fail;
- }
+ /* For now copy the data in the mbuf,
+ worry about zero-copy later */
+ if (odp_packet_copy_from_mem(pkt, 0, pkt_len, buf) != 0) {
+ odp_packet_free(pkt);
+ goto fail;
+ }
+ pkt_hdr->input = pktio_entry->s.handle;
+ if (pktio_cls_enabled(pktio_entry))
+ copy_packet_parser_metadata(&parsed_hdr, pkt_hdr);
+ else
packet_parse_l2(pkt_hdr);
- pkt_hdr->input = pktio_entry->s.handle;
+ if (mbuf->ol_flags & PKT_RX_RSS_HASH)
+ odp_packet_flow_hash_set(pkt, mbuf->hash.rss);
- if (mbuf->ol_flags & PKT_RX_RSS_HASH)
- odp_packet_flow_hash_set(pkt, mbuf->hash.rss);
+ packet_set_ts(pkt_hdr, ts);
- packet_set_ts(pkt_hdr, ts);
+ pkt_table[nb_pkts++] = pkt;
- pkt_table[nb_pkts++] = pkt;
- }
rte_pktmbuf_free(mbuf);
}
return nb_pkts;
fail:
- ODP_ERR("Creating ODP packet failed\n");
for (j = i; j < num; j++)
rte_pktmbuf_free(mbuf_table[j]);