From 12de0b9c6388a86f1498da2915193648d04439eb Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Fri, 24 Sep 2021 05:31:49 -0700 Subject: [PATCH] Sonic sairedis changes for SAI SRV6 and SAI refpoint update to v1.9.0 (#937) Update SAI SEGMENTROUTE object to SAI SRV6 object Serialize and deserialize APIs for SRV6 MY_SID_ENTRY object SAI refpoint update to V1.9.0 --- SAI | 2 +- lib/ClientSai.cpp | 73 ++++ lib/Makefile.am | 6 +- lib/Recorder.h | 5 +- lib/RedisRemoteSaiInterface.cpp | 67 +++ lib/ServerSai.cpp | 54 +++ lib/sai_redis.h | 4 +- lib/sai_redis_interfacequery.cpp | 4 +- lib/sai_redis_ipsec.cpp | 16 + lib/sai_redis_my_mac.cpp | 8 + lib/sai_redis_nexthopgroup.cpp | 2 + lib/sai_redis_segmentroute.cpp | 13 - lib/sai_redis_srv6.cpp | 18 + lib/sairediscommon.h | 11 - meta/DummySaiInterface.cpp | 44 ++ meta/Meta.cpp | 411 +++++++++++++++++++ meta/Meta.h | 4 + meta/MetaKeyHasher.cpp | 34 ++ meta/SaiInterface.cpp | 12 + meta/SaiInterface.h | 2 + meta/SaiSerialize.cpp | 178 +++++++- meta/sai_serialize.h | 7 + syncd/NotificationQueue.h | 1 + syncd/SwitchNotifications.h | 1 + syncd/Syncd.cpp | 63 +++ syncd/VendorSai.cpp | 81 +++- syncd/tests.cpp | 69 +++- unittest/lib/Makefile.am | 2 +- unittest/lib/test_sai_redis_segmentroute.cpp | 26 -- unittest/lib/test_sai_redis_srv6.cpp | 36 ++ unittest/meta/TestSaiSerialize.cpp | 8 +- unittest/vslib/Makefile.am | 2 +- unittest/vslib/test_sai_vs_nexthopgroup.cpp | 6 + unittest/vslib/test_sai_vs_segmentroute.cpp | 26 -- unittest/vslib/test_sai_vs_srv6.cpp | 36 ++ vslib/Makefile.am | 6 +- vslib/VirtualSwitchSaiInterface.cpp | 66 +++ vslib/sai_vs.h | 4 +- vslib/sai_vs_interfacequery.cpp | 4 +- vslib/sai_vs_ipsec.cpp | 16 + vslib/sai_vs_my_mac.cpp | 8 + vslib/sai_vs_nexthopgroup.cpp | 2 + vslib/sai_vs_segmentroute.cpp | 14 - vslib/sai_vs_srv6.cpp | 20 + 44 files changed, 1351 insertions(+), 121 deletions(-) create mode 100644 lib/sai_redis_ipsec.cpp create mode 100644 lib/sai_redis_my_mac.cpp delete mode 100644 lib/sai_redis_segmentroute.cpp create mode 100644 lib/sai_redis_srv6.cpp delete mode 100644 unittest/lib/test_sai_redis_segmentroute.cpp create mode 100644 unittest/lib/test_sai_redis_srv6.cpp delete mode 100644 unittest/vslib/test_sai_vs_segmentroute.cpp create mode 100644 unittest/vslib/test_sai_vs_srv6.cpp create mode 100644 vslib/sai_vs_ipsec.cpp create mode 100644 vslib/sai_vs_my_mac.cpp delete mode 100644 vslib/sai_vs_segmentroute.cpp create mode 100644 vslib/sai_vs_srv6.cpp diff --git a/SAI b/SAI index a6af2e8bb..2ebde24c1 160000 --- a/SAI +++ b/SAI @@ -1 +1 @@ -Subproject commit a6af2e8bb1563c90f4bb04d6487c4747e93eb07d +Subproject commit 2ebde24c1de6d930c5bbc20e7eb89d9f0867d4bc diff --git a/lib/ClientSai.cpp b/lib/ClientSai.cpp index efd7a2288..cff4201fe 100644 --- a/lib/ClientSai.cpp +++ b/lib/ClientSai.cpp @@ -1179,6 +1179,38 @@ sai_status_t ClientSai::bulkCreate( object_statuses); } +sai_status_t ClientSai::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t* my_sid_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + REDIS_CHECK_API_INITIALIZED(); + + // TODO support mode + + std::vector serialized_object_ids; + + // on create vid is put in db by syncd + for (uint32_t idx = 0; idx < object_count; idx++) + { + std::string str_object_id = sai_serialize_my_sid_entry(my_sid_entry[idx]); + serialized_object_ids.push_back(str_object_id); + } + + return bulkCreate( + SAI_OBJECT_TYPE_MY_SID_ENTRY, + serialized_object_ids, + attr_count, + attr_list, + mode, + object_statuses); +} + // BULK CREATE HELPERS sai_status_t ClientSai::bulkCreate( @@ -1335,6 +1367,26 @@ sai_status_t ClientSai::bulkRemove( return bulkRemove(SAI_OBJECT_TYPE_FDB_ENTRY, serializedObjectIds, mode, object_statuses); } +sai_status_t ClientSai::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + REDIS_CHECK_API_INITIALIZED(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_my_sid_entry(my_sid_entry[idx])); + } + + return bulkRemove(SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, mode, object_statuses); +} + // BULK REMOVE HELPERS sai_status_t ClientSai::bulkRemove( @@ -1485,6 +1537,27 @@ sai_status_t ClientSai::bulkSet( return bulkSet(SAI_OBJECT_TYPE_FDB_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); } +sai_status_t ClientSai::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + REDIS_CHECK_API_INITIALIZED(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_my_sid_entry(my_sid_entry[idx])); + } + + return bulkSet(SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); +} + // BULK SET HELPERS sai_status_t ClientSai::bulkSet( diff --git a/lib/Makefile.am b/lib/Makefile.am index 73f113920..e9d21e22b 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -65,7 +65,7 @@ libsairedis_la_SOURCES = \ sai_redis_samplepacket.cpp \ sai_redis_scheduler.cpp \ sai_redis_schedulergroup.cpp \ - sai_redis_segmentroute.cpp \ + sai_redis_srv6.cpp \ sai_redis_stp.cpp \ sai_redis_switch.cpp \ sai_redis_system_port.cpp \ @@ -74,7 +74,9 @@ libsairedis_la_SOURCES = \ sai_redis_udf.cpp \ sai_redis_virtual_router.cpp \ sai_redis_vlan.cpp \ - sai_redis_wred.cpp + sai_redis_wred.cpp \ + sai_redis_ipsec.cpp \ + sai_redis_my_mac.cpp libSaiRedis_a_CPPFLAGS = $(CODE_COVERAGE_CPPFLAGS) libSaiRedis_a_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) $(CODE_COVERAGE_CXXFLAGS) diff --git a/lib/Recorder.h b/lib/Recorder.h index 85846b4ed..3d55dbf12 100644 --- a/lib/Recorder.h +++ b/lib/Recorder.h @@ -170,6 +170,7 @@ namespace sairedis SAI_REDIS_RECORDER_DECLARE_RECORD_CREATE(neighbor_entry); SAI_REDIS_RECORDER_DECLARE_RECORD_CREATE(route_entry); SAI_REDIS_RECORDER_DECLARE_RECORD_CREATE(nat_entry); + SAI_REDIS_RECORDER_DECLARE_RECORD_CREATE(my_sid_entry); public: // remove ENTRY @@ -181,6 +182,7 @@ namespace sairedis SAI_REDIS_RECORDER_DECLARE_RECORD_REMOVE(neighbor_entry); SAI_REDIS_RECORDER_DECLARE_RECORD_REMOVE(route_entry); SAI_REDIS_RECORDER_DECLARE_RECORD_REMOVE(nat_entry); + SAI_REDIS_RECORDER_DECLARE_RECORD_REMOVE(my_sid_entry); public: // set ENTRY @@ -192,6 +194,7 @@ namespace sairedis SAI_REDIS_RECORDER_DECLARE_RECORD_SET(neighbor_entry); SAI_REDIS_RECORDER_DECLARE_RECORD_SET(route_entry); SAI_REDIS_RECORDER_DECLARE_RECORD_SET(nat_entry); + SAI_REDIS_RECORDER_DECLARE_RECORD_SET(my_sid_entry); public: // get ENTRY @@ -203,7 +206,7 @@ namespace sairedis SAI_REDIS_RECORDER_DECLARE_RECORD_GET(neighbor_entry); SAI_REDIS_RECORDER_DECLARE_RECORD_GET(route_entry); SAI_REDIS_RECORDER_DECLARE_RECORD_GET(nat_entry); - + SAI_REDIS_RECORDER_DECLARE_RECORD_GET(my_sid_entry); public: // SAI stats API diff --git a/lib/RedisRemoteSaiInterface.cpp b/lib/RedisRemoteSaiInterface.cpp index 3c0870bca..d5f4c0eac 100644 --- a/lib/RedisRemoteSaiInterface.cpp +++ b/lib/RedisRemoteSaiInterface.cpp @@ -1390,6 +1390,24 @@ sai_status_t RedisRemoteSaiInterface::bulkRemove( return bulkRemove(SAI_OBJECT_TYPE_FDB_ENTRY, serializedObjectIds, mode, object_statuses); } +sai_status_t RedisRemoteSaiInterface::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_my_sid_entry(my_sid_entry[idx])); + } + + return bulkRemove(SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, mode, object_statuses); +} + sai_status_t RedisRemoteSaiInterface::bulkSet( _In_ sai_object_type_t object_type, _In_ uint32_t object_count, @@ -1486,6 +1504,25 @@ sai_status_t RedisRemoteSaiInterface::bulkSet( return bulkSet(SAI_OBJECT_TYPE_FDB_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); } +sai_status_t RedisRemoteSaiInterface::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_my_sid_entry(my_sid_entry[idx])); + } + + return bulkSet(SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); +} + sai_status_t RedisRemoteSaiInterface::bulkSet( _In_ sai_object_type_t object_type, _In_ const std::vector &serialized_object_ids, @@ -1765,6 +1802,36 @@ sai_status_t RedisRemoteSaiInterface::bulkCreate( object_statuses); } +sai_status_t RedisRemoteSaiInterface::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t* my_sid_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + // TODO support mode + + std::vector serialized_object_ids; + + // on create vid is put in db by syncd + for (uint32_t idx = 0; idx < object_count; idx++) + { + std::string str_object_id = sai_serialize_my_sid_entry(my_sid_entry[idx]); + serialized_object_ids.push_back(str_object_id); + } + + return bulkCreate( + SAI_OBJECT_TYPE_MY_SID_ENTRY, + serialized_object_ids, + attr_count, + attr_list, + mode, + object_statuses); +} + sai_status_t RedisRemoteSaiInterface::notifySyncd( _In_ sai_object_id_t switchId, _In_ sai_redis_notify_syncd_t redisNotifySyncd) diff --git a/lib/ServerSai.cpp b/lib/ServerSai.cpp index eecf5fb03..f10b6c754 100644 --- a/lib/ServerSai.cpp +++ b/lib/ServerSai.cpp @@ -1255,6 +1255,25 @@ sai_status_t ServerSai::processBulkCreateEntry( } break; + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + { + std::vector entries(object_count); + + for (uint32_t it = 0; it < object_count; it++) + { + sai_deserialize_my_sid_entry(objectIds[it], entries[it]); + } + + status = m_sai->bulkCreate( + object_count, + entries.data(), + attr_counts.data(), + attr_lists.data(), + mode, + statuses.data()); + } + break; + default: return SAI_STATUS_NOT_SUPPORTED; } @@ -1345,6 +1364,23 @@ sai_status_t ServerSai::processBulkRemoveEntry( } break; + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + { + std::vector entries(object_count); + + for (uint32_t it = 0; it < object_count; it++) + { + sai_deserialize_my_sid_entry(objectIds[it], entries[it]); + } + + status = m_sai->bulkRemove( + object_count, + entries.data(), + mode, + statuses.data()); + } + break; + default: return SAI_STATUS_NOT_SUPPORTED; } @@ -1447,6 +1483,24 @@ sai_status_t ServerSai::processBulkSetEntry( } break; + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + { + std::vector entries(object_count); + + for (uint32_t it = 0; it < object_count; it++) + { + sai_deserialize_my_sid_entry(objectIds[it], entries[it]); + } + + status = m_sai->bulkSet( + object_count, + entries.data(), + attr_lists.data(), + mode, + statuses.data()); + } + break; + default: return SAI_STATUS_NOT_SUPPORTED; } diff --git a/lib/sai_redis.h b/lib/sai_redis.h index e137417f6..906fc6519 100644 --- a/lib/sai_redis.h +++ b/lib/sai_redis.h @@ -48,7 +48,7 @@ PRIVATE extern const sai_rpf_group_api_t redis_rpf_group_api; PRIVATE extern const sai_samplepacket_api_t redis_samplepacket_api; PRIVATE extern const sai_scheduler_api_t redis_scheduler_api; PRIVATE extern const sai_scheduler_group_api_t redis_scheduler_group_api; -PRIVATE extern const sai_segmentroute_api_t redis_segmentroute_api; +PRIVATE extern const sai_srv6_api_t redis_srv6_api; PRIVATE extern const sai_stp_api_t redis_stp_api; PRIVATE extern const sai_switch_api_t redis_switch_api; PRIVATE extern const sai_system_port_api_t redis_system_port_api; @@ -58,6 +58,8 @@ PRIVATE extern const sai_udf_api_t redis_udf_api; PRIVATE extern const sai_virtual_router_api_t redis_virtual_router_api; PRIVATE extern const sai_vlan_api_t redis_vlan_api; PRIVATE extern const sai_wred_api_t redis_wred_api; +PRIVATE extern const sai_my_mac_api_t redis_my_mac_api; +PRIVATE extern const sai_ipsec_api_t redis_ipsec_api; PRIVATE extern std::shared_ptr redis_sai; diff --git a/lib/sai_redis_interfacequery.cpp b/lib/sai_redis_interfacequery.cpp index 67a9946dd..f7ee17688 100644 --- a/lib/sai_redis_interfacequery.cpp +++ b/lib/sai_redis_interfacequery.cpp @@ -67,7 +67,7 @@ static sai_apis_t redis_apis = { API(mcast_fdb), API(bridge), API(tam), - API(segmentroute), + API(srv6), API(mpls), API(dtel), API(bfd), @@ -77,6 +77,8 @@ static sai_apis_t redis_apis = { API(debug_counter), API(macsec), API(system_port), + API(my_mac), + API(ipsec), API(bmtor), }; diff --git a/lib/sai_redis_ipsec.cpp b/lib/sai_redis_ipsec.cpp new file mode 100644 index 000000000..3cde2eeff --- /dev/null +++ b/lib/sai_redis_ipsec.cpp @@ -0,0 +1,16 @@ +#include "sai_redis.h" + +REDIS_GENERIC_QUAD(IPSEC,ipsec); +REDIS_GENERIC_QUAD(IPSEC_PORT,ipsec_port); +REDIS_GENERIC_QUAD(IPSEC_SA,ipsec_sa); +REDIS_GENERIC_STATS(IPSEC_PORT,ipsec_port); +REDIS_GENERIC_STATS(IPSEC_SA,ipsec_sa); + +const sai_ipsec_api_t redis_ipsec_api = { + + REDIS_GENERIC_QUAD_API(ipsec) + REDIS_GENERIC_QUAD_API(ipsec_port) + REDIS_GENERIC_STATS_API(ipsec_port) + REDIS_GENERIC_QUAD_API(ipsec_sa) + REDIS_GENERIC_STATS_API(ipsec_sa) +}; diff --git a/lib/sai_redis_my_mac.cpp b/lib/sai_redis_my_mac.cpp new file mode 100644 index 000000000..586644148 --- /dev/null +++ b/lib/sai_redis_my_mac.cpp @@ -0,0 +1,8 @@ +#include "sai_redis.h" + +REDIS_GENERIC_QUAD(MY_MAC,my_mac); + +const sai_my_mac_api_t redis_my_mac_api = { + + REDIS_GENERIC_QUAD_API(my_mac) +}; diff --git a/lib/sai_redis_nexthopgroup.cpp b/lib/sai_redis_nexthopgroup.cpp index 655deb16d..21d05db65 100644 --- a/lib/sai_redis_nexthopgroup.cpp +++ b/lib/sai_redis_nexthopgroup.cpp @@ -4,6 +4,7 @@ REDIS_BULK_CREATE(NEXT_HOP_GROUP_MEMBER,next_hop_group_members); REDIS_BULK_REMOVE(NEXT_HOP_GROUP_MEMBER,next_hop_group_members); REDIS_GENERIC_QUAD(NEXT_HOP_GROUP,next_hop_group); REDIS_GENERIC_QUAD(NEXT_HOP_GROUP_MEMBER,next_hop_group_member); +REDIS_GENERIC_QUAD(NEXT_HOP_GROUP_MAP,next_hop_group_map); const sai_next_hop_group_api_t redis_next_hop_group_api = { @@ -12,4 +13,5 @@ const sai_next_hop_group_api_t redis_next_hop_group_api = { redis_bulk_create_next_hop_group_members, redis_bulk_remove_next_hop_group_members, + REDIS_GENERIC_QUAD_API(next_hop_group_map) }; diff --git a/lib/sai_redis_segmentroute.cpp b/lib/sai_redis_segmentroute.cpp deleted file mode 100644 index cafd17731..000000000 --- a/lib/sai_redis_segmentroute.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "sai_redis.h" - -REDIS_BULK_CREATE(SEGMENTROUTE_SIDLIST,segmentroute_sidlists); -REDIS_BULK_REMOVE(SEGMENTROUTE_SIDLIST,segmentroute_sidlists); -REDIS_GENERIC_QUAD(SEGMENTROUTE_SIDLIST,segmentroute_sidlist); - -const sai_segmentroute_api_t redis_segmentroute_api = { - - REDIS_GENERIC_QUAD_API(segmentroute_sidlist) - - redis_bulk_create_segmentroute_sidlists, - redis_bulk_remove_segmentroute_sidlists, -}; diff --git a/lib/sai_redis_srv6.cpp b/lib/sai_redis_srv6.cpp new file mode 100644 index 000000000..d31e887f5 --- /dev/null +++ b/lib/sai_redis_srv6.cpp @@ -0,0 +1,18 @@ +#include "sai_redis.h" + +REDIS_BULK_CREATE(SRV6_SIDLIST, srv6_sidlist); +REDIS_BULK_REMOVE(SRV6_SIDLIST, srv6_sidlist); +REDIS_GENERIC_QUAD(SRV6_SIDLIST,srv6_sidlist); +REDIS_BULK_QUAD_ENTRY(MY_SID_ENTRY,my_sid_entry); +REDIS_GENERIC_QUAD_ENTRY(MY_SID_ENTRY,my_sid_entry); + +const sai_srv6_api_t redis_srv6_api = { + + REDIS_GENERIC_QUAD_API(srv6_sidlist) + + redis_bulk_create_srv6_sidlist, + redis_bulk_remove_srv6_sidlist, + + REDIS_GENERIC_QUAD_API(my_sid_entry) + REDIS_BULK_QUAD_API(my_sid_entry) +}; diff --git a/lib/sairediscommon.h b/lib/sairediscommon.h index 7f3eeda96..c095ac472 100644 --- a/lib/sairediscommon.h +++ b/lib/sairediscommon.h @@ -51,17 +51,6 @@ #define REDIS_ASIC_STATE_COMMAND_OBJECT_TYPE_GET_AVAILABILITY_QUERY "object_type_get_availability_query" #define REDIS_ASIC_STATE_COMMAND_OBJECT_TYPE_GET_AVAILABILITY_RESPONSE "object_type_get_availability_response" -// TODO move this to SAI meta repository for auto generate - -#define SAI_SWITCH_NOTIFICATION_NAME_BFD_SESSION_STATE_CHANGE "bfd_session_state_change" -#define SAI_SWITCH_NOTIFICATION_NAME_FDB_EVENT "fdb_event" -#define SAI_SWITCH_NOTIFICATION_NAME_PACKET_EVENT "packet_event" -#define SAI_SWITCH_NOTIFICATION_NAME_PORT_STATE_CHANGE "port_state_change" -#define SAI_SWITCH_NOTIFICATION_NAME_QUEUE_PFC_DEADLOCK "queue_deadlock" -#define SAI_SWITCH_NOTIFICATION_NAME_SWITCH_SHUTDOWN_REQUEST "switch_shutdown_request" -#define SAI_SWITCH_NOTIFICATION_NAME_SWITCH_STATE_CHANGE "switch_state_change" -#define SAI_SWITCH_NOTIFICATION_NAME_TAM_EVENT "tam_event" - /** * @brief Redis virtual object id counter key name. * diff --git a/meta/DummySaiInterface.cpp b/meta/DummySaiInterface.cpp index 245f725cd..671ba2dcf 100644 --- a/meta/DummySaiInterface.cpp +++ b/meta/DummySaiInterface.cpp @@ -276,6 +276,19 @@ sai_status_t DummySaiInterface::bulkRemove( return m_status; } +sai_status_t DummySaiInterface::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + for (uint32_t idx = 0; idx < object_count; idx++) + object_statuses[idx] = m_status; + + return m_status; +} sai_status_t DummySaiInterface::bulkSet( _In_ sai_object_type_t object_type, @@ -353,6 +366,21 @@ sai_status_t DummySaiInterface::bulkSet( return m_status; } +sai_status_t DummySaiInterface::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + for (uint32_t idx = 0; idx < object_count; idx++) + object_statuses[idx] = m_status; + + return m_status; +} + sai_status_t DummySaiInterface::bulkCreate( _In_ sai_object_type_t object_type, _In_ sai_object_id_t switch_id, @@ -435,6 +463,22 @@ sai_status_t DummySaiInterface::bulkCreate( return m_status; } +sai_status_t DummySaiInterface::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + for (uint32_t idx = 0; idx < object_count; idx++) + object_statuses[idx] = m_status; + + return m_status; +} + sai_object_type_t DummySaiInterface::objectTypeQuery( _In_ sai_object_id_t objectId) { diff --git a/meta/Meta.cpp b/meta/Meta.cpp index 5a4b8d4b6..a90409b13 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -439,6 +439,39 @@ sai_status_t Meta::remove( return status; } +sai_status_t Meta::remove( + _In_ const sai_my_sid_entry_t* my_sid_entry) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = meta_sai_validate_my_sid_entry(my_sid_entry, false); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_MY_SID_ENTRY, .objectkey = { .key = { .my_sid_entry = *my_sid_entry } } }; + + status = meta_generic_validation_remove(meta_key); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + status = m_implementation->remove(my_sid_entry); + + META_LOG_STATUS(status, "remove"); + + if (status == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_remove(meta_key); + } + + return status; +} + sai_status_t Meta::create( _In_ const sai_fdb_entry_t* fdb_entry, _In_ uint32_t attr_count, @@ -718,6 +751,41 @@ sai_status_t Meta::create( return status; } +sai_status_t Meta::create( + _In_ const sai_my_sid_entry_t* my_sid_entry, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = meta_sai_validate_my_sid_entry(my_sid_entry, true); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_MY_SID_ENTRY, .objectkey = { .key = { .my_sid_entry = *my_sid_entry } } }; + + status = meta_generic_validation_create(meta_key, my_sid_entry->switch_id, attr_count, attr_list); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + status = m_implementation->create(my_sid_entry, attr_count, attr_list); + + META_LOG_STATUS(status, "create"); + + if (status == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_create(meta_key, my_sid_entry->switch_id, attr_count, attr_list); + } + + return status; +} + sai_status_t Meta::set( _In_ const sai_fdb_entry_t* fdb_entry, _In_ const sai_attribute_t *attr) @@ -989,6 +1057,39 @@ sai_status_t Meta::set( return status; } +sai_status_t Meta::set( + _In_ const sai_my_sid_entry_t* my_sid_entry, + _In_ const sai_attribute_t *attr) +{ + SWSS_LOG_ENTER(); + sai_status_t status = meta_sai_validate_my_sid_entry(my_sid_entry, false); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_MY_SID_ENTRY, .objectkey = { .key = { .my_sid_entry = *my_sid_entry } } }; + + status = meta_generic_validation_set(meta_key, attr); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + status = m_implementation->set(my_sid_entry, attr); + + META_LOG_STATUS(status, "set"); + + if (status == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_set(meta_key, attr); + } + + return status; +} + sai_status_t Meta::get( _In_ const sai_fdb_entry_t* fdb_entry, _In_ uint32_t attr_count, @@ -1257,6 +1358,39 @@ sai_status_t Meta::get( return status; } +sai_status_t Meta::get( + _In_ const sai_my_sid_entry_t* my_sid_entry, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = meta_sai_validate_my_sid_entry(my_sid_entry, false); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_MY_SID_ENTRY, .objectkey = { .key = { .my_sid_entry = *my_sid_entry } } }; + + status = meta_generic_validation_get(meta_key, attr_count, attr_list); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + status = m_implementation->get(my_sid_entry, attr_count, attr_list); + + if (status == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_get(meta_key, my_sid_entry->switch_id, attr_count, attr_list); + } + + return status; +} + sai_status_t Meta::create( _In_ sai_object_type_t object_type, _Out_ sai_object_id_t* object_id, @@ -2092,6 +2226,65 @@ sai_status_t Meta::bulkRemove( return status; } +sai_status_t Meta::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + // all objects must be same type and come from the same switch + // TODO check multiple switches + + PARAMETER_CHECK_IF_NOT_NULL(object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + object_statuses[idx] = SAI_STATUS_NOT_EXECUTED; + } + + //PARAMETER_CHECK_OBJECT_TYPE_VALID(object_type); + PARAMETER_CHECK_POSITIVE(object_count); + PARAMETER_CHECK_IF_NOT_NULL(my_sid_entry); + + if (sai_metadata_get_enum_value_name(&sai_metadata_enum_sai_bulk_op_error_mode_t, mode) == nullptr) + { + SWSS_LOG_ERROR("mode value %d is not in range on %s", mode, sai_metadata_enum_sai_bulk_op_error_mode_t.name); + + return SAI_STATUS_INVALID_PARAMETER; + } + + std::vector vmk; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + sai_status_t status = meta_sai_validate_my_sid_entry(&my_sid_entry[idx], false); + + CHECK_STATUS_SUCCESS(status); + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_MY_SID_ENTRY, .objectkey = { .key = { .my_sid_entry = my_sid_entry[idx] } } }; + + vmk.push_back(meta_key); + + status = meta_generic_validation_remove(meta_key); + + CHECK_STATUS_SUCCESS(status); + } + + auto status = m_implementation->bulkRemove(object_count, my_sid_entry, mode, object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + if (object_statuses[idx] == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_remove(vmk[idx]); + } + } + + return status; +} + sai_status_t Meta::bulkRemove( _In_ uint32_t object_count, _In_ const sai_fdb_entry_t *fdb_entry, @@ -2388,6 +2581,64 @@ sai_status_t Meta::bulkSet( return status; } +sai_status_t Meta::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + PARAMETER_CHECK_IF_NOT_NULL(object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + object_statuses[idx] = SAI_STATUS_NOT_EXECUTED; + } + + //PARAMETER_CHECK_OBJECT_TYPE_VALID(object_type); + PARAMETER_CHECK_POSITIVE(object_count); + PARAMETER_CHECK_IF_NOT_NULL(my_sid_entry); + PARAMETER_CHECK_IF_NOT_NULL(attr_list); + + if (sai_metadata_get_enum_value_name(&sai_metadata_enum_sai_bulk_op_error_mode_t, mode) == nullptr) + { + SWSS_LOG_ERROR("mode value %d is not in range on %s", mode, sai_metadata_enum_sai_bulk_op_error_mode_t.name); + + return SAI_STATUS_INVALID_PARAMETER; + } + + std::vector vmk; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + sai_status_t status = meta_sai_validate_my_sid_entry(&my_sid_entry[idx], false); + + CHECK_STATUS_SUCCESS(status); + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_MY_SID_ENTRY, .objectkey = { .key = { .my_sid_entry = my_sid_entry[idx] } } }; + + vmk.push_back(meta_key); + + status = meta_generic_validation_set(meta_key, &attr_list[idx]); + + CHECK_STATUS_SUCCESS(status); + } + + auto status = m_implementation->bulkSet(object_count, my_sid_entry, attr_list, mode, object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + if (object_statuses[idx] == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_set(vmk[idx], &attr_list[idx]); + } + } + + return status; +} + sai_status_t Meta::bulkSet( _In_ uint32_t object_count, _In_ const sai_fdb_entry_t *fdb_entry, @@ -2830,6 +3081,66 @@ sai_status_t Meta::bulkCreate( return status; } +sai_status_t Meta::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + PARAMETER_CHECK_IF_NOT_NULL(object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + object_statuses[idx] = SAI_STATUS_NOT_EXECUTED; + } + + //PARAMETER_CHECK_OBJECT_TYPE_VALID(object_type); + PARAMETER_CHECK_POSITIVE(object_count); + PARAMETER_CHECK_IF_NOT_NULL(my_sid_entry); + PARAMETER_CHECK_IF_NOT_NULL(attr_count); + PARAMETER_CHECK_IF_NOT_NULL(attr_list); + + if (sai_metadata_get_enum_value_name(&sai_metadata_enum_sai_bulk_op_error_mode_t, mode) == nullptr) + { + SWSS_LOG_ERROR("mode value %d is not in range on %s", mode, sai_metadata_enum_sai_bulk_op_error_mode_t.name); + + return SAI_STATUS_INVALID_PARAMETER; + } + + std::vector vmk; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + sai_status_t status = meta_sai_validate_my_sid_entry(&my_sid_entry[idx], true); + + CHECK_STATUS_SUCCESS(status); + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_MY_SID_ENTRY, .objectkey = { .key = { .my_sid_entry = my_sid_entry[idx] } } }; + + vmk.push_back(meta_key); + + status = meta_generic_validation_create(meta_key, my_sid_entry[idx].switch_id, attr_count[idx], attr_list[idx]); + + CHECK_STATUS_SUCCESS(status); + } + + auto status = m_implementation->bulkCreate(object_count, my_sid_entry, attr_count, attr_list, mode, object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + if (object_statuses[idx] == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_create(vmk[idx], my_sid_entry[idx].switch_id, attr_count[idx], attr_list[idx]); + } + } + + return status; +} + sai_object_type_t Meta::objectTypeQuery( _In_ sai_object_id_t objectId) { @@ -3352,6 +3663,7 @@ void Meta::meta_generic_validation_post_remove( case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: case SAI_ATTR_VALUE_TYPE_INT32_RANGE: case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST: + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: // no special action required break; @@ -4141,6 +4453,87 @@ sai_status_t Meta::meta_sai_validate_inseg_entry( return SAI_STATUS_SUCCESS; } +sai_status_t Meta::meta_sai_validate_my_sid_entry( + _In_ const sai_my_sid_entry_t* my_sid_entry, + _In_ bool create) +{ + SWSS_LOG_ENTER(); + + if (my_sid_entry == NULL) + { + SWSS_LOG_ERROR("my_sid_entry pointer is NULL"); + + return SAI_STATUS_INVALID_PARAMETER; + } + + sai_object_id_t vr = my_sid_entry->vr_id; + + if (vr == SAI_NULL_OBJECT_ID) + { + SWSS_LOG_ERROR("virtual router is set to null object id"); + + return SAI_STATUS_INVALID_PARAMETER; + } + + sai_object_type_t object_type = objectTypeQuery(vr); + + if (object_type == SAI_OBJECT_TYPE_NULL) + { + SWSS_LOG_ERROR("virtual router oid 0x%" PRIx64 " is not valid object type, " + "returned null object type", vr); + + return SAI_STATUS_INVALID_PARAMETER; + } + + sai_object_type_t expected = SAI_OBJECT_TYPE_VIRTUAL_ROUTER; + + if (object_type != expected) + { + SWSS_LOG_ERROR("virtual router oid 0x%" PRIx64 " type %d is wrong type, " + "expected object type %d", vr, object_type, expected); + + return SAI_STATUS_INVALID_PARAMETER; + } + + // check if virtual router exists + sai_object_meta_key_t meta_key_vr = { .objecttype = expected, .objectkey = { .key = { .object_id = vr } } }; + + if (!m_saiObjectCollection.objectExists(meta_key_vr)) + { + SWSS_LOG_ERROR("object key %s doesn't exist", + sai_serialize_object_meta_key(meta_key_vr).c_str()); + + return SAI_STATUS_INVALID_PARAMETER; + } + + // check if my_sid_entry exists + sai_object_meta_key_t meta_key_my_sid_entry = { .objecttype = SAI_OBJECT_TYPE_MY_SID_ENTRY, .objectkey = { .key = { .my_sid_entry = *my_sid_entry } } }; + + if (create) + { + if (m_saiObjectCollection.objectExists(meta_key_my_sid_entry)) + { + SWSS_LOG_ERROR("object key %s already exists", + sai_serialize_object_meta_key(meta_key_my_sid_entry).c_str()); + + return SAI_STATUS_ITEM_ALREADY_EXISTS; + } + + return SAI_STATUS_SUCCESS; + } + + // set, get, remove + if (!m_saiObjectCollection.objectExists(meta_key_my_sid_entry)) + { + SWSS_LOG_ERROR("object key %s doesn't exist", + sai_serialize_object_meta_key(meta_key_my_sid_entry).c_str()); + + return SAI_STATUS_INVALID_PARAMETER; + } + + return SAI_STATUS_SUCCESS; +} + sai_status_t Meta::meta_generic_validation_create( _In_ const sai_object_meta_key_t& meta_key, _In_ sai_object_id_t switch_id, @@ -4538,6 +4931,10 @@ sai_status_t Meta::meta_generic_validation_create( VALIDATION_LIST(md, value.ipaddrlist); break; + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: + VALIDATION_LIST(md, value.segmentlist); + break; + case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: if (value.u32range.min > value.u32range.max) @@ -5202,6 +5599,10 @@ sai_status_t Meta::meta_generic_validation_set( VALIDATION_LIST(md, value.ipaddrlist); break; + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: + VALIDATION_LIST(md, value.segmentlist); + break; + case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: if (value.u32range.min > value.u32range.max) @@ -5606,6 +6007,10 @@ sai_status_t Meta::meta_generic_validation_get( VALIDATION_LIST(md, value.ipaddrlist); break; + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: + VALIDATION_LIST(md, value.segmentlist); + break; + case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: case SAI_ATTR_VALUE_TYPE_INT32_RANGE: // primitives @@ -5845,6 +6250,10 @@ void Meta::meta_generic_validation_post_get( VALIDATION_LIST_GET(md, value.ipaddrlist); break; + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: + VALIDATION_LIST_GET(md, value.segmentlist); + break; + case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: if (value.u32range.min > value.u32range.max) @@ -6759,6 +7168,7 @@ void Meta::meta_generic_validation_post_create( case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: case SAI_ATTR_VALUE_TYPE_INT32_RANGE: case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST: + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: // no special action required break; @@ -6997,6 +7407,7 @@ void Meta::meta_generic_validation_post_set( case SAI_ATTR_VALUE_TYPE_INT32_RANGE: case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST: case SAI_ATTR_VALUE_TYPE_ACL_CAPABILITY: + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: // no special action required break; diff --git a/meta/Meta.h b/meta/Meta.h index 28fec1c86..696d04600 100644 --- a/meta/Meta.h +++ b/meta/Meta.h @@ -438,6 +438,10 @@ namespace saimeta _In_ const sai_inseg_entry_t* inseg_entry, _In_ bool create); + sai_status_t meta_sai_validate_my_sid_entry( + _In_ const sai_my_sid_entry_t* my_sid_entry, + _In_ bool create); + public: /* diff --git a/meta/MetaKeyHasher.cpp b/meta/MetaKeyHasher.cpp index d7a6ee847..cdeb68c7d 100644 --- a/meta/MetaKeyHasher.cpp +++ b/meta/MetaKeyHasher.cpp @@ -191,6 +191,22 @@ static bool operator==( a.label == b.label; } +static bool operator==( + _In_ const sai_my_sid_entry_t& a, + _In_ const sai_my_sid_entry_t& b) +{ + // SWSS_LOG_ENTER(); // disabled for performance reasons + + bool part = a.switch_id == b.switch_id && + a.vr_id == b.vr_id && + a.locator_block_len == b.locator_block_len && + a.locator_node_len == b.locator_node_len && + a.function_len == b.function_len && + a.args_len == b.args_len; + + return part && memcmp(a.sid, b.sid, sizeof(a.sid)) == 0; +} + bool MetaKeyHasher::operator()( _In_ const sai_object_meta_key_t& a, _In_ const sai_object_meta_key_t& b) const @@ -220,6 +236,9 @@ bool MetaKeyHasher::operator()( if (a.objecttype == SAI_OBJECT_TYPE_INSEG_ENTRY) return a.objectkey.key.inseg_entry == b.objectkey.key.inseg_entry; + if (a.objecttype == SAI_OBJECT_TYPE_MY_SID_ENTRY) + return a.objectkey.key.my_sid_entry == b.objectkey.key.my_sid_entry; + if (a.objecttype == SAI_OBJECT_TYPE_MCAST_FDB_ENTRY) return a.objectkey.key.mcast_fdb_entry == b.objectkey.key.mcast_fdb_entry; @@ -229,6 +248,7 @@ bool MetaKeyHasher::operator()( if (a.objecttype == SAI_OBJECT_TYPE_IPMC_ENTRY) return a.objectkey.key.ipmc_entry == b.objectkey.key.ipmc_entry; + SWSS_LOG_THROW("not implemented: %s", sai_serialize_object_meta_key(a).c_str()); } @@ -313,6 +333,17 @@ static inline std::size_t sai_get_hash( return ie.label; } +static inline std::size_t sai_get_hash( + _In_ const sai_my_sid_entry_t& se) +{ + // SWSS_LOG_ENTER(); // disabled for performance reasons + + uint32_t ip6[4]; + memcpy(ip6, se.sid, sizeof(ip6)); + + return ip6[0] ^ ip6[1] ^ ip6[2] ^ ip6[3]; +} + static inline std::size_t sai_get_hash( _In_ const sai_mcast_fdb_entry_t& mfe) { @@ -401,6 +432,9 @@ std::size_t MetaKeyHasher::operator()( case SAI_OBJECT_TYPE_INSEG_ENTRY: return sai_get_hash(k.objectkey.key.inseg_entry); + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + return sai_get_hash(k.objectkey.key.my_sid_entry); + case SAI_OBJECT_TYPE_MCAST_FDB_ENTRY: return sai_get_hash(k.objectkey.key.mcast_fdb_entry); diff --git a/meta/SaiInterface.cpp b/meta/SaiInterface.cpp index cd7a2296f..82e37242d 100644 --- a/meta/SaiInterface.cpp +++ b/meta/SaiInterface.cpp @@ -43,6 +43,9 @@ sai_status_t SaiInterface::create( case SAI_OBJECT_TYPE_INSEG_ENTRY: return create(&metaKey.objectkey.key.inseg_entry, attr_count, attr_list); + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + return create(&metaKey.objectkey.key.my_sid_entry, attr_count, attr_list); + default: SWSS_LOG_ERROR("object type %s not implemented, FIXME", info->objecttypename); @@ -87,6 +90,9 @@ sai_status_t SaiInterface::remove( case SAI_OBJECT_TYPE_INSEG_ENTRY: return remove(&metaKey.objectkey.key.inseg_entry); + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + return remove(&metaKey.objectkey.key.my_sid_entry); + default: SWSS_LOG_ERROR("object type %s not implemented, FIXME", info->objecttypename); @@ -132,6 +138,9 @@ sai_status_t SaiInterface::set( case SAI_OBJECT_TYPE_INSEG_ENTRY: return set(&metaKey.objectkey.key.inseg_entry, attr); + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + return set(&metaKey.objectkey.key.my_sid_entry, attr); + default: SWSS_LOG_ERROR("object type %s not implemented, FIXME", info->objecttypename); @@ -178,6 +187,9 @@ sai_status_t SaiInterface::get( case SAI_OBJECT_TYPE_INSEG_ENTRY: return get(&metaKey.objectkey.key.inseg_entry, attr_count, attr_list); + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + return get(&metaKey.objectkey.key.my_sid_entry, attr_count, attr_list); + default: SWSS_LOG_ERROR("object type %s not implemented, FIXME", info->objecttypename); diff --git a/meta/SaiInterface.h b/meta/SaiInterface.h index c1e794133..0b6dc5f1b 100644 --- a/meta/SaiInterface.h +++ b/meta/SaiInterface.h @@ -14,12 +14,14 @@ extern "C" { _X(NEIGHBOR_ENTRY,neighbor_entry); \ _X(ROUTE_ENTRY,route_entry); \ _X(NAT_ENTRY,nat_entry); \ + _X(MY_SID_ENTRY,my_sid_entry); \ #define SAIREDIS_DECLARE_EVERY_BULK_ENTRY(_X) \ _X(FDB_ENTRY,fdb_entry); \ _X(INSEG_ENTRY,inseg_entry); \ _X(NAT_ENTRY,nat_entry); \ _X(ROUTE_ENTRY,route_entry); \ + _X(MY_SID_ENTRY,my_sid_entry); \ #define SAIREDIS_SAIINTERFACE_DECLARE_QUAD_ENTRY_VIRTUAL(OT,ot) \ virtual sai_status_t create( \ diff --git a/meta/SaiSerialize.cpp b/meta/SaiSerialize.cpp index e5e8931e1..53f63fcfb 100644 --- a/meta/SaiSerialize.cpp +++ b/meta/SaiSerialize.cpp @@ -261,6 +261,10 @@ sai_status_t transfer_attribute( RETURN_ON_ERROR(transfer_list(src_attr.value.ipaddrlist, dst_attr.value.ipaddrlist, countOnly)); break; + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: + RETURN_ON_ERROR(transfer_list(src_attr.value.segmentlist, dst_attr.value.segmentlist, countOnly)); + break; + /* ACL FIELD DATA */ case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: @@ -420,6 +424,10 @@ sai_status_t transfer_attribute( transfer_primitive(src_attr.value.sysportconfig, dst_attr.value.sysportconfig); break; + case SAI_ATTR_VALUE_TYPE_AUTH_KEY: + transfer_primitive(src_attr.value.authkey, dst_attr.value.authkey); + break; + case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY: transfer_primitive(src_attr.value.macsecauthkey, dst_attr.value.macsecauthkey); break; @@ -432,6 +440,10 @@ sai_status_t transfer_attribute( transfer_primitive(src_attr.value.macsecsak, dst_attr.value.macsecsak); break; + case SAI_ATTR_VALUE_TYPE_ENCRYPT_KEY: + transfer_primitive(src_attr.value.encrypt_key, dst_attr.value.encrypt_key); + break; + case SAI_ATTR_VALUE_TYPE_PORT_ERR_STATUS_LIST: RETURN_ON_ERROR(transfer_list(src_attr.value.porterror, dst_attr.value.porterror, countOnly)); break; @@ -448,10 +460,6 @@ sai_status_t transfer_attribute( transfer_primitive(src_attr.value.rx_state, dst_attr.value.rx_state); break; - case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: - RETURN_ON_ERROR(transfer_list(src_attr.value.segmentlist, dst_attr.value.segmentlist, countOnly)); - break; - case SAI_ATTR_VALUE_TYPE_MAP_LIST: RETURN_ON_ERROR(transfer_list(src_attr.value.maplist, dst_attr.value.maplist, countOnly)); break; @@ -1226,6 +1234,7 @@ static json sai_serialize_qos_map_params( j["qidx"] = params.queue_index; j["mpls_exp"] = params.mpls_exp; j["color"] = sai_serialize_packet_color(params.color); + j["fc"] = params.fc; return j; } @@ -1569,6 +1578,39 @@ std::string sai_serialize_system_port_config_list( return j.dump(); } +std::string sai_serialize_segment_list( + _In_ const sai_segment_list_t& segmentlist, + _In_ bool countOnly) +{ + SWSS_LOG_ENTER(); + + std::string s = sai_serialize_number(segmentlist.count); + + if (countOnly) + { + return s; + } + + if (segmentlist.list == NULL || segmentlist.count == 0) + { + return s + ":null"; + } + + std::string l; + + for (uint32_t i = 0; i < segmentlist.count; ++i) + { + l += sai_serialize_ipv6(segmentlist.list[i]); + + if (i != segmentlist.count -1) + { + l += ","; + } + } + + return s + ":" + l; +} + std::string sai_serialize_attr_value( _In_ const sai_attr_metadata_t& meta, _In_ const sai_attribute_t &attr, @@ -1668,6 +1710,9 @@ std::string sai_serialize_attr_value( case SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST: return sai_serialize_ip_address_list(attr.value.ipaddrlist, countOnly); + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: + return sai_serialize_segment_list(attr.value.segmentlist, countOnly); + // ACL FIELD DATA case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: @@ -1717,6 +1762,12 @@ std::string sai_serialize_attr_value( case SAI_ATTR_VALUE_TYPE_MACSEC_SALT: return sai_serialize_hex_binary(attr.value.macsecsalt); + case SAI_ATTR_VALUE_TYPE_AUTH_KEY: + return sai_serialize_hex_binary(attr.value.authkey); + + case SAI_ATTR_VALUE_TYPE_ENCRYPT_KEY: + return sai_serialize_hex_binary(attr.value.encrypt_key); + case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG: return sai_serialize_system_port_config(meta, attr.value.sysportconfig); @@ -1991,6 +2042,24 @@ std::string sai_serialize_nat_entry( return j.dump(); } +std::string sai_serialize_my_sid_entry( + _In_ const sai_my_sid_entry_t& my_sid_entry) +{ + SWSS_LOG_ENTER(); + + json j; + + j["switch_id"] = sai_serialize_object_id(my_sid_entry.switch_id); + j["vr_id"] = sai_serialize_object_id(my_sid_entry.vr_id); + j["locator_block_len"] = sai_serialize_number(my_sid_entry.locator_block_len); + j["locator_node_len"] = sai_serialize_number(my_sid_entry.locator_node_len); + j["function_len"] = sai_serialize_number(my_sid_entry.function_len); + j["args_len"] = sai_serialize_number(my_sid_entry.args_len); + j["sid"] = sai_serialize_ipv6(my_sid_entry.sid); + + return j.dump(); +} + std::string sai_serialize_object_meta_key( _In_ const sai_object_meta_key_t& meta_key) { @@ -2027,6 +2096,10 @@ std::string sai_serialize_object_meta_key( key = sai_serialize_inseg_entry(meta_key.objectkey.key.inseg_entry); break; + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + key = sai_serialize_my_sid_entry(meta_key.objectkey.key.my_sid_entry); + break; + case SAI_OBJECT_TYPE_L2MC_ENTRY: key = sai_serialize_l2mc_entry(meta_key.objectkey.key.l2mc_entry); break; @@ -2420,6 +2493,16 @@ static void sai_deserialize_qos_map_params( params.mpls_exp = j["mpls_exp"]; } + if (j.find("fc") == j.end()) + { + // for backward compatibility + params.fc = 0; + } + else + { + params.fc = j["fc"]; + } + sai_deserialize_packet_color(j["color"], params.color); } @@ -2640,6 +2723,53 @@ void sai_deserialize_ip_address_list( sai_deserialize_list(s, list, countOnly, [&](const std::string sitem, sai_ip_address_t& item) { sai_deserialize_ip_address(sitem, item);} ); } +void sai_deserialize_segment_list( + _In_ const std::string& s, + _Out_ sai_segment_list_t& list, + _In_ bool countOnly) +{ + SWSS_LOG_ENTER(); + + if (countOnly) + { + sai_deserialize_number(s, list.count); + return; + } + + auto pos = s.find(":"); + + if (pos == std::string::npos) + { + SWSS_LOG_THROW("invalid list %s", s.c_str()); + } + + std::string scount = s.substr(0, pos); + + sai_deserialize_number(scount, list.count); + + std::string slist = s.substr(pos + 1); + + if (slist == "null") + { + list.list = NULL; + return; + } + + auto tokens = swss::tokenize(slist, ','); + + if (tokens.size() != list.count) + { + SWSS_LOG_THROW("invalid list count %lu != %u", tokens.size(), list.count); + } + + list.list = sai_alloc_n_of_ptr_type(list.count, list.list); + + for (uint32_t i = 0; i < list.count; ++i) + { + sai_deserialize_ipv6(tokens[i], list.list[i]); + } +} + template void sai_deserialize_range( _In_ const std::string& s, @@ -3062,6 +3192,9 @@ void sai_deserialize_attr_value( case SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST: return sai_deserialize_ip_address_list(s, attr.value.ipaddrlist, countOnly); + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: + return sai_deserialize_segment_list(s, attr.value.segmentlist, countOnly); + // ACL FIELD DATA case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: @@ -3100,6 +3233,12 @@ void sai_deserialize_attr_value( case SAI_ATTR_VALUE_TYPE_ACL_CAPABILITY: return sai_deserialize_acl_capability(s, attr.value.aclcapability); + case SAI_ATTR_VALUE_TYPE_AUTH_KEY: + return sai_deserialize_hex_binary(s, attr.value.authkey); + + case SAI_ATTR_VALUE_TYPE_ENCRYPT_KEY: + return sai_deserialize_hex_binary(s, attr.value.encrypt_key); + case SAI_ATTR_VALUE_TYPE_MACSEC_SAK: return sai_deserialize_hex_binary(s, attr.value.macsecsak); @@ -3354,6 +3493,23 @@ void sai_deserialize_inseg_entry( sai_deserialize_number(j["label"], inseg_entry.label); } +void sai_deserialize_my_sid_entry( + _In_ const std::string& s, + _Out_ sai_my_sid_entry_t &ne) +{ + SWSS_LOG_ENTER(); + + json j = json::parse(s); + + sai_deserialize_object_id(j["switch_id"], ne.switch_id); + sai_deserialize_object_id(j["vr_id"], ne.vr_id); + sai_deserialize_number(j["locator_block_len"], ne.locator_block_len); + sai_deserialize_number(j["locator_node_len"], ne.locator_node_len); + sai_deserialize_number(j["function_len"], ne.function_len); + sai_deserialize_number(j["args_len"], ne.args_len); + sai_deserialize_ipv6(j["sid"], ne.sid); +} + static void sai_deserialize_nat_entry_key( _In_ const json& j, _Out_ sai_nat_entry_key_t& nat_entry_key) @@ -3538,6 +3694,10 @@ void sai_deserialize_object_meta_key( sai_deserialize_inseg_entry(str_object_id, meta_key.objectkey.key.inseg_entry); break; + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + sai_deserialize_my_sid_entry(str_object_id, meta_key.objectkey.key.my_sid_entry); + break; + case SAI_OBJECT_TYPE_L2MC_ENTRY: sai_deserialize_l2mc_entry(str_object_id, meta_key.objectkey.key.l2mc_entry); break; @@ -3760,6 +3920,10 @@ void sai_deserialize_free_attribute_value( sai_free_list(attr.value.ipaddrlist); break; + case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST: + sai_free_list(attr.value.segmentlist); + break; + /* ACL FIELD DATA */ case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: @@ -3808,6 +3972,12 @@ void sai_deserialize_free_attribute_value( sai_free_list(attr.value.aclcapability.action_list); break; + case SAI_ATTR_VALUE_TYPE_AUTH_KEY: + break; + + case SAI_ATTR_VALUE_TYPE_ENCRYPT_KEY: + break; + case SAI_ATTR_VALUE_TYPE_MACSEC_SAK: case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY: case SAI_ATTR_VALUE_TYPE_MACSEC_SALT: diff --git a/meta/sai_serialize.h b/meta/sai_serialize.h index d752f4a7a..646501ea6 100644 --- a/meta/sai_serialize.h +++ b/meta/sai_serialize.h @@ -125,6 +125,9 @@ std::string sai_serialize_tunnel_stat( std::string sai_serialize_queue_attr( _In_ const sai_queue_attr_t attr); +std::string sai_serialize_my_sid_entry( + _In_ const sai_my_sid_entry_t &my_sid_entry); + std::string sai_serialize_hex_binary( _In_ const void *buffer, _In_ size_t length); @@ -356,6 +359,10 @@ void sai_deserialize_mac( _In_ const std::string& s, _Out_ sai_mac_t& mac); +void sai_deserialize_my_sid_entry( + _In_ const std::string& s, + _Out_ sai_my_sid_entry_t& my_sid_entry); + void sai_deserialize_ipv4( _In_ const std::string& s, _Out_ sai_ip4_t& ipaddr); diff --git a/syncd/NotificationQueue.h b/syncd/NotificationQueue.h index cdbec7fdc..bf0b2364d 100644 --- a/syncd/NotificationQueue.h +++ b/syncd/NotificationQueue.h @@ -2,6 +2,7 @@ extern "C" { #include +#include } #include "swss/table.h" diff --git a/syncd/SwitchNotifications.h b/syncd/SwitchNotifications.h index 898719aad..9412ef271 100644 --- a/syncd/SwitchNotifications.h +++ b/syncd/SwitchNotifications.h @@ -81,6 +81,7 @@ namespace syncd SlotBase({ .on_bfd_session_state_change = &Slot::onBfdSessionStateChange, .on_fdb_event = &Slot::onFdbEvent, + .on_ipsec_sa_status_change = nullptr, .on_packet_event = nullptr, .on_port_state_change = &Slot::onPortStateChange, .on_queue_pfc_deadlock = &Slot::onQueuePfcDeadlock, diff --git a/syncd/Syncd.cpp b/syncd/Syncd.cpp index 26a5a8d10..a4f3ff52c 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -1034,6 +1034,28 @@ sai_status_t Syncd::processBulkCreateEntry( } break; + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + { + std::vector entries(object_count); + + for (uint32_t it = 0; it < object_count; it++) + { + sai_deserialize_my_sid_entry(objectIds[it], entries[it]); + + entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id); + entries[it].vr_id = m_translator->translateVidToRid(entries[it].vr_id); + } + + status = m_vendorSai->bulkCreate( + object_count, + entries.data(), + attr_counts.data(), + attr_lists.data(), + mode, + statuses.data()); + } + break; + default: return SAI_STATUS_NOT_SUPPORTED; } @@ -1122,6 +1144,26 @@ sai_status_t Syncd::processBulkRemoveEntry( } break; + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + { + std::vector entries(object_count); + + for (uint32_t it = 0; it < object_count; it++) + { + sai_deserialize_my_sid_entry(objectIds[it], entries[it]); + + entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id); + entries[it].vr_id = m_translator->translateVidToRid(entries[it].vr_id); + } + + status = m_vendorSai->bulkRemove( + object_count, + entries.data(), + mode, + statuses.data()); + } + break; + case SAI_OBJECT_TYPE_INSEG_ENTRY: { std::vector entries(object_count); @@ -1240,6 +1282,27 @@ sai_status_t Syncd::processBulkSetEntry( } break; + case SAI_OBJECT_TYPE_MY_SID_ENTRY: + { + std::vector entries(object_count); + + for (uint32_t it = 0; it < object_count; it++) + { + sai_deserialize_my_sid_entry(objectIds[it], entries[it]); + + entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id); + entries[it].vr_id = m_translator->translateVidToRid(entries[it].vr_id); + } + + status = m_vendorSai->bulkSet( + object_count, + entries.data(), + attr_lists.data(), + mode, + statuses.data()); + } + break; + case SAI_OBJECT_TYPE_INSEG_ENTRY: { std::vector entries(object_count); diff --git a/syncd/VendorSai.cpp b/syncd/VendorSai.cpp index 637955d7a..d0ebefdd6 100644 --- a/syncd/VendorSai.cpp +++ b/syncd/VendorSai.cpp @@ -620,8 +620,8 @@ sai_status_t VendorSai::bulkCreate( ptr = m_apis.next_hop_group_api->create_next_hop_group_members; break; - case SAI_OBJECT_TYPE_SEGMENTROUTE_SIDLIST: - ptr = m_apis.segmentroute_api->create_segmentroute_sidlists; + case SAI_OBJECT_TYPE_SRV6_SIDLIST: + ptr = m_apis.srv6_api->create_srv6_sidlists; break; case SAI_OBJECT_TYPE_STP_PORT: @@ -679,8 +679,8 @@ sai_status_t VendorSai::bulkRemove( ptr = m_apis.next_hop_group_api->remove_next_hop_group_members; break; - case SAI_OBJECT_TYPE_SEGMENTROUTE_SIDLIST: - ptr = m_apis.segmentroute_api->remove_segmentroute_sidlists; + case SAI_OBJECT_TYPE_SRV6_SIDLIST: + ptr = m_apis.srv6_api->remove_srv6_sidlists; break; case SAI_OBJECT_TYPE_STP_PORT: @@ -832,6 +832,32 @@ sai_status_t VendorSai::bulkCreate( object_statuses); } +sai_status_t VendorSai::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t* entries, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + VENDOR_CHECK_API_INITIALIZED(); + + if (!m_apis.srv6_api->create_my_sid_entries) + { + SWSS_LOG_INFO("create_my_sid_entries is not supported"); + return SAI_STATUS_NOT_SUPPORTED; + } + + return m_apis.srv6_api->create_my_sid_entries( + object_count, + entries, + attr_count, + attr_list, + mode, + object_statuses); +} // BULK REMOVE sai_status_t VendorSai::bulkRemove( @@ -927,6 +953,29 @@ sai_status_t VendorSai::bulkRemove( object_statuses); } +sai_status_t VendorSai::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *entries, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + VENDOR_CHECK_API_INITIALIZED(); + + if (!m_apis.srv6_api->remove_my_sid_entries) + { + SWSS_LOG_INFO("remove_my_sid_entries is not supported"); + return SAI_STATUS_NOT_SUPPORTED; + } + + return m_apis.srv6_api->remove_my_sid_entries( + object_count, + entries, + mode, + object_statuses); +} + // BULK SET sai_status_t VendorSai::bulkSet( @@ -1029,6 +1078,30 @@ sai_status_t VendorSai::bulkSet( object_statuses); } +sai_status_t VendorSai::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *entries, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + VENDOR_CHECK_API_INITIALIZED(); + + if (!m_apis.srv6_api->set_my_sid_entries_attribute) + { + SWSS_LOG_INFO("set_my_sid_entries_attribute is not supported"); + return SAI_STATUS_NOT_SUPPORTED; + } + + return m_apis.srv6_api->set_my_sid_entries_attribute( + object_count, + entries, + attr_list, + mode, + object_statuses); +} // NON QUAD API sai_status_t VendorSai::flushFdbEntries( diff --git a/syncd/tests.cpp b/syncd/tests.cpp index 324718dc4..d28169793 100644 --- a/syncd/tests.cpp +++ b/syncd/tests.cpp @@ -229,10 +229,16 @@ void test_bulk_next_hop_group_member_create() sai_next_hop_api_t *sai_next_hop_api = NULL; sai_next_hop_group_api_t *sai_next_hop_group_api = NULL; sai_switch_api_t *sai_switch_api = NULL; + sai_lag_api_t *sai_lag_api = NULL; + sai_router_interface_api_t *sai_rif_api = NULL; + sai_virtual_router_api_t * sai_virtual_router_api = NULL; sai_api_query(SAI_API_NEXT_HOP, (void**)&sai_next_hop_api); sai_api_query(SAI_API_NEXT_HOP_GROUP, (void**)&sai_next_hop_group_api); sai_api_query(SAI_API_SWITCH, (void**)&sai_switch_api); + sai_api_query(SAI_API_ROUTER_INTERFACE, (void **)&sai_rif_api); + sai_api_query(SAI_API_LAG, (void**)&sai_lag_api); + sai_api_query(SAI_API_VIRTUAL_ROUTER, (void**)&sai_virtual_router_api); uint32_t count = 3; @@ -262,6 +268,29 @@ void test_bulk_next_hop_group_member_create() ASSERT_SUCCESS("failed to create next hop group"); + // virtual router + sai_object_id_t vr; + + status = sai_virtual_router_api->create_virtual_router(&vr, switch_id, 0, NULL); + + ASSERT_SUCCESS("failed to create virtual router"); + + // create lag + sai_object_id_t lag; + status = sai_lag_api->create_lag(&lag, switch_id, 0, NULL); + + // create router interface + sai_object_id_t rif; + sai_attribute_t rifattr[3]; + rifattr[0].id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID; + rifattr[0].value.oid = vr; + rifattr[1].id = SAI_ROUTER_INTERFACE_ATTR_TYPE; + rifattr[1].value.s32 = SAI_ROUTER_INTERFACE_TYPE_PORT; + rifattr[2].id = SAI_ROUTER_INTERFACE_ATTR_PORT_ID; + rifattr[2].value.oid = lag; + status = sai_rif_api->create_router_interface(&rif, switch_id, 3, rifattr); + ASSERT_SUCCESS("Failed to create router interface"); + for (uint32_t i = 0; i < count; ++i) { sai_object_id_t hop_vid; @@ -269,11 +298,12 @@ void test_bulk_next_hop_group_member_create() sai_attribute_t nhattr[3] = { }; nhattr[0].id = SAI_NEXT_HOP_ATTR_TYPE; - nhattr[0].value.s32 = SAI_NEXT_HOP_TYPE_SEGMENTROUTE_ENDPOINT; - - nhattr[1].id = SAI_NEXT_HOP_ATTR_SEGMENTROUTE_ENDPOINT_TYPE; - - nhattr[2].id = SAI_NEXT_HOP_ATTR_SEGMENTROUTE_ENDPOINT_POP_TYPE; + nhattr[0].value.s32 = SAI_NEXT_HOP_TYPE_IP; + nhattr[1].id = SAI_NEXT_HOP_ATTR_IP; + nhattr[1].value.ipaddr.addr_family = SAI_IP_ADDR_FAMILY_IPV4; + nhattr[1].value.ipaddr.addr.ip4 = 0x10000001 + count; + nhattr[2].id = SAI_NEXT_HOP_ATTR_ROUTER_INTERFACE_ID; + nhattr[2].value.oid = rif; status = sai_next_hop_api->create_next_hop(&hop_vid, switch_id, 3, nhattr); @@ -467,11 +497,15 @@ void test_bulk_route_set() sai_switch_api_t *sai_switch_api = NULL; sai_virtual_router_api_t * sai_virtual_router_api = NULL; sai_next_hop_api_t *sai_next_hop_api = NULL; + sai_lag_api_t *sai_lag_api = NULL; + sai_router_interface_api_t *sai_rif_api = NULL; sai_api_query(SAI_API_ROUTE, (void**)&sai_route_api); sai_api_query(SAI_API_SWITCH, (void**)&sai_switch_api); sai_api_query(SAI_API_VIRTUAL_ROUTER, (void**)&sai_virtual_router_api); sai_api_query(SAI_API_NEXT_HOP, (void**)&sai_next_hop_api); + sai_api_query(SAI_API_ROUTER_INTERFACE, (void **)&sai_rif_api); + sai_api_query(SAI_API_LAG, (void**)&sai_lag_api); uint32_t count = 3; @@ -505,15 +539,34 @@ void test_bulk_route_set() ASSERT_SUCCESS("failed to create virtual router"); + // create lag + sai_object_id_t lag; + status = sai_lag_api->create_lag(&lag, switch_id, 0, NULL); + + // create router interface + sai_object_id_t rif; + sai_attribute_t rifattr[3]; + rifattr[0].id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID; + rifattr[0].value.oid = vr; + rifattr[1].id = SAI_ROUTER_INTERFACE_ATTR_TYPE; + rifattr[1].value.s32 = SAI_ROUTER_INTERFACE_TYPE_PORT; + rifattr[2].id = SAI_ROUTER_INTERFACE_ATTR_PORT_ID; + rifattr[2].value.oid = lag; + status = sai_rif_api->create_router_interface(&rif, switch_id, 3, rifattr); + ASSERT_SUCCESS("Failed to create router interface"); + // next hop sai_object_id_t hop; sai_attribute_t nhattr[3] = { }; nhattr[0].id = SAI_NEXT_HOP_ATTR_TYPE; - nhattr[0].value.s32 = SAI_NEXT_HOP_TYPE_SEGMENTROUTE_ENDPOINT; - nhattr[1].id = SAI_NEXT_HOP_ATTR_SEGMENTROUTE_ENDPOINT_TYPE; - nhattr[2].id = SAI_NEXT_HOP_ATTR_SEGMENTROUTE_ENDPOINT_POP_TYPE; + nhattr[0].value.s32 = SAI_NEXT_HOP_TYPE_IP; + nhattr[1].id = SAI_NEXT_HOP_ATTR_IP; + nhattr[1].value.ipaddr.addr_family = SAI_IP_ADDR_FAMILY_IPV4; + nhattr[1].value.ipaddr.addr.ip4 = 0x10000001; + nhattr[2].id = SAI_NEXT_HOP_ATTR_ROUTER_INTERFACE_ID; + nhattr[2].value.oid = rif; status = sai_next_hop_api->create_next_hop(&hop, switch_id, 3, nhattr); diff --git a/unittest/lib/Makefile.am b/unittest/lib/Makefile.am index 52380199c..458b46153 100644 --- a/unittest/lib/Makefile.am +++ b/unittest/lib/Makefile.am @@ -62,7 +62,7 @@ testslibsairedis_SOURCES = main_libsairedis.cpp \ test_sai_redis_router_samplepacket.cpp \ test_sai_redis_schedulergroup.cpp \ test_sai_redis_scheduler.cpp \ - test_sai_redis_segmentroute.cpp \ + test_sai_redis_srv6.cpp \ test_sai_redis_switch.cpp \ test_sai_redis_system_port.cpp \ test_sai_redis_tam.cpp \ diff --git a/unittest/lib/test_sai_redis_segmentroute.cpp b/unittest/lib/test_sai_redis_segmentroute.cpp deleted file mode 100644 index 7fb80c445..000000000 --- a/unittest/lib/test_sai_redis_segmentroute.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -extern "C" { -#include "sai.h" -} - -#include "swss/logger.h" - -TEST(libsairedis, segmentroute_sidlist) -{ - sai_segmentroute_api_t *api = nullptr; - - sai_api_query(SAI_API_SEGMENTROUTE, (void**)&api); - - EXPECT_NE(api, nullptr); - - sai_object_id_t id; - - EXPECT_NE(SAI_STATUS_SUCCESS, api->create_segmentroute_sidlist(&id,0,0,0)); - EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_segmentroute_sidlist(0)); - EXPECT_NE(SAI_STATUS_SUCCESS, api->set_segmentroute_sidlist_attribute(0,0)); - EXPECT_NE(SAI_STATUS_SUCCESS, api->get_segmentroute_sidlist_attribute(0,0,0)); - - EXPECT_NE(SAI_STATUS_SUCCESS, api->create_segmentroute_sidlists(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0,0)); - EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_segmentroute_sidlists(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); -} diff --git a/unittest/lib/test_sai_redis_srv6.cpp b/unittest/lib/test_sai_redis_srv6.cpp new file mode 100644 index 000000000..d9c03e99d --- /dev/null +++ b/unittest/lib/test_sai_redis_srv6.cpp @@ -0,0 +1,36 @@ +#include + +extern "C" { +#include "sai.h" +} + +#include "swss/logger.h" + +TEST(libsairedis, srv6) +{ + sai_srv6_api_t *api = nullptr; + + sai_api_query(SAI_API_SRV6, (void**)&api); + + EXPECT_NE(api, nullptr); + + sai_object_id_t obj_id; + sai_my_sid_entry_t id ; + + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_srv6_sidlist(&obj_id,0,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_srv6_sidlist(0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_srv6_sidlist_attribute(0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_srv6_sidlist_attribute(0,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_srv6_sidlists(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_srv6_sidlists(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_my_sid_entry(&id,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_my_sid_entry(0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_my_sid_entry_attribute(0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_my_sid_entry_attribute(0,0,0)); + + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_my_sid_entries(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_my_sid_entries(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_my_sid_entries_attribute(0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_my_sid_entries_attribute(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); +} diff --git a/unittest/meta/TestSaiSerialize.cpp b/unittest/meta/TestSaiSerialize.cpp index e6252774b..aa4d36419 100644 --- a/unittest/meta/TestSaiSerialize.cpp +++ b/unittest/meta/TestSaiSerialize.cpp @@ -1026,8 +1026,8 @@ TEST(SaiSerialize, serialize_qos_map) attr.id = SAI_QOS_MAP_ATTR_MAP_TO_VALUE_LIST; sai_qos_map_t qm = { - .key = { .tc = 1, .dscp = 2, .dot1p = 3, .prio = 4, .pg = 5, .queue_index = 6, .color = SAI_PACKET_COLOR_RED, .mpls_exp = 0 }, - .value = { .tc = 11, .dscp = 22, .dot1p = 33, .prio = 44, .pg = 55, .queue_index = 66, .color = SAI_PACKET_COLOR_GREEN, .mpls_exp = 0 } }; + .key = { .tc = 1, .dscp = 2, .dot1p = 3, .prio = 4, .pg = 5, .queue_index = 6, .color = SAI_PACKET_COLOR_RED, .mpls_exp = 0, .fc = 2 }, + .value = { .tc = 11, .dscp = 22, .dot1p = 33, .prio = 44, .pg = 55, .queue_index = 66, .color = SAI_PACKET_COLOR_GREEN, .mpls_exp = 0, .fc = 2 } }; attr.value.qosmap.count = 1; attr.value.qosmap.list = &qm; @@ -1036,7 +1036,7 @@ TEST(SaiSerialize, serialize_qos_map) s = sai_serialize_attr_value(*meta, attr); - std::string ret = "{\"count\":1,\"list\":[{\"key\":{\"color\":\"SAI_PACKET_COLOR_RED\",\"dot1p\":3,\"dscp\":2,\"mpls_exp\":0,\"pg\":5,\"prio\":4,\"qidx\":6,\"tc\":1},\"value\":{\"color\":\"SAI_PACKET_COLOR_GREEN\",\"dot1p\":33,\"dscp\":22,\"mpls_exp\":0,\"pg\":55,\"prio\":44,\"qidx\":66,\"tc\":11}}]}"; + std::string ret = "{\"count\":1,\"list\":[{\"key\":{\"color\":\"SAI_PACKET_COLOR_RED\",\"dot1p\":3,\"dscp\":2,\"fc\":2,\"mpls_exp\":0,\"pg\":5,\"prio\":4,\"qidx\":6,\"tc\":1},\"value\":{\"color\":\"SAI_PACKET_COLOR_GREEN\",\"dot1p\":33,\"dscp\":22,\"fc\":2,\"mpls_exp\":0,\"pg\":55,\"prio\":44,\"qidx\":66,\"tc\":11}}]}"; EXPECT_EQ(s, ret); @@ -1063,6 +1063,7 @@ TEST(SaiSerialize, serialize_qos_map) EXPECT_EQ(l.key.queue_index, 6); EXPECT_EQ(l.key.color, SAI_PACKET_COLOR_RED); EXPECT_EQ(l.key.mpls_exp, 0); + EXPECT_EQ(l.key.fc, 2); EXPECT_EQ(l.value.tc, 11); EXPECT_EQ(l.value.dscp, 22); @@ -1072,6 +1073,7 @@ TEST(SaiSerialize, serialize_qos_map) EXPECT_EQ(l.value.queue_index, 66); EXPECT_EQ(l.value.color, SAI_PACKET_COLOR_GREEN); EXPECT_EQ(l.value.mpls_exp, 0); + EXPECT_EQ(l.value.fc, 2); } template diff --git a/unittest/vslib/Makefile.am b/unittest/vslib/Makefile.am index 7139edab6..d3b230720 100644 --- a/unittest/vslib/Makefile.am +++ b/unittest/vslib/Makefile.am @@ -82,7 +82,7 @@ testslibsaivs_SOURCES = main_libsaivs.cpp \ test_sai_vs_router_samplepacket.cpp \ test_sai_vs_schedulergroup.cpp \ test_sai_vs_scheduler.cpp \ - test_sai_vs_segmentroute.cpp \ + test_sai_vs_srv6.cpp \ test_sai_vs_switch.cpp \ test_sai_vs_system_port.cpp \ test_sai_vs_tam.cpp \ diff --git a/unittest/vslib/test_sai_vs_nexthopgroup.cpp b/unittest/vslib/test_sai_vs_nexthopgroup.cpp index 8807dc09b..24b1cc136 100644 --- a/unittest/vslib/test_sai_vs_nexthopgroup.cpp +++ b/unittest/vslib/test_sai_vs_nexthopgroup.cpp @@ -28,4 +28,10 @@ TEST(libsaivs, next_hop_group) EXPECT_NE(SAI_STATUS_SUCCESS, api->create_next_hop_group_members(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0,0)); EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_next_hop_group_members(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_next_hop_group_map(&id,0,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_next_hop_group_map(0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_next_hop_group_map_attribute(0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_next_hop_group_map_attribute(0,0,0)); + } diff --git a/unittest/vslib/test_sai_vs_segmentroute.cpp b/unittest/vslib/test_sai_vs_segmentroute.cpp deleted file mode 100644 index d4021b9c6..000000000 --- a/unittest/vslib/test_sai_vs_segmentroute.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -extern "C" { -#include "sai.h" -} - -#include "swss/logger.h" - -TEST(libsaivs, segmentroute_sidlist) -{ - sai_segmentroute_api_t *api = nullptr; - - sai_api_query(SAI_API_SEGMENTROUTE, (void**)&api); - - EXPECT_NE(api, nullptr); - - sai_object_id_t id; - - EXPECT_NE(SAI_STATUS_SUCCESS, api->create_segmentroute_sidlist(&id,0,0,0)); - EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_segmentroute_sidlist(0)); - EXPECT_NE(SAI_STATUS_SUCCESS, api->set_segmentroute_sidlist_attribute(0,0)); - EXPECT_NE(SAI_STATUS_SUCCESS, api->get_segmentroute_sidlist_attribute(0,0,0)); - - EXPECT_NE(SAI_STATUS_SUCCESS, api->create_segmentroute_sidlists(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0,0)); - EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_segmentroute_sidlists(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); -} diff --git a/unittest/vslib/test_sai_vs_srv6.cpp b/unittest/vslib/test_sai_vs_srv6.cpp new file mode 100644 index 000000000..6c4bab9d3 --- /dev/null +++ b/unittest/vslib/test_sai_vs_srv6.cpp @@ -0,0 +1,36 @@ +#include + +extern "C" { +#include "sai.h" +} + +#include "swss/logger.h" + +TEST(libsaivs, srv6) +{ + sai_srv6_api_t *api = nullptr; + + sai_api_query(SAI_API_SRV6, (void**)&api); + + EXPECT_NE(api, nullptr); + + sai_my_sid_entry_t id; + sai_object_id_t obj_id; + + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_srv6_sidlist(&obj_id,0,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_srv6_sidlist(0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_srv6_sidlist_attribute(0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_srv6_sidlist_attribute(0,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_srv6_sidlists(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_srv6_sidlists(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_my_sid_entry(&id,0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_my_sid_entry(0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_my_sid_entry_attribute(0,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_my_sid_entry_attribute(0,0,0)); + + EXPECT_NE(SAI_STATUS_SUCCESS, api->create_my_sid_entries(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->remove_my_sid_entries(0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->set_my_sid_entries_attribute(0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); + EXPECT_NE(SAI_STATUS_SUCCESS, api->get_my_sid_entries_attribute(0,0,0,0,SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR,0)); +} diff --git a/vslib/Makefile.am b/vslib/Makefile.am index 7b1451cf8..422d7ca16 100644 --- a/vslib/Makefile.am +++ b/vslib/Makefile.am @@ -96,7 +96,7 @@ libsaivs_la_SOURCES = \ sai_vs_samplepacket.cpp \ sai_vs_scheduler.cpp \ sai_vs_schedulergroup.cpp \ - sai_vs_segmentroute.cpp \ + sai_vs_srv6.cpp \ sai_vs_stp.cpp \ sai_vs_switch.cpp \ sai_vs_system_port.cpp \ @@ -105,7 +105,9 @@ libsaivs_la_SOURCES = \ sai_vs_udf.cpp \ sai_vs_virtual_router.cpp \ sai_vs_vlan.cpp \ - sai_vs_wred.cpp + sai_vs_wred.cpp \ + sai_vs_my_mac.cpp \ + sai_vs_ipsec.cpp libSaiVS_a_CPPFLAGS = $(CODE_COVERAGE_CPPFLAGS) libSaiVS_a_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) $(CODE_COVERAGE_CXXFLAGS) diff --git a/vslib/VirtualSwitchSaiInterface.cpp b/vslib/VirtualSwitchSaiInterface.cpp index 58df841e1..7e78bf19d 100644 --- a/vslib/VirtualSwitchSaiInterface.cpp +++ b/vslib/VirtualSwitchSaiInterface.cpp @@ -981,6 +981,24 @@ sai_status_t VirtualSwitchSaiInterface::bulkRemove( return bulkRemove(route_entry->switch_id, SAI_OBJECT_TYPE_ROUTE_ENTRY, serializedObjectIds, mode, object_statuses); } +sai_status_t VirtualSwitchSaiInterface::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_my_sid_entry(my_sid_entry[idx])); + } + + return bulkRemove(my_sid_entry->switch_id, SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, mode, object_statuses); +} + sai_status_t VirtualSwitchSaiInterface::bulkRemove( _In_ uint32_t object_count, _In_ const sai_nat_entry_t *nat_entry, @@ -1076,6 +1094,25 @@ sai_status_t VirtualSwitchSaiInterface::bulkSet( return bulkSet(route_entry->switch_id, SAI_OBJECT_TYPE_ROUTE_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); } +sai_status_t VirtualSwitchSaiInterface::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t *my_sid_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_my_sid_entry(my_sid_entry[idx])); + } + + return bulkSet(my_sid_entry->switch_id, SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); +} + sai_status_t VirtualSwitchSaiInterface::bulkSet( _In_ uint32_t object_count, _In_ const sai_nat_entry_t *nat_entry, @@ -1282,6 +1319,35 @@ sai_status_t VirtualSwitchSaiInterface::bulkCreate( object_statuses); } +sai_status_t VirtualSwitchSaiInterface::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_my_sid_entry_t* my_sid_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serialized_object_ids; + + // on create vid is put in db by syncd + for (uint32_t idx = 0; idx < object_count; idx++) + { + std::string str_object_id = sai_serialize_my_sid_entry(my_sid_entry[idx]); + serialized_object_ids.push_back(str_object_id); + } + + return bulkCreate( + my_sid_entry->switch_id, + SAI_OBJECT_TYPE_MY_SID_ENTRY, + serialized_object_ids, + attr_count, + attr_list, + mode, + object_statuses); +} + sai_status_t VirtualSwitchSaiInterface::bulkCreate( _In_ uint32_t object_count, _In_ const sai_nat_entry_t* nat_entry, diff --git a/vslib/sai_vs.h b/vslib/sai_vs.h index b445ce754..46063a914 100644 --- a/vslib/sai_vs.h +++ b/vslib/sai_vs.h @@ -48,7 +48,7 @@ PRIVATE extern const sai_rpf_group_api_t vs_rpf_group_api; PRIVATE extern const sai_samplepacket_api_t vs_samplepacket_api; PRIVATE extern const sai_scheduler_api_t vs_scheduler_api; PRIVATE extern const sai_scheduler_group_api_t vs_scheduler_group_api; -PRIVATE extern const sai_segmentroute_api_t vs_segmentroute_api; +PRIVATE extern const sai_srv6_api_t vs_srv6_api; PRIVATE extern const sai_stp_api_t vs_stp_api; PRIVATE extern const sai_switch_api_t vs_switch_api; PRIVATE extern const sai_system_port_api_t vs_system_port_api; @@ -58,6 +58,8 @@ PRIVATE extern const sai_udf_api_t vs_udf_api; PRIVATE extern const sai_virtual_router_api_t vs_virtual_router_api; PRIVATE extern const sai_vlan_api_t vs_vlan_api; PRIVATE extern const sai_wred_api_t vs_wred_api; +PRIVATE extern const sai_my_mac_api_t vs_my_mac_api; +PRIVATE extern const sai_ipsec_api_t vs_ipsec_api; PRIVATE extern std::shared_ptr vs_sai; diff --git a/vslib/sai_vs_interfacequery.cpp b/vslib/sai_vs_interfacequery.cpp index 1393d18a6..a42b8021a 100644 --- a/vslib/sai_vs_interfacequery.cpp +++ b/vslib/sai_vs_interfacequery.cpp @@ -65,7 +65,7 @@ static sai_apis_t vs_apis = { API(mcast_fdb), API(bridge), API(tam), - API(segmentroute), + API(srv6), API(mpls), API(dtel), API(bfd), @@ -75,6 +75,8 @@ static sai_apis_t vs_apis = { API(debug_counter), API(macsec), API(system_port), + API(my_mac), + API(ipsec), API(bmtor), }; diff --git a/vslib/sai_vs_ipsec.cpp b/vslib/sai_vs_ipsec.cpp new file mode 100644 index 000000000..fe4255a0e --- /dev/null +++ b/vslib/sai_vs_ipsec.cpp @@ -0,0 +1,16 @@ +#include "sai_vs.h" + +VS_GENERIC_QUAD(IPSEC,ipsec); +VS_GENERIC_QUAD(IPSEC_PORT,ipsec_port); +VS_GENERIC_QUAD(IPSEC_SA,ipsec_sa); +VS_GENERIC_STATS(IPSEC_PORT,ipsec_port); +VS_GENERIC_STATS(IPSEC_SA,ipsec_sa); + +const sai_ipsec_api_t vs_ipsec_api = { + + VS_GENERIC_QUAD_API(ipsec) + VS_GENERIC_QUAD_API(ipsec_port) + VS_GENERIC_STATS_API(ipsec_port) + VS_GENERIC_QUAD_API(ipsec_sa) + VS_GENERIC_STATS_API(ipsec_sa) +}; diff --git a/vslib/sai_vs_my_mac.cpp b/vslib/sai_vs_my_mac.cpp new file mode 100644 index 000000000..a159602e1 --- /dev/null +++ b/vslib/sai_vs_my_mac.cpp @@ -0,0 +1,8 @@ +#include "sai_vs.h" + +VS_GENERIC_QUAD(IPSEC,my_mac); + +const sai_my_mac_api_t vs_my_mac_api = { + + VS_GENERIC_QUAD_API(my_mac) +}; diff --git a/vslib/sai_vs_nexthopgroup.cpp b/vslib/sai_vs_nexthopgroup.cpp index 393e028e0..2a6e84d9a 100644 --- a/vslib/sai_vs_nexthopgroup.cpp +++ b/vslib/sai_vs_nexthopgroup.cpp @@ -5,6 +5,7 @@ VS_BULK_REMOVE(NEXT_HOP_GROUP_MEMBER,next_hop_group_members); VS_GENERIC_QUAD(NEXT_HOP_GROUP,next_hop_group); VS_GENERIC_QUAD(NEXT_HOP_GROUP_MEMBER,next_hop_group_member); +VS_GENERIC_QUAD(NEXT_HOP_GROUP_MAP,next_hop_group_map); const sai_next_hop_group_api_t vs_next_hop_group_api = { @@ -13,4 +14,5 @@ const sai_next_hop_group_api_t vs_next_hop_group_api = { vs_bulk_create_next_hop_group_members, vs_bulk_remove_next_hop_group_members, + VS_GENERIC_QUAD_API(next_hop_group_map) }; diff --git a/vslib/sai_vs_segmentroute.cpp b/vslib/sai_vs_segmentroute.cpp deleted file mode 100644 index 6ea4ef228..000000000 --- a/vslib/sai_vs_segmentroute.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "sai_vs.h" - -VS_BULK_CREATE(SEGMENTROUTE_SIDLIST,segmentroute_sidlists); -VS_BULK_REMOVE(SEGMENTROUTE_SIDLIST,segmentroute_sidlists); - -VS_GENERIC_QUAD(SEGMENTROUTE_SIDLIST,segmentroute_sidlist); - -const sai_segmentroute_api_t vs_segmentroute_api = { - - VS_GENERIC_QUAD_API(segmentroute_sidlist) - - vs_bulk_create_segmentroute_sidlists, - vs_bulk_remove_segmentroute_sidlists, -}; diff --git a/vslib/sai_vs_srv6.cpp b/vslib/sai_vs_srv6.cpp new file mode 100644 index 000000000..4a7f55f78 --- /dev/null +++ b/vslib/sai_vs_srv6.cpp @@ -0,0 +1,20 @@ +#include "sai_vs.h" + +VS_BULK_CREATE(SRV6_SIDLIST,srv6_sidlists); +VS_BULK_REMOVE(SRV6_SIDLIST,srv6_sidlists); + +VS_GENERIC_QUAD(SRV6_SIDLIST,srv6_sidlist); + +VS_GENERIC_QUAD_ENTRY(MY_SID_ENTRY, my_sid_entry); +VS_BULK_QUAD_ENTRY(MY_SID_ENTRY, my_sid_entry); + +const sai_srv6_api_t vs_srv6_api = { + + VS_GENERIC_QUAD_API(srv6_sidlist) + + vs_bulk_create_srv6_sidlists, + vs_bulk_remove_srv6_sidlists, + + VS_GENERIC_QUAD_API(my_sid_entry) + VS_BULK_QUAD_API(my_sid_entry) +};