diff --git a/doc/SAI-IPv6-Segment-Routing-VPN.md b/doc/SAI-IPv6-Segment-Routing-VPN.md index 316e4fe33..d01848b1c 100644 --- a/doc/SAI-IPv6-Segment-Routing-VPN.md +++ b/doc/SAI-IPv6-Segment-Routing-VPN.md @@ -664,6 +664,249 @@ has a NULL object id for SID-list. saistatus = sai_route_api->create_route(&route_entry, 2, route_entry_attrs); ``` +## SRv6 SID Marking Feature + +This section describes the SID Marking feature for SRv6 VPN, which enables VPN SIDs to carry QoS and policy information derived from packet classification. Two new tunnel map types support SID Marking by allowing VPN SID selection based on forwarding class and hierarchical policy lookup. + +### Forwarding Class Derivation + +The forwarding class used for SID Marking is derived from packet classification through one of the following mechanisms: + +1. **QoS Map Classification**: Use `SAI_QOS_MAP_TYPE_DSCP_TO_FORWARDING_CLASS` to map incoming packet DSCP values to forwarding class values. The QoS map is attached to the ingress port. + +2. **ACL Classification**: Use `SAI_ACL_ENTRY_ATTR_ACTION_SET_FORWARDING_CLASS` ACL action to set the forwarding class based on ACL match criteria, providing flexible classification beyond DSCP. + +### Hierarchical Lookup Flow + +When using hierarchical SID Marking with `PREFIX_AGG_ID_TO_TUNNEL_MAP_ID`, the logical lookup proceeds as follows: + +``` +Route Entry (with Prefix Aggregation ID) + │ + ▼ +First Tunnel Map (PREFIX_AGG_ID_TO_TUNNEL_MAP_ID) + │ Key: Prefix Aggregation ID + │ Value: Second Tunnel Map OID + ▼ +Second Tunnel Map (FORWARDING_CLASS_TO_SRV6_VPN_SID) + │ Key: Forwarding Class (from QoS Map or ACL) + │ Value: VPN SID + ▼ +Final VPN SID for encapsulation +``` + +This two-level indirection enables per-destination, per-QoS-class VPN SID selection, allowing different traffic classes to the same destination to use different VPN SIDs. + +**Note:** While the SAI API models this as a two-level lookup, implementations are likely to collapse the hierarchical lookup into a single lookup using a composite key (e.g., Prefix Aggregation ID + Forwarding Class) for efficiency. + +### SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID + +#### Overview + +The `SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID` tunnel map type implements the core SID Marking capability. It enables VPN SIDs to be marked with QoS information by selecting different VPN SIDs based on forwarding class. The marked VPN SID carries the QoS information end-to-end through the SRv6 network. + +#### Tunnel Map Entry Attributes + +```c +typedef enum _sai_tunnel_map_entry_attr_t +{ + // ... + // + // ... + + /** + * @brief Forwarding Class key + * + * @type sai_uint32_t + * @flags MANDATORY_ON_CREATE | CREATE_ONLY + * @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID + */ + SAI_TUNNEL_MAP_ENTRY_ATTR_FORWARDING_CLASS_KEY = 0x00000013, + + /** + * @brief SRv6 VPN SID value + * + * @type sai_ip6_t + * @flags MANDATORY_ON_CREATE | CREATE_ONLY + * @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID + */ + SAI_TUNNEL_MAP_ENTRY_ATTR_SRV6_VPN_SID_VALUE = 0x00000011, + + // ... + // + // ... +} sai_tunnel_map_entry_attr_t; +``` + +### SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_TUNNEL_MAP_ID + +#### Overview + +The `SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_TUNNEL_MAP_ID` tunnel map type enables hierarchical, two-level lookup for VPN SID selection. The first level maps a prefix aggregation ID to a second tunnel map, which then maps forwarding class to VPN SID. This allows combining prefix-based routing with QoS-aware SID Marking. + +#### Tunnel Map Entry Attributes + +```c +typedef enum _sai_tunnel_map_entry_attr_t +{ + // ... + // + // ... + + /** + * @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_TUNNEL_MAP_ID + */ + SAI_TUNNEL_MAP_ENTRY_ATTR_PREFIX_AGG_ID_KEY = 0x00000010, + + /** + * @brief Tunnel Map ID value + * + * @type sai_object_id_t + * @flags MANDATORY_ON_CREATE | CREATE_ONLY + * @objects SAI_OBJECT_TYPE_TUNNEL_MAP + * @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_TUNNEL_MAP_ID + */ + SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_ID_VALUE = 0x00000012, + + // ... + // + // ... +} sai_tunnel_map_entry_attr_t; +``` + +### SID Marking Programming Example + +The following example demonstrates SID Marking where traffic uses different VPN SIDs based on forwarding class. + +```c + // 1. Create QoS Map to derive forwarding class from DSCP (on ingress port) + // This step configures SAI_QOS_MAP_TYPE_DSCP_TO_FORWARDING_CLASS + // (QoS map creation omitted for brevity) + + // 2. Create the tunnel map (Forwarding Class -> VPN SID) + tunnel_map_attrs[0].id = SAI_TUNNEL_MAP_ATTR_TYPE; + tunnel_map_attrs[0].value.s32 = SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID; + saistatus = sai_tunnel_api->create_tunnel_map(&fc_to_sid_map, switch_id, 1, tunnel_map_attrs); + + // 2.1 Create tunnel map entries for each forwarding class + // Forwarding Class 0x0 -> VPN SID + tunnel_map_entry_attrs[0].id = SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE; + tunnel_map_entry_attrs[0].value.s32 = SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID; + tunnel_map_entry_attrs[1].id = SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP; + tunnel_map_entry_attrs[1].value.oid = fc_to_sid_map; + tunnel_map_entry_attrs[2].id = SAI_TUNNEL_MAP_ENTRY_ATTR_FORWARDING_CLASS_KEY; + tunnel_map_entry_attrs[2].value.u32 = 0x0; + tunnel_map_entry_attrs[3].id = SAI_TUNNEL_MAP_ENTRY_ATTR_SRV6_VPN_SID_VALUE; + CONVERT_STR_TO_IPV6(tunnel_map_entry_attrs[3].value.ip6, "fd00:205:2007:fff0:30::"); + saistatus = sai_tunnel_api->create_tunnel_map_entry(&fc0_entry, switch_id, 4, tunnel_map_entry_attrs); + + // Forwarding Class 0x8 -> VPN SID + tunnel_map_entry_attrs[2].value.u32 = 0x8; + CONVERT_STR_TO_IPV6(tunnel_map_entry_attrs[3].value.ip6, "fd00:205:2007:fff0:38::"); + saistatus = sai_tunnel_api->create_tunnel_map_entry(&fc8_entry, switch_id, 4, tunnel_map_entry_attrs); + + // Forwarding Class 0xf -> VPN SID + tunnel_map_entry_attrs[2].value.u32 = 0xf; + CONVERT_STR_TO_IPV6(tunnel_map_entry_attrs[3].value.ip6, "fd00:205:2007:fff0:3f::"); + saistatus = sai_tunnel_api->create_tunnel_map_entry(&fcf_entry, switch_id, 4, tunnel_map_entry_attrs); + + // 3. Create SRv6 tunnel with the FC->SID encap mapper + tunnel_entry_attrs[0].id = SAI_TUNNEL_ATTR_TYPE; + tunnel_entry_attrs[0].value.s32 = SAI_TUNNEL_TYPE_SRV6; + tunnel_entry_attrs[1].id = SAI_TUNNEL_ATTR_ENCAP_SRC_IP; + CONVERT_STR_TO_IPV6(tunnel_entry_attrs[1].value.ip6, "fd00:205:2007::1"); + tunnel_entry_attrs[2].id = SAI_TUNNEL_ATTR_UNDERLAY_INTERFACE; + tunnel_entry_attrs[2].value.oid = underlay_rif; + tunnel_entry_attrs[3].id = SAI_TUNNEL_ATTR_ENCAP_MAPPERS; + tunnel_entry_attrs[3].value.objlist.count = 1; + tunnel_entry_attrs[3].value.objlist.list[0] = fc_to_sid_map; + tunnel_entry_attrs[4].id = SAI_TUNNEL_ATTR_PEER_MODE; + tunnel_entry_attrs[4].value.s32 = SAI_TUNNEL_PEER_MODE_P2P; + tunnel_entry_attrs[5].id = SAI_TUNNEL_ATTR_ENCAP_DST_IP; + CONVERT_STR_TO_IPV6(tunnel_entry_attrs[5].value.ip6, "fd00:205:2007::21"); + saistatus = sai_tunnel_api->create_tunnel(&srv6_tunnel_id, switch_id, 6, tunnel_entry_attrs); + + // 4. Create SRv6 nexthop and route + // (Similar to existing VPN programming, see earlier examples) +``` + +### Hierarchical SID Marking Programming Example + +The following example demonstrates hierarchical SID Marking where a prefix aggregation ID maps to a tunnel map, which then maps forwarding class to VPN SID. + +```c + // 1. Create QoS Map to derive forwarding class from DSCP (on ingress port) + // This step configures SAI_QOS_MAP_TYPE_DSCP_TO_FORWARDING_CLASS + // (QoS map creation omitted for brevity) + + // 2. Create the inner tunnel map (Forwarding Class -> VPN SID) + tunnel_map_attrs[0].id = SAI_TUNNEL_MAP_ATTR_TYPE; + tunnel_map_attrs[0].value.s32 = SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID; + saistatus = sai_tunnel_api->create_tunnel_map(&fc_to_sid_map, switch_id, 1, tunnel_map_attrs); + + // 2.1 Create tunnel map entries for each forwarding class + // Forwarding Class 0x0 -> VPN SID + tunnel_map_entry_attrs[0].id = SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE; + tunnel_map_entry_attrs[0].value.s32 = SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID; + tunnel_map_entry_attrs[1].id = SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP; + tunnel_map_entry_attrs[1].value.oid = fc_to_sid_map; + tunnel_map_entry_attrs[2].id = SAI_TUNNEL_MAP_ENTRY_ATTR_FORWARDING_CLASS_KEY; + tunnel_map_entry_attrs[2].value.u32 = 0x0; + tunnel_map_entry_attrs[3].id = SAI_TUNNEL_MAP_ENTRY_ATTR_SRV6_VPN_SID_VALUE; + CONVERT_STR_TO_IPV6(tunnel_map_entry_attrs[3].value.ip6, "fd00:205:2007:fff0:30::"); + saistatus = sai_tunnel_api->create_tunnel_map_entry(&fc0_entry, switch_id, 4, tunnel_map_entry_attrs); + + // Forwarding Class 0x8 -> VPN SID + tunnel_map_entry_attrs[2].value.u32 = 0x8; + CONVERT_STR_TO_IPV6(tunnel_map_entry_attrs[3].value.ip6, "fd00:205:2007:fff0:38::"); + saistatus = sai_tunnel_api->create_tunnel_map_entry(&fc8_entry, switch_id, 4, tunnel_map_entry_attrs); + + // Forwarding Class 0xf -> VPN SID + tunnel_map_entry_attrs[2].value.u32 = 0xf; + CONVERT_STR_TO_IPV6(tunnel_map_entry_attrs[3].value.ip6, "fd00:205:2007:fff0:3f::"); + saistatus = sai_tunnel_api->create_tunnel_map_entry(&fcf_entry, switch_id, 4, tunnel_map_entry_attrs); + + // 3. Create the outer tunnel map (Prefix Aggregation ID -> Tunnel Map) + tunnel_map_attrs[0].id = SAI_TUNNEL_MAP_ATTR_TYPE; + tunnel_map_attrs[0].value.s32 = SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_TUNNEL_MAP_ID; + saistatus = sai_tunnel_api->create_tunnel_map(&prefix_to_map, switch_id, 1, tunnel_map_attrs); + + // 3.1 Create entry mapping prefix aggregation ID 10 to the FC->SID map + tunnel_map_entry_attrs[0].id = SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE; + tunnel_map_entry_attrs[0].value.s32 = SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_TUNNEL_MAP_ID; + tunnel_map_entry_attrs[1].id = SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP; + tunnel_map_entry_attrs[1].value.oid = prefix_to_map; + tunnel_map_entry_attrs[2].id = SAI_TUNNEL_MAP_ENTRY_ATTR_PREFIX_AGG_ID_KEY; + tunnel_map_entry_attrs[2].value.u32 = 10; // Prefix Aggregation ID + tunnel_map_entry_attrs[3].id = SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_ID_VALUE; + tunnel_map_entry_attrs[3].value.oid = fc_to_sid_map; // Points to FC->SID map + saistatus = sai_tunnel_api->create_tunnel_map_entry(&prefix_entry, switch_id, 4, tunnel_map_entry_attrs); + + // 4. Create SRv6 tunnel with the hierarchical encap mapper + tunnel_entry_attrs[0].id = SAI_TUNNEL_ATTR_TYPE; + tunnel_entry_attrs[0].value.s32 = SAI_TUNNEL_TYPE_SRV6; + tunnel_entry_attrs[1].id = SAI_TUNNEL_ATTR_ENCAP_SRC_IP; + CONVERT_STR_TO_IPV6(tunnel_entry_attrs[1].value.ip6, "fd00:205:2007::1"); + tunnel_entry_attrs[2].id = SAI_TUNNEL_ATTR_UNDERLAY_INTERFACE; + tunnel_entry_attrs[2].value.oid = underlay_rif; + tunnel_entry_attrs[3].id = SAI_TUNNEL_ATTR_ENCAP_MAPPERS; + tunnel_entry_attrs[3].value.objlist.count = 1; + tunnel_entry_attrs[3].value.objlist.list[0] = prefix_to_map; // Outer map + tunnel_entry_attrs[4].id = SAI_TUNNEL_ATTR_PEER_MODE; + tunnel_entry_attrs[4].value.s32 = SAI_TUNNEL_PEER_MODE_P2P; + tunnel_entry_attrs[5].id = SAI_TUNNEL_ATTR_ENCAP_DST_IP; + CONVERT_STR_TO_IPV6(tunnel_entry_attrs[5].value.ip6, "fd00:205:2007::21"); + saistatus = sai_tunnel_api->create_tunnel(&srv6_tunnel_id, switch_id, 6, tunnel_entry_attrs); + + // 5. Create SRv6 nexthop and route with prefix aggregation ID + // Route entry must include SAI_ROUTE_ENTRY_ATTR_PREFIX_AGG_ID = 10 + // (Similar to existing VPN programming, see earlier examples) +``` + ## References 1. [IPv6 Segment Routing Header (SRH)](https://tools.ietf.org/html/rfc8754) 2. [Segment Routing over IPv6 (SRv6) Network Programming](https://tools.ietf.org/html/rfc8986) diff --git a/experimental/saiswitchextensions.h b/experimental/saiswitchextensions.h index 418f86895..279ed8c35 100644 --- a/experimental/saiswitchextensions.h +++ b/experimental/saiswitchextensions.h @@ -27,6 +27,7 @@ #include #include +#include /** * @brief DASH capability HA scope level @@ -131,6 +132,52 @@ typedef void (*sai_ha_scope_event_notification_fn)( _In_ uint32_t count, _In_ const sai_ha_scope_event_data_t *data); +/** + * @brief Flow bulk get session event type + */ +typedef enum _sai_flow_bulk_get_session_event_t +{ + /** Bulk get session finished */ + SAI_FLOW_BULK_GET_SESSION_EVENT_FINISHED, + + /** Flow entry received */ + SAI_FLOW_BULK_GET_SESSION_EVENT_FLOW_ENTRY, + +} sai_flow_bulk_get_session_event_t; + +/** + * @brief Notification data format received from SAI flow bulk get session callback + * + * @count attr[attr_count] + */ +typedef struct _sai_flow_bulk_get_session_event_data_t +{ + /** + * @brief Event type + * + * If event_type is SAI_FLOW_BULK_GET_SESSION_EVENT_FINISHED, attr is NULL, flow_entry is invalid. + * If event_type is SAI_FLOW_BULK_GET_SESSION_EVENT_FLOW_ENTRY, attr is not NULL. + */ + sai_flow_bulk_get_session_event_t event_type; + +} sai_flow_bulk_get_session_event_data_t; + +/** + * @brief Flow bulk get session event notification + * + * Passed as a parameter into sai_initialize_switch() + * + * @count data[count] + * + * @param[in] flow_bulk_session_id ID of the flow bulk session + * @param[in] count Number of notifications + * @param[in] data Array of flow bulk get session events + */ +typedef void (*sai_flow_bulk_get_session_event_notification_fn)( + _In_ sai_object_id_t flow_bulk_session_id, + _In_ uint32_t count, + _In_ const sai_flow_bulk_get_session_event_data_t *data); + /** * @brief SAI switch attribute extensions. * @@ -191,6 +238,17 @@ typedef enum _sai_switch_attr_extensions_t */ SAI_SWITCH_ATTR_HA_SCOPE_EVENT_NOTIFY, + /** + * @brief DASH flow bulk get session event notification + * + * Use sai_flow_bulk_get_session_event_notification_fn as notification function. + * + * @type sai_pointer_t sai_flow_bulk_get_session_event_notification_fn + * @flags CREATE_AND_SET + * @default NULL + */ + SAI_SWITCH_ATTR_FLOW_BULK_GET_SESSION_EVENT_NOTIFY, + SAI_SWITCH_ATTR_EXTENSIONS_RANGE_END } sai_switch_attr_extensions_t; diff --git a/inc/saiipmcgroup.h b/inc/saiipmcgroup.h index 43a577772..d8531f02b 100644 --- a/inc/saiipmcgroup.h +++ b/inc/saiipmcgroup.h @@ -248,6 +248,10 @@ typedef struct _sai_ipmc_group_api_t sai_remove_ipmc_group_member_fn remove_ipmc_group_member; sai_set_ipmc_group_member_attribute_fn set_ipmc_group_member_attribute; sai_get_ipmc_group_member_attribute_fn get_ipmc_group_member_attribute; + sai_bulk_object_create_fn create_ipmc_groups; + sai_bulk_object_remove_fn remove_ipmc_groups; + sai_bulk_object_set_attribute_fn set_ipmc_groups_attribute; + sai_bulk_object_get_attribute_fn get_ipmc_groups_attribute; } sai_ipmc_group_api_t; diff --git a/inc/saitunnel.h b/inc/saitunnel.h index 3df704697..11b0158bc 100644 --- a/inc/saitunnel.h +++ b/inc/saitunnel.h @@ -80,6 +80,12 @@ typedef enum _sai_tunnel_map_type_t /** TUNNEL Map Prefix Aggregation ID to SRV6 VPN SID */ SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_SRV6_VPN_SID = 0x0000000d, + /** TUNNEL Map Prefix Aggregation ID to Tunnel Map ID */ + SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_TUNNEL_MAP_ID = 0x0000000e, + + /** TUNNEL Map Forwarding Class to SRV6 VPN SID */ + SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID = 0x0000000f, + /** Custom range base value */ SAI_TUNNEL_MAP_TYPE_CUSTOM_RANGE_BASE = 0x10000000 @@ -246,7 +252,7 @@ typedef enum _sai_tunnel_map_entry_attr_t * * @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 + * @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_PREFIX_AGG_ID_TO_TUNNEL_MAP_ID */ SAI_TUNNEL_MAP_ENTRY_ATTR_PREFIX_AGG_ID_KEY = 0x00000010, @@ -255,10 +261,29 @@ typedef enum _sai_tunnel_map_entry_attr_t * * @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 + * @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 or SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID */ SAI_TUNNEL_MAP_ENTRY_ATTR_SRV6_VPN_SID_VALUE = 0x00000011, + /** + * @brief Tunnel Map ID value + * + * @type sai_object_id_t + * @flags MANDATORY_ON_CREATE | CREATE_ONLY + * @objects SAI_OBJECT_TYPE_TUNNEL_MAP + * @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_PREFIX_AGG_ID_TO_TUNNEL_MAP_ID + */ + SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_ID_VALUE = 0x00000012, + + /** + * @brief Forwarding Class value + * + * @type sai_uint32_t + * @flags MANDATORY_ON_CREATE | CREATE_ONLY + * @condition SAI_TUNNEL_MAP_ENTRY_ATTR_TUNNEL_MAP_TYPE == SAI_TUNNEL_MAP_TYPE_FORWARDING_CLASS_TO_SRV6_VPN_SID + */ + SAI_TUNNEL_MAP_ENTRY_ATTR_FORWARDING_CLASS_KEY = 0x00000013, + /** * @brief End of attributes */