Hi,

On 15 October 2014 19:37, Anders Roxell <[email protected]> wrote:

> Question: should we add "#include <odp_classification.h>" into odp.h in
> this patch as well or in a separate patch?


I would prefer to add this in odp.h once we have a stable classification
implementation.
Currently this is only a header file patch.

>


> I only had one nit see comment inline.
>
> On 2014-10-14 23:00, Balasubramanian Manoharan wrote:
> > Signed-off-by: Balasubramanian Manoharan <[email protected]>
> > ---
> > Classification API header file
> > V3: Fixes the review comments from Anders and Mike
> >
> >  platform/linux-generic/Makefile.am                 |   2 +
> >  .../linux-generic/include/api/odp_classification.h | 540
> +++++++++++++++++++++
> >  platform/linux-generic/include/api/odp_packet_io.h |   5 +
> >  platform/linux-generic/include/api/odp_queue.h     |   5 +
> >  platform/linux-generic/odp_classification.c        | 236 +++++++++
> >  5 files changed, 788 insertions(+)
> >  create mode 100644
> platform/linux-generic/include/api/odp_classification.h
> >  create mode 100644 platform/linux-generic/odp_classification.c
> >
> > diff --git a/platform/linux-generic/Makefile.am
> b/platform/linux-generic/Makefile.am
> > index d076d50..38dfdd1 100644
> > --- a/platform/linux-generic/Makefile.am
> > +++ b/platform/linux-generic/Makefile.am
> > @@ -12,6 +12,7 @@ include_HEADERS = \
> >
>  $(top_srcdir)/platform/linux-generic/include/api/odp_barrier.h \
> >
>  $(top_srcdir)/platform/linux-generic/include/api/odp_buffer.h \
> >
>  $(top_srcdir)/platform/linux-generic/include/api/odp_buffer_pool.h \
> > +
>  $(top_srcdir)/platform/linux-generic/include/api/odp_classification.h \
>
> Nit, move it so the files are in alfabetic order.
>
> Okay

