aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/include/odp_classification_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-generic/include/odp_classification_internal.h')
-rw-r--r--platform/linux-generic/include/odp_classification_internal.h47
1 files changed, 46 insertions, 1 deletions
diff --git a/platform/linux-generic/include/odp_classification_internal.h b/platform/linux-generic/include/odp_classification_internal.h
index 48ee0526e..bc0a12f8f 100644
--- a/platform/linux-generic/include/odp_classification_internal.h
+++ b/platform/linux-generic/include/odp_classification_internal.h
@@ -1,4 +1,5 @@
/* Copyright (c) 2014-2018, Linaro Limited
+ * Copyright (c) 2021, Nokia
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -18,14 +19,58 @@
extern "C" {
#endif
+#include <odp/api/atomic.h>
#include <odp/api/classification.h>
+#include <odp/api/hints.h>
#include <odp/api/queue.h>
#include <odp_packet_internal.h>
#include <odp/api/packet_io.h>
#include <odp_packet_io_internal.h>
#include <odp_classification_datamodel.h>
-cos_t *_odp_cos_entry_from_idx(uint32_t ndx);
+extern cls_global_t *_odp_cls_global;
+
+static inline cos_t *_odp_cos_entry_from_idx(uint32_t ndx)
+{
+ return &_odp_cls_global->cos_tbl.cos_entry[ndx];
+}
+
+static inline int _odp_cos_queue_idx(const cos_t *cos, odp_queue_t queue)
+{
+ uint32_t i, tbl_idx;
+ int queue_idx = -1;
+
+ if (cos->s.num_queue == 1) {
+ if (odp_unlikely(cos->s.queue != queue))
+ return -1;
+ return 0;
+ }
+
+ tbl_idx = cos->s.index * CLS_COS_QUEUE_MAX;
+ for (i = 0; i < cos->s.num_queue; i++) {
+ if (_odp_cls_global->queue_grp_tbl.s.queue[tbl_idx + i] == queue) {
+ queue_idx = i;
+ break;
+ }
+ }
+ return queue_idx;
+}
+
+static inline void _odp_cos_queue_stats_add(cos_t *cos, odp_queue_t queue,
+ uint64_t packets, uint64_t discards)
+{
+ int queue_idx = _odp_cos_queue_idx(cos, queue);
+
+ if (odp_unlikely(queue_idx < 0)) {
+ ODP_ERR("Queue not attached to the CoS\n");
+ return;
+ }
+
+ if (packets)
+ odp_atomic_add_u64(&cos->s.stats[queue_idx].packets, packets);
+ if (discards)
+ odp_atomic_add_u64(&cos->s.stats[queue_idx].discards, discards);
+}
/** Classification Internal function **/