diff mbox

[API-NEXT,1/4] api: classification: Adds capability and PMR range

Message ID 1461219545-14545-1-git-send-email-bala.manoharan@linaro.org
State Superseded
Headers show

Commit Message

Balasubramanian Manoharan April 21, 2016, 6:19 a.m. UTC
Adds classification capability structure and PMR range functionality.
odp_cls_capability_t structure defines system level classification
capability.

Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org>
---
 include/odp/api/spec/classification.h | 134 ++++++++++++++++++++++++++++------
 1 file changed, 112 insertions(+), 22 deletions(-)

Comments

Balasubramanian Manoharan April 22, 2016, 5:42 a.m. UTC | #1
On 21 April 2016 at 17:30, Savolainen, Petri (Nokia - FI/Espoo) <
petri.savolainen@nokia.com> wrote:

>

>

> > -----Original Message-----

> > From: EXT Balasubramanian Manoharan [mailto:bala.manoharan@linaro.org]

> > Sent: Thursday, April 21, 2016 9:19 AM

> > To: lng-odp@lists.linaro.org

> > Cc: Savolainen, Petri (Nokia - FI/Espoo) <petri.savolainen@nokia.com>;

> > Balasubramanian Manoharan <bala.manoharan@linaro.org>

> > Subject: [API-NEXT 1/4] api: classification: Adds capability and PMR

> range

> >

> > Adds classification capability structure and PMR range functionality.

> > odp_cls_capability_t structure defines system level classification

> > capability.

> >

> > Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org>

> > ---

> >  include/odp/api/spec/classification.h | 134

> ++++++++++++++++++++++++++++-

> > -----

> >  1 file changed, 112 insertions(+), 22 deletions(-)

> >

> > diff --git a/include/odp/api/spec/classification.h

> > b/include/odp/api/spec/classification.h

> > index 076b3de..28619a9 100644

> > --- a/include/odp/api/spec/classification.h

> > +++ b/include/odp/api/spec/classification.h

