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>
---
 include/odp/api/spec/classification.h | 71 ++++++++++++++++++++++++++++++++---
 include/odp/api/spec/packet_io.h      | 21 +++++++++++
 2 files changed, 87 insertions(+), 5 deletions(-)

diff --git a/include/odp/api/spec/classification.h 
b/include/odp/api/spec/classification.h
index 39831b2..b4b943a 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,19 @@ typedef struct odp_cls_capability_t {
        /** Maximum number of CoS supported */
        unsigned max_cos;
 
+       /* support mode for plain queue */
+       odp_support_t plain_queue;
+
+       /* support mode for sched queue */
+       odp_support_t sched_queue;
+
+       /** Maximun number of queue supported per CoS
+        * if the value is 1, then hashing is not supported*/
+       unsigned max_queue_supported;
+
+       /** Protocol header combination supported for Hashing */
+       odp_pktin_hash_proto_t hash_supported;
+
        /** A Boolean to denote support of PMR range */
        odp_bool_t pmr_range_supported;
 } odp_cls_capability_t;
@@ -164,9 +177,40 @@ 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
+        * and 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 type */
+       odp_queue_type_t queue_type;
+
+       /** ODP Queue dequeue mode
+        *  This value is valid only for PLAIN queue types */
+       odp_queue_op_mode_t deq_mode;
+
+       /** Schedule parameters for the queue created */
+       odp_schedule_param_t sched_param;
+
+       /* Protocol header fields which are included in packet input
+        * hash calculation */
+       odp_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 +253,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.
diff --git a/include/odp/api/spec/packet_io.h b/include/odp/api/spec/packet_io.h
index 8802089..1a40a1f 100644
--- a/include/odp/api/spec/packet_io.h
+++ b/include/odp/api/spec/packet_io.h
@@ -131,6 +131,27 @@ typedef union odp_pktin_hash_proto_t {
 } odp_pktin_hash_proto_t;
 
 /**
+ * Packet hash protocols
+ *
+ * The list of protocol header field combination in enum format, which are
+ * included in packet hash calculation.
+ */
+typedef enum odp_hash_proto_t {
+       /** IPv4 address and UDP port numbers */
+       ODP_HASH_PROTO_IPV4_UDP,
+       /** IPv4 addresses and TCP port numbers */
+       ODP_HASH_PROTO_IPV4_TCP,
+       /** IPv4 addresses */
+       ODP_HASH_PROTO_IPV4,
+       /** IPv6 addresses and UDP port numbers */
+       ODP_HASH_PROTO_IPV6_UDP,
+       /** IPv6 addresses and TCP port numbers */
+       ODP_HASH_PROTO_IPV6_TCP,
+       /** IPv6 addresses */
+       ODP_HASH_PROTO_IPV6
+} odp_hash_proto_t;
+
+/**
  * Packet IO operation mode
  */
 typedef enum odp_pktio_op_mode_t {
-- 
1.9.1

Reply via email to