inc/saitam.h (514 lines of code) (raw):

/** * Copyright (c) 2014 Microsoft Open Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT * LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS * FOR A PARTICULAR PURPOSE, MERCHANTABILITY OR NON-INFRINGEMENT. * * See the Apache Version 2.0 License for specific language governing * permissions and limitations under the License. * * Microsoft would like to thank the following companies for their review and * assistance with these files: Intel Corporation, Mellanox Technologies Ltd, * Dell Products, L.P., Facebook, Inc., Marvell International Ltd. * * @file saitam.h * * @brief This module defines SAI TAM (Telemetry And Monitoring) spec */ #if !defined (__SAITAM_H_) #define __SAITAM_H_ #include <saitypes.h> /** * @defgroup SAITAM SAI - Telemetry and monitoring specific API definitions * * @{ */ /** * @brief TAM Attributes. */ typedef enum _sai_tam_attr_t { /** * @brief Start of Attributes */ SAI_TAM_ATTR_START, /** * @brief Tam telemetry objects associated with this tam * * @type sai_object_list_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_TELEMETRY * @default empty */ SAI_TAM_ATTR_TELEMETRY_OBJECTS_LIST = SAI_TAM_ATTR_START, /** * @brief Tam event objects associated with this tam * * @type sai_object_list_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_EVENT * @default empty */ SAI_TAM_ATTR_EVENT_OBJECTS_LIST, /** * @brief Tam INT objects associated with this tam * * @type sai_object_list_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_INT * @default empty */ SAI_TAM_ATTR_INT_OBJECTS_LIST, /** * @brief List of TAM bind points where this object will be applied. * * TAM group bind point list - create only attribute required for TAM * object to let the user specify his intention to allow the * source to generate data. * * @type sai_s32_list_t sai_tam_bind_point_type_t * @flags CREATE_ONLY * @default empty */ SAI_TAM_ATTR_TAM_BIND_POINT_TYPE_LIST, /** * @brief End of Attributes */ SAI_TAM_ATTR_END, /** Custom range base value */ SAI_TAM_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_ATTR_CUSTOM_RANGE_END } sai_tam_attr_t; /** * @brief Create and return a TAM object * * This creates a TAM object in the driver for tracking the buffer usage. * Via the attributes, caller may indicate a preference for tracking of a * specific set of statistics/groups. * * @param[out] tam_id TAM object * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_fn)( _Out_ sai_object_id_t *tam_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified tam object. * * Deleting a TAM object also deletes all associated report and threshold objects. * * @param[in] tam_id TAM object to be removed. * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_fn)( _In_ sai_object_id_t tam_id); /** * @brief Set TAM attribute value(s). * * @param[in] tam_id TAM id * @param[in] attr Attribute to set * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_attribute_fn)( _In_ sai_object_id_t tam_id, _In_ const sai_attribute_t *attr); /** * @brief Get values for specified TAM attributes. * * @param[in] tam_id TAM object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_attribute_fn)( _In_ sai_object_id_t tam_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief TAM Telemetry Math Function types */ typedef enum _sai_tam_tel_math_func_type_t { /** None */ SAI_TAM_TEL_MATH_FUNC_TYPE_NONE, /** Geometric mean */ SAI_TAM_TEL_MATH_FUNC_TYPE_GEO_MEAN, /** Algebraic mean */ SAI_TAM_TEL_MATH_FUNC_TYPE_ALGEBRAIC_MEAN, /** Average */ SAI_TAM_TEL_MATH_FUNC_TYPE_AVERAGE, /** Statistical function Mode */ SAI_TAM_TEL_MATH_FUNC_TYPE_MODE, /** Packet Rate computation */ SAI_TAM_TEL_MATH_FUNC_TYPE_RATE, } sai_tam_tel_math_func_type_t; /** * @brief Attributes for Math function */ typedef enum _sai_tam_math_func_attr_t { /** * @brief Start of Attributes */ SAI_TAM_MATH_FUNC_ATTR_START, /** * @brief Type of math function * * @type sai_tam_tel_math_func_type_t * @flags CREATE_AND_SET * @default SAI_TAM_TEL_MATH_FUNC_TYPE_NONE */ SAI_TAM_MATH_FUNC_ATTR_TAM_TEL_MATH_FUNC_TYPE = SAI_TAM_MATH_FUNC_ATTR_START, /** * @brief End of Attributes */ SAI_TAM_MATH_FUNC_ATTR_END, /** Custom range base value */ SAI_TAM_MATH_FUNC_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_MATH_FUNC_ATTR_CUSTOM_RANGE_END } sai_tam_math_func_attr_t; /** * @brief Create and return a math function object * * @param[out] tam_math_func_id Object id for math function * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_math_func_fn)( _Out_ sai_object_id_t *tam_math_func_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified Match function object * * @param[in] tam_math_func_id Object id for math function * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_math_func_fn)( _In_ sai_object_id_t tam_math_func_id); /** * @brief Get values for specified Math function attributes * * @param[in] tam_math_func_id Object id for math function * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_math_func_attribute_fn)( _In_ sai_object_id_t tam_math_func_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for specified Math function attribute * * @param[in] tam_math_func_id Object id for math function * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_math_func_attribute_fn)( _In_ sai_object_id_t tam_math_func_id, _In_ const sai_attribute_t *attr); /** * @brief TAM event threshold unit */ typedef enum _sai_tam_event_threshold_unit_t { /** * @brief Event threshold unit nanosecond */ SAI_TAM_EVENT_THRESHOLD_UNIT_NANOSEC, /** * @brief Event threshold unit micro second */ SAI_TAM_EVENT_THRESHOLD_UNIT_USEC, /** * @brief Event threshold unit millisecond */ SAI_TAM_EVENT_THRESHOLD_UNIT_MSEC, /** * @brief Event threshold unit percent */ SAI_TAM_EVENT_THRESHOLD_UNIT_PERCENT, /** * @brief Event threshold unit byte count */ SAI_TAM_EVENT_THRESHOLD_UNIT_BYTES, /** * @brief Event threshold unit packet count */ SAI_TAM_EVENT_THRESHOLD_UNIT_PACKETS, /** * @brief Event threshold unit cells */ SAI_TAM_EVENT_THRESHOLD_UNIT_CELLS } sai_tam_event_threshold_unit_t; /** * @brief Event Threshold Attributes */ typedef enum _sai_tam_event_threshold_attr_t { /** * @brief Start of Attributes */ SAI_TAM_EVENT_THRESHOLD_ATTR_START, /** * @brief High water mark * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 90 */ SAI_TAM_EVENT_THRESHOLD_ATTR_HIGH_WATERMARK = SAI_TAM_EVENT_THRESHOLD_ATTR_START, /** * @brief Low Water Mark * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 10 */ SAI_TAM_EVENT_THRESHOLD_ATTR_LOW_WATERMARK, /** * @brief Latency in nanoseconds * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 10 */ SAI_TAM_EVENT_THRESHOLD_ATTR_LATENCY, /** * @brief Rate for specified event type * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_EVENT_THRESHOLD_ATTR_RATE, /** * @brief Abs Value for specified Event * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_EVENT_THRESHOLD_ATTR_ABS_VALUE, /** * @brief Tam event threshold unit * * @type sai_tam_event_threshold_unit_t * @flags CREATE_AND_SET * @default SAI_TAM_EVENT_THRESHOLD_UNIT_MSEC */ SAI_TAM_EVENT_THRESHOLD_ATTR_UNIT, /** * @brief End of Attributes */ SAI_TAM_EVENT_THRESHOLD_ATTR_END, /** Custom range base value */ SAI_TAM_EVENT_THRESHOLD_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_EVENT_THRESHOLD_ATTR_CUSTOM_RANGE_END } sai_tam_event_threshold_attr_t; /** * @brief Create and return a threshold object * * @param[out] tam_event_threshold_id Event Threshold object * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_event_threshold_fn)( _Out_ sai_object_id_t *tam_event_threshold_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified threshold object * * @param[in] tam_event_threshold_id Event Threshold object * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_event_threshold_fn)( _In_ sai_object_id_t tam_event_threshold_id); /** * @brief Get values for specified threshold object attributes * * @param[in] tam_event_threshold_id Event Threshold object * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_event_threshold_attribute_fn)( _In_ sai_object_id_t tam_event_threshold_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified threshold object attribute * * @param[in] tam_event_threshold_id Event Threshold object * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_event_threshold_attribute_fn)( _In_ sai_object_id_t tam_event_threshold_id, _In_ const sai_attribute_t *attr); /** * @brief TAM INT types */ typedef enum _sai_tam_int_type_t { /** * @brief INT type IOAM */ SAI_TAM_INT_TYPE_IOAM, /** * @brief INT type IFA1 */ SAI_TAM_INT_TYPE_IFA1, /** * @brief INT type IFA2 */ SAI_TAM_INT_TYPE_IFA2, /** * @brief INT type P4 INT v1 */ SAI_TAM_INT_TYPE_P4_INT_1, /** * @brief INT type P4 INT v2 */ SAI_TAM_INT_TYPE_P4_INT_2, /** * @brief Direct Export (aka postcard) */ SAI_TAM_INT_TYPE_DIRECT_EXPORT, /** * @brief Telemetry data at the end of the packet */ SAI_TAM_INT_TYPE_IFA1_TAILSTAMP, /** * @brief INT type Path Tracing */ SAI_TAM_INT_TYPE_PATH_TRACING, } sai_tam_int_type_t; /** * @brief Type of indication of INT presence in a packet */ typedef enum _sai_tam_int_presence_type_t { /** * @brief Indication of INT presence in a packet is undefined * * This type can be used when all indications of INT presence * in a packet are defined in well known specifications */ SAI_TAM_INT_PRESENCE_TYPE_UNDEFINED, /** * @brief INT presence type probe marker */ SAI_TAM_INT_PRESENCE_TYPE_PB, /** * @brief INT presence type L3 protocol */ SAI_TAM_INT_PRESENCE_TYPE_L3_PROTOCOL, /** * @brief INT presence type DSCP */ SAI_TAM_INT_PRESENCE_TYPE_DSCP } sai_tam_int_presence_type_t; /** * @brief Attributes for TAM INT */ typedef enum _sai_tam_int_attr_t { /** * @brief Start of Attributes */ SAI_TAM_INT_ATTR_START, /** * @brief Type of INT method * * @type sai_tam_int_type_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_TAM_INT_ATTR_TYPE = SAI_TAM_INT_ATTR_START, /** * @brief Device Identifier * * @type sai_uint32_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_TAM_INT_ATTR_DEVICE_ID, /** * @brief IOAM trace type * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 0 * @validonly SAI_TAM_INT_ATTR_TYPE == SAI_TAM_INT_TYPE_IOAM */ SAI_TAM_INT_ATTR_IOAM_TRACE_TYPE, /** * @brief Type of indication of INT presence in a packet * * @type sai_tam_int_presence_type_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_TAM_INT_ATTR_INT_PRESENCE_TYPE, /** * @brief First 4 octets of Probe Marker value that indicates INT presence * * @type sai_uint32_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @condition SAI_TAM_INT_ATTR_INT_PRESENCE_TYPE == SAI_TAM_INT_PRESENCE_TYPE_PB */ SAI_TAM_INT_ATTR_INT_PRESENCE_PB1, /** * @brief Second 4 octets of Probe Marker value that indicates INT presence * * @type sai_uint32_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @condition SAI_TAM_INT_ATTR_INT_PRESENCE_TYPE == SAI_TAM_INT_PRESENCE_TYPE_PB */ SAI_TAM_INT_ATTR_INT_PRESENCE_PB2, /** * @brief DSCP value that indicates presence of INT in a packet * * @type sai_uint8_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @condition SAI_TAM_INT_ATTR_INT_PRESENCE_TYPE == SAI_TAM_INT_PRESENCE_TYPE_DSCP */ SAI_TAM_INT_ATTR_INT_PRESENCE_DSCP_VALUE, /** * @brief Inline or Clone mode * Inline mode will insert header and metadata in live packet * Clone mode will insert header and metadata in cloned packet * * @type bool * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_TAM_INT_ATTR_INLINE, /** * @brief L3 protocol value that indicates presence of INT in a packet * * @type sai_uint8_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @condition SAI_TAM_INT_ATTR_INT_PRESENCE_TYPE == SAI_TAM_INT_PRESENCE_TYPE_L3_PROTOCOL */ SAI_TAM_INT_ATTR_INT_PRESENCE_L3_PROTOCOL, /** * @brief Trace vector value * trace vector is used to specified the fields * of interest in metadata header * * @type sai_uint16_t * @flags CREATE_AND_SET * @isvlan false * @default 0 * @validonly SAI_TAM_INT_ATTR_TYPE == SAI_TAM_INT_TYPE_IFA1 or SAI_TAM_INT_ATTR_TYPE == SAI_TAM_INT_TYPE_IFA2 */ SAI_TAM_INT_ATTR_TRACE_VECTOR, /** * @brief Action vector value * action vector is used to specified the actions * of interest on metadata header * value of 0 means no actions of interest * * @type sai_uint16_t * @flags CREATE_AND_SET * @isvlan false * @default 0 * @validonly SAI_TAM_INT_ATTR_TYPE == SAI_TAM_INT_TYPE_IFA1 or SAI_TAM_INT_ATTR_TYPE == SAI_TAM_INT_TYPE_IFA2 */ SAI_TAM_INT_ATTR_ACTION_VECTOR, /** * @brief P4 INT instruction bitmap * * @type sai_uint16_t * @flags CREATE_AND_SET * @isvlan false * @default 0 * @validonly SAI_TAM_INT_ATTR_TYPE == SAI_TAM_INT_TYPE_P4_INT_1 or SAI_TAM_INT_ATTR_TYPE == SAI_TAM_INT_TYPE_P4_INT_2 */ SAI_TAM_INT_ATTR_P4_INT_INSTRUCTION_BITMAP, /** * @brief Enable metadata fragmentation * * When there is insufficient space in the packet to add INT * metadata for this hop (e.g. MTU would be exceeded), the device * may remove the metadata from the packet, send a report to the * collector, and insert its metadata before forwarding the packet. * * Note: Applicable only when SAI_TAM_INT_ATTR_TYPE != SAI_TAM_INT_TYPE_DIRECT_EXPORT * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_INT_ATTR_METADATA_FRAGMENT_ENABLE, /** * @brief Enable checksum * * Enable checksum for metadata stack * * @type bool * @flags CREATE_AND_SET * @default false * @validonly SAI_TAM_INT_ATTR_TYPE == SAI_TAM_INT_TYPE_IFA2 */ SAI_TAM_INT_ATTR_METADATA_CHECKSUM_ENABLE, /** * @brief TAM INT should report all packets without filtering * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_INT_ATTR_REPORT_ALL_PACKETS, /** * @brief TAM INT flow liveliness period in seconds * * @type sai_uint16_t * @flags CREATE_AND_SET * @isvlan false * @default 0 */ SAI_TAM_INT_ATTR_FLOW_LIVENESS_PERIOD, /** * @brief Latency sensitivity for flow state change detection * in units of 2^n nanoseconds * * @type sai_uint8_t * @flags CREATE_AND_SET * @default 20 */ SAI_TAM_INT_ATTR_LATENCY_SENSITIVITY, /** * @brief INT bind point for ACL object * * Bind (or unbind) an ACL table or ACL group. Enable/Update * ACL table or ACL group filtering for INT insertion. * Disable ingress filtering by assigning SAI_NULL_OBJECT_ID * in the attribute value. * * @type sai_object_id_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_ACL_TABLE, SAI_OBJECT_TYPE_ACL_TABLE_GROUP * @allownull true * @default SAI_NULL_OBJECT_ID */ SAI_TAM_INT_ATTR_ACL_GROUP, /** * @brief Maximum number of hops allowed in the path * * @type sai_uint8_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_INT_ATTR_MAX_HOP_COUNT, /** * @brief Maximum length of metadata stack, in units of 4 octet words * * @type sai_uint8_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_INT_ATTR_MAX_LENGTH, /** * @brief Metadata name space ID * name space id defines the applicable format of metadata header * * @type sai_uint8_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_INT_ATTR_NAME_SPACE_ID, /** * @brief Metadata name space ID scope * name space id scope is global or local * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_INT_ATTR_NAME_SPACE_ID_GLOBAL, /** * @brief Enable/Disable Samplepacket session * * Enable ingress sampling by assigning samplepacket object id Disable * ingress sampling by assigning #SAI_NULL_OBJECT_ID as attribute value. * * @type sai_object_id_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_SAMPLEPACKET * @allownull true * @default SAI_NULL_OBJECT_ID */ SAI_TAM_INT_ATTR_INGRESS_SAMPLEPACKET_ENABLE, /** * @brief Collector object list * * @type sai_object_list_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_COLLECTOR * @default empty */ SAI_TAM_INT_ATTR_COLLECTOR_LIST, /** * @brief Math function attached * * @type sai_object_id_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_MATH_FUNC * @allownull true * @default SAI_NULL_OBJECT_ID */ SAI_TAM_INT_ATTR_MATH_FUNC, /** * @brief Tam report type * * @type sai_object_id_t * @flags CREATE_ONLY * @objects SAI_OBJECT_TYPE_TAM_REPORT * @allownull true * @default SAI_NULL_OBJECT_ID */ SAI_TAM_INT_ATTR_REPORT_ID, /** * @brief End of Attributes */ SAI_TAM_INT_ATTR_END, /** Custom range base value */ SAI_TAM_INT_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_INT_ATTR_CUSTOM_RANGE_END } sai_tam_int_attr_t; /** * @brief Create and return a INT type object * * @param[out] tam_int_id INT object * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_int_fn)( _Out_ sai_object_id_t *tam_int_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified INT object * * @param[in] tam_int_id INT type object id * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_int_fn)( _In_ sai_object_id_t tam_int_id); /** * @brief Get values for specified INT object attributes * * @param[in] tam_int_id INT object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_int_attribute_fn)( _In_ sai_object_id_t tam_int_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified INT object attribute * * @param[in] tam_int_id INT object id * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_int_attribute_fn)( _In_ sai_object_id_t tam_int_id, _In_ const sai_attribute_t *attr); /** * @brief TAM telemetry types supported */ typedef enum _sai_tam_telemetry_type_t { /** * @brief Networking element TAM * All the data relevant to networking element * e.g. thermal, optics, switch interconnect */ SAI_TAM_TELEMETRY_TYPE_NE, /** * @brief Switch silicon TAM * All the data relevant to switch * e.g. route, port, queue statistics */ SAI_TAM_TELEMETRY_TYPE_SWITCH, /** * @brief Fabric TAM * All the data relevant to switch fabric */ SAI_TAM_TELEMETRY_TYPE_FABRIC, /** * @brief Flow TAM * All the data relevant to a given flow */ SAI_TAM_TELEMETRY_TYPE_FLOW, /** * @brief INT TAM * All the data relevant on a per packet basis */ SAI_TAM_TELEMETRY_TYPE_INT, /** * @brief Data based on counter subscriptions * * Collect statistics for specific counters, using * SAI_TAM_COUNTER_SUBSCRIPTION objects */ SAI_TAM_TELEMETRY_TYPE_COUNTER_SUBSCRIPTION, } sai_tam_telemetry_type_t; /** * @brief Telemetry type attributes */ typedef enum _sai_tam_tel_type_attr_t { /** * @brief Start of Attributes */ SAI_TAM_TEL_TYPE_ATTR_START, /** * @brief Telemetry type * * @type sai_tam_telemetry_type_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_TAM_TEL_TYPE_ATTR_TAM_TELEMETRY_TYPE = SAI_TAM_TEL_TYPE_ATTR_START, /** * @brief INT - Switch Identifier * * Switch Identifier can be an encoded number or an IP address * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_TEL_TYPE_ATTR_INT_SWITCH_IDENTIFIER, /** * @brief Switch - Collect Port stats * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS, /** * @brief Switch - Collect Port stats ingress * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS_INGRESS, /** * @brief Switch - Collect Port stats egress * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS_EGRESS, /** * @brief Switch - Collect virtual queue stats * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_VIRTUAL_QUEUE_STATS, /** * @brief Switch - Collect output queue stats * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_OUTPUT_QUEUE_STATS, /** * @brief Switch - Collect MMU stats * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_MMU_STATS, /** * @brief Switch - Collect fabric stats * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_FABRIC_STATS, /** * @brief Switch - Collect filter stats * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_FILTER_STATS, /** * @brief Switch - Collect Resource utilization stats * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_RESOURCE_UTILIZATION_STATS, /** * @brief Fabric - Collect Queue information * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_FABRIC_Q, /** * @brief NE - Collect information of networking element * * @type bool * @flags CREATE_AND_SET * @default false */ SAI_TAM_TEL_TYPE_ATTR_NE_ENABLE, /** * @brief DSCP value * * @type sai_uint8_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_TEL_TYPE_ATTR_DSCP_VALUE, /** * @brief Math function attached * * @type sai_object_id_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_MATH_FUNC * @allownull true * @default SAI_NULL_OBJECT_ID */ SAI_TAM_TEL_TYPE_ATTR_MATH_FUNC, /** * @brief Tam report type * * @type sai_object_id_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @objects SAI_OBJECT_TYPE_TAM_REPORT */ SAI_TAM_TEL_TYPE_ATTR_REPORT_ID, /** * @brief List of Tam counter subscription objects * * @type sai_object_list_t * @flags READ_ONLY * @objects SAI_OBJECT_TYPE_TAM_COUNTER_SUBSCRIPTION */ SAI_TAM_TEL_TYPE_ATTR_COUNTER_SUBSCRIPTION_LIST, /** * @brief End of Attributes */ SAI_TAM_TEL_TYPE_ATTR_END, /** Custom range base value */ SAI_TAM_TEL_TYPE_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_TEL_TYPE_ATTR_CUSTOM_RANGE_END } sai_tam_tel_type_attr_t; /** * @brief Create and return a telemetry type object * * @param[out] tam_tel_type_id Telemetry type object * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_tel_type_fn)( _Out_ sai_object_id_t *tam_tel_type_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified telemetry type object * * @param[in] tam_tel_type_id Telemetry type object id * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_tel_type_fn)( _In_ sai_object_id_t tam_tel_type_id); /** * @brief Get values for specified telemetry type object attributes * * @param[in] tam_tel_type_id Telemetry type object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_tel_type_attribute_fn)( _In_ sai_object_id_t tam_tel_type_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified telemetry type object attribute * * @param[in] tam_tel_type_id Telemetry type object id * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_tel_type_attribute_fn)( _In_ sai_object_id_t tam_tel_type_id, _In_ const sai_attribute_t *attr); /** * @brief TAM report types */ typedef enum _sai_tam_report_type_t { /** * @brief Report using SFLOW */ SAI_TAM_REPORT_TYPE_SFLOW, /** * @brief Report using IPFIX */ SAI_TAM_REPORT_TYPE_IPFIX, /** * @brief Report using GPB */ SAI_TAM_REPORT_TYPE_PROTO, /** * @brief Report using THRIFT */ SAI_TAM_REPORT_TYPE_THRIFT, /** * @brief Report using JSON */ SAI_TAM_REPORT_TYPE_JSON, /** * @brief Report using P4 format */ SAI_TAM_REPORT_TYPE_P4_EXTN, /** * @brief Report using Histogram */ SAI_TAM_REPORT_TYPE_HISTOGRAM, /** * @brief Report using vendor extensions */ SAI_TAM_REPORT_TYPE_VENDOR_EXTN, /** * @brief Report using GENETLINK */ SAI_TAM_REPORT_TYPE_GENETLINK, /** * @brief Custom range base value */ SAI_TAM_REPORT_TYPE_CUSTOM_RANGE_BASE = 0x10000000, } sai_tam_report_type_t; /** * @brief Enum defining reporting modes. */ typedef enum _sai_tam_report_mode_t { /** Report all events */ SAI_TAM_REPORT_MODE_ALL, /** Report in a bulk mode */ SAI_TAM_REPORT_MODE_BULK, } sai_tam_report_mode_t; /** * @brief TAM report interval units */ typedef enum _sai_tam_report_interval_unit_t { /** * @brief Report interval unit nanosecond */ SAI_TAM_REPORT_INTERVAL_UNIT_NANOSEC, /** * @brief Report interval unit microsecond */ SAI_TAM_REPORT_INTERVAL_UNIT_USEC, /** * @brief Report interval unit millisecond */ SAI_TAM_REPORT_INTERVAL_UNIT_MSEC, } sai_tam_report_interval_unit_t; /** * @brief Attributes for TAM report */ typedef enum _sai_tam_report_attr_t { /** * @brief Start of Attributes */ SAI_TAM_REPORT_ATTR_START, /** * @brief Type of reporting method * * @type sai_tam_report_type_t * @flags MANDATORY_ON_CREATE | CREATE_AND_SET */ SAI_TAM_REPORT_ATTR_TYPE = SAI_TAM_REPORT_ATTR_START, /** * @brief Statistic for this histogram * * @type sai_uint32_t * @flags CREATE_ONLY * @default 0 * @validonly SAI_TAM_REPORT_ATTR_TYPE == SAI_TAM_REPORT_TYPE_HISTOGRAM */ SAI_TAM_REPORT_ATTR_HISTOGRAM_NUMBER_OF_BINS, /** * @brief Histogram Bins Lower Boundaries * * List of lower boundary of each bin for this HISTOGRAM in * number referred object units. The upper boundary of a bin is * the lower boundary of next bin. The upper boundary of the * last bin is infinity. * * @type sai_u32_list_t * @flags CREATE_ONLY * @default empty * @validonly SAI_TAM_REPORT_ATTR_TYPE == SAI_TAM_REPORT_TYPE_HISTOGRAM */ SAI_TAM_REPORT_ATTR_HISTOGRAM_BIN_BOUNDARY, /** * @brief Maximum number of reports to generate after an event * * Note: The value 0 indicates that there is no quota * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_REPORT_ATTR_QUOTA, /** * @brief Report Mode * * @type sai_tam_report_mode_t * @flags CREATE_ONLY * @default SAI_TAM_REPORT_MODE_ALL */ SAI_TAM_REPORT_ATTR_REPORT_MODE, /** * @brief Report Interval * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 1000 * @validonly SAI_TAM_REPORT_ATTR_REPORT_MODE == SAI_TAM_REPORT_MODE_BULK */ SAI_TAM_REPORT_ATTR_REPORT_INTERVAL, /** * @brief Enterprise number * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 0 * @validonly SAI_TAM_REPORT_ATTR_TYPE == SAI_TAM_REPORT_TYPE_IPFIX */ SAI_TAM_REPORT_ATTR_ENTERPRISE_NUMBER, /** * @brief Template report interval in minutes * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 15 * @validonly SAI_TAM_REPORT_ATTR_TYPE == SAI_TAM_REPORT_TYPE_IPFIX */ SAI_TAM_REPORT_ATTR_TEMPLATE_REPORT_INTERVAL, /** * @brief Report Interval Units * * @type sai_tam_report_interval_unit_t * @flags CREATE_AND_SET * @default SAI_TAM_REPORT_INTERVAL_UNIT_USEC * @validonly SAI_TAM_REPORT_ATTR_REPORT_MODE == SAI_TAM_REPORT_MODE_BULK */ SAI_TAM_REPORT_ATTR_REPORT_INTERVAL_UNIT, /** * @brief End of Attributes */ SAI_TAM_REPORT_ATTR_END, /** Custom range base value */ SAI_TAM_REPORT_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_REPORT_ATTR_CUSTOM_RANGE_END } sai_tam_report_attr_t; /** * @brief Create and return a report object id * * @param[out] tam_report_id Report object Id * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_report_fn)( _Out_ sai_object_id_t *tam_report_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified report object * * @param[in] tam_report_id Report object id * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_report_fn)( _In_ sai_object_id_t tam_report_id); /** * @brief Get values for specified report object attributes * * @param[in] tam_report_id Report object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_report_attribute_fn)( _In_ sai_object_id_t tam_report_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified report object attribute * * @param[in] tam_report_id Report object id * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_report_attribute_fn)( _In_ sai_object_id_t tam_report_id, _In_ const sai_attribute_t *attr); /** * @brief TAM reporting unit */ typedef enum _sai_tam_reporting_unit_t { /** * @brief Report Unit second */ SAI_TAM_REPORTING_UNIT_SEC, /** * @brief Report unit minute */ SAI_TAM_REPORTING_UNIT_MINUTE, /** * @brief Report unit hour */ SAI_TAM_REPORTING_UNIT_HOUR, /** * @brief Report unit day */ SAI_TAM_REPORTING_UNIT_DAY } sai_tam_reporting_unit_t; /** * @brief TAM telemetry attributes */ typedef enum _sai_tam_telemetry_attr_t { /** * @brief Start of Attributes */ SAI_TAM_TELEMETRY_ATTR_START, /** * @brief TAM tel type object list * * @type sai_object_list_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_TEL_TYPE * @default empty */ SAI_TAM_TELEMETRY_ATTR_TAM_TYPE_LIST = SAI_TAM_TELEMETRY_ATTR_START, /** * @brief Collector object list * * @type sai_object_list_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @objects SAI_OBJECT_TYPE_TAM_COLLECTOR */ SAI_TAM_TELEMETRY_ATTR_COLLECTOR_LIST, /** * @brief Tam telemetry reporting unit * * @type sai_tam_reporting_unit_t * @flags CREATE_AND_SET * @default SAI_TAM_REPORTING_UNIT_SEC */ SAI_TAM_TELEMETRY_ATTR_TAM_REPORTING_UNIT, /** * @brief Tam event reporting interval * * defines the gap between two reports * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 1 */ SAI_TAM_TELEMETRY_ATTR_REPORTING_INTERVAL, /** * @brief End of Attributes */ SAI_TAM_TELEMETRY_ATTR_END, /** Custom range base value */ SAI_TAM_TELEMETRY_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_TELEMETRY_ATTR_CUSTOM_RANGE_END } sai_tam_telemetry_attr_t; /** * @brief Create and return a telemetry object * * @param[out] tam_telemetry_id Telemetry object id * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_telemetry_fn)( _Out_ sai_object_id_t *tam_telemetry_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified telemetry object * * @param[in] tam_telemetry_id Telemetry object * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_telemetry_fn)( _In_ sai_object_id_t tam_telemetry_id); /** * @brief Get values for specified telemetry object attributes * * @param[in] tam_telemetry_id Telemetry object * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_telemetry_attribute_fn)( _In_ sai_object_id_t tam_telemetry_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified telemetry object attribute * * @param[in] tam_telemetry_id Telemetry object * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_telemetry_attribute_fn)( _In_ sai_object_id_t tam_telemetry_id, _In_ const sai_attribute_t *attr); /** * @brief Transport Types */ typedef enum _sai_tam_transport_type_t { /** * @brief Transport None * This is usually used for local host */ SAI_TAM_TRANSPORT_TYPE_NONE, /** * @brief Transport TCP */ SAI_TAM_TRANSPORT_TYPE_TCP, /** * @brief Transport UDP */ SAI_TAM_TRANSPORT_TYPE_UDP, /** * @brief Transport GRPC */ SAI_TAM_TRANSPORT_TYPE_GRPC, /** * @brief Transport MIRROR session */ SAI_TAM_TRANSPORT_TYPE_MIRROR, } sai_tam_transport_type_t; /** * @brief Transport Authentication Types */ typedef enum _sai_tam_transport_auth_type_t { /** * @brief No Authentication */ SAI_TAM_TRANSPORT_AUTH_TYPE_NONE, /** * @brief Authenticate using SSL */ SAI_TAM_TRANSPORT_AUTH_TYPE_SSL, /** * @brief Authenticate using TLS */ SAI_TAM_TRANSPORT_AUTH_TYPE_TLS } sai_tam_transport_auth_type_t; /** * @brief Transport object Attributes */ typedef enum _sai_tam_transport_attr_t { /** * @brief Start of Attributes */ SAI_TAM_TRANSPORT_ATTR_START, /** * @brief Transport type * * @type sai_tam_transport_type_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_TAM_TRANSPORT_ATTR_TRANSPORT_TYPE = SAI_TAM_TRANSPORT_ATTR_START, /** * @brief Transport src port * Value of -1 can be used a hint to compute ephemeral * or entropy value * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 31337 */ SAI_TAM_TRANSPORT_ATTR_SRC_PORT, /** * @brief Transport dst port * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 31337 */ SAI_TAM_TRANSPORT_ATTR_DST_PORT, /** * @brief Transport authentication * * @type sai_tam_transport_auth_type_t * @flags CREATE_AND_SET * @default SAI_TAM_TRANSPORT_AUTH_TYPE_NONE */ SAI_TAM_TRANSPORT_ATTR_TRANSPORT_AUTH_TYPE, /** * @brief Transport MTU size * Driver must ensure the size of packet do not exceed MTU size * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 1500 */ SAI_TAM_TRANSPORT_ATTR_MTU, /** * @brief End of Attributes */ SAI_TAM_TRANSPORT_ATTR_END, /** Custom range base value */ SAI_TAM_TRANSPORT_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_TRANSPORT_ATTR_CUSTOM_RANGE_END } sai_tam_transport_attr_t; /** * @brief Create and return a transport object id * * @param[out] tam_transport_id Transport object Id * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_transport_fn)( _Out_ sai_object_id_t *tam_transport_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified transport object * * @param[in] tam_transport_id Transport object id * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_transport_fn)( _In_ sai_object_id_t tam_transport_id); /** * @brief Get values for specified transport object attributes * * @param[in] tam_transport_id Transport object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_transport_attribute_fn)( _In_ sai_object_id_t tam_transport_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified transport object attribute * * @param[in] tam_transport_id Transport object id * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_transport_attribute_fn)( _In_ sai_object_id_t tam_transport_id, _In_ const sai_attribute_t *attr); /** * @brief TAM collector attributes */ typedef enum _sai_tam_collector_attr_t { /** * @brief Start of Attributes */ SAI_TAM_COLLECTOR_ATTR_START, /** * @brief Source IP address * * Note: Applicable only when SAI_TAM_TRANSPORT_ATTR_TRANSPORT_TYPE != SAI_TAM_TRANSPORT_TYPE_NONE * * @type sai_ip_address_t * @flags MANDATORY_ON_CREATE | CREATE_AND_SET */ SAI_TAM_COLLECTOR_ATTR_SRC_IP = SAI_TAM_COLLECTOR_ATTR_START, /** * @brief Destination IP addresses * * Note: Applicable only when SAI_TAM_TRANSPORT_ATTR_TRANSPORT_TYPE != SAI_TAM_TRANSPORT_TYPE_NONE * * @type sai_ip_address_t * @flags MANDATORY_ON_CREATE | CREATE_AND_SET */ SAI_TAM_COLLECTOR_ATTR_DST_IP, /** * @brief Destination local CPU * * Note: Applicable only when SAI_TAM_TRANSPORT_ATTR_TRANSPORT_TYPE == SAI_TAM_TRANSPORT_TYPE_NONE * * @type bool * @flags CREATE_AND_SET * @default true */ SAI_TAM_COLLECTOR_ATTR_LOCALHOST, /** * @brief Virtual router ID * * @type sai_object_id_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_VIRTUAL_ROUTER * @allownull true * @default SAI_NULL_OBJECT_ID */ SAI_TAM_COLLECTOR_ATTR_VIRTUAL_ROUTER_ID, /** * @brief Telemetry report truncate size * * @type sai_uint16_t * @flags CREATE_AND_SET * @isvlan false * @default 0 */ SAI_TAM_COLLECTOR_ATTR_TRUNCATE_SIZE, /** * @brief Transport attributes object * * @type sai_object_id_t * @flags MANDATORY_ON_CREATE | CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_TRANSPORT */ SAI_TAM_COLLECTOR_ATTR_TRANSPORT, /** * @brief DSCP value * * @type sai_uint8_t * @flags MANDATORY_ON_CREATE | CREATE_AND_SET */ SAI_TAM_COLLECTOR_ATTR_DSCP_VALUE, /** * @brief Hostif User Defined Trap object used to reach local host via GENETLINK * * @type sai_object_id_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_HOSTIF_USER_DEFINED_TRAP * @allownull true * @default SAI_NULL_OBJECT_ID * @validonly SAI_TAM_COLLECTOR_ATTR_LOCALHOST == true */ SAI_TAM_COLLECTOR_ATTR_HOSTIF_TRAP, /** * @brief End of Attributes */ SAI_TAM_COLLECTOR_ATTR_END, /** Custom range base value */ SAI_TAM_COLLECTOR_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_COLLECTOR_ATTR_CUSTOM_RANGE_END } sai_tam_collector_attr_t; /** * @brief Create and return a collector object id * * @param[out] tam_collector_id Collector object Id * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_collector_fn)( _Out_ sai_object_id_t *tam_collector_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified collector object * * @param[in] tam_collector_id Collector object id * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_collector_fn)( _In_ sai_object_id_t tam_collector_id); /** * @brief Get values for specified collector object attributes * * @param[in] tam_collector_id Collector object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_collector_attribute_fn)( _In_ sai_object_id_t tam_collector_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified collector object attribute * * @param[in] tam_collector_id Collector object id * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_collector_attribute_fn)( _In_ sai_object_id_t tam_collector_id, _In_ const sai_attribute_t *attr); /** * @brief Enum defining event types. */ typedef enum _sai_tam_event_type_t { /** * @brief New flow or flow state change event * This event is used to monitoring the state of flow * A flow can be learned, aged, or classified */ SAI_TAM_EVENT_TYPE_FLOW_STATE, /** * @brief Watchlist event * Instead of a single flow, a group flows can be monitored */ SAI_TAM_EVENT_TYPE_FLOW_WATCHLIST, /** * @brief Flow TCP FLAGS event * All TCP Flags are monitored for change */ SAI_TAM_EVENT_TYPE_FLOW_TCPFLAG, /** * @brief Queue depth or latency threshold event * Queue occupancy threshold */ SAI_TAM_EVENT_TYPE_QUEUE_THRESHOLD, /** * @brief Queue tail drop event * Number of packets dropped as tail drops because * the queue is full */ SAI_TAM_EVENT_TYPE_QUEUE_TAIL_DROP, /** * @brief Packet drop event * Simple drop of packets for any reason */ SAI_TAM_EVENT_TYPE_PACKET_DROP, /** * @brief Switch resource utilization threshold event * Any resource utilization when exceeds a threshold * For example, route table if 90% full can generate an event */ SAI_TAM_EVENT_TYPE_RESOURCE_UTILIZATION, /** * @brief Ingress priority group shared occupancy threshold event */ SAI_TAM_EVENT_TYPE_IPG_SHARED, /** * @brief Ingress priority group XOFF room threshold event */ SAI_TAM_EVENT_TYPE_IPG_XOFF_ROOM, /** * @brief Buffer service pool threshold event */ SAI_TAM_EVENT_TYPE_BSP, } sai_tam_event_type_t; /** * @brief Enum defining event types. */ typedef enum _sai_tam_event_action_attr_t { /** * @brief Start of Attributes */ SAI_TAM_EVENT_ACTION_ATTR_START, /** * @brief Report Object * * @type sai_object_id_t * @flags MANDATORY_ON_CREATE | CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_REPORT */ SAI_TAM_EVENT_ACTION_ATTR_REPORT_TYPE = SAI_TAM_EVENT_ACTION_ATTR_START, /** * @brief QOS action Type Object * * @type sai_uint32_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_EVENT_ACTION_ATTR_QOS_ACTION_TYPE, /** * @brief End of Attributes */ SAI_TAM_EVENT_ACTION_ATTR_END, /** Custom range base value */ SAI_TAM_EVENT_ACTION_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_EVENT_ACTION_ATTR_CUSTOM_RANGE_END } sai_tam_event_action_attr_t; /** * @brief Create and return a event action object id * * @param[out] tam_event_action_id Event object Id * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_event_action_fn)( _Out_ sai_object_id_t *tam_event_action_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified event object * * @param[in] tam_event_action_id Event object id * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_event_action_fn)( _In_ sai_object_id_t tam_event_action_id); /** * @brief Get values for specified event object attributes * * @param[in] tam_event_action_id Event object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_event_action_attribute_fn)( _In_ sai_object_id_t tam_event_action_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified event object attribute * * @param[in] tam_event_action_id Event object id * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_event_action_attribute_fn)( _In_ sai_object_id_t tam_event_action_id, _In_ const sai_attribute_t *attr); /** * @brief Tam event attributes */ typedef enum _sai_tam_event_attr_t { /** * @brief Start of Attributes */ SAI_TAM_EVENT_ATTR_START, /** * @brief Tam event type * * @type sai_tam_event_type_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_TAM_EVENT_ATTR_TYPE = SAI_TAM_EVENT_ATTR_START, /** * @brief Event action * * @type sai_object_list_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @objects SAI_OBJECT_TYPE_TAM_EVENT_ACTION */ SAI_TAM_EVENT_ATTR_ACTION_LIST, /** * @brief Collector object list * * @type sai_object_list_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @objects SAI_OBJECT_TYPE_TAM_COLLECTOR */ SAI_TAM_EVENT_ATTR_COLLECTOR_LIST, /** * @brief Tam event threshold attr Object * * @type sai_object_id_t * @flags CREATE_AND_SET * @objects SAI_OBJECT_TYPE_TAM_EVENT_THRESHOLD * @allownull true * @default SAI_NULL_OBJECT_ID */ SAI_TAM_EVENT_ATTR_THRESHOLD, /** * @brief DSCP value * * @type sai_uint8_t * @flags CREATE_AND_SET * @default 0 */ SAI_TAM_EVENT_ATTR_DSCP_VALUE, /** * @brief End of Attributes */ SAI_TAM_EVENT_ATTR_END, /** Custom range base value */ SAI_TAM_EVENT_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_EVENT_ATTR_CUSTOM_RANGE_END } sai_tam_event_attr_t; /** * @brief Create and return a event object id * * @param[out] tam_event_id Event object Id * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_event_fn)( _Out_ sai_object_id_t *tam_event_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Deletes a specified event object * * @param[in] tam_event_id Event object id * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_event_fn)( _In_ sai_object_id_t tam_event_id); /** * @brief Get values for specified event object attributes * * @param[in] tam_event_id Event object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_event_attribute_fn)( _In_ sai_object_id_t tam_event_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief Set value for a specified event object attribute * * @param[in] tam_event_id Event object id * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_event_attribute_fn)( _In_ sai_object_id_t tam_event_id, _In_ const sai_attribute_t *attr); /** * @brief Counter Subscription attributes */ typedef enum _sai_tam_counter_subscription_attr_t { /** * @brief Start of Attributes */ SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_START, /** * @brief TAM telemetry type object * * @type sai_object_id_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @objects SAI_OBJECT_TYPE_TAM_TEL_TYPE */ SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_TEL_TYPE = SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_START, /** * @brief Subscribed object * * @type sai_object_id_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY * @objects SAI_OBJECT_TYPE_BUFFER_POOL, SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, SAI_OBJECT_TYPE_PORT, SAI_OBJECT_TYPE_QUEUE */ SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_OBJECT_ID, /** * @brief Subscribed stat enum * * @type sai_uint32_t * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_STAT_ID, /** * @brief Telemetry label * * Label to identify this counter in telemetry reports. * * @type sai_uint64_t * @flags CREATE_ONLY * @default 0 */ SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_LABEL, /** * @brief End of Attributes */ SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_END, /** Custom range base value */ SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_CUSTOM_RANGE_START = 0x10000000, /** End of custom range base */ SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_CUSTOM_RANGE_END } sai_tam_counter_subscription_attr_t; /** * @brief Create a counter subscription * * @param[out] tam_counter_subscription_id Counter subscription object Id * @param[in] switch_id Switch object id * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_create_tam_counter_subscription_fn)( _Out_ sai_object_id_t *tam_counter_subscription_id, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief Delete a specified counter subscription * * @param[in] tam_counter_subscription_id Counter Subscription object id * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_remove_tam_counter_subscription_fn)( _In_ sai_object_id_t tam_counter_subscription_id); /** * @brief Set value for a specified counter subscription object attribute * * @param[in] tam_counter_subscription_id Counter Subscription object id * @param[in] attr Attribute * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_set_tam_counter_subscription_attribute_fn)( _In_ sai_object_id_t tam_counter_subscription_id, _In_ const sai_attribute_t *attr); /** * @brief Get values for specified event object attributes * * @param[in] tam_counter_subscription_id Counter Subscription object id * @param[in] attr_count Number of attributes * @param[inout] attr_list Array of attributes * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ typedef sai_status_t (*sai_get_tam_counter_subscription_attribute_fn)( _In_ sai_object_id_t tam_counter_subscription_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); /** * @brief TAM event callback * * @count attr_list[attr_count] * @count buffer[buffer_size] * @objects attr_list SAI_OBJECT_TYPE_TAM_EVENT_ACTION * @objects tam_event_id SAI_OBJECT_TYPE_TAM_EVENT * * @param[in] tam_event_id Create Event Object ID * @param[in] buffer_size Actual buffer size in bytes * @param[in] buffer Data buffer * @param[in] attr_count Number of attributes * @param[in] attr_list Array of attributes */ typedef void (*sai_tam_event_notification_fn)( _In_ sai_object_id_t tam_event_id, _In_ sai_size_t buffer_size, _In_ const void *buffer, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); /** * @brief TAM telemetry data get API * * @param[in] switch_id SAI Switch object id * @param[in] obj_list SAI Switch object list * @param[in] clear_on_read Flag to clear the read data * @param[inout] buffer_size Actual buffer size in bytes * @param[out] buffer Data buffer * * @return #SAI_STATUS_SUCCESS on success, failure status code on error */ sai_status_t sai_tam_telemetry_get_data( _In_ sai_object_id_t switch_id, _In_ sai_object_list_t obj_list, _In_ bool clear_on_read, _Inout_ sai_size_t *buffer_size, _Out_ void *buffer); /** * @brief SAI TAM API set */ typedef struct _sai_tam_api_t { /** * @brief SAI TAM v1 API set */ sai_create_tam_fn create_tam; sai_remove_tam_fn remove_tam; sai_set_tam_attribute_fn set_tam_attribute; sai_get_tam_attribute_fn get_tam_attribute; sai_create_tam_math_func_fn create_tam_math_func; sai_remove_tam_math_func_fn remove_tam_math_func; sai_set_tam_math_func_attribute_fn set_tam_math_func_attribute; sai_get_tam_math_func_attribute_fn get_tam_math_func_attribute; sai_create_tam_report_fn create_tam_report; sai_remove_tam_report_fn remove_tam_report; sai_set_tam_report_attribute_fn set_tam_report_attribute; sai_get_tam_report_attribute_fn get_tam_report_attribute; sai_create_tam_event_threshold_fn create_tam_event_threshold; sai_remove_tam_event_threshold_fn remove_tam_event_threshold; sai_set_tam_event_threshold_attribute_fn set_tam_event_threshold_attribute; sai_get_tam_event_threshold_attribute_fn get_tam_event_threshold_attribute; sai_create_tam_int_fn create_tam_int; sai_remove_tam_int_fn remove_tam_int; sai_set_tam_int_attribute_fn set_tam_int_attribute; sai_get_tam_int_attribute_fn get_tam_int_attribute; sai_create_tam_tel_type_fn create_tam_tel_type; sai_remove_tam_tel_type_fn remove_tam_tel_type; sai_set_tam_tel_type_attribute_fn set_tam_tel_type_attribute; sai_get_tam_tel_type_attribute_fn get_tam_tel_type_attribute; sai_create_tam_transport_fn create_tam_transport; sai_remove_tam_transport_fn remove_tam_transport; sai_set_tam_transport_attribute_fn set_tam_transport_attribute; sai_get_tam_transport_attribute_fn get_tam_transport_attribute; sai_create_tam_telemetry_fn create_tam_telemetry; sai_remove_tam_telemetry_fn remove_tam_telemetry; sai_set_tam_telemetry_attribute_fn set_tam_telemetry_attribute; sai_get_tam_telemetry_attribute_fn get_tam_telemetry_attribute; sai_create_tam_collector_fn create_tam_collector; sai_remove_tam_collector_fn remove_tam_collector; sai_set_tam_collector_attribute_fn set_tam_collector_attribute; sai_get_tam_collector_attribute_fn get_tam_collector_attribute; sai_create_tam_event_action_fn create_tam_event_action; sai_remove_tam_event_action_fn remove_tam_event_action; sai_set_tam_event_action_attribute_fn set_tam_event_action_attribute; sai_get_tam_event_action_attribute_fn get_tam_event_action_attribute; sai_create_tam_event_fn create_tam_event; sai_remove_tam_event_fn remove_tam_event; sai_set_tam_event_attribute_fn set_tam_event_attribute; sai_get_tam_event_attribute_fn get_tam_event_attribute; sai_create_tam_counter_subscription_fn create_tam_counter_subscription; sai_remove_tam_counter_subscription_fn remove_tam_counter_subscription; sai_set_tam_counter_subscription_attribute_fn set_tam_counter_subscription_attribute; sai_get_tam_counter_subscription_attribute_fn get_tam_counter_subscription_attribute; } sai_tam_api_t; /** * @} */ #endif /** __SAITAM_H_ */