Enable packet hashing per CoS to be able to distribute incoming packets to
multiple queues linked with a CoS.

Signed-off-by: Balasubramanian Manoharan <bala.manoha...@linaro.org>
---
v4: incorporates review comments from Petri

 include/odp/api/spec/classification.h | 83 ++++++++++++++++++++++++++++++++---
 1 file changed, 78 insertions(+), 5 deletions(-)

diff --git a/include/odp/api/spec/classification.h 
b/include/odp/api/spec/classification.h
index 39831b2..315afaa 100644
--- a/include/odp/api/spec/classification.h
+++ b/include/odp/api/spec/classification.h
@@ -4,7 +4,6 @@
  * SPDX-License-Identifier:     BSD-3-Clause
  */
 
-
 /**
  * @file
  *
@@ -19,12 +18,13 @@
 extern "C" {
 #endif
 
+#include <odp/api/packet_io.h>
+#include <odp/api/support.h>
 /** @defgroup odp_classification ODP CLASSIFICATION
  *  Classification operations.
  *  @{
  */
 
-
 /**
  * @typedef odp_cos_t
  * ODP Class of service handle
@@ -126,6 +126,13 @@ typedef struct odp_cls_capability_t {
        /** Maximum number of CoS supported */
        unsigned max_cos;
 
+       /** Maximun number of queue supported per CoS
+        * if the value is 1, then hashing is not supported*/
+       unsigned max_hash_queues;
+
+       /** Protocol header combination supported for Hashing */
+       odp_pktin_hash_proto_t hash_protocols;
+
        /** A Boolean to denote support of PMR range */
        odp_bool_t pmr_range_supported;
 } odp_cls_capability_t;
@@ -164,9 +171,33 @@ typedef enum {
  * Used to communicate class of service creation options
  */
 typedef struct odp_cls_cos_param {
-       odp_queue_t queue;      /**< Queue associated with CoS */
-       odp_pool_t pool;        /**< Pool associated with CoS */
-       odp_cls_drop_t drop_policy;     /**< Drop policy associated with CoS */
+       /* Number of queues to be linked to this CoS.
+        * If the number is greater than 1 then hashing has to be
+        * configured. If number is equal to 1 then hashing is disabled
+        * and queue has to be configured by the application.
+        * When hashing is enabled the queues are created by the implementation
+        * then application need not configure any queue to the class of service
+        * Depening on the implementation this number might be rounded-off to
+        * nearest supported value (e.g power of 2)
+        * */
+       uint32_t num_queue;
+
+       /** Queue parameters */
+       odp_queue_param_t queue_param;
+
+       /* Protocol header fields which are included in packet input
+        * hash calculation */
+       odp_pktin_hash_proto_t hash_proto;
+
+       /* If hashing is disabled, then application has to configure
+        * this queue and packets are delivered to this queue */
+       odp_queue_t queue;
+
+       /* Pool associated with CoS */
+       odp_pool_t pool;
+
+       /* Drop policy associated with CoS */
+       odp_cls_drop_t drop_policy;
 } odp_cls_cos_param_t;
 
 /**
@@ -209,6 +240,23 @@ int odp_cls_capability(odp_cls_capability_t *capability);
 odp_cos_t odp_cls_cos_create(const char *name, odp_cls_cos_param_t *param);
 
 /**
+ * Queue hash result
+ * Returns the queue within a CoS in which a particular packet will be enqueued
+ * based on the packet parameters and hash protocol field configured with the
+ * class of service.
+ *
+ * @param      cos     class of service
+ * @param      packet  Packet handle
+ *
+ * @retval             Returns the queue handle on which this packet will be
+ *                     enqueued.
+ * @retval             ODP_QUEUE_INVALID for error case
+ *
+ * @note The packet has to be updated with valid header pointers L2, L3 and L4.
+ */
+odp_queue_t odp_queue_hash_result(odp_cos_t cos, odp_packet_t packet);
+
+/**
  * Discard a class-of-service along with all its associated resources
  *
  * @param[in]  cos_id  class-of-service instance.
@@ -245,6 +293,31 @@ int odp_cos_queue_set(odp_cos_t cos_id, odp_queue_t 
queue_id);
 odp_queue_t odp_cos_queue(odp_cos_t cos_id);
 
 /**
+ * Get the number of queues linked with the specific class-of-service
+ *
+ * @param      cos_id          class-of-service instance.
+ *
+ * @return                     Number of queues linked with the 
class-of-service.
+ */
+uint32_t odp_cos_num_queue(odp_cos_t cos_id);
+
+/**
+ * Get the list of queue associated with the specific class-of-service
+ *
+ * @param[in]  cos_id          class-of-service instance.
+ *
+ * @param[out] queue           Array of queue handles associated
+ *                             with the class-of-service.
+ *
+ * @param[in]  num             Maximum number of queue handles to output.
+ *
+ * @return                     Number of queues linked with CoS
+ * @retval     <0              on failure
+ */
+uint32_t odp_cos_queue_multi(odp_cos_t cos_id, odp_queue_t queue[],
+                            uint32_t num);
+
+/**
  * Assign packet drop policy for specific class-of-service
  *
  * @param[in]  cos_id          class-of-service instance.
-- 
1.9.1

Reply via email to