> Cheers,
> Anders
>
> >
>  $(top_srcdir)/platform/linux-generic/include/api/odp_byteorder.h \
> >
>  $(top_srcdir)/platform/linux-generic/include/api/odp_compiler.h \
> >
>  $(top_srcdir)/platform/linux-generic/include/api/odp_config.h \
> > @@ -51,6 +52,7 @@ __LIB__libodp_la_SOURCES = \
> >                          odp_barrier.c \
> >                          odp_buffer.c \
> >                          odp_buffer_pool.c \
> > +                        odp_classification.c \
> >                          odp_coremask.c \
> >                          odp_crypto.c \
> >                          odp_init.c \
> > diff --git a/platform/linux-generic/include/api/odp_classification.h
> b/platform/linux-generic/include/api/odp_classification.h
> > new file mode 100644
> > index 0000000..5bb30d9
> > --- /dev/null
> > +++ b/platform/linux-generic/include/api/odp_classification.h
> > @@ -0,0 +1,540 @@
> > +/* Copyright (c) 2014, Linaro Limited
> > + * All rights reserved.
> > + *
> > + * SPDX-License-Identifier:     BSD-3-Clause
> > + */
> > +
> > +
> > +/**
> > + * @file
> > + *
> > + * ODP classification descriptor
> > + */
> > +
> > +#ifndef ODP_CLASSIFY_H_
> > +#define ODP_CLASSIFY_H_
> > +
> > +#ifdef __cplusplus
> > +extern "C" {
> > +#endif
> > +
> > +
> > +#include <odp_std_types.h>
> > +#include <odp_buffer_pool.h>
> > +#include <odp_packet.h>
> > +#include <odp_packet_io.h>
> > +#include <odp_queue.h>
> > +
> > +/**
> > + * Class of service instance type
> > + */
> > +typedef uint32_t odp_cos_t;
> > +
> > +
> > +/**
> > + * flow signature type, only used for packet meta data field.
> > + */
> > +typedef uint32_t odp_flowsig_t;
> > +
> > +/**
> > + * This value is returned from odp_cos_create() on failure,
> > + * May also be used as a “sink” class of service that
> > + * results in packets being discarded.
> > +*/
> > +#define ODP_COS_INVALID    ((odp_cos_t)~0)
> > +
> > +/**
> > + * Class-of-service packet drop policies
> > + */
> > +typedef enum odp_cos_drop {
> > +     ODP_COS_DROP_POOL,    /**< Follow buffer pool drop policy */
> > +     ODP_COS_DROP_NEVER,    /**< Never drop, ignoring buffer pool
> policy */
> > +} odp_drop_e;
> > +
> > +/**
> > + * Packet header field enumeration
> > + * for fields that may be used to calculate
> > + * the flow signature, if present in a packet.
> > + */
> > +typedef enum odp_cos_hdr_flow_fields {
> > +     ODP_COS_FHDR_IN_PKTIO,  /**< Ingress port number */
> > +     ODP_COS_FHDR_L2_SAP,    /**< Ethernet Source MAC address */
> > +     ODP_COS_FHDR_L2_DAP,    /**< Ethernet Destination MAC address */
> > +     ODP_COS_FHDR_L2_VID,    /**< Ethernet VLAN ID */
> > +     ODP_COS_FHDR_L3_FLOW,   /**< IPv6 flow_id */
> > +     ODP_COS_FHDR_L3_SAP,    /**< IP source address */
> > +     ODP_COS_FHDR_L3_DAP,    /**< IP destination address */
> > +     ODP_COS_FHDR_L4_PROTO,  /**< IP protocol (e.g. TCP/UDP/ICMP) */
> > +     ODP_COS_FHDR_L4_SAP,    /**< Transport source port */
> > +     ODP_COS_FHDR_L4_DAP,    /**< Transport destination port */
> > +     ODP_COS_FHDR_IPSEC_SPI, /**< IPsec session identifier */
> > +     ODP_COS_FHDR_LD_VNI,    /**< NVGRE/VXLAN network identifier */
> > +     ODP_COS_FHDR_USER       /**< Application-specific header field(s)
> */
> > +} odp_cos_hdr_flow_fields_e;
> > +
> > +/**
> > + * Create a class-of-service
> > + *
> > + * @param[in]  name  String intended for debugging purposes.
> > + *
> > + * @return           Class of service instance identifier,
> > + *                   or ODP_COS_INVALID on error.
> > + */
> > +odp_cos_t odp_cos_create(const char *name);
> > +
> > +/**
> > + * Discard a class-of-service along with all its associated resources
> > + *
> > + * @param[in]        cos_id  class-of-service instance.
> > + *
> > + * @return           0 on success, -1 on error.
> > + */
> > +int odp_cos_destroy(odp_cos_t cos_id);
> > +
> > +/**
> > + * Assign a queue for a class-of-service
> > + *
> > + * @param[in]        cos_id          class-of-service instance.
> > + *
> > + * @param[in]        queue_id        Identifier of a queue where all
> packets
> > + *                           of this specific class of service
> > + *                           will be enqueued.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + */
> > +int odp_cos_set_queue(odp_cos_t cos_id, odp_queue_t queue_id);
> > +
> > +/**
> > + * Assign a homogenous queue-group to a class-of-service.
> > + *
> > + * @param[in]        cos_id          class-of-service instance
> > + * @param[in]        queue_group_id  Identifier of the queue group to
> receive packets
> > + *                           associated with this class of service.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + */
> > +int odp_cos_set_queue_group(odp_cos_t cos_id,
> > +                         odp_queue_group_t queue_group_id);
> > +
> > +/**
> > + * Assign packet buffer pool for specific class-of-service
> > + *
> > + * @param[in]        cos_id          class-of-service instance.
> > + * @param[in]        pool_id         Buffer pool identifier where all
> packet buffers
> > + *                           will be sourced to store packet that
> > + *                           belong to this class of service.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + *
> > + * @note Optional.
> > + */
> > +int odp_cos_set_pool(odp_cos_t cos_id, odp_buffer_pool_t pool_id);
> > +
> > +
> > +/**
> > + * Assign packet drop policy for specific class-of-service
> > + *
> > + * @param[in]        cos_id          class-of-service instance.
> > + * @param[in]        drop_policy     Desired packet drop policy for
> this class.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + *
> > + * @note Optional.
> > + */
> > +int odp_cos_set_drop(odp_cos_t cos_id, odp_drop_e drop_policy);
> > +
> > +/**
> > + * Setup per-port default class-of-service.
> > + *
> > + * @param[in]        pktio_in        Ingress port identifier.
> > + * @param[in]        default_cos     Class-of-service set to all
> packets arriving
> > + *                           at the 'pktio_in' ingress port,
> > + *                           unless overridden by subsequent
> > + *                           header-based filters.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + */
> > +int odp_pktio_set_default_cos(odp_pktio_t pktio_in, odp_cos_t
> default_cos);
> > +
> > +/**
> > + * Setup per-port error class-of-service
> > + *
> > + * @param[in]        pktio_in        Ingress port identifier.
> > + * @param[in]        error_cos       class-of-service set to all
> packets arriving
> > + *                           at the 'pktio_in' ingress port
> > + *                           that contain an error.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + *
> > + * @note Optional.
> > + */
> > +int odp_pktio_set_error_cos(odp_pktio_t pktio_in, odp_cos_t error_cos);
> > +
> > +/**
> > + * Setup per-port header offset
> > + *
> > + * @param[in]        pktio_in        Ingress port identifier.
> > + * @param[in]        offset          Number of bytes the classifier
> must skip.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + * @note  Optional.
> > + *
> > + */
> > +int odp_pktio_set_skip(odp_pktio_t pktio_in, size_t offset);
> > +
> > +/**
> > + * Specify per-port buffer headroom
> > + *
> > + * @param[in]        pktio_in        Ingress port identifier.
> > + * @param[in]        headroom        Number of bytes of space preceding
> > + *                           packet data to reserve for use as headroom.
> > + *                           Must not exceed the implementation
> > + *                           defined ODP_PACKET_MAX_HEADROOM.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + *
> > + * @note Optional.
> > + */
> > +int odp_pktio_set_headroom(odp_pktio_t port_id, size_t headroom);
> > +
> > +/**
> > + * Specify per-cos buffer headroom
> > + *
> > + * @param[in]        cos_id          Class-of-service instance
> > + * @param[in]        headroom        Number of bytes of space preceding
> packet
> > + *                           data to reserve for use as headroom.
> > + *                           Must not exceed the implementation
> > + *                           defined ODP_PACKET_MAX_HEADROOM.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + *
> > + * @note Optional.
> > + */
> > +int odp_cos_set_headroom(odp_cos_t cos_id, size_t req_room);
> > +
> > +/**
> > + * Request to override per-port class of service
> > + * based on Layer-2 priority field if present.
> > + *
> > + * @param[in]        pktio_in        Ingress port identifier.
> > + * @param[in]        num_qos         Number of QoS levels, typically 8.
> > + * @param[in]        qos_table       Values of the Layer-2 QoS header
> field.
> > + * @param[in]        cos_table       Class-of-service assigned to each
> of the
> > + *                           allowed Layer-2 QOS levels.
> > + * @return                   0 on success, -1 on error.
> > + */
> > +int odp_cos_with_l2_priority(odp_pktio_t pktio_in,
> > +                          size_t num_qos,
> > +                          uint8_t qos_table[],
> > +                          odp_cos_t cos_table[]);
> > +
> > +/**
> > + * Request to override per-port class of service
> > + * based on Layer-3 priority field if present.
> > + *
> > + * @param[in]        pktio_in        Ingress port identifier.
> > + * @param[in]        num_qos         Number of allowed Layer-3 QoS
> levels.
> > + * @param[in]        qos_table       Values of the Layer-3 QoS header
> field.
> > + * @param[in]        cos_table       Class-of-service assigned to each
> of the
> > + *                           allowed Layer-3 QOS levels.
> > + * @param[in]        l3_preference   when true, Layer-3 QoS overrides
> > + *                           L2 QoS when present.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + *
> > + * @note Optional.
> > + */
> > +int odp_cos_with_l3_qos(odp_pktio_t pktio_in,
> > +                     size_t num_qos,
> > +                     uint8_t qos_table[],
> > +                     odp_cos_t cos_table[],
> > +                     bool l3_preference);
> > +
> > +
> > +/**
> > + * Set of header fields that take part in flow signature hash
> calculation:
> > + * bit positions per 'odp_cos_hdr_flow_fields_e' enumeration.
> > + */
> > +typedef uint16_t odp_cos_flow_set_t;
> > +
> > +/**
> > + * Set a member of the flow signature fields data set
> > + */
> > +static inline
> > +odp_cos_flow_set_t odp_cos_flow_set(odp_cos_flow_set_t set,
> > +                                 odp_cos_hdr_flow_fields_e field)
> > +{
> > +     return set | (1U << field);
> > +}
> > +
> > +/**
> > + * Test a member of the flow signature fields data set
> > + */
> > +static inline bool
> > +odp_cos_flow_is_set(odp_cos_flow_set_t set, odp_cos_hdr_flow_fields_e
> field)
> > +{
> > +     return (set & (1U << field)) != 0;
> > +}
> > +
> > +/**
> > + * Set up set of headers used to calculate a flow signature
> > + * based on class-of-service.
> > + *
> > + * @param[in]        cos_id          Class of service instance
> identifier
> > + * @param[in]        req_data_set    Requested data-set for
> > + *                           flow signature calculation
> > + *
> > + * @return                   Data-set that was successfully applied.
> > + *                           All-zeros data set indicates a failure to
> > + *                           assign any of the requested fields,
> > + *                           or other error.
> > + * @note Optional.
> > + */
> > +odp_cos_flow_set_t
> > +odp_cos_class_flow_signature(odp_cos_t cos_id,
> > +                          odp_cos_flow_set_t req_data_set);
> > +
> > +/**
> > + * Set up set of headers used to calculate a flow signature
> > + * based on ingress port.
> > + *
> > + * @param[in]        pktio_in        Ingress port identifier
> > + * @param[in]        req_data_set    Requested data-set for
> > + *                           flow signature calculation
> > + *
> > + * @return                   Data-set that was successfully applied.
> > + *                           An all-zeros data-set indicates a failure
> to
> > + *                           assign any of the requested fields,
> > + *                           or other error.
> > + */
> > +odp_cos_flow_set_t
> > +odp_cos_port_flow_signature(odp_pktio_t pktio_in,
> > +                         odp_cos_flow_set_t req_data_set);
> > +
> > +/**
> > + * PMR - Packet Matching Rule
> > + * Up to 32 bit of ternary matching of one of the available header
> fields
> > + */
> > +#define    ODP_PMR_INVAL ((odp_pmr_t)NULL)
> > +typedef uint32_t odp_pmr_t;
> > +
> > +/**
> > + * Packet Matching Rule field enumeration
> > + * for fields that may be used to calculate
> > + * the PMR, if present in a packet.
> > + */
> > +typedef enum odp_pmr_term {
> > +     ODP_PMR_LEN,            /**< Total length of received packet*/
> > +     ODP_PMR_ETHTYPE_0,      /**< Initial (outer)
> > +                             Ethertype only (*val=uint16_t)*/
> > +     ODP_PMR_ETHTYPE_X,      /**< Ethertype of most inner VLAN tag
> > +                             (*val=uint16_t)*/
> > +     ODP_PMR_VLAN_ID_0,      /**< First VLAN ID (outer) (*val=uint16_t)
> */
> > +     ODP_PMR_VLAN_ID_X,      /**< Last VLAN ID (inner) (*val=uint16_t)
> */
> > +     ODP_PMR_DMAC,           /**< destination MAC address
> (*val=uint64_t)*/
> > +     ODP_PMR_IPPROTO,        /**< IP Protocol or IPv6 Next Header
> > +                             (*val=uint8_t) */
> > +     ODP_PMR_UDP_DPORT,      /**< Destination UDP port, implies
> IPPROTO=17*/
> > +     ODP_PMR_TCP_DPORT,      /**< Destination TCP port implies
> IPPROTO=6*/
> > +     ODP_PMR_UDP_SPORT,      /**< Source UDP Port (*val=uint16_t)*/
> > +     ODP_PMR_TCP_SPORT,      /**< Source TCP port (*val=uint16_t)*/
> > +     ODP_PMR_SIP_ADDR,       /**< Source IP address (uint32_t)*/
> > +     ODP_PMR_DIP_ADDR,       /**< Destination IP address (uint32_t)*/
> > +     ODP_PMR_SIP6_ADDR,      /**< Source IP address (uint8_t[16])*/
> > +     ODP_PMR_DIP6_ADDR,      /**< Destination IP address (uint8_t[16])*/
> > +     ODP_PMR_IPSEC_SPI,      /**< IPsec session
> identifier(*val=uint32_t)*/
> > +     ODP_PMR_LD_VNI,         /**< NVGRE/VXLAN network identifier
> > +                             (*val=uint32_t)*/
> > +
> > +     /** Inner header may repeat above values with this offset */
> > +     ODP_PMR_INNER_HDR_OFF = 32
> > +} odp_pmr_term_e;
> > +
> > +/**
> > + * Create a packet match rule with mask and value
> > + *
> > + * @param[in]        term    One of the enumerated values supported
> > + * @param[in]        val     Value to match against the packet header
> > + *                   in native byte order.
> > + * @param[in]        mask    Mask to indicate which bits of the header
> > + *                   should be matched ('1') and
> > + *                   which should be ignored ('0')
> > + * @param[in]        val_sz  Size of the ‘val’ and ‘mask’ arguments,
> > + *                   that must match the value size requirement of the
> > + *                   specific ‘term’.
> > + *
> > + * @return           Handle of the matching rule or ODP_PMR_INVAL on
> error
> > + */
> > +odp_pmr_t odp_pmr_create_match(odp_pmr_term_e term,
> > +                            const void *val,
> > +                            const void *mask,
> > +                            size_t val_sz);
> > +
> > +/**
> > + * Create a packet match rule with value range
> > + *
> > + * @param[in]        term    One of the enumerated values supported
> > + * @param[in]        val1    Lower bound of the header field range.
> > + * @param[in]        val2    Upper bound of the header field range.
> > + * @param[in]        val_sz  Size of the ‘val1’ and ‘val2’ arguments,
> > + *                   that must match the value size requirement of the
> > + *                   specific ‘term’.
> > + *
> > + * @return           Handle of the matching rule or ODP_PMR_INVAL on
> error
> > + * @note: Range is inclusive [val1..val2].
> > + */
> > +odp_pmr_t odp_pmr_create_range(odp_pmr_term_e term,
> > +                            const void *val1,
> > +                            const void *val2,
> > +                            size_t val_sz);
> > +/**
> > + * Invalidate a packet match rule and vacate its resources
> > + *
> > + * @param[in]        pmr_id  Identifier of the PMR to be destroyed
> > + *
> > + * @return           0 on success, -1 or error.
> > + */
> > +int odp_pmr_destroy(odp_pmr_t pmr_id);
> > +
> > +/**
> > + * Apply a PMR to a pktio to assign a CoS.
> > + *
> > + * @param[in]        pmr_id          PMR to be activated
> > + * @param[in]        src_pktio       pktio to which this PMR is to be
> applied
> > + * @param[in]        dst_cos         CoS to be assigned by this PMR
> > + *
> > + * @return                   0 on success, -1 or error.
> > + */
> > +int odp_pktio_pmr_cos(odp_pmr_t pmr_id,
> > +                   odp_pktio_t src_pktio, odp_cos_t dst_cos);
> > +
> > +/**
> > + * Cascade a PMR to refine packets from one CoS to another.
> > + *
> > + * @param[in]        pmr_id          PMR to be activated
> > + * @param[in]        src_cos         CoS to be filtered
> > + * @param[in]        dst_cos         CoS to be assigned to packets
> filtered
> > + *                           from src_cos that match pmr_id.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + */
> > +int odp_cos_pmr_cos(odp_pmr_t pmr_id, odp_cos_t src_cos, odp_cos_t
> dst_cos);
> > +
> > +/**
> > + * Retrieve packet matcher statistics
> > + *
> > + * @param[in]        pmr_id          PMR from which to retrieve the
> count
> > + *
> > + * @return                   Current number of matches for a given
> matcher instance.
> > + */
> > +signed long odp_pmr_match_count(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
> op_pmr_term_e
> > + */
> > +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);
> > +
> > +/**
> > + * Packet Match Type field enumeration
> > + * for fields that may be used to identify
> > + * the different PMR match type.
> > + */
> > +typedef enum odp_pmr_match_type {
> > +             ODP_PMR_MASK,       /**< Match a masked set of bits */
> > +             ODP_PMR_RANGE,      /**< Match an integer range */
> > +     } odp_pmr_match_type_e;
> > +
> > +/**
> > + * Following structure is used to define composite packet matching rules
> > + * in the form of an array of individual match or range rules.
> > + * The underlying platform may not support all or any specific
> combination
> > + * of value match or range rules, and the application should take care
> > + * of inspecting the return value when installing such rules, and
> perform
> > + * appropriate fallback action.
> > + */
> > +typedef struct odp_pmr_match_t {
> > +     odp_pmr_match_type_e match_type;
> > +     union {
> > +             struct {
> > +                     odp_pmr_term_e  term;
> > +                     const void          *val;
> > +                     const void          *mask;
> > +                     unsigned int         val_sz;
> > +             } mask; /**< Match a masked set of bits */
> > +             struct {
> > +                     odp_pmr_term_e  term;
> > +                     const void          *val1;
> > +                     const void          *val2;
> > +                     unsigned int         val_sz;
> > +             } range; /**< Match an integer range */
> > +     };
> > +} odp_pmr_match_t;
> > +
> > +/** An opaque handle to a composite packet match rule-set */
> > +typedef uint32_t odp_pmr_set_t;
> > +
> > +/**
> > + * Create a composite packet match rule
> > + *
> > + * @param[in]        num_terms       Number of terms in the match rule.
> > + * @param[in]        terms           Array of num_terms entries, one
> entry per
> > + *                           term desired.
> > + * @param[in]        dst_cos         Class-of-service to be assigned to
> packets
> > + *                           that match the compound rule-set,
> > + *                           or a subset thereof, if partly applied.
> > + * @param[out]       pmr_set_id      Returned handle to the composite
> rule set.
> > + *
> > + * @return                   Return value may be a positive number
> > + *                           indicating the number of ‘terms’ elements
> > + *                           that have been successfully mapped to the
> > + *                           underlying platform classification engine
> and
> > + *                           may be in the range from 1 to ‘num_terms’,
> > + *                           or -1 for error.
> > + */
> > +int odp_pmr_match_set_create(int num_terms, odp_pmr_match_t *terms,
> > +                          odp_pmr_set_t *pmr_set_id);
> > +
> > +/**
> > + * Function to delete a composite packet match rule set
> > + * Depending on the implementation details, destroying a rule-set
> > + * may not guarantee the availability of hardware resources to create
> the
> > + * same or essentially similar rule-set.
> > + *
> > + * All of the resources pertaining to the match set associated with the
> > + * class-of-service will be released, but the class-of-service will
> > + * remain intact.
> > + *
> > + * @param[in]        pmr_set_id      A composite rule-set handle
> > + *                           returned when created.
> > + *
> > + * @return                   0 on success, -1 on error.
> > + */
> > +int odp_pmr_match_set_destroy(odp_pmr_set_t pmr_set_id);
> > +
> > +/**
> > + * Apply a PMR Match Set to a pktio to assign a CoS.
> > + *
> > + * @param[in]        pmr_set_id      PMR match set to be activated
> > + * @param[in]        src_pktio       pktio to which this PMR match
> > + *                           set is to be applied
> > + * @param[in]        dst_cos         CoS to be assigned by this PMR
> match set
> > + *
> > + * @return                   0 on success, -1 or error.
> > + */
> > +int odp_pktio_pmr_match_set_cos(odp_pmr_t pmr_id, odp_pktio_t src_pktio,
> > +                             odp_cos_t dst_cos);
> > +
> > +#ifdef __cplusplus
> > +}
> > +#endif
> > +
> > +#endif
> > diff --git a/platform/linux-generic/include/api/odp_packet_io.h
> b/platform/linux-generic/include/api/odp_packet_io.h
> > index 29fd105..b532927 100644
> > --- a/platform/linux-generic/include/api/odp_packet_io.h
> > +++ b/platform/linux-generic/include/api/odp_packet_io.h
> > @@ -30,6 +30,11 @@ typedef uint32_t odp_pktio_t;
> >  #define ODP_PKTIO_INVALID 0
> >
> >  /**
> > + * 'odp_pktio_t' value to indicate any port
> > + */
> > +#define ODP_PKTIO_ANY ((odp_pktio_t)~0)
> > +
> > +/**
> >   * Open an ODP packet IO instance
> >   *
> >   * @param dev    Packet IO device
> > diff --git a/platform/linux-generic/include/api/odp_queue.h
> b/platform/linux-generic/include/api/odp_queue.h
> > index 5e083f1..6e8efa9 100644
> > --- a/platform/linux-generic/include/api/odp_queue.h
> > +++ b/platform/linux-generic/include/api/odp_queue.h
> > @@ -28,6 +28,11 @@ extern "C" {
> >   */
> >  typedef uint32_t odp_queue_t;
> >
> > +/**
> > + * Queue group instance type
> > + */
> > +typedef uint32_t odp_queue_group_t;
> > +
> >  /** Invalid queue */
> >  #define ODP_QUEUE_INVALID  0
> >
> > diff --git a/platform/linux-generic/odp_classification.c
> b/platform/linux-generic/odp_classification.c
> > new file mode 100644
> > index 0000000..f537ff1
> > --- /dev/null
> > +++ b/platform/linux-generic/odp_classification.c
> > @@ -0,0 +1,236 @@
> > +#include <odp_classification.h>
> > +#include <odp_align.h>
> > +#include <odp_queue.h>
> > +#include <odp_debug.h>
> > +#include <odp_debug_internal.h>
> > +#include <odp_packet_io.h>
> > +
> > +odp_cos_t odp_cos_create(const char *name)
> > +{
> > +     (void) name;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_cos_destroy(odp_cos_t cos_id)
> > +{
> > +     (void)cos_id;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_cos_set_queue(odp_cos_t cos_id, odp_queue_t queue_id)
> > +{
> > +     (void)cos_id;
> > +     (void)queue_id;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_cos_set_queue_group(odp_cos_t cos_id, odp_queue_group_t
> queue_group_id)
> > +{
> > +     (void)cos_id;
> > +     (void)queue_group_id;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_cos_set_pool(odp_cos_t cos_id, odp_buffer_pool_t pool_id)
> > +{
> > +     (void)cos_id;
> > +     (void) pool_id;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +
> > +int odp_cos_set_drop(odp_cos_t cos_id, odp_drop_e drop_policy)
> > +{
> > +     (void)cos_id;
> > +     (void)drop_policy;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_pktio_set_default_cos(odp_pktio_t pktio_in, odp_cos_t
> default_cos)
> > +{
> > +     (void)pktio_in;
> > +     (void)default_cos;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +int odp_pktio_set_error_cos(odp_pktio_t pktio_in, odp_cos_t error_cos)
> > +{
> > +     (void)pktio_in;
> > +     (void)error_cos;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_pktio_set_skip(odp_pktio_t pktio_in, size_t offset)
> > +{
> > +     (void)pktio_in;
> > +     (void)offset;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_pktio_set_headroom(odp_pktio_t port_id, size_t headroom)
> > +{
> > +     (void)port_id;
> > +     (void)headroom;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +int odp_cos_set_headroom(odp_cos_t cos_id, size_t req_room)
> > +{
> > +     (void)cos_id;
> > +     (void)req_room;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_cos_with_l2_priority(odp_pktio_t pktio_in,
> > +                          size_t num_qos,
> > +                          uint8_t qos_table[],
> > +                          odp_cos_t cos_table[])
> > +{
> > +     (void)pktio_in;
> > +     (void)num_qos;
> > +     (void)qos_table;
> > +     (void)cos_table;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_cos_with_l3_qos(odp_pktio_t pktio_in,
> > +                     size_t num_qos,
> > +                     uint8_t qos_table[],
> > +                     odp_cos_t cos_table[],
> > +                     bool l3_preference)
> > +{
> > +     (void)pktio_in;
> > +     (void)num_qos;
> > +     (void)qos_table;
> > +     (void)cos_table;
> > +     (void)l3_preference;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +odp_cos_flow_set_t
> > +odp_cos_class_flow_signature(odp_cos_t cos_id,
> > +                          odp_cos_flow_set_t req_data_set)
> > +{
> > +     (void)cos_id;
> > +     (void)req_data_set;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +odp_cos_flow_set_t
> > +odp_cos_port_flow_signature(odp_pktio_t pktio_in,
> > +                         odp_cos_flow_set_t req_data_set)
> > +{
> > +     (void)pktio_in;
> > +     (void)req_data_set;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +odp_pmr_t odp_pmr_create_match(odp_pmr_term_e term,
> > +                            const void *val,
> > +                            const void *mask,
> > +                            size_t val_sz)
> > +{
> > +     (void)term;
> > +     (void)val;
> > +     (void)mask;
> > +     (void)val_sz;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +odp_pmr_t odp_pmr_create_range(odp_pmr_term_e term,
> > +                            const void *val1,
> > +                            const void *val2,
> > +                            size_t val_sz)
> > +{
> > +     (void)term;
> > +     (void)val1;
> > +     (void)val2;
> > +     (void)val_sz;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +int odp_pmr_destroy(odp_pmr_t pmr_id)
> > +{
> > +     (void)pmr_id;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_pktio_pmr_cos(odp_pmr_t pmr_id,
> > +                   odp_pktio_t src_pktio,
> > +                   odp_cos_t dst_cos)
> > +{
> > +     (void)pmr_id;
> > +     (void)src_pktio;
> > +     (void)dst_cos;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_cos_pmr_cos(odp_pmr_t pmr_id, odp_cos_t src_cos, odp_cos_t
> dst_cos)
> > +{
> > +     (void)pmr_id;
> > +     (void)src_cos;
> > +     (void)dst_cos;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +signed long odp_pmr_match_count(odp_pmr_t pmr_id)
> > +{
> > +     (void)pmr_id;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +unsigned long long odp_pmr_terms_cap(void)
> > +{
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +unsigned odp_pmr_terms_avail(void)
> > +{
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_pmr_match_set_create(int num_terms, odp_pmr_match_t *terms,
> > +                          odp_pmr_set_t *pmr_set_id)
> > +{
> > +     (void)num_terms;
> > +     (void)terms;
> > +     (void)pmr_set_id;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_pmr_match_set_destroy(odp_pmr_set_t pmr_set_id)
> > +{
> > +     (void)pmr_set_id;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > +
> > +int odp_pktio_pmr_match_set_cos(odp_pmr_t pmr_id, odp_pktio_t src_pktio,
> > +                             odp_cos_t dst_cos)
> > +{
> > +     (void)pmr_id;
> > +     (void)src_pktio;
> > +     (void)dst_cos;
> > +     ODP_UNIMPLEMENTED();
> > +     return 0;
> > +}
> > --
> > 2.0.1.472.g6f92e5f
> >
> >
>
> > _______________________________________________
> > lng-odp mailing list
> > [email protected]
> > http://lists.linaro.org/mailman/listinfo/lng-odp
>
>
> --
> Anders Roxell
> [email protected]
> M: +46 709 71 42 85 | IRC: roxell
>
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to