inc/saitunnel.h (239 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 saitunnel.h
*
* @brief This module defines SAI Tunnel interface
*/
#if !defined (__SAITUNNEL_H_)
#define __SAITUNNEL_H_
#include <saitypes.h>
/**
* @defgroup SAITUNNEL SAI - Next hop specific API definitions
*
* @{
*/
/**
* @brief Enum defining tunnel map types.
*/
typedef enum _sai_tunnel_map_type_t
{
/** TUNNEL Map overlay ECN to underlay ECN (only valid for encap) */
SAI_TUNNEL_MAP_TYPE_OECN_TO_UECN = 0x00000000,
/** TUNNEL Map underlay ECN and overlay ECN to overlay ECN (only valid for decap) */
SAI_TUNNEL_MAP_TYPE_UECN_OECN_TO_OECN = 0x00000001,
/** TUNNEL Map VNI to VLAN ID */
SAI_TUNNEL_MAP_TYPE_VNI_TO_VLAN_ID = 0x00000002,
/** TUNNEL Map VLAN ID to VNI */
SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VNI = 0x00000003,
/** TUNNEL Map VNI to Bridge IF */
SAI_TUNNEL_MAP_TYPE_VNI_TO_BRIDGE_IF = 0x00000004,
/** TUNNEL Map Bridge IF to VNI */
SAI_TUNNEL_MAP_TYPE_BRIDGE_IF_TO_VNI = 0x00000005,
/** TUNNEL Map VNI to Virtual Router ID */
SAI_TUNNEL_MAP_TYPE_VNI_TO_VIRTUAL_ROUTER_ID = 0x00000006,
/** TUNNEL Map Virtual Router ID to VNI */
SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI = 0x00000007,
/** TUNNEL Map VSID to VLAN ID */
SAI_TUNNEL_MAP_TYPE_VSID_TO_VLAN_ID = 0x00000008,
/** TUNNEL Map VLAN ID to VSID */
SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VSID = 0x00000009,
/** TUNNEL Map VSID to Bridge IF */
SAI_TUNNEL_MAP_TYPE_VSID_TO_BRIDGE_IF = 0x0000000a,
/** TUNNEL Map Bridge IF to VSID */
SAI_TUNNEL_MAP_TYPE_BRIDGE_IF_TO_VSID = 0x0000000b,
/** TUNNEL Map Virtual Router ID to SRV6 VPN SID */
SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VPN_SID = 0x0000000c,
/** TUNNEL Map Prefix Aggregation ID to SRV6 VPN SID */
SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_SRV6_VPN_SID = 0x0000000d,
/** Custom range base value */
SAI_TUNNEL_MAP_TYPE_CUSTOM_RANGE_BASE = 0x10000000
} sai_tunnel_map_type_t;
typedef enum _sai_tunnel_map_entry_attr_t
{
/**
* @brief Start of attributes
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_START = 0x00000000,
/**
* @brief Tunnel Map type
*
* @type sai_tunnel_map_type_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE = SAI_TUNNEL_MAP_ENTRY_ATTR_START,
/**
* @brief Tunnel map ex
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @objects SAI_OBJECT_TYPE_TUNNEL_MAP
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP = 0x00000001,
/**
* @brief Inner ECN key
*
* @type sai_uint8_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_OECN_TO_UECN or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_UECN_OECN_TO_OECN
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_OECN_KEY = 0x00000002,
/**
* @brief Inner ECN value
*
* @type sai_uint8_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_UECN_OECN_TO_OECN
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_OECN_VALUE = 0x00000003,
/**
* @brief Outer ECN key
*
* @type sai_uint8_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_UECN_OECN_TO_OECN
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_UECN_KEY = 0x00000004,
/**
* @brief Outer ECN value
*
* @type sai_uint8_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_OECN_TO_UECN
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_UECN_VALUE = 0x00000005,
/**
* @brief Vlan ID key
*
* @type sai_uint16_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @isvlan true
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VNI or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VSID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_VLAN_ID_KEY = 0x00000006,
/**
* @brief Vlan ID value
*
* @type sai_uint16_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @isvlan true
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VNI_TO_VLAN_ID or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VSID_TO_VLAN_ID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_VLAN_ID_VALUE = 0x00000007,
/**
* @brief VNI ID key
*
* @type sai_uint32_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VNI_TO_VLAN_ID or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VNI_TO_BRIDGE_IF or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VNI_TO_VIRTUAL_ROUTER_ID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_VNI_ID_KEY = 0x00000008,
/**
* @brief VNI ID value
*
* @type sai_uint32_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VNI or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_BRIDGE_IF_TO_VNI or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_VNI_ID_VALUE = 0x00000009,
/**
* @brief Bridge ID key
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @objects SAI_OBJECT_TYPE_BRIDGE
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_BRIDGE_IF_TO_VNI or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_BRIDGE_IF_TO_VSID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_BRIDGE_ID_KEY = 0x0000000a,
/**
* @brief Bridge ID value
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @objects SAI_OBJECT_TYPE_BRIDGE
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VNI_TO_BRIDGE_IF or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VSID_TO_BRIDGE_IF
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_BRIDGE_ID_VALUE = 0x0000000b,
/**
* @brief Virtual Router ID key
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @objects SAI_OBJECT_TYPE_VIRTUAL_ROUTER
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VPN_SID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_VIRTUAL_ROUTER_ID_KEY = 0x0000000c,
/**
* @brief Virtual Router ID value
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @objects SAI_OBJECT_TYPE_VIRTUAL_ROUTER
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VNI_TO_VIRTUAL_ROUTER_ID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_VIRTUAL_ROUTER_ID_VALUE = 0x0000000d,
/**
* @brief VSID ID key
*
* @type sai_uint32_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VSID_TO_VLAN_ID or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VSID_TO_BRIDGE_IF
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_VSID_ID_KEY = 0x0000000e,
/**
* @brief VSID ID value
*
* @type sai_uint32_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VSID or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_BRIDGE_IF_TO_VSID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_VSID_ID_VALUE = 0x0000000f,
/**
* @brief Prefix Aggregation ID key
*
* @type sai_uint32_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_SRV6_VPN_SID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_PREFIX_AGG_ID_KEY = 0x00000010,
/**
* @brief SRV6 VPN SID
*
* @type sai_ip6_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_SRV6_VPN_SID or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VPN_SID
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_SRV6_VPN_SID_VALUE = 0x00000011,
/**
* @brief End of attributes
*/
SAI_TUNNEL_MAP_ENTRY_ATTR_END,
/** Custom range base value */
SAI_TUNNEL_MAP_ENTRY_ATTR_CUSTOM_RANGE_START = 0x10000000,
/** End of custom range base */
SAI_TUNNEL_MAP_ENTRY_ATTR_CUSTOM_RANGE_END
} sai_tunnel_map_entry_attr_t;
/**
* @brief Defines tunnel map attributes
*/
typedef enum _sai_tunnel_map_attr_t
{
/**
* @brief Start of attributes
*/
SAI_TUNNEL_MAP_ATTR_START = 0x00000000,
/**
* @brief Tunnel Map type
*
* @type sai_tunnel_map_type_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
*/
SAI_TUNNEL_MAP_ATTR_TYPE = SAI_TUNNEL_MAP_ATTR_START,
/**
* @brief Tunnel map entries associated with this map.
*
* @type sai_object_list_t
* @flags READ_ONLY
* @objects SAI_OBJECT_TYPE_TUNNEL_MAP_ENTRY
*/
SAI_TUNNEL_MAP_ATTR_ENTRY_LIST,
/**
* @brief End of attributes
*/
SAI_TUNNEL_MAP_ATTR_END,
/** Custom range base value */
SAI_TUNNEL_MAP_ATTR_CUSTOM_RANGE_START = 0x10000000,
/** End of custom range base */
SAI_TUNNEL_MAP_ATTR_CUSTOM_RANGE_END
} sai_tunnel_map_attr_t;
/**
* @brief Create tunnel Map
*
* @param[out] tunnel_map_id Tunnel Map Id
* @param[in] switch_id Switch 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_tunnel_map_fn)(
_Out_ sai_object_id_t *tunnel_map_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
/**
* @brief Remove tunnel Map
*
* @param[in] tunnel_map_id Tunnel Map id to be removed
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_remove_tunnel_map_fn)(
_In_ sai_object_id_t tunnel_map_id);
/**
* @brief Set attributes for tunnel map
*
* @param[in] tunnel_map_id Tunnel Map Id
* @param[in] attr Attribute to set
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_set_tunnel_map_attribute_fn)(
_In_ sai_object_id_t tunnel_map_id,
_In_ const sai_attribute_t *attr);
/**
* @brief Get attributes of tunnel map
*
* @param[in] tunnel_map_id Tunnel map 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_tunnel_map_attribute_fn)(
_In_ sai_object_id_t tunnel_map_id,
_In_ uint32_t attr_count,
_Inout_ sai_attribute_t *attr_list);
/**
* @brief Defines tunnel TTL mode
*/
typedef enum _sai_tunnel_ttl_mode_t
{
/**
* @brief The uniform model
*
* Where the TTL field is preserved end-to-end by copying into the outer
* header on encapsulation and copying from the outer header on
* decapsulation. This is applicable for inner IP packets. If the inner
* packet is a non-IP packet, then the value is undefined and implementation
* can chose a valid/meaningful outer TTL value, say in the case of VXLAN encap.
*/
SAI_TUNNEL_TTL_MODE_UNIFORM_MODEL,
/**
* @brief The pipe model
*
* Where the outer header is independent of that in the inner header so
* it hides the TTL field of the inner header from any interaction
* with nodes along the tunnel.
*
* TTL field is user-defined for outer header on encapsulation. TTL
* field of inner header remains the same on decapsulation.
*/
SAI_TUNNEL_TTL_MODE_PIPE_MODEL
} sai_tunnel_ttl_mode_t;
/**
* @brief Defines tunnel DSCP mode
*/
typedef enum _sai_tunnel_dscp_mode_t
{
/**
* @brief The uniform model
*
* Where the DSCP field is preserved end-to-end by copying into the
* outer header on encapsulation and copying from the outer header on
* decapsulation. This is applicable for inner IP packets. If the inner
* packet is a non-IP packet, then the value is undefined and implementation
* can chose a valid/meaningful outer DSCP value, say in the case of VXLAN encap.
*/
SAI_TUNNEL_DSCP_MODE_UNIFORM_MODEL,
/**
* @brief The pipe model
*
* Where the outer header is independent of that in the inner header so
* it hides the DSCP field of the inner header from any interaction
* with nodes along the tunnel.
*
* DSCP field is user-defined for outer header on encapsulation. DSCP
* field of inner header remains the same on decapsulation.
*/
SAI_TUNNEL_DSCP_MODE_PIPE_MODEL
} sai_tunnel_dscp_mode_t;
/**
* @brief Defines tunnel peer mode
*/
typedef enum _sai_tunnel_peer_mode_t
{
/**
* @brief P2P Tunnel
*/
SAI_TUNNEL_PEER_MODE_P2P,
/**
* @brief P2MP Tunnel
*/
SAI_TUNNEL_PEER_MODE_P2MP,
} sai_tunnel_peer_mode_t;
/**
* @brief Defines tunnel attributes
*/
typedef enum _sai_tunnel_attr_t
{
/**
* @brief Start of attributes
*/
SAI_TUNNEL_ATTR_START,
/**
* @brief Tunnel type
*
* @type sai_tunnel_type_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @isresourcetype true
*/
SAI_TUNNEL_ATTR_TYPE = SAI_TUNNEL_ATTR_START,
/**
* @brief Tunnel underlay interface
*
* Underlay interface is router interface when conditions are met.
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @objects SAI_OBJECT_TYPE_ROUTER_INTERFACE
* @condition SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP_GRE or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_VXLAN or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_SRV6 or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_NVGRE or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP_ESP or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP_UDP_ESP or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_VXLAN_UDP_ESP
*/
SAI_TUNNEL_ATTR_UNDERLAY_INTERFACE,
/**
* @brief Tunnel overlay interface
*
* Overlay interface is router interface when conditions are met.
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @objects SAI_OBJECT_TYPE_ROUTER_INTERFACE
* @condition SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP_GRE or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP_ESP or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP_UDP_ESP
*/
SAI_TUNNEL_ATTR_OVERLAY_INTERFACE,
/* Tunnel encap attributes */
/**
* @brief Tunnel Peer Mode
*
* @type sai_tunnel_peer_mode_t
* @flags CREATE_ONLY
* @default SAI_TUNNEL_PEER_MODE_P2MP
*/
SAI_TUNNEL_ATTR_PEER_MODE,
/**
* @brief Tunnel src IP
*
* @type sai_ip_address_t
* @flags CREATE_ONLY
* @default 0.0.0.0
*/
SAI_TUNNEL_ATTR_ENCAP_SRC_IP,
/**
* @brief Tunnel Destination IP
*
* @type sai_ip_address_t
* @flags CREATE_ONLY
* @default 0.0.0.0
* @validonly SAI_TUNNEL_ATTR_PEER_MODE == SAI_TUNNEL_PEER_MODE_P2P
*/
SAI_TUNNEL_ATTR_ENCAP_DST_IP,
/**
* @brief Tunnel TTL mode (pipe or uniform model)
*
* @type sai_tunnel_ttl_mode_t
* @flags CREATE_AND_SET
* @default SAI_TUNNEL_TTL_MODE_UNIFORM_MODEL
*/
SAI_TUNNEL_ATTR_ENCAP_TTL_MODE,
/**
* @brief Tunnel TTL value
*
* @type sai_uint8_t
* @flags CREATE_AND_SET
* @default 255
* @validonly SAI_TUNNEL_ATTR_ENCAP_TTL_MODE == SAI_TUNNEL_TTL_MODE_PIPE_MODEL
*/
SAI_TUNNEL_ATTR_ENCAP_TTL_VAL,
/**
* @brief Tunnel DSCP mode (pipe or uniform model)
*
* @type sai_tunnel_dscp_mode_t
* @flags CREATE_AND_SET
* @default SAI_TUNNEL_DSCP_MODE_UNIFORM_MODEL
*/
SAI_TUNNEL_ATTR_ENCAP_DSCP_MODE,
/**
* @brief Tunnel DSCP value (6 bits)
*
* @type sai_uint8_t
* @flags CREATE_AND_SET
* @default 0
* @validonly SAI_TUNNEL_ATTR_ENCAP_DSCP_MODE == SAI_TUNNEL_DSCP_MODE_PIPE_MODEL
*/
SAI_TUNNEL_ATTR_ENCAP_DSCP_VAL,
/**
* @brief Tunnel GRE key valid
*
* @type bool
* @flags CREATE_ONLY
* @default false
*/
SAI_TUNNEL_ATTR_ENCAP_GRE_KEY_VALID,
/**
* @brief Tunnel GRE key
*
* @type sai_uint32_t
* @flags CREATE_AND_SET
* @default 0
* @validonly SAI_TUNNEL_ATTR_ENCAP_GRE_KEY_VALID == true
*/
SAI_TUNNEL_ATTR_ENCAP_GRE_KEY,
/**
* @brief Tunnel encap ECN mode
*
* @type sai_tunnel_encap_ecn_mode_t
* @flags CREATE_ONLY
* @default SAI_TUNNEL_ENCAP_ECN_MODE_STANDARD
*/
SAI_TUNNEL_ATTR_ENCAP_ECN_MODE,
/**
* @brief Tunnel encap mappers
*
* @type sai_object_list_t
* @flags CREATE_ONLY
* @objects SAI_OBJECT_TYPE_TUNNEL_MAP
* @default empty
*/
SAI_TUNNEL_ATTR_ENCAP_MAPPERS,
/* Tunnel decap attributes */
/**
* @brief Tunnel decap ECN mode
*
* @type sai_tunnel_decap_ecn_mode_t
* @flags CREATE_ONLY
* @default SAI_TUNNEL_DECAP_ECN_MODE_STANDARD
*/
SAI_TUNNEL_ATTR_DECAP_ECN_MODE,
/**
* @brief Tunnel decap mappers
*
* @type sai_object_list_t
* @flags CREATE_ONLY
* @objects SAI_OBJECT_TYPE_TUNNEL_MAP
* @default empty
*/
SAI_TUNNEL_ATTR_DECAP_MAPPERS,
/**
* @brief Tunnel TTL mode (pipe or uniform model)
*
* @type sai_tunnel_ttl_mode_t
* @flags CREATE_AND_SET
* @default SAI_TUNNEL_TTL_MODE_UNIFORM_MODEL
*/
SAI_TUNNEL_ATTR_DECAP_TTL_MODE,
/**
* @brief Tunnel DSCP mode (pipe or uniform model)
*
* @type sai_tunnel_dscp_mode_t
* @flags CREATE_AND_SET
* @default SAI_TUNNEL_DSCP_MODE_UNIFORM_MODEL
*/
SAI_TUNNEL_ATTR_DECAP_DSCP_MODE,
/**
* @brief Tunnel term table entries associated with this tunnel.
*
* @type sai_object_list_t
* @flags READ_ONLY
* @objects SAI_OBJECT_TYPE_TUNNEL_TERM_TABLE_ENTRY
*/
SAI_TUNNEL_ATTR_TERM_TABLE_ENTRY_LIST,
/**
* @brief Packet action when a packet ingress and gets routed back to same tunnel
*
* @type sai_packet_action_t
* @flags CREATE_AND_SET
* @default SAI_PACKET_ACTION_FORWARD
* @isresourcetype true
*/
SAI_TUNNEL_ATTR_LOOPBACK_PACKET_ACTION,
/**
* @brief Tunnel VXLAN UDP source port mode
*
* @type sai_tunnel_vxlan_udp_sport_mode_t
* @flags CREATE_AND_SET
* @default SAI_TUNNEL_VXLAN_UDP_SPORT_MODE_EPHEMERAL
*/
SAI_TUNNEL_ATTR_VXLAN_UDP_SPORT_MODE,
/**
* @brief Tunnel UDP source port
*
* @type sai_uint16_t
* @flags CREATE_AND_SET
* @isvlan false
* @default 0
* @validonly SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_VXLAN and SAI_TUNNEL_ATTR_VXLAN_UDP_SPORT_MODE == SAI_TUNNEL_VXLAN_UDP_SPORT_MODE_USER_DEFINED
*/
SAI_TUNNEL_ATTR_VXLAN_UDP_SPORT,
/**
* @brief Tunnel UDP source port mask
*
* Sport mask defining the number of least significant bits
* reserved for the calculated hash value. 0 means a fixed value.
*
* @type sai_uint8_t
* @flags CREATE_AND_SET
* @isvlan false
* @default 0
* @validonly SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_VXLAN and SAI_TUNNEL_ATTR_VXLAN_UDP_SPORT_MODE == SAI_TUNNEL_VXLAN_UDP_SPORT_MODE_USER_DEFINED
*/
SAI_TUNNEL_ATTR_VXLAN_UDP_SPORT_MASK,
/**
* @brief IPsec encryption SA index
*
* Index to bind an egress IPsec SA to a tunnel.
*
* @type sai_uint32_t
* @flags CREATE_AND_SET
* @default 0
* @validonly SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP_ESP or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_IPINIP_UDP_ESP or SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_VXLAN_UDP_ESP
*/
SAI_TUNNEL_ATTR_SA_INDEX,
/**
* @brief List of ports that are programmed with SAs for this IPsec tunnel.
* Useful only when IPsec is implemented in a PHY Chip (different sai_switch
* object).
*
* For IPsec hardware in the Switch ASIC, the per-tunnel port list can be
* derived from the union of SAI_IPSEC_SA_ATTR_IPSEC_PORT_LIST for all
* sai_ipsec_sa objects for that tunnel.
*
* @type sai_object_list_t
* @flags CREATE_AND_SET
* @objects SAI_OBJECT_TYPE_PORT
* @default empty
*/
SAI_TUNNEL_ATTR_IPSEC_SA_PORT_LIST,
/**
* @brief Enable TC AND COLOR -> DSCP MAP on tunnel at encapsulation (access-to-network) node to remark the DSCP in tunnel header
*
* @type sai_object_id_t
* @flags CREATE_AND_SET
* @objects SAI_OBJECT_TYPE_QOS_MAP
* @allownull true
* @default SAI_NULL_OBJECT_ID
*/
SAI_TUNNEL_ATTR_ENCAP_QOS_TC_AND_COLOR_TO_DSCP_MAP,
/**
* @brief Enable TC -> Queue MAP on tunnel encap
*
* Map id = #SAI_NULL_OBJECT_ID to disable map on tunnel.
* Default no map, i.e. packets are queued with static mapping.
*
* @type sai_object_id_t
* @flags CREATE_AND_SET
* @objects SAI_OBJECT_TYPE_QOS_MAP
* @allownull true
* @default SAI_NULL_OBJECT_ID
*/
SAI_TUNNEL_ATTR_ENCAP_QOS_TC_TO_QUEUE_MAP,
/**
* @brief Enable DSCP -> TC MAP on tunnel at termination (Network-to-access) node. This map if configured overrides the port MAP
*
* @type sai_object_id_t
* @flags CREATE_AND_SET
* @objects SAI_OBJECT_TYPE_QOS_MAP
* @allownull true
* @default SAI_NULL_OBJECT_ID
*/
SAI_TUNNEL_ATTR_DECAP_QOS_DSCP_TO_TC_MAP,
/**
* @brief Enable TC -> Priority Group MAP. TC is derived from the tunnel MAP
*
* Map id = #SAI_NULL_OBJECT_ID to disable map on port.
* Default no map
*
* @type sai_object_id_t
* @flags CREATE_AND_SET
* @objects SAI_OBJECT_TYPE_QOS_MAP
* @allownull true
* @default SAI_NULL_OBJECT_ID
*/
SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP,
/**
* @brief Drop tunnel packets with not allowed UDP source port
*
* Upon enabling this feature, if the tunnel packet ingresses with
* UDP source port outside of range defined for this tunnel, it
* will be dropped.
*
* @type bool
* @flags CREATE_AND_SET
* @default false
* @validonly SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_VXLAN and SAI_TUNNEL_ATTR_VXLAN_UDP_SPORT_MODE == SAI_TUNNEL_VXLAN_UDP_SPORT_MODE_USER_DEFINED
*/
SAI_TUNNEL_ATTR_VXLAN_UDP_SPORT_SECURITY,
/**
* @brief Set tunnel statistics counting mode
*
* @type sai_stats_count_mode_t
* @flags CREATE_AND_SET
* @default SAI_STATS_COUNT_MODE_PACKET_AND_BYTE
*/
SAI_TUNNEL_ATTR_STATS_COUNT_MODE,
/**
* @brief Attach counter object list
*
* Counter object should be of type Selective.
* Fill (#SAI_COUNTER_ATTR_TYPE with #SAI_COUNTER_TYPE_SELECTIVE).
*
* @type sai_object_list_t
* @flags CREATE_AND_SET
* @objects SAI_OBJECT_TYPE_COUNTER
* @default empty
*/
SAI_TUNNEL_ATTR_SELECTIVE_COUNTER_LIST,
/**
* @brief End of attributes
*/
SAI_TUNNEL_ATTR_END,
/** Custom range base value */
SAI_TUNNEL_ATTR_CUSTOM_RANGE_START = 0x10000000,
/** End of custom range base */
SAI_TUNNEL_ATTR_CUSTOM_RANGE_END
} sai_tunnel_attr_t;
/**
* @brief Tunnel counter IDs in sai_get_tunnel_stats() call
*/
typedef enum _sai_tunnel_stat_t
{
/** Ingress byte stat count */
SAI_TUNNEL_STAT_IN_OCTETS,
/** Ingress packet stat count */
SAI_TUNNEL_STAT_IN_PACKETS,
/** Egress byte stat count */
SAI_TUNNEL_STAT_OUT_OCTETS,
/** Egress packet stat count */
SAI_TUNNEL_STAT_OUT_PACKETS
} sai_tunnel_stat_t;
/**
* @brief Create tunnel
*
* @param[out] tunnel_id Tunnel id
* @param[in] switch_id Switch 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_tunnel_fn)(
_Out_ sai_object_id_t *tunnel_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
/**
* @brief Remove tunnel
*
* @param[in] tunnel_id Tunnel id
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_remove_tunnel_fn)(
_In_ sai_object_id_t tunnel_id);
/**
* @brief Set tunnel attribute
*
* @param[in] tunnel_id Tunnel id
* @param[in] attr Attribute
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_set_tunnel_attribute_fn)(
_In_ sai_object_id_t tunnel_id,
_In_ const sai_attribute_t *attr);
/**
* @brief Get tunnel attributes
*
* @param[in] tunnel_id Tunnel 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_tunnel_attribute_fn)(
_In_ sai_object_id_t tunnel_id,
_In_ uint32_t attr_count,
_Inout_ sai_attribute_t *attr_list);
/**
* @brief Get tunnel statistics counters. Deprecated for backward compatibility.
*
* @param[in] tunnel_id Tunnel id
* @param[in] number_of_counters Number of counters in the array
* @param[in] counter_ids Specifies the array of counter ids
* @param[out] counters Array of resulting counter values.
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_get_tunnel_stats_fn)(
_In_ sai_object_id_t tunnel_id,
_In_ uint32_t number_of_counters,
_In_ const sai_stat_id_t *counter_ids,
_Out_ uint64_t *counters);
/**
* @brief Get tunnel statistics counters extended.
*
* @param[in] tunnel_id Tunnel id
* @param[in] number_of_counters Number of counters in the array
* @param[in] counter_ids Specifies the array of counter ids
* @param[in] mode Statistics mode
* @param[out] counters Array of resulting counter values.
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_get_tunnel_stats_ext_fn)(
_In_ sai_object_id_t tunnel_id,
_In_ uint32_t number_of_counters,
_In_ const sai_stat_id_t *counter_ids,
_In_ sai_stats_mode_t mode,
_Out_ uint64_t *counters);
/**
* @brief Clear tunnel statistics counters.
*
* @param[in] tunnel_id Tunnel id
* @param[in] number_of_counters Number of counters in the array
* @param[in] counter_ids Specifies the array of counter ids
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_clear_tunnel_stats_fn)(
_In_ sai_object_id_t tunnel_id,
_In_ uint32_t number_of_counters,
_In_ const sai_stat_id_t *counter_ids);
/**
* @brief Defines tunnel termination table entry type
*/
typedef enum _sai_tunnel_term_table_entry_type_t
{
/** Tunnel termination table point to point entry match on dst & src IP & tunnel type */
SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2P,
/** Tunnel termination table destination point to multi point source entry match on dst IP & src IP+mask & tunnel type */
SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2MP,
/** Tunnel termination table multi point destination to point source entry match on dst IP+mask & src IP & tunnel type */
SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2P,
/** Tunnel termination table multi point to multi point entry match on dst IP+mask & src IP+mask & tunnel type */
SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2MP,
} sai_tunnel_term_table_entry_type_t;
/**
* @brief Defines tunnel termination table entry attributes
*/
typedef enum _sai_tunnel_term_table_entry_attr_t
{
/**
* @brief Start of attributes
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_START,
/**
* @brief Tunnel virtual router id
* This attribute is deprecated and removed from
* the termination entry key
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_AND_SET
* @objects SAI_OBJECT_TYPE_VIRTUAL_ROUTER
* @deprecated true
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_VR_ID = SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_START,
/**
* @brief Tunnel entry type
*
* @type sai_tunnel_term_table_entry_type_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE,
/**
* @brief Tunnel termination IP address
*
* @type sai_ip_address_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE == SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2P or SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE == SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2MP
* @relaxed true
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_DST_IP,
/**
* @brief Tunnel termination IP address mask
*
* @type sai_ip_address_t
* @flags CREATE_ONLY
* @default 0.0.0.0
* @validonly SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE == SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2P or SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE == SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2MP
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_DST_IP_MASK,
/**
* @brief Tunnel source IP address
*
* @type sai_ip_address_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @condition SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE == SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2P or SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE == SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2P
* @relaxed true
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_SRC_IP,
/**
* @brief Tunnel source IP address mask
*
* @type sai_ip_address_t
* @flags CREATE_ONLY
* @default 0.0.0.0
* @validonly SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE == SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2MP or SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TYPE == SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2MP
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_SRC_IP_MASK,
/**
* @brief Tunnel type
*
* @type sai_tunnel_type_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_TUNNEL_TYPE,
/**
* @brief Tunnel id to be use for decap
*
* @type sai_object_id_t
* @flags MANDATORY_ON_CREATE | CREATE_ONLY
* @objects SAI_OBJECT_TYPE_TUNNEL
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_ACTION_TUNNEL_ID,
/** READ-ONLY */
/**
* @brief Tunnel term table entry IP address family
*
* @type sai_ip_addr_family_t
* @flags READ_ONLY
* @isresourcetype true
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_IP_ADDR_FAMILY,
/**
* @brief IPsec packet verified by hardware Security Engine. Valid only for
* tunnel type SAI_TUNNEL_TYPE_IPINIP_ESP, SAI_TUNNEL_TYPE_IPINIP_UDP_ESP
* or SAI_TUNNEL_TYPE_VXLAN_UDP_ESP
*
* @type bool
* @flags CREATE_AND_SET
* @default true
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_IPSEC_VERIFIED,
/**
* @brief Priority
*
* Value must be in the range defined in
* \[#SAI_SWITCH_ATTR_TUNNEL_TERM_TABLE_ENTRY_MINIMUM_PRIORITY,
* #SAI_SWITCH_ATTR_TUNNEL_TERM_TABLE_ENTRY_MAXIMUM_PRIORITY\]
* (default = #SAI_SWITCH_ATTR_TUNNEL_TERM_TABLE_ENTRY_MINIMUM_PRIORITY)
* higher value in priority equals higher priority
*
* @type sai_uint32_t
* @flags CREATE_AND_SET
* @default 0
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_PRIORITY,
/**
* @brief End of attributes
*/
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_END,
/** Custom range base value */
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_CUSTOM_RANGE_START = 0x10000000,
/** Enc of custom range base */
SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_CUSTOM_RANGE_END
} sai_tunnel_term_table_entry_attr_t;
/**
* @brief Create tunnel termination table entry
*
* @param[out] tunnel_term_table_entry_id Tunnel termination table entry id
* @param[in] switch_id Switch 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_tunnel_term_table_entry_fn)(
_Out_ sai_object_id_t *tunnel_term_table_entry_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
/**
* @brief Remove tunnel termination table entry
*
* @param[in] tunnel_term_table_entry_id Tunnel termination table entry id
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_remove_tunnel_term_table_entry_fn)(
_In_ sai_object_id_t tunnel_term_table_entry_id);
/**
* @brief Set tunnel termination table entry attribute
*
* @param[in] tunnel_term_table_entry_id Tunnel termination table entry id
* @param[in] attr Attribute
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_set_tunnel_term_table_entry_attribute_fn)(
_In_ sai_object_id_t tunnel_term_table_entry_id,
_In_ const sai_attribute_t *attr);
/**
* @brief Get tunnel termination table entry attributes
*
* @param[in] tunnel_term_table_entry_id Tunnel termination table entry 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_tunnel_term_table_entry_attribute_fn)(
_In_ sai_object_id_t tunnel_term_table_entry_id,
_In_ uint32_t attr_count,
_Inout_ sai_attribute_t *attr_list);
/**
* @brief Create tunnel map item
*
* @param[out] tunnel_map_entry_id Tunnel map item id
* @param[in] switch_id Switch 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_tunnel_map_entry_fn)(
_Out_ sai_object_id_t *tunnel_map_entry_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
/**
* @brief Remove tunnel map item
*
* @param[in] tunnel_map_entry_id Tunnel map item id
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_remove_tunnel_map_entry_fn)(
_In_ sai_object_id_t tunnel_map_entry_id);
/**
* @brief Set tunnel map item attribute
*
* @param[in] tunnel_map_entry_id Tunnel map item id
* @param[in] attr Attribute
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
typedef sai_status_t (*sai_set_tunnel_map_entry_attribute_fn)(
_In_ sai_object_id_t tunnel_map_entry_id,
_In_ const sai_attribute_t *attr);
/**
* @brief Get tunnel map item attributes
*
* @param[in] tunnel_map_entry_id Tunnel map item 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_tunnel_map_entry_attribute_fn)(
_In_ sai_object_id_t tunnel_map_entry_id,
_In_ uint32_t attr_count,
_Inout_ sai_attribute_t *attr_list);
/**
* @brief Tunnel methods table retrieved with sai_api_query()
*/
typedef struct _sai_tunnel_api_t
{
sai_create_tunnel_map_fn create_tunnel_map;
sai_remove_tunnel_map_fn remove_tunnel_map;
sai_set_tunnel_map_attribute_fn set_tunnel_map_attribute;
sai_get_tunnel_map_attribute_fn get_tunnel_map_attribute;
sai_create_tunnel_fn create_tunnel;
sai_remove_tunnel_fn remove_tunnel;
sai_set_tunnel_attribute_fn set_tunnel_attribute;
sai_get_tunnel_attribute_fn get_tunnel_attribute;
sai_get_tunnel_stats_fn get_tunnel_stats;
sai_get_tunnel_stats_ext_fn get_tunnel_stats_ext;
sai_clear_tunnel_stats_fn clear_tunnel_stats;
sai_create_tunnel_term_table_entry_fn create_tunnel_term_table_entry;
sai_remove_tunnel_term_table_entry_fn remove_tunnel_term_table_entry;
sai_set_tunnel_term_table_entry_attribute_fn set_tunnel_term_table_entry_attribute;
sai_get_tunnel_term_table_entry_attribute_fn get_tunnel_term_table_entry_attribute;
sai_create_tunnel_map_entry_fn create_tunnel_map_entry;
sai_remove_tunnel_map_entry_fn remove_tunnel_map_entry;
sai_set_tunnel_map_entry_attribute_fn set_tunnel_map_entry_attribute;
sai_get_tunnel_map_entry_attribute_fn get_tunnel_map_entry_attribute;
sai_bulk_object_create_fn create_tunnels;
sai_bulk_object_remove_fn remove_tunnels;
sai_bulk_object_set_attribute_fn set_tunnels_attribute;
sai_bulk_object_get_attribute_fn get_tunnels_attribute;
} sai_tunnel_api_t;
/**
* @}
*/
#endif /** __SAITUNNEL_H_ */