On Wed, Jul 19, 2017 at 9:37 PM, Balasubramanian Manoharan <
bala.manoha...@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.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 {
>

Not part of this patch, but shouldn't this be struct odp_cls_cos_param_t
for consistency with other typedef'd structs?


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

If hashing is enabled, is this field ignored? Doc should say so if yes.


> +       odp_queue_t queue;
>

Alternately, if queue is only meaningful when num_queue == 1, should this
be a union?  For example:

/** Number of queues associated with this CoS.
* Controls variant  parameter mappings needed for optional hashing. */
uint32_t num_queue;

/** Variant mappings based on num_queue value */
union {
        /** Mapping used when num_queue == 1 */
        odp_queue_t queue; /** The single queue associated with this CoS */

        /** Mapping used when num_queue > 1 */
        struct {
                odp_queue_param_t queue_param;  /** Parameters used for
queues created for this CoS */
                odp_pktin_hash_proto_t hash_proto; /** How packets are
hashed into queues for this CoS */
        };
};

> +
> +       /* 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);
>

Petri suggested that this be named odp_cls_hash_result() or
odp_cls_dest_queue() since this is a cls API, not a queue API. I agree and
think odp_cls_hash_result() is clearer.


> +
> +/**
>   * 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);
>

Petri suggested this be named odp_cls_num_cos_queues() since odp_cls_... is
the standard prefix for Classifier APIs. Since this is an extension of the
existing odp_cos_queue() API, this name seems OK to me.


> +
> +/**
> + * 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);
>

Petri pointed out that the _multi() suffix is reserved for actions that
have multiple inputs, so odp_cos_queues() would be better here.
odp_cls_cos_queues() is also OK, but since this is in the existing
odp_cos_queue() "family", odp_cos_queues() seems fine here.

BTW, the only inconsistency we have in the current CLS API names is in CoS
creation. We have the API odp_cls_cos_create() but odp_cos_destroy().
Either we should have all ODP Classifier APIs use the odp_cls_ prefix, or
if we allow both odp_cls and odp_cos (since cos = class of service, hence
classifier is implicit in that abbreviation) then perhaps we should
deprecate odp_cls_cos_create() and have odp_cos_create() instead.


> +
> +/**
>   * Assign packet drop policy for specific class-of-service
>   *
>   * @param[in]  cos_id          class-of-service instance.
> --
> 1.9.1
>
>

Reply via email to