Regards,
Bala

On 25 July 2017 at 06:51, Bill Fischofer <bill.fischo...@linaro.org> wrote:

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

Okay. Will update accordingly.


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

Agreed.


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

This inconsistency can be taken as a separate patch once this gets merged.


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

Reply via email to