> > @@ -55,6 +55,76 @@ extern "C" {

> >   */

> >

> >  /**

> > + * Supported PMR term values

> > + *

> > + * Supported Packet Matching Rule term values in a bit field structure.

> > + */

> > +typedef union odp_cls_pmr_supported_t {

> > +     struct {

> > +             /** Total length of received packet */

> > +             uint64_t        pmr_len:1;

>

> This should be shortly "len".

>


 Maybe we can rename as packet_len. Since this field is used to identify
length of the packet.

>

> > +             /** Initial (outer) Ethertype only */

> > +             uint64_t        ethtype_0:1;

> > +             /** Ethertype of most inner VLAN tag */

> > +             uint64_t        ethtype_x:1;

> > +             /** First VLAN ID (outer) */

> > +             uint64_t        vlan_id_0:1;

> > +             /** Last VLAN ID (inner) */

> > +             uint64_t        vlan_id_x:1;

> > +             /** destination MAC address */

> > +             uint64_t        dmac:1;

> > +             /** IP Protocol or IPv6 Next Header */

> > +             uint64_t        ip_proto:1;

> > +             /** Destination UDP port, implies IPPROTO=17 */

> > +             uint64_t        udp_dport:1;

> > +             /** Destination TCP port implies IPPROTO=6 */

> > +             uint64_t        tcp_dport:1;

> > +             /** Source UDP Port */

> > +             uint64_t        udp_sport:1;

> > +             /** Source TCP port */

> > +             uint64_t        tcp_sport:1;

> > +             /** Source IP address */

> > +             uint64_t        sip_addr:1;

> > +             /** Destination IP address */

> > +             uint64_t        dip_addr:1;

> > +             /** Source IP address */

> > +             uint64_t        sip6_addr:1;

> > +             /** Destination IP address */

> > +             uint64_t        dip6_addr:1;

> > +             /** IPsec session identifier */

> > +             uint64_t        ipsec_spi:1;

> > +             /** NVGRE/VXLAN network identifier */

> > +             uint64_t        ld_vni:1;

> > +             /** Custom match rule, offset from start of

> > +              * frame. The match is defined by the offset, the

> > +              * expected value, and its size.

> > +              */

> > +             uint64_t        custom_frame:1;

> > +

> > +     } proto;

>

> I'd use "bit" here, proto is definitely wrong here since there are fields

> that are not protocols (len, address, custom  ...). Proto is copy-paste

> from hash struct, but bit would be better also there.

>

> pmr_terms.all_bits = 0;

> pmr_terms.bit.len       = 1;

> pmr_terms.bit.udp_sport = 1;

>


Should the name be "bit" or "field"?

> ...

>

>

> > +     uint64_t all_bits;

> > +} odp_cls_pmr_supported_t;

>

>

> Since this is a general list of pmr terms, a better name for the type

> would be odp_cls_pmr_terms_t, which may then be used for multiple purposes

> (supported, not supported, hw offloaded, etc).

>


Okay.

>

>

>

> > +

> > +/**

> > + * Classification capabilities

> > + * This capability structure defines system level classfication

> > capability

> > + */

> > +typedef struct odp_cls_capability_t {

> > +     /** PMR terms supported by the classifier

> > +      * A mask one bit for each of odp_pmr_term_t

>

> "A bit mask of one bit for each ..."

>

> > +      */

> > +     odp_cls_pmr_supported_t pmr_terms;

>

> odp_cls_pmr_terms_t supported;

>

>

> > +     /** Maximum number of PMR terms */

> > +     unsigned max_pmr_terms;

>

> A line feed between every struct field would make this code more readable.

>


Agreed.

>

> > +     /** Number of PMR terms available for use now */

> > +     unsigned available_pmr_terms;

> > +     /** Maximum number of CoS supported */

> > +     unsigned max_cos;

> > +     /** A Boolean to denote support of PMR range */

> > +     odp_bool_t pmr_range_supported;

> > +} odp_cls_capability_t;

> > +

> > +/**

> >   * class of service packet drop policies

> >   */

> >  typedef enum {

> > @@ -103,6 +173,17 @@ typedef struct odp_cls_cos_param {

> >  void odp_cls_cos_param_init(odp_cls_cos_param_t *param);

> >

> >  /**

> > + * Query classification capabilities

> > + *

> > + * Outputs classification capabilities on success.

> > + *

> > + * @param[out]       capability      Classification capability

> structure for

> > output

>

> "Pointer to classification ... "

>

>

> > + * @retval   0 on success

> > + * @retval   <0 on failure

> > + */

> > +int odp_cls_capability(odp_cls_capability_t *capability);

> > +

> > +/**

> >   * Create a class-of-service

> >   *

> >   * @param    name    String intended for debugging purposes.

> > @@ -268,17 +349,40 @@ typedef enum {

> >  } odp_pmr_term_t;

> >

> >  /**

> > - * Following structure is used to define a packet matching rule

> > + * Packet Matching Rule parameter structure

> >   */

> > -typedef struct odp_pmr_match_t {

> > -     odp_pmr_term_t  term;   /**< PMR term value to be matched */

> > -     const void      *val;   /**< Value to be matched */

> > -     const void      *mask;  /**< Masked set of bits to be matched */

> > +typedef struct odp_pmr_param_t {

> > +     odp_pmr_term_t  term;   /**< Packet Macthing Rule term */

> > +     bool range_term;        /**< True if the value is range and false

> if match

>

> Must be odp_bool_t

>


Okay.

>

> -Petri

>

>

Regards,
Bala

>

> > */

> > +     union {

> > +             struct {

> > +                     /**< Value to be matched */

> > +                     const void      *value;

> > +                     /**< Masked set of bits to be matched */

> > +                     const void      *mask;

> > +             } match;

> > +             struct {

> > +                     /* Start and End values are included in the range

> */

> > +                     /**< start value of range */

> > +                     const void      *val_start;

> > +                     /**< End value of range */

> > +                     const void      *val_end;

> > +             } range;

> > +     };

> >       uint32_t        val_sz;  /**< Size of the term value */

> >       uint32_t        offset;  /**< User-defined offset in packet

> >                                Used if term == ODP_PMR_CUSTOM_FRAME only,

> >                                ignored otherwise */

> > -} odp_pmr_match_t;

> > +} odp_pmr_param_t;

>
diff mbox

Patch

diff --git a/include/odp/api/spec/classification.h b/include/odp/api/spec/classification.h
index 076b3de..28619a9 100644
--- a/include/odp/api/spec/classification.h
+++ b/include/odp/api/spec/classification.h
@@ -55,6 +55,76 @@  extern "C" {
  */
 
 /**
+ * Supported PMR term values
+ *
+ * Supported Packet Matching Rule term values in a bit field structure.
+ */
+typedef union odp_cls_pmr_supported_t {
+	struct {
+		/** Total length of received packet */
+		uint64_t	pmr_len:1;
+		/** Initial (outer) Ethertype only */
+		uint64_t	ethtype_0:1;
+		/** Ethertype of most inner VLAN tag */
+		uint64_t	ethtype_x:1;
+		/** First VLAN ID (outer) */
+		uint64_t	vlan_id_0:1;
+		/** Last VLAN ID (inner) */
+		uint64_t	vlan_id_x:1;
+		/** destination MAC address */
+		uint64_t	dmac:1;
+		/** IP Protocol or IPv6 Next Header */
+		uint64_t	ip_proto:1;
+		/** Destination UDP port, implies IPPROTO=17 */
+		uint64_t	udp_dport:1;
+		/** Destination TCP port implies IPPROTO=6 */
+		uint64_t	tcp_dport:1;
+		/** Source UDP Port */
+		uint64_t	udp_sport:1;
+		/** Source TCP port */
+		uint64_t	tcp_sport:1;
+		/** Source IP address */
+		uint64_t	sip_addr:1;
+		/** Destination IP address */
+		uint64_t	dip_addr:1;
+		/** Source IP address */
+		uint64_t	sip6_addr:1;
+		/** Destination IP address */
+		uint64_t	dip6_addr:1;
+		/** IPsec session identifier */
+		uint64_t	ipsec_spi:1;
+		/** NVGRE/VXLAN network identifier */
+		uint64_t	ld_vni:1;
+		/** Custom match rule, offset from start of
+		 * frame. The match is defined by the offset, the
+		 * expected value, and its size.
+		 */
+		uint64_t	custom_frame:1;
+
+	} proto;
+	uint64_t all_bits;
+} odp_cls_pmr_supported_t;
+
+/**
+ * Classification capabilities
+ * This capability structure defines system level classfication capability
+ */
+typedef struct odp_cls_capability_t {
+	/** PMR terms supported by the classifier
+	 * A mask one bit for each of odp_pmr_term_t
+	 */
+	odp_cls_pmr_supported_t pmr_terms;
+	/** Maximum number of PMR terms */
+	unsigned max_pmr_terms;
+	/** Number of PMR terms available for use now */
+	unsigned available_pmr_terms;
+	/** Maximum number of CoS supported */
+	unsigned max_cos;
+	/** A Boolean to denote support of PMR range */
+	odp_bool_t pmr_range_supported;
+} odp_cls_capability_t;
+
+/**
  * class of service packet drop policies
  */
 typedef enum {
@@ -103,6 +173,17 @@  typedef struct odp_cls_cos_param {
 void odp_cls_cos_param_init(odp_cls_cos_param_t *param);
 
 /**
+ * Query classification capabilities
+ *
+ * Outputs classification capabilities on success.
+ *
+ * @param[out]	capability	Classification capability structure for output
+ * @retval	0 on success
+ * @retval	<0 on failure
+ */
+int odp_cls_capability(odp_cls_capability_t *capability);
+
+/**
  * Create a class-of-service
  *
  * @param	name	String intended for debugging purposes.
@@ -268,17 +349,40 @@  typedef enum {
 } odp_pmr_term_t;
 
 /**
- * Following structure is used to define a packet matching rule
+ * Packet Matching Rule parameter structure
  */
-typedef struct odp_pmr_match_t {
-	odp_pmr_term_t  term;	/**< PMR term value to be matched */
-	const void	*val;	/**< Value to be matched */
-	const void	*mask;	/**< Masked set of bits to be matched */
+typedef struct odp_pmr_param_t {
+	odp_pmr_term_t  term;	/**< Packet Macthing Rule term */
+	bool range_term;	/**< True if the value is range and false if match */
+	union {
+		struct {
+			/**< Value to be matched */
+			const void	*value;
+			/**< Masked set of bits to be matched */
+			const void	*mask;
+		} match;
+		struct {
+			/* Start and End values are included in the range */
+			/**< start value of range */
+			const void	*val_start;
+			/**< End value of range */
+			const void	*val_end;
+		} range;
+	};
 	uint32_t	val_sz;	 /**< Size of the term value */
 	uint32_t	offset;  /**< User-defined offset in packet
 				 Used if term == ODP_PMR_CUSTOM_FRAME only,
 				 ignored otherwise */
-} odp_pmr_match_t;
+} odp_pmr_param_t;
+
+/**
+ * Intiailize packet matching rule parameters
+ *
+ * Initialize an odp_pmr_param_t to its default values for all fields
+ *
+ * @param param Address of the odp_pmr_param_t to be initialized
+ */
+void odp_cls_pmr_param_init(odp_pmr_param_t *param);
 
 /**
  * Create a packet match rule between source and destination class of service.
@@ -293,7 +397,7 @@  typedef struct odp_pmr_match_t {
  * of inspecting the return value when installing such rules, and perform
  * appropriate fallback action.
  *
- * @param[in]	terms		Array of odp_pmr_match_t entries, one entry per
+ * @param[in]	terms		Array of odp_pmr_param_t entries, one entry per
  *				term desired.
  * @param[in]	num_terms	Number of terms in the match rule.
  * @param[in]	src_cos		source CoS handle
@@ -302,7 +406,7 @@  typedef struct odp_pmr_match_t {
  * @return			Handle to the Packet Match Rule.
  * @retval			ODP_PMR_INVAL on failure
  */
-odp_pmr_t odp_cls_pmr_create(const odp_pmr_match_t *terms, int num_terms,
+odp_pmr_t odp_cls_pmr_create(const odp_pmr_param_t *terms, int num_terms,
 			     odp_cos_t src_cos, odp_cos_t dst_cos);
 
 /**
@@ -323,20 +427,6 @@  odp_pmr_t odp_cls_pmr_create(const odp_pmr_match_t *terms, int num_terms,
 int odp_cls_pmr_destroy(odp_pmr_t pmr_id);
 
 /**
- * Inquire about matching terms supported by the classifier
- *
- * @return A mask one bit per enumerated term, one for each of odp_pmr_term_t
- */
-unsigned long long odp_pmr_terms_cap(void);
-
-/**
- * Return the number of packet matching terms available for use
- *
- * @return A number of packet matcher resources available for use.
- */
-unsigned odp_pmr_terms_avail(void);
-
-/**
 * Assigns a packet pool for a specific class of service.
 * All the packets belonging to the given class of service will
 * be allocated from the assigned packet pool.