inc/saitypes.h (823 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 saitypes.h
*
* @brief This module defines SAI portable types
*/
#if !defined (__SAITYPES_H_)
#define __SAITYPES_H_
/**
* @defgroup SAITYPES SAI - Types definitions
*
* @{
*/
#if defined(_WIN32)
/*
* *nix already has lower-case definitions for types.
*/
typedef UINT8 uint8_t;
typedef UINT16 uint16_t;
typedef UINT32 uint32_t;
typedef INT32 int32_t;
typedef INT64 int64_t;
typedef UINT64 uint64_t;
typedef INT32 sai_status_t;
typedef UINT32 sai_switch_profile_id_t;
typedef UINT16 sai_vlan_id_t;
typedef UINT32 sai_attr_id_t;
typedef UINT8 sai_cos_t;
typedef UINT8 sai_queue_index_t;
typedef UINT8 sai_mac_t[6];
typedef UINT32 sai_ip4_t;
typedef UINT8 sai_ip6_t[16];
typedef UINT32 sai_switch_hash_seed_t;
typedef UINT32 sai_label_id_t;
typedef UINT32 sai_stat_id_t;
typedef UINT8 sai_encrypt_key_t[32];
typedef UINT8 sai_auth_key_t[16];
typedef UINT8 sai_macsec_sak_t[32];
typedef UINT8 sai_macsec_auth_key_t[16];
typedef UINT8 sai_macsec_salt_t[12];
#include <ws2def.h>
#include <ws2ipdef.h>
#if !defined(__BOOL_DEFINED)
typedef enum
{
false,
true
} _bool;
#define bool _bool
#endif /* __BOOL_DEFINED */
/**
* @def PATH_MAX
* N.B. Equal to 260 on Windows
*/
#define PATH_MAX MAX_PATH
#else /* #if defined(_WIN32) */
#include <stdint.h>
#include <stdbool.h>
#include <sys/types.h>
typedef int32_t sai_status_t;
typedef uint32_t sai_switch_profile_id_t;
typedef uint16_t sai_vlan_id_t;
typedef uint32_t sai_attr_id_t;
typedef uint8_t sai_cos_t;
typedef uint8_t sai_queue_index_t;
typedef uint8_t sai_mac_t[6];
typedef uint32_t sai_ip4_t;
typedef uint8_t sai_ip6_t[16];
typedef uint32_t sai_switch_hash_seed_t;
typedef uint32_t sai_label_id_t;
typedef uint32_t sai_stat_id_t;
typedef uint8_t sai_encrypt_key_t[32];
typedef uint8_t sai_auth_key_t[16];
typedef uint8_t sai_macsec_sak_t[32];
typedef uint8_t sai_macsec_auth_key_t[16];
typedef uint8_t sai_macsec_salt_t[12];
#define _In_
#define _Out_
#define _Inout_
#define _In_reads_z_(_LEN_)
#define _In_reads_opt_z_(_LEN_)
#endif /* _WIN32 */
/*
* New common definitions
*/
typedef uint64_t sai_uint64_t;
typedef int64_t sai_int64_t;
typedef uint32_t sai_uint32_t;
typedef int32_t sai_int32_t;
typedef uint16_t sai_uint16_t;
typedef int16_t sai_int16_t;
typedef uint8_t sai_uint8_t;
typedef int8_t sai_int8_t;
typedef size_t sai_size_t;
typedef uint64_t sai_object_id_t;
typedef void *sai_pointer_t;
typedef uint64_t sai_api_version_t;
typedef struct _sai_timespec_t
{
uint64_t tv_sec;
uint32_t tv_nsec;
} sai_timespec_t;
/**
* @def SAI_NULL_OBJECT_ID
* SAI NULL object ID
*/
#define SAI_NULL_OBJECT_ID 0L
/**
* @brief Defines a list of SAI object ids used as SAI attribute value.
*
* In set attribute function call, the count member defines the number of
* objects.
*
* In get attribute function call, the function call returns a list of objects
* to the caller in the list member. The caller is responsible for allocating the
* buffer for the list member and set the count member to the size of allocated object
* list. If the size is large enough to accommodate the list of object id, the
* callee will then fill the list member and set the count member to the actual
* number of objects. If the list size is not large enough, the callee will set the
* count member to the actual number of object id and return
* #SAI_STATUS_BUFFER_OVERFLOW. Once the caller gets such return code, it should
* use the returned count member to re-allocate list and retry.
*/
typedef struct _sai_object_list_t
{
uint32_t count;
sai_object_id_t *list;
} sai_object_list_t;
/**
* @brief SAI common API type
*/
typedef enum _sai_common_api_t
{
SAI_COMMON_API_CREATE = 0,
SAI_COMMON_API_REMOVE = 1,
SAI_COMMON_API_SET = 2,
SAI_COMMON_API_GET = 3,
SAI_COMMON_API_BULK_CREATE = 4,
SAI_COMMON_API_BULK_REMOVE = 5,
SAI_COMMON_API_BULK_SET = 6,
SAI_COMMON_API_BULK_GET = 7,
SAI_COMMON_API_MAX = 8,
} sai_common_api_t;
/**
* @brief SAI object type
*/
typedef enum _sai_object_type_t
{
SAI_OBJECT_TYPE_NULL = 0, /**< invalid object type */
SAI_OBJECT_TYPE_PORT = 1,
SAI_OBJECT_TYPE_LAG = 2,
SAI_OBJECT_TYPE_VIRTUAL_ROUTER = 3,
SAI_OBJECT_TYPE_NEXT_HOP = 4,
SAI_OBJECT_TYPE_NEXT_HOP_GROUP = 5,
SAI_OBJECT_TYPE_ROUTER_INTERFACE = 6,
SAI_OBJECT_TYPE_ACL_TABLE = 7,
SAI_OBJECT_TYPE_ACL_ENTRY = 8,
SAI_OBJECT_TYPE_ACL_COUNTER = 9,
SAI_OBJECT_TYPE_ACL_RANGE = 10,
SAI_OBJECT_TYPE_ACL_TABLE_GROUP = 11,
SAI_OBJECT_TYPE_ACL_TABLE_GROUP_MEMBER = 12,
SAI_OBJECT_TYPE_HOSTIF = 13,
SAI_OBJECT_TYPE_MIRROR_SESSION = 14,
SAI_OBJECT_TYPE_SAMPLEPACKET = 15,
SAI_OBJECT_TYPE_STP = 16,
SAI_OBJECT_TYPE_HOSTIF_TRAP_GROUP = 17,
SAI_OBJECT_TYPE_POLICER = 18,
SAI_OBJECT_TYPE_WRED = 19,
SAI_OBJECT_TYPE_QOS_MAP = 20,
SAI_OBJECT_TYPE_QUEUE = 21,
SAI_OBJECT_TYPE_SCHEDULER = 22,
SAI_OBJECT_TYPE_SCHEDULER_GROUP = 23,
SAI_OBJECT_TYPE_BUFFER_POOL = 24,
SAI_OBJECT_TYPE_BUFFER_PROFILE = 25,
SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP = 26,
SAI_OBJECT_TYPE_LAG_MEMBER = 27,
SAI_OBJECT_TYPE_HASH = 28,
SAI_OBJECT_TYPE_UDF = 29,
SAI_OBJECT_TYPE_UDF_MATCH = 30,
SAI_OBJECT_TYPE_UDF_GROUP = 31,
SAI_OBJECT_TYPE_FDB_ENTRY = 32,
SAI_OBJECT_TYPE_SWITCH = 33,
SAI_OBJECT_TYPE_HOSTIF_TRAP = 34,
SAI_OBJECT_TYPE_HOSTIF_TABLE_ENTRY = 35,
SAI_OBJECT_TYPE_NEIGHBOR_ENTRY = 36,
SAI_OBJECT_TYPE_ROUTE_ENTRY = 37,
SAI_OBJECT_TYPE_VLAN = 38,
SAI_OBJECT_TYPE_VLAN_MEMBER = 39,
SAI_OBJECT_TYPE_HOSTIF_PACKET = 40,
SAI_OBJECT_TYPE_TUNNEL_MAP = 41,
SAI_OBJECT_TYPE_TUNNEL = 42,
SAI_OBJECT_TYPE_TUNNEL_TERM_TABLE_ENTRY = 43,
SAI_OBJECT_TYPE_FDB_FLUSH = 44,
SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER = 45,
SAI_OBJECT_TYPE_STP_PORT = 46,
SAI_OBJECT_TYPE_RPF_GROUP = 47,
SAI_OBJECT_TYPE_RPF_GROUP_MEMBER = 48,
SAI_OBJECT_TYPE_L2MC_GROUP = 49,
SAI_OBJECT_TYPE_L2MC_GROUP_MEMBER = 50,
SAI_OBJECT_TYPE_IPMC_GROUP = 51,
SAI_OBJECT_TYPE_IPMC_GROUP_MEMBER = 52,
SAI_OBJECT_TYPE_L2MC_ENTRY = 53,
SAI_OBJECT_TYPE_IPMC_ENTRY = 54,
SAI_OBJECT_TYPE_MCAST_FDB_ENTRY = 55,
SAI_OBJECT_TYPE_HOSTIF_USER_DEFINED_TRAP = 56,
SAI_OBJECT_TYPE_BRIDGE = 57,
SAI_OBJECT_TYPE_BRIDGE_PORT = 58,
SAI_OBJECT_TYPE_TUNNEL_MAP_ENTRY = 59,
SAI_OBJECT_TYPE_TAM = 60,
SAI_OBJECT_TYPE_SRV6_SIDLIST = 61,
SAI_OBJECT_TYPE_PORT_POOL = 62,
SAI_OBJECT_TYPE_INSEG_ENTRY = 63,
SAI_OBJECT_TYPE_DTEL = 64, /**< experimental */
SAI_OBJECT_TYPE_DTEL_QUEUE_REPORT = 65, /**< experimental */
SAI_OBJECT_TYPE_DTEL_INT_SESSION = 66, /**< experimental */
SAI_OBJECT_TYPE_DTEL_REPORT_SESSION = 67, /**< experimental */
SAI_OBJECT_TYPE_DTEL_EVENT = 68, /**< experimental */
SAI_OBJECT_TYPE_BFD_SESSION = 69,
SAI_OBJECT_TYPE_ISOLATION_GROUP = 70,
SAI_OBJECT_TYPE_ISOLATION_GROUP_MEMBER = 71,
SAI_OBJECT_TYPE_TAM_MATH_FUNC = 72,
SAI_OBJECT_TYPE_TAM_REPORT = 73,
SAI_OBJECT_TYPE_TAM_EVENT_THRESHOLD = 74,
SAI_OBJECT_TYPE_TAM_TEL_TYPE = 75,
SAI_OBJECT_TYPE_TAM_TRANSPORT = 76,
SAI_OBJECT_TYPE_TAM_TELEMETRY = 77,
SAI_OBJECT_TYPE_TAM_COLLECTOR = 78,
SAI_OBJECT_TYPE_TAM_EVENT_ACTION = 79,
SAI_OBJECT_TYPE_TAM_EVENT = 80,
SAI_OBJECT_TYPE_NAT_ZONE_COUNTER = 81,
SAI_OBJECT_TYPE_NAT_ENTRY = 82,
SAI_OBJECT_TYPE_TAM_INT = 83,
SAI_OBJECT_TYPE_COUNTER = 84,
SAI_OBJECT_TYPE_DEBUG_COUNTER = 85,
SAI_OBJECT_TYPE_PORT_CONNECTOR = 86,
SAI_OBJECT_TYPE_PORT_SERDES = 87,
SAI_OBJECT_TYPE_MACSEC = 88,
SAI_OBJECT_TYPE_MACSEC_PORT = 89,
SAI_OBJECT_TYPE_MACSEC_FLOW = 90,
SAI_OBJECT_TYPE_MACSEC_SC = 91,
SAI_OBJECT_TYPE_MACSEC_SA = 92,
SAI_OBJECT_TYPE_SYSTEM_PORT = 93,
SAI_OBJECT_TYPE_FINE_GRAINED_HASH_FIELD = 94,
SAI_OBJECT_TYPE_SWITCH_TUNNEL = 95,
SAI_OBJECT_TYPE_MY_SID_ENTRY = 96,
SAI_OBJECT_TYPE_MY_MAC = 97,
SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MAP = 98,
SAI_OBJECT_TYPE_IPSEC = 99,
SAI_OBJECT_TYPE_IPSEC_PORT = 100,
SAI_OBJECT_TYPE_IPSEC_SA = 101,
SAI_OBJECT_TYPE_GENERIC_PROGRAMMABLE = 102,
SAI_OBJECT_TYPE_ARS_PROFILE = 103,
SAI_OBJECT_TYPE_ARS = 104,
SAI_OBJECT_TYPE_ACL_TABLE_CHAIN_GROUP = 105,
SAI_OBJECT_TYPE_TWAMP_SESSION = 106,
SAI_OBJECT_TYPE_TAM_COUNTER_SUBSCRIPTION = 107,
SAI_OBJECT_TYPE_POE_DEVICE = 108,
SAI_OBJECT_TYPE_POE_PSE = 109,
SAI_OBJECT_TYPE_POE_PORT = 110,
SAI_OBJECT_TYPE_ICMP_ECHO_SESSION = 111,
/** Must remain in last position */
SAI_OBJECT_TYPE_MAX,
SAI_OBJECT_TYPE_EXTENSIONS_RANGE_BASE = 0x20000000,
} sai_object_type_t;
typedef struct _sai_u8_list_t
{
uint32_t count;
uint8_t *list;
} sai_u8_list_t;
/**
* @brief Defines a s8 list or string
*
* String should be null terminated and count should include '\0'.
*/
typedef struct _sai_s8_list_t
{
uint32_t count;
int8_t *list;
} sai_s8_list_t;
typedef struct _sai_u16_list_t
{
uint32_t count;
uint16_t *list;
} sai_u16_list_t;
typedef struct _sai_s16_list_t
{
uint32_t count;
int16_t *list;
} sai_s16_list_t;
typedef struct _sai_u32_list_t
{
uint32_t count;
uint32_t *list;
} sai_u32_list_t;
typedef struct _sai_s32_list_t
{
uint32_t count;
int32_t *list;
} sai_s32_list_t;
typedef struct _sai_u32_range_t
{
uint32_t min;
uint32_t max;
} sai_u32_range_t;
typedef struct _sai_s32_range_t
{
int32_t min;
int32_t max;
} sai_s32_range_t;
typedef struct _sai_u16_range_t
{
uint16_t min;
uint16_t max;
} sai_u16_range_t;
typedef struct _sai_u16_range_list_t
{
uint32_t count;
sai_u16_range_t *list;
} sai_u16_range_list_t;
/**
* @brief Defines a vlan list data structure
*/
typedef struct _sai_vlan_list_t
{
/** Number of VLANs */
uint32_t count;
/** List of VLANs */
sai_vlan_id_t *list;
} sai_vlan_list_t;
typedef enum _sai_ip_addr_family_t
{
SAI_IP_ADDR_FAMILY_IPV4,
SAI_IP_ADDR_FAMILY_IPV6
} sai_ip_addr_family_t;
/**
* @extraparam sai_ip_addr_family_t addr_family
*/
typedef union _sai_ip_addr_t
{
/** @validonly addr_family == SAI_IP_ADDR_FAMILY_IPV4 */
sai_ip4_t ip4;
/** @validonly addr_family == SAI_IP_ADDR_FAMILY_IPV6 */
sai_ip6_t ip6;
} sai_ip_addr_t;
typedef struct _sai_ip_address_t
{
sai_ip_addr_family_t addr_family;
/** @passparam addr_family */
sai_ip_addr_t addr;
} sai_ip_address_t;
typedef struct _sai_ip_address_list_t
{
uint32_t count;
sai_ip_address_t *list;
} sai_ip_address_list_t;
typedef struct _sai_ip_prefix_t
{
sai_ip_addr_family_t addr_family;
/** @passparam addr_family */
sai_ip_addr_t addr;
/** @passparam addr_family */
sai_ip_addr_t mask;
} sai_ip_prefix_t;
typedef struct _sai_ip_prefix_list_t
{
uint32_t count;
sai_ip_prefix_t *list;
} sai_ip_prefix_list_t;
/**
* @brief Attribute data for #SAI_PORT_ATTR_PRBS_RX_STATUS
*/
typedef enum _sai_port_prbs_rx_status_t
{
/** PRBS is locked and error_count is 0 */
SAI_PORT_PRBS_RX_STATUS_OK,
/** PRBS is locked, but there are errors */
SAI_PORT_PRBS_RX_STATUS_LOCK_WITH_ERRORS,
/** PRBS not locked */
SAI_PORT_PRBS_RX_STATUS_NOT_LOCKED,
/** PRBS locked but there is loss of lock since last call */
SAI_PORT_PRBS_RX_STATUS_LOST_LOCK,
} sai_port_prbs_rx_status_t;
typedef struct _sai_prbs_rx_state_t
{
sai_port_prbs_rx_status_t rx_status;
uint32_t error_count;
} sai_prbs_rx_state_t;
typedef struct _sai_latch_status_t
{
/** Current status at the time of read */
bool current_status;
/** Indicates that the status changed at least once since the last read */
bool changed;
} sai_latch_status_t;
typedef struct _sai_port_lane_latch_status_t
{
uint32_t lane;
sai_latch_status_t value;
} sai_port_lane_latch_status_t;
typedef struct _sai_port_lane_latch_status_list_t
{
uint32_t count;
sai_port_lane_latch_status_t *list;
} sai_port_lane_latch_status_list_t;
/**
* @brief Field match mask
*
* @extraparam const sai_attr_metadata_t *meta
*/
typedef union _sai_acl_field_data_mask_t
{
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8 */
sai_uint8_t u8;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT8 */
sai_int8_t s8;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT16 */
sai_uint16_t u16;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16 */
sai_int16_t s16;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32 */
sai_uint32_t u32;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32 */
sai_int32_t s32;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64 */
sai_uint64_t u64;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC */
sai_mac_t mac;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4 */
sai_ip4_t ip4;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6 */
sai_ip6_t ip6;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST */
sai_u8_list_t u8list;
} sai_acl_field_data_mask_t;
/**
* @brief ACL field data union.
*
* @extraparam const sai_attr_metadata_t *meta
*/
typedef union _sai_acl_field_data_data_t
{
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL */
bool booldata;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8 */
sai_uint8_t u8;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT8 */
sai_int8_t s8;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT16 */
sai_uint16_t u16;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16 */
sai_int16_t s16;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32 */
sai_uint32_t u32;
/**
* @suffix enum
* @passparam meta->enummetadata
* @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32
*/
sai_int32_t s32;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64 */
sai_uint64_t u64;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC */
sai_mac_t mac;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4 */
sai_ip4_t ip4;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6 */
sai_ip6_t ip6;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID */
sai_object_id_t oid;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST */
sai_object_list_t objlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST */
sai_u8_list_t u8list;
} sai_acl_field_data_data_t;
/**
* @brief Defines a single ACL filter
*
* @note IPv4 and IPv6 Address expected in Network Byte Order
*
* @extraparam const sai_attr_metadata_t *meta
*/
typedef struct _sai_acl_field_data_t
{
/**
* @brief Match enable/disable
*/
bool enable;
/**
* @brief Field match mask
*
* @note Nothing can be serialized if mask is not needed for data items
* like object id.
*
* @passparam meta
* @validonly enable == true
*/
sai_acl_field_data_mask_t mask;
/**
* @brief Expected AND result using match mask above with packet field
* value where applicable.
*
* @passparam meta
* @validonly enable == true
*/
sai_acl_field_data_data_t data;
} sai_acl_field_data_t;
/**
* @extraparam const sai_attr_metadata_t *meta
*/
typedef union _sai_acl_action_parameter_t
{
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_BOOL */
bool booldata;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT8 */
sai_uint8_t u8;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT8 */
sai_int8_t s8;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT16 */
sai_uint16_t u16;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT16 */
sai_int16_t s16;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT32 */
sai_uint32_t u32;
/**
* @suffix enum
* @passparam meta->enummetadata
* @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT32
*/
sai_int32_t s32;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_MAC */
sai_mac_t mac;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV4 */
sai_ip4_t ip4;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV6 */
sai_ip6_t ip6;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID */
sai_object_id_t oid;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST */
sai_object_list_t objlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IP_ADDRESS */
sai_ip_address_t ipaddr;
} sai_acl_action_parameter_t;
/**
* @brief Defines a single ACL action
*
* @note IPv4 and IPv6 Address expected in Network Byte Order
*
* @extraparam const sai_attr_metadata_t *meta
*/
typedef struct _sai_acl_action_data_t
{
/**
* @brief Action enable/disable
*/
bool enable;
/**
* @brief Action parameter
*
* @passparam meta
* @validonly enable == true
*/
sai_acl_action_parameter_t parameter;
} sai_acl_action_data_t;
/**
* @brief Packet Color
*/
typedef enum _sai_packet_color_t
{
/**
* @brief Color Green
*/
SAI_PACKET_COLOR_GREEN,
/**
* @brief Color Yellow
*/
SAI_PACKET_COLOR_YELLOW,
/**
* @brief Color Red
*/
SAI_PACKET_COLOR_RED,
} sai_packet_color_t;
/**
* @brief Defines QOS map types.
*
* @par Examples:
*
* dot1p/DSCP/MPLS_EXP --> TC
* dot1p/DSCP/MPLS_EXP --> Color
* dot1p/DSCP/MPLS_EXP --> TC + Color
* DSCP/MPLS_EXP --> FC
* TC --> dot1p/DSCP/MPLS_EXP.
* TC + color --> dot1p/DSCP/MPLS_EXP.
* TC --> Egress Queue.
*/
typedef struct _sai_qos_map_params_t
{
/** Traffic class */
sai_cos_t tc;
/** DSCP value */
sai_uint8_t dscp;
/** Dot1p value */
sai_uint8_t dot1p;
/** PFC priority value */
sai_uint8_t prio;
/** Priority group value */
sai_uint8_t pg;
/**
* @brief Egress port queue OID is not known at the time of map creation.
* Using queue index for maps.
*/
sai_queue_index_t queue_index;
/** Color of the packet */
sai_packet_color_t color;
/** MPLS exp value */
sai_uint8_t mpls_exp;
/** Forwarding class */
sai_uint8_t fc;
} sai_qos_map_params_t;
typedef struct _sai_qos_map_t
{
/** Input parameters to match */
sai_qos_map_params_t key;
/** Output map parameters */
sai_qos_map_params_t value;
} sai_qos_map_t;
typedef struct _sai_qos_map_list_t
{
/** Number of entries in the map */
uint32_t count;
/** Map list */
sai_qos_map_t *list;
} sai_qos_map_list_t;
typedef struct _sai_map_t
{
/** Input key value */
sai_uint32_t key;
/** Input data value for the key */
sai_int32_t value;
} sai_map_t;
typedef struct _sai_map_list_t
{
/** Number of entries in the map */
uint32_t count;
/** Map list */
sai_map_t *list;
} sai_map_list_t;
/**
* @brief Attribute data for SAI_ACL_TABLE_ATTR_SUPPORTED_MATCH_TYPE
*/
typedef enum _sai_acl_table_supported_match_type_t
{
/** Ternary */
SAI_ACL_TABLE_SUPPORTED_MATCH_TYPE_TERNARY,
/** Exact */
SAI_ACL_TABLE_SUPPORTED_MATCH_TYPE_EXACT,
} sai_acl_table_supported_match_type_t;
/**
* @brief Attribute data for SAI_ACL_TABLE_CHAIN_GROUP_ATTR_STAGE
*/
typedef enum _sai_acl_table_chain_group_stage_t
{
/** Stage 0 */
SAI_ACL_TABLE_CHAIN_GROUP_STAGE_0,
/** Stage 0 */
SAI_ACL_TABLE_CHAIN_GROUP_STAGE_1,
/** Stage 1 */
SAI_ACL_TABLE_CHAIN_GROUP_STAGE_2,
/** Stage 2 */
SAI_ACL_TABLE_CHAIN_GROUP_STAGE_3,
} sai_acl_table_chain_group_stage_t;
/**
* @brief Structure for ACL chain stage and corresponding table type
*/
typedef struct _sai_acl_chain_t
{
/** ACL table chain stage */
sai_acl_table_chain_group_stage_t chain_group_stage;
/** Table type supported for this stage */
sai_acl_table_supported_match_type_t supported_match_type;
} sai_acl_chain_t;
typedef struct _sai_acl_chain_list_t
{
/** Number of stages in the chain */
uint32_t count;
/** Chain list */
sai_acl_chain_t *list;
} sai_acl_chain_list_t;
/**
* @brief Structure for ACL attributes supported at each stage.
* action_list alone is added now. Qualifier list can also be added
* when needed.
*/
typedef struct _sai_acl_capability_t
{
/**
* @brief Output from get function.
*
* Flag indicating whether action list is mandatory for table creation.
*/
bool is_action_list_mandatory;
/**
* @brief Output from get function.
*
* List of actions supported per stage from the sai_acl_table_action_list_t.
* Max action list can be obtained using the #SAI_SWITCH_ATTR_MAX_ACL_ACTION_COUNT.
*
* @suffix enum_list
* @passparam &sai_metadata_enum_sai_acl_action_type_t
*/
sai_s32_list_t action_list;
/**
* @brief Supported match type
*
* Indicates the match type supported by ACL stage
*/
sai_acl_table_supported_match_type_t supported_match_type;
/**
* @brief Non contiguous bit match supported
*
* Indicates whether EM can support non contiguous bits matching
*/
bool is_non_contiguous_bits_exact_match_supported;
} sai_acl_capability_t;
/**
* @brief Attribute data for SAI_ACL_TABLE_ATTR_STAGE
*/
typedef enum _sai_acl_stage_t
{
/** Ingress Stage */
SAI_ACL_STAGE_INGRESS,
/** Egress Stage */
SAI_ACL_STAGE_EGRESS,
/** Ingress Stage */
SAI_ACL_STAGE_INGRESS_MACSEC,
/** Egress Stage */
SAI_ACL_STAGE_EGRESS_MACSEC,
/** Pre-ingress Stage */
SAI_ACL_STAGE_PRE_INGRESS,
/** Post Ingress Stage */
SAI_ACL_STAGE_POST_INGRESS,
} sai_acl_stage_t;
/**
* @brief Attribute data for SAI_ACL_TABLE_ATTR_BIND_POINT
*/
typedef enum _sai_acl_bind_point_type_t
{
/** Bind Point Type Port */
SAI_ACL_BIND_POINT_TYPE_PORT,
/** Bind Point Type LAG */
SAI_ACL_BIND_POINT_TYPE_LAG,
/** Bind Point Type VLAN */
SAI_ACL_BIND_POINT_TYPE_VLAN,
/** Bind Point Type RIF */
SAI_ACL_BIND_POINT_TYPE_ROUTER_INTERFACE,
/** @ignore - for backward compatibility */
SAI_ACL_BIND_POINT_TYPE_ROUTER_INTF = SAI_ACL_BIND_POINT_TYPE_ROUTER_INTERFACE,
/** Bind Point Type Switch */
SAI_ACL_BIND_POINT_TYPE_SWITCH
} sai_acl_bind_point_type_t;
/**
* @brief Attribute data for SAI_ACL_TABLE_ATTR_MATCH_TYPE
*/
typedef enum _sai_acl_table_match_type_t
{
/** Match Type Ternary */
SAI_ACL_TABLE_MATCH_TYPE_TERNARY,
/** Match Type Exact */
SAI_ACL_TABLE_MATCH_TYPE_EXACT,
} sai_acl_table_match_type_t;
/**
* @brief Attribute data for SAI_TAM_TABLE_ATTR_BIND_POINT
*/
typedef enum _sai_tam_bind_point_type_t
{
/** Bind Point Type Queue */
SAI_TAM_BIND_POINT_TYPE_QUEUE,
/** Bind Point Type Port */
SAI_TAM_BIND_POINT_TYPE_PORT,
/** Bind Point Type LAG */
SAI_TAM_BIND_POINT_TYPE_LAG,
/** Bind Point Type VLAN */
SAI_TAM_BIND_POINT_TYPE_VLAN,
/** Bind Point Type Switch */
SAI_TAM_BIND_POINT_TYPE_SWITCH,
/** Bind Point Type Ingress Priority Group */
SAI_TAM_BIND_POINT_TYPE_IPG,
/** Bind Point Type Buffer Service Pool */
SAI_TAM_BIND_POINT_TYPE_BSP,
} sai_tam_bind_point_type_t;
/**
* @brief Structure for ACL Resource Count
*/
typedef struct _sai_acl_resource_t
{
/** ACL stage */
sai_acl_stage_t stage;
/** ACL Bind point */
sai_acl_bind_point_type_t bind_point;
/** Available number of entries */
sai_uint32_t avail_num;
} sai_acl_resource_t;
/**
* @brief List of available ACL resources at each stage and
* each binding point. This shall be returned when queried for
* SAI_SWITCH_ATTR_AVAILABLE_ACL_TABLE or
* SAI_SWITCH_ATTR_AVAILABLE_ACL_TABLE_GROUP
*/
typedef struct _sai_acl_resource_list_t
{
/** Number of entries */
uint32_t count;
/** Resource list */
sai_acl_resource_t *list;
} sai_acl_resource_list_t;
/**
* @brief Segment Routing Tag Length Value Types
*/
typedef enum _sai_tlv_type_t
{
/** Ingress Tag Length Value */
SAI_TLV_TYPE_INGRESS,
/** Egress Tag Length Value */
SAI_TLV_TYPE_EGRESS,
/** Opaque Tag Length Value */
SAI_TLV_TYPE_OPAQUE,
/** Hash-based Message Authentication Code Tag Length Value */
SAI_TLV_TYPE_HMAC
} sai_tlv_type_t;
/**
* @brief Segment Routing Hash-based Message Authentication Code Tag Length Value Format
*/
typedef struct _sai_hmac_t
{
sai_uint32_t key_id;
sai_uint32_t hmac[8];
} sai_hmac_t;
/**
* @extraparam sai_tlv_type_t tlv_type
*/
typedef union _sai_tlv_entry_t
{
/** @validonly tlv_type == SAI_TLV_TYPE_INGRESS */
sai_ip6_t ingress_node;
/** @validonly tlv_type == SAI_TLV_TYPE_EGRESS */
sai_ip6_t egress_node;
/** @validonly tlv_type == SAI_TLV_TYPE_OPAQUE */
sai_uint32_t opaque_container[4];
/** @validonly tlv_type == SAI_TLV_TYPE_HMAC */
sai_hmac_t hmac;
} sai_tlv_entry_t;
/**
* @brief Segment Routing Tag Length Value entry
*/
typedef struct _sai_tlv_t
{
sai_tlv_type_t tlv_type;
/** @passparam tlv_type */
sai_tlv_entry_t entry;
} sai_tlv_t;
/**
* @brief List of Segment Routing Tag Length Value entries
*/
typedef struct _sai_tlv_list_t
{
/** Number of Tag Length Value entries */
uint32_t count;
/** Tag Length Value list */
sai_tlv_t *list;
} sai_tlv_list_t;
/**
* @brief List of Segment Routing segment entries
*/
typedef struct _sai_segment_list_t
{
/** Number of IPv6 Segment Route entries */
uint32_t count;
/** Segment list */
sai_ip6_t *list;
} sai_segment_list_t;
/**
* @brief JSON data type
* "attributes": [
* {
* "attribute_name": {
* "sai_metadata": {
* "sai_attr_value_type": "<SAI_ATTR_VALUE_TYPE_T>",
* "brief": "Brief Attribute Description",
* "sai_attr_flags": "<SAI_ATTR_FLAGS_T>",
* "allowed_object_types": [ "<LIST OF ALLOWED OBJECT TYPES>" ],
* "default_value": "<DEFAULT ATTR VALUE>"
* },
* "value": <VALUE of the attribute>
* }
* }
* ]
* attributes - Mandatory top-level key where JSON parsing begins
* attribute_name - Name of one attribute in the list of attributes
* sai_attr_value_type - Data type of the attribute
* brief - Optional description of the field
* sai_attr_flags - Optional Usage flags for the field
* allowed_object_types - If data type is OID, then this is the list of object types allowed as data
*/
typedef struct _sai_json_t
{
/** String in JSON format */
sai_s8_list_t json;
} sai_json_t;
/**
* @brief Defines a lane with its eye values with the up and down values
* being in mV and left and right being in mUI.
*/
typedef struct _sai_port_lane_eye_values_t
{
uint32_t lane;
int32_t left;
int32_t right;
int32_t up;
int32_t down;
} sai_port_lane_eye_values_t;
/**
* @brief Defines a port's lanes eye values list
*
* In get_port_attribute function call, the count member defines the number
* of objects which will be returned to the caller in the list member. The
* caller must allocate the buffer for the list member and set the count
* member to the size of the allocated objects in the list member.
*
* If the size is large enough to accommodate the list of objects, the
* callee must fill the list member and set the count member to the actual
* number of objects filled. If the size is not large enough, the callee
* must set the count member to the actual number of objects filled in the
* list member and return #SAI_STATUS_BUFFER_OVERFLOW. Once the caller
* gets such a return code, it may use the returned count member to
* re-allocate the list and retry.
*/
typedef struct _sai_port_eye_values_list_t
{
uint32_t count;
sai_port_lane_eye_values_t *list;
} sai_port_eye_values_list_t;
/**
* @brief Defines a lane with its frequency offset ppm
*/
typedef struct _sai_port_frequency_offset_ppm_values_t
{
uint32_t lane;
sai_int16_t ppm;
} sai_port_frequency_offset_ppm_values_t;
/**
* @brief Defines a port's lanes frequency offset ppm list
*/
typedef struct _sai_port_frequency_offset_ppm_list_t
{
uint32_t count;
sai_port_frequency_offset_ppm_values_t *list;
} sai_port_frequency_offset_ppm_list_t;
/**
* @brief Defines a lane with its SNR
*
* Each SNR value is encoded as U16 in units of 1/256 dB.
* For example, a value of 5248 represents a SNR of 20.5 dB
*/
typedef struct _sai_port_snr_values_t
{
uint32_t lane;
sai_uint16_t snr;
} sai_port_snr_values_t;
/**
* @brief Defines a port's lanes SNR list
*/
typedef struct _sai_port_snr_list_t
{
uint32_t count;
sai_port_snr_values_t *list;
} sai_port_snr_list_t;
/**
* @brief POE port active channel (when delivering power)
*/
typedef enum _sai_poe_port_active_channel_type_t
{
SAI_POE_PORT_ACTIVE_CHANNEL_TYPE_A,
SAI_POE_PORT_ACTIVE_CHANNEL_TYPE_B,
SAI_POE_PORT_ACTIVE_CHANNEL_TYPE_A_AND_B,
} sai_poe_port_active_channel_type_t;
/**
* @brief POE port signature type (when delivering power)
*/
typedef enum _sai_poe_port_signature_type_t
{
SAI_POE_PORT_SIGNATURE_TYPE_SINGLE,
SAI_POE_PORT_SIGNATURE_TYPE_DUAL,
} sai_poe_port_signature_type_t;
/**
* @brief POE port classification method (when delivering power)
*/
typedef enum _sai_poe_port_class_method_type_t
{
SAI_POE_PORT_CLASS_METHOD_TYPE_REGULAR,
SAI_POE_PORT_CLASS_METHOD_TYPE_AUTO_CLASS,
} sai_poe_port_class_method_type_t;
/**
* @brief Defines a port consumption structure
*
* Data that is needed and available when a port is delivering power
*/
typedef struct _sai_poe_port_power_consumption_t
{
/**
* @brief Active channel: a/b/ab
*/
sai_poe_port_active_channel_type_t active_channel;
/**
* @brief Voltage in MILLI volts
*/
uint32_t voltage;
/**
* @brief Current in MILLI ampere
*/
uint32_t current;
/**
* @brief Consumption in MILLI watts
*/
uint32_t consumption;
/**
* @brief Single or dual signature port
*/
sai_poe_port_signature_type_t signature_type;
/**
* @brief IEEE 802.3bt port class method type regular/auto
*/
sai_poe_port_class_method_type_t class_method;
/**
* @brief Measured class for channel a
*/
uint8_t measured_class_a;
/**
* @brief Assigned (final) class for channel a
*/
uint8_t assigned_class_a;
/**
* @brief Dual signature IEEE 802.3bt port - measured class for channel b
*/
uint8_t measured_class_b;
/**
* @brief Dual signature IEEE 802.3bt port - assigned (final) class for channel b
*/
uint8_t assigned_class_b;
} sai_poe_port_power_consumption_t;
/**
* @brief Enum defining MPLS out segment type
*/
typedef enum _sai_outseg_type_t
{
/** Out segment of ingress node, label stack depth is at least one */
SAI_OUTSEG_TYPE_PUSH,
/** Out segment of intermediate node, label stack depth is one */
SAI_OUTSEG_TYPE_SWAP,
} sai_outseg_type_t;
/**
* @brief Enum defining TTL mode for MPLS out segment
*/
typedef enum _sai_outseg_ttl_mode_t
{
SAI_OUTSEG_TTL_MODE_UNIFORM,
SAI_OUTSEG_TTL_MODE_PIPE,
} sai_outseg_ttl_mode_t;
/**
* @brief Enum defining MPLS EXP mode for MPLS out segment
*/
typedef enum _sai_outseg_exp_mode_t
{
SAI_OUTSEG_EXP_MODE_UNIFORM,
SAI_OUTSEG_EXP_MODE_PIPE,
} sai_outseg_exp_mode_t;
/**
* @brief System port configuration attributes
*
* Speed parameter should be the same value as SAI_PORT_ATTR_SPEED.
* This is used for VOQ scheduling.
*
* All elements are mandatory
*/
typedef struct _sai_system_port_config_t
{
/** System Port ID */
uint32_t port_id;
/** Switch ID of where the system port exists */
uint32_t attached_switch_id;
/** Core associated with the system port */
uint32_t attached_core_index;
/** Port Index within the core associated with the system port */
uint32_t attached_core_port_index;
/** Speed of the system port */
uint32_t speed;
/** Number of Virtual Output Queues associated with the system port */
uint32_t num_voq;
} sai_system_port_config_t;
/**
* @brief System port configuration list
*/
typedef struct _sai_system_port_config_list_t
{
/** Number of entries in the list */
uint32_t count;
/** System port configuration list */
sai_system_port_config_t *list;
} sai_system_port_config_list_t;
/**
* @brief Fabric port reachability
*/
typedef struct _sai_fabric_port_reachability_t
{
/** Remote switch ID (SAI_SWITCH_TYPE_NPU) */
uint32_t switch_id;
/** Remote switch ID is reachable through the fabric port */
bool reachable;
} sai_fabric_port_reachability_t;
/**
* @brief Port error status. This attribute is to be deprecated. Use sai_port_error_status_t instead.
*
* @deprecated true
*/
typedef enum _sai_port_err_status_t
{
/** Data Unit CRC Error */
SAI_PORT_ERR_STATUS_DATA_UNIT_CRC_ERROR,
/** Data Unit Size Error */
SAI_PORT_ERR_STATUS_DATA_UNIT_SIZE,
/** Data Unit Misalignment Error */
SAI_PORT_ERR_STATUS_DATA_UNIT_MISALIGNMENT_ERROR,
/** Uncorrectable RS-FEC code word error */
SAI_PORT_ERR_STATUS_CODE_GROUP_ERROR,
/** SerDes Signal is out of sync */
SAI_PORT_ERR_STATUS_SIGNAL_LOCAL_ERROR,
/** Port is not accepting reachability data units */
SAI_PORT_ERR_STATUS_NO_RX_REACHABILITY,
/** Rate of data units with CRC errors passed its threshold */
SAI_PORT_ERR_STATUS_CRC_RATE,
/** Error remote fault indication */
SAI_PORT_ERR_STATUS_REMOTE_FAULT_STATUS,
/** Error status max */
SAI_PORT_ERR_STATUS_MAX,
} sai_port_err_status_t;
/**
* @brief Attribute data for #SAI_PORT_ATTR_ERR_STATUS_LIST
*/
typedef struct _sai_port_err_status_list_t
{
/** Number of entries in the list */
uint32_t count;
/** Port error list */
sai_port_err_status_t *list;
} sai_port_err_status_list_t;
/**
* @brief Data Type
*
* To use enum values as attribute value is sai_int32_t s32
*
* @extraparam const sai_attr_metadata_t *meta
*/
typedef union _sai_attribute_value_t
{
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_BOOL */
bool booldata;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_CHARDATA */
char chardata[32];
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT8 */
sai_uint8_t u8;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_INT8 */
sai_int8_t s8;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT16 */
sai_uint16_t u16;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_INT16 */
sai_int16_t s16;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT32 */
sai_uint32_t u32;
/**
* @suffix enum
* @passparam meta->enummetadata
* @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_INT32
*/
sai_int32_t s32;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT64 */
sai_uint64_t u64;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_INT64 */
sai_int64_t s64;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_POINTER */
sai_pointer_t ptr;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_MAC */
sai_mac_t mac;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_IPV4 */
sai_ip4_t ip4;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_IPV6 */
sai_ip6_t ip6;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_IP_ADDRESS */
sai_ip_address_t ipaddr;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_IP_PREFIX */
sai_ip_prefix_t ipprefix;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_PRBS_RX_STATE */
sai_prbs_rx_state_t rx_state;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_OBJECT_ID */
sai_object_id_t oid;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_OBJECT_LIST */
sai_object_list_t objlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT8_LIST */
sai_u8_list_t u8list;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_INT8_LIST */
sai_s8_list_t s8list;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT16_LIST */
sai_u16_list_t u16list;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_INT16_LIST */
sai_s16_list_t s16list;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT32_LIST */
sai_u32_list_t u32list;
/**
* @suffix enum_list
* @passparam meta->enummetadata
* @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_INT32_LIST
*/
sai_s32_list_t s32list;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT32_RANGE */
sai_u32_range_t u32range;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_INT32_RANGE */
sai_s32_range_t s32range;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT16_RANGE_LIST */
sai_u16_range_list_t u16rangelist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_VLAN_LIST */
sai_vlan_list_t vlanlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST */
sai_qos_map_list_t qosmap;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_MAP_LIST */
sai_map_list_t maplist;
/* TODO UDF also we need flag for UDF */
/**
* @passparam meta
* @validonly meta->isaclfield == true
*/
sai_acl_field_data_t aclfield;
/**
* @passparam meta
* @validonly meta->isaclaction == true
*/
sai_acl_action_data_t aclaction;
/**
* @passparam meta
* @validonly meta->isaclmask == true
*/
sai_acl_field_data_mask_t aclmask;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_CAPABILITY */
sai_acl_capability_t aclcapability;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST */
sai_acl_resource_list_t aclresource;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_TLV_LIST */
sai_tlv_list_t tlvlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_SEGMENT_LIST */
sai_segment_list_t segmentlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST */
sai_ip_address_list_t ipaddrlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_PORT_EYE_VALUES_LIST */
sai_port_eye_values_list_t porteyevalues;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_TIMESPEC */
sai_timespec_t timespec;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ENCRYPT_KEY */
sai_encrypt_key_t encrypt_key;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_AUTH_KEY */
sai_auth_key_t authkey;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_MACSEC_SAK */
sai_macsec_sak_t macsecsak;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY */
sai_macsec_auth_key_t macsecauthkey;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_MACSEC_SALT */
sai_macsec_salt_t macsecsalt;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG */
sai_system_port_config_t sysportconfig;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG_LIST */
sai_system_port_config_list_t sysportconfiglist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_FABRIC_PORT_REACHABILITY */
sai_fabric_port_reachability_t reachability;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_PORT_ERR_STATUS_LIST */
sai_port_err_status_list_t porterror;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_PORT_LANE_LATCH_STATUS_LIST */
sai_port_lane_latch_status_list_t portlanelatchstatuslist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_LATCH_STATUS */
sai_latch_status_t latchstatus;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_JSON */
sai_json_t json;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_IP_PREFIX_LIST */
sai_ip_prefix_list_t ipprefixlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_CHAIN_LIST */
sai_acl_chain_list_t aclchainlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_PORT_FREQUENCY_OFFSET_PPM_LIST */
sai_port_frequency_offset_ppm_list_t portfrequencyoffsetppmlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_PORT_SNR_LIST */
sai_port_snr_list_t portsnrlist;
/** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_POE_PORT_POWER_CONSUMPTION */
sai_poe_port_power_consumption_t portpowerconsumption;
} sai_attribute_value_t;
/**
* @extraparam const sai_attr_metadata_t *meta
*/
typedef struct _sai_attribute_t
{
/** @passparam meta */
sai_attr_id_t id;
/** @passparam meta */
sai_attribute_value_t value;
} sai_attribute_t;
typedef enum _sai_bulk_op_error_mode_t
{
/**
* @brief Bulk operation error handling mode where operation stops on the first failed creation
*
* Rest of objects will use SAI_STATUS_NON_EXECUTED return status value.
*/
SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR,
/**
* @brief Bulk operation error handling mode where operation ignores the failures and continues to create other objects
*/
SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,
} sai_bulk_op_error_mode_t;
/**
* @brief Bulk objects creation.
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_count Number of objects to create
* @param[in] attr_count List of attr_count. Caller passes the number
* of attribute for each object to create.
* @param[in] attr_list List of attributes for every object.
* @param[in] mode Bulk operation error handling mode.
*
* @param[out] object_id List of object ids returned
* @param[out] object_statuses List of status for every object. Caller needs to allocate the buffer.
*
* @return #SAI_STATUS_SUCCESS on success when all objects are created or #SAI_STATUS_FAILURE when
* any of the objects fails to create. When there is failure, Caller is expected to go through the
* list of returned statuses to find out which fails and which succeeds.
*/
typedef sai_status_t (*sai_bulk_object_create_fn)(
_In_ sai_object_id_t switch_id,
_In_ uint32_t object_count,
_In_ const uint32_t *attr_count,
_In_ const sai_attribute_t **attr_list,
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_object_id_t *object_id,
_Out_ sai_status_t *object_statuses);
/**
* @brief Bulk objects removal.
*
* @param[in] object_count Number of objects to create
* @param[in] object_id List of object ids
* @param[in] mode Bulk operation error handling mode.
* @param[out] object_statuses List of status for every object. Caller needs to allocate the buffer.
*
* @return #SAI_STATUS_SUCCESS on success when all objects are removed or #SAI_STATUS_FAILURE when
* any of the objects fails to remove. When there is failure, Caller is expected to go through the
* list of returned statuses to find out which fails and which succeeds.
*/
typedef sai_status_t (*sai_bulk_object_remove_fn)(
_In_ uint32_t object_count,
_In_ const sai_object_id_t *object_id,
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses);
/**
* @brief Bulk objects set attributes.
*
* @param[in] object_count Number of objects to set on attribute
* @param[in] object_id List of object ids
* @param[in] attr_list List of attributes for every object, one per object.
* @param[in] mode Bulk operation error handling mode.
* @param[out] object_statuses List of status for every object. Caller needs to allocate the buffer.
*
* @return #SAI_STATUS_SUCCESS when set attributes on all objects succeeded or
* #SAI_STATUS_FAILURE when any of the objects fails to set attribute. When
* there is failure, Caller is expected to go through the list of returned
* statuses to find out which fails and which succeeds.
*/
typedef sai_status_t (*sai_bulk_object_set_attribute_fn)(
_In_ uint32_t object_count,
_In_ const sai_object_id_t *object_id,
_In_ const sai_attribute_t *attr_list,
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses);
/**
* @brief Bulk objects get attributes.
*
* @param[in] object_count Number of objects to get on attribute
* @param[in] object_id List of object ids
* @param[in] attr_count List of attr_count. Caller passes the number
* of attribute for each object to get.
* @param[inout] attr_list List of attributes for every object.
* @param[in] mode Bulk operation error handling mode.
* @param[out] object_statuses List of status for every object. Caller needs to allocate the buffer.
*
* @return #SAI_STATUS_SUCCESS when get attributes on all objects succeeded or
* #SAI_STATUS_FAILURE when any of the objects fails to get attribute. When
* there is failure, Caller is expected to go through the list of returned
* statuses to find out which fails and which succeeds.
*/
typedef sai_status_t (*sai_bulk_object_get_attribute_fn)(
_In_ uint32_t object_count,
_In_ const sai_object_id_t *object_id,
_In_ const uint32_t *attr_count,
_Inout_ sai_attribute_t **attr_list,
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses);
/**
* @brief SAI statistics modes
*
* Used in get statistics extended or query statistics capabilities
* Note enum values must be powers of 2 to be used as bit mask for query statistics capabilities
*
* @flags strict
*/
typedef enum _sai_stats_mode_t
{
/**
* @brief Read statistics
*/
SAI_STATS_MODE_READ = 1 << 0,
/**
* @brief Read and clear after reading
*/
SAI_STATS_MODE_READ_AND_CLEAR = 1 << 1,
/**
* @brief Bulk read statistics
*/
SAI_STATS_MODE_BULK_READ = 1 << 2,
/**
* @brief Bulk clear statistics
*/
SAI_STATS_MODE_BULK_CLEAR = 1 << 3,
/**
* @brief Bulk read and clear after reading
*/
SAI_STATS_MODE_BULK_READ_AND_CLEAR = 1 << 4,
} sai_stats_mode_t;
typedef struct _sai_stat_capability_t
{
/** Stat enum value */
sai_stat_id_t stat_enum;
/**
* @brief Bit mask of supported statistics modes (sai_stats_mode_t)
*
* For example, if read and read_and_clear are supported, value is
* SAI_STATS_MODE_READ | SAI_STATS_MODE_READ_AND_CLEAR
*
* @flags sai_stats_mode_t
*/
uint32_t stat_modes;
} sai_stat_capability_t;
typedef struct _sai_stat_capability_list_t
{
uint32_t count;
sai_stat_capability_t *list;
} sai_stat_capability_list_t;
typedef enum _sai_stats_count_mode_t
{
/** Count packet and byte */
SAI_STATS_COUNT_MODE_PACKET_AND_BYTE,
/** Count only packet */
SAI_STATS_COUNT_MODE_PACKET,
/** Count only byte */
SAI_STATS_COUNT_MODE_BYTE,
/** Counting is disabled */
SAI_STATS_COUNT_MODE_NONE
} sai_stats_count_mode_t;
typedef enum _sai_object_stage_t
{
/** Common stage */
SAI_OBJECT_STAGE_BOTH,
/** Ingress stage */
SAI_OBJECT_STAGE_INGRESS,
/** Egress stage */
SAI_OBJECT_STAGE_EGRESS
} sai_object_stage_t;
typedef enum _sai_health_data_type_t
{
/** General health data type */
SAI_HEALTH_DATA_TYPE_GENERAL,
/** SER health data type */
SAI_HEALTH_DATA_TYPE_SER
} sai_health_data_type_t;
typedef enum _sai_ser_type_t
{
/**
* @brief Unknown error type
*/
SAI_SER_TYPE_UNKNOWN = 0,
/**
* @brief Parity error
*/
SAI_SER_TYPE_PARITY = 1,
/**
* @brief ECC single bit error
*/
SAI_SER_TYPE_ECC_SINGLE_BIT = 2,
/**
* @brief ECC double bit error
*/
SAI_SER_TYPE_ECC_DOUBLE_BIT = 3,
} sai_ser_type_t;
typedef enum _sai_ser_correction_type_t
{
/**
* @brief SW takes no action when error happens
*/
SAI_SER_CORRECTION_TYPE_NO_ACTION = 0,
/**
* @brief SW tries to correct but fails
*/
SAI_SER_CORRECTION_TYPE_FAIL_TO_CORRECT = 1,
/**
* @brief SW writes NULL entry to clear the error
*/
SAI_SER_CORRECTION_TYPE_ENTRY_CLEAR = 2,
/**
* @brief Restore entry from SW cache
*/
SAI_SER_CORRECTION_TYPE_SW_CACHE_RESTORE = 3,
/**
* @brief Restore entry from HW cache
*/
SAI_SER_CORRECTION_TYPE_HW_CACHE_RESTORE = 4,
/**
* @brief Memory needs special correction handling
*/
SAI_SER_CORRECTION_TYPE_SPECIAL = 5,
} sai_ser_correction_type_t;
/**
* @brief SAI SER log information type
*
* @flags strict
*/
typedef enum _sai_ser_log_type_t
{
/**
* @brief Error happens on memory
*/
SAI_SER_LOG_TYPE_MEM = 1 << 0,
/**
* @brief Error happens on register
*/
SAI_SER_LOG_TYPE_REG = 1 << 1,
/**
* @brief Parity errors detected more than once
*/
SAI_SER_LOG_TYPE_MULTI = 1 << 2,
/**
* @brief Error corrected by SW
*/
SAI_SER_LOG_TYPE_CORRECTED = 1 << 3,
/**
* @brief Restore entry from HW cache
*/
SAI_SER_LOG_TYPE_ENTRY_INFO = 1 << 4,
/**
* @brief Cache data is valid
*/
SAI_SER_LOG_TYPE_CACHE = 1 << 5,
} sai_ser_log_type_t;
typedef struct _sai_ser_health_data_t
{
/** SER type specific fields */
sai_ser_type_t type;
/** SER correction type specific fields */
sai_ser_correction_type_t correction_type;
/**
* @brief SER correction log info (sai_ser_log_type_t)
*
* For example, if entry info is present and is coming from cache
* SAI_SER_LOG_TYPE_ENTRY_INFO | SAI_SER_LOG_TYPE_CACHE
*
* @flags sai_ser_log_type_t
*/
uint32_t ser_log_type;
} sai_ser_health_data_t;
/**
* @extraparam sai_health_data_type_t data_type
*/
typedef union _sai_health_data_t
{
/** @validonly data_type == SAI_HEALTH_DATA_TYPE_SER */
sai_ser_health_data_t ser;
} sai_health_data_t;
typedef struct _sai_switch_health_data_t
{
/** Type of switch health data */
sai_health_data_type_t data_type;
/** @passparam data_type */
sai_health_data_t data;
} sai_switch_health_data_t;
/**
* @}
*/
#endif /** __SAITYPES_H_ */