[API-NEXT,v3,2/4] api: classification: add support for packet hashing in classification

Message ID 1501776012-30615-3-git-send-email-odpbot@yandex.ru
State New
Headers show
Series
  • api: classification: adds packet hashing feature
Related show

Commit Message

Github ODP bot Aug. 3, 2017, 4 p.m.
From: Balasubramanian Manoharan <bala.manoharan@linaro.org>


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.manoharan@linaro.org>

---
/** Email created from pull request 100 (bala-manoharan:cls-queue-hashing3)
 ** https://github.com/Linaro/odp/pull/100
 ** Patch: https://github.com/Linaro/odp/pull/100.patch
 ** Base sha: b4cd6c50f9f0c2e1fa975b768253d4f4b35fad07
 ** Merge commit sha: ce11265bc05af0b43f6d63ffa80d65461ad0d7f4
 **/
 include/odp/api/spec/classification.h | 91 +++++++++++++++++++++++++++++++++--
 1 file changed, 86 insertions(+), 5 deletions(-)

Patch

diff --git a/include/odp/api/spec/classification.h b/include/odp/api/spec/classification.h
index 39831b24..0c4a95c5 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,41 @@  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 is enabled.
+	 * If number is equal to 1 then hashing is disabled.
+	 * When hashing is enabled the queues are created by the implementation
+	 * and application need not configure any queue to the class of service.
+	 * When hashing is disabled application has to configure the 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;
+
+	/** Variant mapping for queue hash configurataion */
+	union {
+		/** Mapping used when num_queue = 1, hashing is disabled in
+		 * this case and application has to configure this queue and
+		 * packets are delivered to this queue */
+		odp_queue_t queue;
+
+		/** Mapping used when num_queue > 1, hashing is enabled in
+		 * this case and queues are created by the implementation */
+		struct {
+			/** 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;
+		};
+	};
+	/** 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 +248,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_cls_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 +301,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_cls_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_cls_cos_queues(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.