From patchwork Fri Oct 17 11:34:28 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Balasubramanian Manoharan X-Patchwork-Id: 38851 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ee0-f71.google.com (mail-ee0-f71.google.com [74.125.83.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id C02F32054E for ; Fri, 17 Oct 2014 11:35:15 +0000 (UTC) Received: by mail-ee0-f71.google.com with SMTP id d17sf447535eek.2 for ; Fri, 17 Oct 2014 04:35:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id :mime-version:subject:precedence:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:errors-to:sender :x-original-sender:x-original-authentication-results:mailing-list :content-type:content-transfer-encoding; bh=QD6osr6Uwd7WoAF6UEsZGe9YCkFT7SvilUktCUkSH0E=; b=dRcCbSrpQmOXNGRYm9FO3f54RQTUXrfNAjhAr0o0D+fohxQ97YSpoABTJQmPKLDLiv FGAb3xequhW8iBvWlnJRgAz8TkYZnxkQ7+atfK737z+wJMEjXlpsbCzA5dyBXR3ykGm+ 2j4clfJIFMxAKCIL4aQCGSvSbDLD5LL5S4B+k07Md/tK5krFD/nM9HXXnhrRjS0S3wKv u/sModejY3rU1d1t5p6ExV0SwokFX0tpVuJOvqcFgLyyL9DQyb1GVS363GP1eDgP8jJs Sruf2Fy3j53vxnT7Re3dyzCsqYpuko3Ob41M5uafGEwwS5Sym/nueaS9xVPVeohpuoyG H5aA== X-Gm-Message-State: ALoCoQmUm4WRrskjwB+12YfIJ/13f16xH2UDL0/VSdQyB2Dk+zjMPeAEC5aEM6O+S+8p+DfO0Fff X-Received: by 10.152.9.37 with SMTP id w5mr2715laa.10.1413545714681; Fri, 17 Oct 2014 04:35:14 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.206.8 with SMTP id lk8ls215871lac.17.gmail; Fri, 17 Oct 2014 04:35:14 -0700 (PDT) X-Received: by 10.112.148.231 with SMTP id tv7mr2486104lbb.94.1413545714520; Fri, 17 Oct 2014 04:35:14 -0700 (PDT) Received: from mail-lb0-f182.google.com (mail-lb0-f182.google.com. [209.85.217.182]) by mx.google.com with ESMTPS id q1si1638140laj.42.2014.10.17.04.35.14 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 17 Oct 2014 04:35:14 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.182 as permitted sender) client-ip=209.85.217.182; Received: by mail-lb0-f182.google.com with SMTP id z11so517834lbi.13 for ; Fri, 17 Oct 2014 04:35:14 -0700 (PDT) X-Received: by 10.112.189.10 with SMTP id ge10mr8065214lbc.23.1413545714309; Fri, 17 Oct 2014 04:35:14 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.84.229 with SMTP id c5csp208298lbz; Fri, 17 Oct 2014 04:35:13 -0700 (PDT) X-Received: by 10.224.90.3 with SMTP id g3mr11029268qam.90.1413545712320; Fri, 17 Oct 2014 04:35:12 -0700 (PDT) Received: from ip-10-35-177-41.ec2.internal (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTPS id w46si1720393qgw.23.2014.10.17.04.35.11 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 17 Oct 2014 04:35:12 -0700 (PDT) Received-SPF: none (google.com: lng-odp-bounces@lists.linaro.org does not designate permitted sender hosts) client-ip=54.225.227.206; Received: from localhost ([127.0.0.1] helo=ip-10-35-177-41.ec2.internal) by ip-10-35-177-41.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1Xf5oL-0001rF-3M; Fri, 17 Oct 2014 11:35:09 +0000 Received: from mail-yk0-f178.google.com ([209.85.160.178]) by ip-10-35-177-41.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1Xf5oE-0001qX-6w for lng-odp@lists.linaro.org; Fri, 17 Oct 2014 11:35:02 +0000 Received: by mail-yk0-f178.google.com with SMTP id q9so253091ykb.23 for ; Fri, 17 Oct 2014 04:34:57 -0700 (PDT) X-Received: by 10.236.37.72 with SMTP id x48mr1125476yha.191.1413545696878; Fri, 17 Oct 2014 04:34:56 -0700 (PDT) Received: from bala-PowerEdge-T110-II.caveonetworks.com ([111.93.218.67]) by mx.google.com with ESMTPSA id k28sm2510701yho.23.2014.10.17.04.34.54 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 17 Oct 2014 04:34:56 -0700 (PDT) From: Balasubramanian Manoharan To: lng-odp@lists.linaro.org Date: Fri, 17 Oct 2014 17:04:28 +0530 Message-Id: <1413545668-15339-1-git-send-email-bala.manoharan@linaro.org> X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 X-Topics: Classification patch Subject: [lng-odp] =?utf-8?q?=5BODP/PATCH_v4=5D_ODP_Classification_API?= X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: lng-odp-bounces@lists.linaro.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: bala.manoharan@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.182 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 Signed-off-by: Balasubramanian Manoharan --- V4: moved odp_classification.h file in alphabetical order in Makefile.am 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..6a8a093 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -13,6 +13,7 @@ include_HEADERS = \ $(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_byteorder.h \ + $(top_srcdir)/platform/linux-generic/include/api/odp_classification.h \ $(top_srcdir)/platform/linux-generic/include/api/odp_compiler.h \ $(top_srcdir)/platform/linux-generic/include/api/odp_config.h \ $(top_srcdir)/platform/linux-generic/include/api/odp_coremask.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..6dfefab --- /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 +#include +#include +#include +#include + +/** + * 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_set_t pmr_set_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..901087c --- /dev/null +++ b/platform/linux-generic/odp_classification.c @@ -0,0 +1,236 @@ +#include +#include +#include +#include +#include +#include + +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_set_t pmr_set_id, odp_pktio_t src_pktio, + odp_cos_t dst_cos) +{ + (void)pmr_set_id; + (void)src_pktio; + (void)dst_cos; + ODP_UNIMPLEMENTED(); + return 0; +}