On 15 October 2014 17:05, Bala Manoharan <[email protected]> wrote:
> > 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. > OK. I'm fine with that! Cheers, Anders > > > >> 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
