diff options
Diffstat (limited to 'platform/linux-generic/include/odp_classification_internal.h')
-rw-r--r-- | platform/linux-generic/include/odp_classification_internal.h | 47 |
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 **/ |