Packet input does not call packet_classifier function when
there are no cos (pmr, default cos or l2/l3 table) set for
the pktio interface.

Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com>
---
 .../linux-generic/include/odp_packet_io_internal.h | 10 +++
 platform/linux-generic/odp_classification.c        |  5 ++
 platform/linux-generic/odp_packet_io.c             | 97 ++++++++++++++--------
 3 files changed, 78 insertions(+), 34 deletions(-)

diff --git a/platform/linux-generic/include/odp_packet_io_internal.h 
b/platform/linux-generic/include/odp_packet_io_internal.h
index a21c683..6b03051 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -109,6 +109,16 @@ static inline pktio_entry_t *get_pktio_entry(odp_pktio_t 
pktio)
        return pktio_entry_ptr[pktio_to_id(pktio)];
 }
 
+static inline int pktio_cls_enabled(pktio_entry_t *entry)
+{
+       return entry->s.cls_enabled;
+}
+
+static inline void pktio_cls_enabled_set(pktio_entry_t *entry, int ena)
+{
+       entry->s.cls_enabled = ena;
+}
+
 int pktin_poll(pktio_entry_t *entry);
 
 extern const pktio_if_ops_t sock_mmsg_pktio_ops;
diff --git a/platform/linux-generic/odp_classification.c 
b/platform/linux-generic/odp_classification.c
index 6c1aff4..fb1b019 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -307,6 +307,7 @@ int odp_pktio_default_cos_set(odp_pktio_t pktio_in, 
odp_cos_t default_cos)
        }
 
        entry->s.cls.default_cos = cos;
+       pktio_cls_enabled_set(entry, 1);
        return 0;
 }
 
@@ -378,6 +379,7 @@ int odp_cos_with_l2_priority(odp_pktio_t pktio_in,
                                l2_cos->cos[qos_table[i]] = cos;
                }
        }
+       pktio_cls_enabled_set(entry, 1);
        UNLOCK(&l2_cos->lock);
        return 0;
 }
@@ -410,6 +412,7 @@ int odp_cos_with_l3_qos(odp_pktio_t pktio_in,
                                l3_cos->cos[qos_table[i]] = cos;
                }
        }
+       pktio_cls_enabled_set(entry, 1);
        UNLOCK(&l3_cos->lock);
        return 0;
 }
