aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBogdan Pricope <bogdan.pricope@linaro.org>2018-05-02 11:29:48 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-05-14 18:07:04 +0300
commitdf1c292ed40d4c2c480917f1eab06a046c93c3b1 (patch)
tree7f5be2a98b54e30cc3ffcac26b42f85ded52317d
parent49c671e80fd2c88b6f36337ebd1cd4748eb8bae1 (diff)
linux-gen: classification: permit packet parsing at pktio level
This change is needed to support pktio specific parsers. Signed-off-by: Bogdan Pricope <bogdan.pricope@linaro.org> Reviewed-and-tested-by: Matias Elo <matias.elo@nokia.com> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
-rw-r--r--platform/linux-generic/include/odp_classification_internal.h2
-rw-r--r--platform/linux-generic/odp_classification.c12
-rw-r--r--platform/linux-generic/pktio/dpdk.c4
-rw-r--r--platform/linux-generic/pktio/loop.c2
-rw-r--r--platform/linux-generic/pktio/netmap.c2
-rw-r--r--platform/linux-generic/pktio/socket.c3
-rw-r--r--platform/linux-generic/pktio/socket_mmap.c3
-rw-r--r--platform/linux-generic/pktio/tap.c2
8 files changed, 17 insertions, 13 deletions
diff --git a/platform/linux-generic/include/odp_classification_internal.h b/platform/linux-generic/include/odp_classification_internal.h
index 47f80dc25..84d605e6b 100644
--- a/platform/linux-generic/include/odp_classification_internal.h
+++ b/platform/linux-generic/include/odp_classification_internal.h
@@ -39,7 +39,7 @@ selects destination queue and packet pool based on selected PMR and CoS.
**/
int cls_classify_packet(pktio_entry_t *entry, const uint8_t *base,
uint16_t pkt_len, uint32_t seg_len, odp_pool_t *pool,
- odp_packet_hdr_t *pkt_hdr);
+ odp_packet_hdr_t *pkt_hdr, odp_bool_t parse);
/**
Packet IO classifier init
diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c
index 14720924c..46fcf67ee 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -987,17 +987,19 @@ static uint32_t packet_rss_hash(odp_packet_hdr_t *pkt_hdr,
*/
int cls_classify_packet(pktio_entry_t *entry, const uint8_t *base,
uint16_t pkt_len, uint32_t seg_len, odp_pool_t *pool,
- odp_packet_hdr_t *pkt_hdr)
+ odp_packet_hdr_t *pkt_hdr, odp_bool_t parse)
{
cos_t *cos;
uint32_t tbl_index;
uint32_t hash;
- packet_parse_reset(pkt_hdr);
- packet_set_len(pkt_hdr, pkt_len);
+ if (parse) {
+ packet_parse_reset(pkt_hdr);
+ packet_set_len(pkt_hdr, pkt_len);
- packet_parse_common(&pkt_hdr->p, base, pkt_len, seg_len,
- ODP_PROTO_LAYER_ALL);
+ packet_parse_common(&pkt_hdr->p, base, pkt_len, seg_len,
+ ODP_PROTO_LAYER_ALL);
+ }
cos = cls_select_cos(entry, base, pkt_hdr);
if (cos == NULL)
diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c
index 14d59d8e0..c8d7d0d44 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -533,7 +533,7 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
if (cls_classify_packet(pktio_entry,
(const uint8_t *)data,
pkt_len, pkt_len, &pool,
- &parsed_hdr))
+ &parsed_hdr, true))
goto fail;
}
@@ -778,7 +778,7 @@ static inline int mbuf_to_pkt_zero(pktio_entry_t *pktio_entry,
if (cls_classify_packet(pktio_entry,
(const uint8_t *)data,
pkt_len, pkt_len, &pool,
- &parsed_hdr))
+ &parsed_hdr, true))
ODP_ERR("Unable to classify packet\n");
rte_pktmbuf_free(mbuf);
continue;
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c
index fc80e8019..779e4c62b 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -131,7 +131,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
ret = cls_classify_packet(pktio_entry, pkt_addr,
pkt_len, seg_len,
- &new_pool, pkt_hdr);
+ &new_pool, pkt_hdr, true);
if (ret) {
failed++;
odp_packet_free(pkt);
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
index 835d81ebb..567bc9f95 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -705,7 +705,7 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry,
if (pktio_cls_enabled(pktio_entry)) {
if (cls_classify_packet(pktio_entry,
(const uint8_t *)slot.buf, len,
- len, &pool, &parsed_hdr))
+ len, &pool, &parsed_hdr, true))
goto fail;
}
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c
index f6f3288c2..8b7200e6f 100644
--- a/platform/linux-generic/pktio/socket.c
+++ b/platform/linux-generic/pktio/socket.c
@@ -655,7 +655,8 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
seg_len = msgvec[i].msg_hdr.msg_iov->iov_len;
if (cls_classify_packet(pktio_entry, base, pkt_len,
- seg_len, &pool, pkt_hdr)) {
+ seg_len, &pool, pkt_hdr,
+ true)) {
ODP_ERR("cls_classify_packet failed");
odp_packet_free(pkt);
continue;
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c
index deaa6da15..847eb71ad 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/socket_mmap.c
@@ -228,7 +228,8 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry,
if (pktio_cls_enabled(pktio_entry)) {
if (cls_classify_packet(pktio_entry, pkt_buf, pkt_len,
- pkt_len, &pool, &parsed_hdr)) {
+ pkt_len, &pool, &parsed_hdr,
+ true)) {
mmap_rx_user_ready(ppd.raw); /* drop */
frame_num = next_frame_num;
continue;
diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c
index 56f90b31b..af766e0de 100644
--- a/platform/linux-generic/pktio/tap.c
+++ b/platform/linux-generic/pktio/tap.c
@@ -264,7 +264,7 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data,
if (pktio_cls_enabled(pktio_entry)) {
if (cls_classify_packet(pktio_entry, data, len, len,
&pktio_entry->s.pkt_tap.pool,
- &parsed_hdr)) {
+ &parsed_hdr, true)) {
return ODP_PACKET_INVALID;
}
}