[1/3] api: classification: add support for packet hashing in classification

Message ID 1493803502-4500-1-git-send-email-bala.manoharan@linaro.org
State New
Headers show
Series
  • [1/3] api: classification: add support for packet hashing in classification
Related show

Commit Message

Balasubramanian Manoharan May 3, 2017, 9:25 a.m.
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>

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

-- 
1.9.1

Comments

Bill Fischofer May 3, 2017, 11:56 a.m. | #1
This needs to be API-NEXT since it is proposing API changes. Will discuss
at today's ARCH call.

On Wed, May 3, 2017 at 4:25 AM, Balasubramanian Manoharan <
bala.manoharan@linaro.org> wrote:

> 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>

> ---

>  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

>

>

Patch

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 {