@@ -488,6 +491,7 @@ int odp_pktio_pmr_cos(odp_pmr_t pmr_id,
        pktio_entry->s.cls.pmr[num_pmr] = pmr;
        pktio_entry->s.cls.cos[num_pmr] = cos;
        pktio_entry->s.cls.num_pmr++;
+       pktio_cls_enabled_set(pktio_entry, 1);
        UNLOCK(&pktio_entry->s.cls.lock);
 
        return 0;
@@ -625,6 +629,7 @@ int odp_pktio_pmr_match_set_cos(odp_pmr_set_t pmr_set_id, 
odp_pktio_t src_pktio,
        pktio_entry->s.cls.pmr[num_pmr] = pmr;
        pktio_entry->s.cls.cos[num_pmr] = cos;
        pktio_entry->s.cls.num_pmr++;
+       pktio_cls_enabled_set(pktio_entry, 1);
        UNLOCK(&pktio_entry->s.cls.lock);
 
        return 0;
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index d724933..2e7b199 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -154,9 +154,7 @@ static void unlock_entry_classifier(pktio_entry_t *entry)
 static void init_pktio_entry(pktio_entry_t *entry)
 {
        set_taken(entry);
-       /* Currently classifier is enabled by default. It should be enabled
-          only when used. */
-       entry->s.cls_enabled = 1;
+       pktio_cls_enabled_set(entry, 0);
        entry->s.inq_default = ODP_QUEUE_INVALID;
 
        pktio_classifier_init(entry);
@@ -542,30 +540,42 @@ odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry)
        odp_buffer_hdr_t *buf_hdr;
        odp_buffer_t buf;
        odp_packet_t pkt_tbl[QUEUE_MULTI_MAX];
-       odp_buffer_hdr_t *tmp_hdr_tbl[QUEUE_MULTI_MAX];
+       odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        int pkts, i, j;
+       odp_pktio_t pktio;
 
        buf_hdr = queue_deq(qentry);
        if (buf_hdr != NULL)
                return buf_hdr;
 
-       pkts = odp_pktio_recv(qentry->s.pktin, pkt_tbl, QUEUE_MULTI_MAX);
+       pktio = qentry->s.pktin;
+
+       pkts = odp_pktio_recv(pktio, pkt_tbl, QUEUE_MULTI_MAX);
        if (pkts <= 0)
                return NULL;
 
-       for (i = 0, j = 0; i < pkts; ++i) {
-               buf = _odp_packet_to_buffer(pkt_tbl[i]);
-               buf_hdr = odp_buf_to_hdr(buf);
-               if (0 > packet_classifier(qentry->s.pktin, pkt_tbl[i]))
-                       tmp_hdr_tbl[j++] = buf_hdr;
+       if (pktio_cls_enabled(get_pktio_entry(pktio))) {
+               for (i = 0, j = 0; i < pkts; i++) {
+                       if (0 > packet_classifier(pktio, pkt_tbl[i])) {
+                               buf = _odp_packet_to_buffer(pkt_tbl[i]);
+                               hdr_tbl[j++] = odp_buf_to_hdr(buf);
+                       }
+               }
+       } else {
+               for (i = 0; i < pkts; i++) {
+                       buf        = _odp_packet_to_buffer(pkt_tbl[i]);
+                       hdr_tbl[i] = odp_buf_to_hdr(buf);
+               }
+
+               j = pkts;
        }
 
        if (0 == j)
                return NULL;
 
        if (j > 1)
-               queue_enq_multi(qentry, &tmp_hdr_tbl[1], j - 1, 0);
-       buf_hdr = tmp_hdr_tbl[0];
+               queue_enq_multi(qentry, &hdr_tbl[1], j - 1, 0);
+       buf_hdr = hdr_tbl[0];
        return buf_hdr;
 }
 
@@ -581,10 +591,10 @@ int pktin_deq_multi(queue_entry_t *qentry, 
odp_buffer_hdr_t *buf_hdr[], int num)
 {
        int nbr;
        odp_packet_t pkt_tbl[QUEUE_MULTI_MAX];
-       odp_buffer_hdr_t *tmp_hdr_tbl[QUEUE_MULTI_MAX];
-       odp_buffer_hdr_t *tmp_hdr;
+       odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        odp_buffer_t buf;
        int pkts, i, j;
+       odp_pktio_t pktio;
 
        nbr = queue_deq_multi(qentry, buf_hdr, num);
        if (odp_unlikely(nbr > num))
@@ -597,19 +607,30 @@ int pktin_deq_multi(queue_entry_t *qentry, 
odp_buffer_hdr_t *buf_hdr[], int num)
        if (nbr == num)
                return nbr;
 
-       pkts = odp_pktio_recv(qentry->s.pktin, pkt_tbl, QUEUE_MULTI_MAX);
+       pktio = qentry->s.pktin;
+
+       pkts = odp_pktio_recv(pktio, pkt_tbl, QUEUE_MULTI_MAX);
        if (pkts <= 0)
                return nbr;
 
-       for (i = 0, j = 0; i < pkts; ++i) {
-               buf = _odp_packet_to_buffer(pkt_tbl[i]);
-               tmp_hdr = odp_buf_to_hdr(buf);
-               if (0 > packet_classifier(qentry->s.pktin, pkt_tbl[i]))
-                       tmp_hdr_tbl[j++] = tmp_hdr;
+       if (pktio_cls_enabled(get_pktio_entry(pktio))) {
+               for (i = 0, j = 0; i < pkts; i++) {
+                       if (0 > packet_classifier(pktio, pkt_tbl[i])) {
+                               buf = _odp_packet_to_buffer(pkt_tbl[i]);
+                               hdr_tbl[j++] = odp_buf_to_hdr(buf);
+                       }
+               }
+       } else {
+               for (i = 0; i < pkts; i++) {
+                       buf        = _odp_packet_to_buffer(pkt_tbl[i]);
+                       hdr_tbl[i] = odp_buf_to_hdr(buf);
+               }
+
+               j = pkts;
        }
 
        if (j)
-               queue_enq_multi(qentry, tmp_hdr_tbl, j, 0);
+               queue_enq_multi(qentry, hdr_tbl, j, 0);
        return nbr;
 }
 
@@ -618,6 +639,10 @@ int pktin_poll(pktio_entry_t *entry)
        odp_packet_t pkt_tbl[QUEUE_MULTI_MAX];
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        int num, num_enq, i;
+       odp_buffer_t buf;
+       odp_pktio_t pktio;
+
+       pktio = entry->s.handle;
 
        if (odp_unlikely(is_free(entry)))
                return -1;
@@ -628,26 +653,30 @@ int pktin_poll(pktio_entry_t *entry)
        if (entry->s.state == STATE_STOP)
                return 0;
 
-       num = odp_pktio_recv(entry->s.handle, pkt_tbl, QUEUE_MULTI_MAX);
+       num = odp_pktio_recv(pktio, pkt_tbl, QUEUE_MULTI_MAX);
+
+       if (num == 0)
+               return 0;
 
        if (num < 0) {
                ODP_ERR("Packet recv error\n");
                return -1;
        }
 
-       for (i = 0, num_enq = 0; i < num; ++i) {
-               odp_buffer_t buf;
-               odp_buffer_hdr_t *hdr;
-
-               buf = _odp_packet_to_buffer(pkt_tbl[i]);
-               hdr = odp_buf_to_hdr(buf);
-
-               if (entry->s.cls_enabled) {
-                       if (packet_classifier(entry->s.handle, pkt_tbl[i]) < 0)
-                               hdr_tbl[num_enq++] = hdr;
-               } else {
-                       hdr_tbl[num_enq++] = hdr;
+       if (pktio_cls_enabled(entry)) {
+               for (i = 0, num_enq = 0; i < num; i++) {
+                       if (packet_classifier(pktio, pkt_tbl[i]) < 0) {
+                               buf = _odp_packet_to_buffer(pkt_tbl[i]);
+                               hdr_tbl[num_enq++] = odp_buf_to_hdr(buf);
+                       }
                }
+       } else {
+               for (i = 0; i < num; i++) {
+                       buf        = _odp_packet_to_buffer(pkt_tbl[i]);
+                       hdr_tbl[i] = odp_buf_to_hdr(buf);
+               }
+
+               num_enq = num;
        }
 
        if (num_enq) {
-- 
2.5.3

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to