From 4bae246ac90f273401e053b194e5482d430e5a2b Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Tue, 24 Aug 2021 13:55:45 -0700 Subject: [PATCH 1/9] Sonic sairedis changes for SAI SRV6 --- lib/ClientSai.cpp | 73 +++++ lib/Makefile.am | 2 +- lib/Recorder.h | 5 +- lib/RedisRemoteSaiInterface.cpp | 67 +++++ lib/ServerSai.cpp | 54 ++++ lib/sai_redis.h | 2 +- lib/sai_redis_interfacequery.cpp | 2 +- lib/sai_redis_srv6.cpp | 18 ++ meta/DummySaiInterface.cpp | 44 +++ meta/Meta.cpp | 432 ++++++++++++++++++++++++++++ meta/Meta.h | 4 + meta/MetaKeyHasher.cpp | 33 +++ meta/SaiInterface.cpp | 12 + meta/SaiInterface.h | 2 + meta/SaiSerialize.cpp | 137 +++++++++ meta/sai_serialize.h | 7 + syncd/Syncd.cpp | 63 ++++ syncd/VendorSai.cpp | 77 ++++- syncd/tests.cpp | 38 ++- vslib/Makefile.am | 2 +- vslib/VirtualSwitchSaiInterface.cpp | 66 +++++ vslib/sai_vs.h | 2 +- vslib/sai_vs_interfacequery.cpp | 2 +- vslib/sai_vs_srv6.cpp | 20 ++ 24 files changed, 1144 insertions(+), 20 deletions(-) create mode 100644 lib/sai_redis_srv6.cpp create mode 100644 vslib/sai_vs_srv6.cpp diff --git a/lib/ClientSai.cpp b/lib/ClientSai.cpp index efd7a22887..cff4201fec 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 73f1139200..95f40b5105 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 \ diff --git a/lib/Recorder.h b/lib/Recorder.h index 85846b4ed4..3d55dbf124 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 3c0870bcab..d5f4c0eac5 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 eecf5fb031..9f0e4f14dd 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 e137417f60..6a2391e970 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; diff --git a/lib/sai_redis_interfacequery.cpp b/lib/sai_redis_interfacequery.cpp index 67a9946ddf..ad66097132 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), diff --git a/lib/sai_redis_srv6.cpp b/lib/sai_redis_srv6.cpp new file mode 100644 index 0000000000..d31e887f53 --- /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/meta/DummySaiInterface.cpp b/meta/DummySaiInterface.cpp index 245f725cd3..671ba2dcf5 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 79509a34c6..6b391e55b2 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -472,6 +472,46 @@ 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); + + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_DEBUG("remove status: %s", sai_serialize_status(status).c_str()); + } + else + { + SWSS_LOG_ERROR("remove status: %s", sai_serialize_status(status).c_str()); + } + + 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, @@ -807,6 +847,48 @@ 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); + + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_DEBUG("create status: %s", sai_serialize_status(status).c_str()); + } + else + { + SWSS_LOG_ERROR("create status: %s", sai_serialize_status(status).c_str()); + } + + 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) @@ -1134,6 +1216,46 @@ 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); + + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_DEBUG("set status: %s", sai_serialize_status(status).c_str()); + } + else + { + SWSS_LOG_ERROR("set status: %s", sai_serialize_status(status).c_str()); + } + + 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, @@ -1402,6 +1524,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, @@ -2263,6 +2418,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, @@ -2559,6 +2773,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, @@ -3001,6 +3273,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) { @@ -3523,6 +3855,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; @@ -4312,6 +4645,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, @@ -4707,6 +5121,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) @@ -5369,6 +5787,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) @@ -5771,6 +6193,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 @@ -6010,6 +6436,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) @@ -6924,6 +7354,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; @@ -7162,6 +7593,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 521c735759..79dc2ec49a 100644 --- a/meta/Meta.h +++ b/meta/Meta.h @@ -429,6 +429,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 1da4d8585a..a9d67dc060 100644 --- a/meta/MetaKeyHasher.cpp +++ b/meta/MetaKeyHasher.cpp @@ -98,6 +98,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 @@ -127,6 +143,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; + SWSS_LOG_THROW("not implemented: %s", sai_serialize_object_meta_key(a).c_str()); } @@ -211,6 +230,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]; +} + std::size_t MetaKeyHasher::operator()( _In_ const sai_object_meta_key_t& k) const { @@ -241,6 +271,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); + default: SWSS_LOG_THROW("not handled: %s", sai_serialize_object_type(k.objecttype).c_str()); } diff --git a/meta/SaiInterface.cpp b/meta/SaiInterface.cpp index cd7a2296fd..82e37242dc 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 c1e794133f..99ecdf1aeb 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 6f67a92bc1..fe9068b24c 100644 --- a/meta/SaiSerialize.cpp +++ b/meta/SaiSerialize.cpp @@ -255,6 +255,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: @@ -1516,6 +1520,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, @@ -1615,6 +1652,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: @@ -1902,6 +1942,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) { @@ -1938,6 +1996,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; + default: if (meta->isnonobjectid) @@ -2552,6 +2614,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, @@ -2969,6 +3078,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: @@ -3233,6 +3345,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) @@ -3374,6 +3503,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; + default: if (meta->isnonobjectid) @@ -3562,6 +3695,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: diff --git a/meta/sai_serialize.h b/meta/sai_serialize.h index 1ba81ef927..92ec274700 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); @@ -324,6 +327,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); + // deserialize notifications void sai_deserialize_fdb_event_ntf( diff --git a/syncd/Syncd.cpp b/syncd/Syncd.cpp index 3eebdc8d52..60c0118f53 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -1003,6 +1003,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; } @@ -1091,6 +1113,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); @@ -1209,6 +1251,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 637955d7a6..ea6c4ba378 100644 --- a/syncd/VendorSai.cpp +++ b/syncd/VendorSai.cpp @@ -621,7 +621,7 @@ sai_status_t VendorSai::bulkCreate( break; case SAI_OBJECT_TYPE_SEGMENTROUTE_SIDLIST: - ptr = m_apis.segmentroute_api->create_segmentroute_sidlists; + ptr = m_apis.srv6_api->create_srv6_sidlists; break; case SAI_OBJECT_TYPE_STP_PORT: @@ -680,7 +680,7 @@ sai_status_t VendorSai::bulkRemove( break; case SAI_OBJECT_TYPE_SEGMENTROUTE_SIDLIST: - ptr = m_apis.segmentroute_api->remove_segmentroute_sidlists; + 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 324718dc4a..9299dfa475 100644 --- a/syncd/tests.cpp +++ b/syncd/tests.cpp @@ -229,10 +229,12 @@ 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_srv6_api_t *sai_srv6_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_SRV6, (void **)&sai_srv6_api); uint32_t count = 3; @@ -264,18 +266,24 @@ void test_bulk_next_hop_group_member_create() for (uint32_t i = 0; i < count; ++i) { + // srv6 sidlist object + sai_object_id_t sidlist; + sai_attribute_t sidattr[1] = { }; + sidattr[0].id = SAI_SRV6_SIDLIST_ATTR_TYPE; + sidattr[0].value.s32 = SAI_SRV6_SIDLIST_TYPE_ENCAPS_RED; + status = sai_srv6_api->create_srv6_sidlist(&sidlist, switch_id, 1, sidattr); + sai_object_id_t hop_vid; - sai_attribute_t nhattr[3] = { }; + sai_attribute_t nhattr[2] = { }; 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[0].value.s32 = SAI_NEXT_HOP_TYPE_SRV6_SIDLIST; - nhattr[2].id = SAI_NEXT_HOP_ATTR_SEGMENTROUTE_ENDPOINT_POP_TYPE; + nhattr[1].id = SAI_NEXT_HOP_ATTR_SRV6_SIDLIST_ID; + nhattr[1].value.oid = sidlist; - status = sai_next_hop_api->create_next_hop(&hop_vid, switch_id, 3, nhattr); + status = sai_next_hop_api->create_next_hop(&hop_vid, switch_id, 2, nhattr); ASSERT_SUCCESS("failed to create next hop"); @@ -467,11 +475,13 @@ 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_srv6_api_t *sai_srv6_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_SRV6, (void**)&sai_srv6_api); uint32_t count = 3; @@ -505,17 +515,23 @@ void test_bulk_route_set() ASSERT_SUCCESS("failed to create virtual router"); + // sidlist object + sai_object_id_t sidlist; + sai_attribute_t sidattr[1] = { }; + sidattr[0].id = SAI_SRV6_SIDLIST_ATTR_TYPE; + sidattr[0].value.s32 = SAI_SRV6_SIDLIST_TYPE_ENCAPS_RED; + status = sai_srv6_api->create_srv6_sidlist(&sidlist, switch_id, 1, sidattr); // next hop sai_object_id_t hop; - sai_attribute_t nhattr[3] = { }; + sai_attribute_t nhattr[2] = { }; 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_SRV6_SIDLIST; + nhattr[1].id = SAI_NEXT_HOP_ATTR_SRV6_SIDLIST_ID; + nhattr[1].value.oid = sidlist; - status = sai_next_hop_api->create_next_hop(&hop, switch_id, 3, nhattr); + status = sai_next_hop_api->create_next_hop(&hop, switch_id, 2, nhattr); ASSERT_SUCCESS("failed to create next hop"); diff --git a/vslib/Makefile.am b/vslib/Makefile.am index 73fbf2d1e3..b42363360f 100644 --- a/vslib/Makefile.am +++ b/vslib/Makefile.am @@ -95,7 +95,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 \ diff --git a/vslib/VirtualSwitchSaiInterface.cpp b/vslib/VirtualSwitchSaiInterface.cpp index 14bd9dce10..56da0291bd 100644 --- a/vslib/VirtualSwitchSaiInterface.cpp +++ b/vslib/VirtualSwitchSaiInterface.cpp @@ -980,6 +980,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, @@ -1075,6 +1093,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, @@ -1281,6 +1318,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 b445ce7546..b595ebe0a7 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; diff --git a/vslib/sai_vs_interfacequery.cpp b/vslib/sai_vs_interfacequery.cpp index 1393d18a6d..d3b86ae287 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), diff --git a/vslib/sai_vs_srv6.cpp b/vslib/sai_vs_srv6.cpp new file mode 100644 index 0000000000..4a7f55f783 --- /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) +}; From f00dc705d0f6f219afed94e188ffc0a1bdaa44c5 Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Tue, 24 Aug 2021 14:04:13 -0700 Subject: [PATCH 2/9] fix alignment --- meta/SaiInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta/SaiInterface.h b/meta/SaiInterface.h index 99ecdf1aeb..0b6dc5f1b8 100644 --- a/meta/SaiInterface.h +++ b/meta/SaiInterface.h @@ -14,7 +14,7 @@ extern "C" { _X(NEIGHBOR_ENTRY,neighbor_entry); \ _X(ROUTE_ENTRY,route_entry); \ _X(NAT_ENTRY,nat_entry); \ - _X(MY_SID_ENTRY,my_sid_entry); \ + _X(MY_SID_ENTRY,my_sid_entry); \ #define SAIREDIS_DECLARE_EVERY_BULK_ENTRY(_X) \ _X(FDB_ENTRY,fdb_entry); \ From 7db333a33d08603ebdb61c0a47de2e733190f542 Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Wed, 1 Sep 2021 12:09:49 -0700 Subject: [PATCH 3/9] SRV6 unittests --- unittest/lib/Makefile.am | 4 +-- unittest/lib/test_sai_redis_segmentroute.cpp | 26 -------------- unittest/lib/test_sai_redis_srv6.cpp | 36 ++++++++++++++++++++ unittest/vslib/Makefile.am | 4 +-- unittest/vslib/test_sai_vs_segmentroute.cpp | 26 -------------- unittest/vslib/test_sai_vs_srv6.cpp | 36 ++++++++++++++++++++ 6 files changed, 76 insertions(+), 56 deletions(-) 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 diff --git a/unittest/lib/Makefile.am b/unittest/lib/Makefile.am index a7d3191a73..e78fc4efef 100644 --- a/unittest/lib/Makefile.am +++ b/unittest/lib/Makefile.am @@ -47,7 +47,6 @@ 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_switch.cpp \ test_sai_redis_system_port.cpp \ test_sai_redis_tam.cpp \ @@ -57,7 +56,8 @@ testslibsairedis_SOURCES = main_libsairedis.cpp \ test_sai_redis_virtual_router.cpp \ test_sai_redis_vlan.cpp \ test_sai_redis_hostif.cpp \ - test_sai_redis_wred.cpp + test_sai_redis_wred.cpp \ + test_sai_redis_srv6.cpp testslibsairedis_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) testslibsairedis_LDADD = $(LDADD_GTEST) -L$(top_srcdir)/lib/.libs -lsairedis -lhiredis -lswsscommon -lpthread -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -lzmq $(CODE_COVERAGE_LIBS) diff --git a/unittest/lib/test_sai_redis_segmentroute.cpp b/unittest/lib/test_sai_redis_segmentroute.cpp deleted file mode 100644 index 7fb80c4456..0000000000 --- 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 0000000000..d9c03e99d0 --- /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/vslib/Makefile.am b/unittest/vslib/Makefile.am index 7139edab63..1b81af2288 100644 --- a/unittest/vslib/Makefile.am +++ b/unittest/vslib/Makefile.am @@ -82,7 +82,6 @@ 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_switch.cpp \ test_sai_vs_system_port.cpp \ test_sai_vs_tam.cpp \ @@ -92,7 +91,8 @@ testslibsaivs_SOURCES = main_libsaivs.cpp \ test_sai_vs_virtual_router.cpp \ test_sai_vs_vlan.cpp \ test_sai_vs_hostif.cpp \ - test_sai_vs_wred.cpp + test_sai_vs_wred.cpp \ + test_sai_vs_srv6.cpp testslibsaivs_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) testslibsaivs_LDADD = $(LDADD_GTEST) -L$(top_srcdir)/vslib/.libs -lsaivs -lhiredis -lswsscommon -lpthread -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -lzmq $(CODE_COVERAGE_LIBS) diff --git a/unittest/vslib/test_sai_vs_segmentroute.cpp b/unittest/vslib/test_sai_vs_segmentroute.cpp deleted file mode 100644 index d4021b9c68..0000000000 --- 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 0000000000..a66a875504 --- /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)); +} From c2a0c0ec3ed729d8f3dc6873e988af2a7fe4ddd3 Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Thu, 9 Sep 2021 08:36:40 -0700 Subject: [PATCH 4/9] Remove segmentroute reference files --- lib/sai_redis_segmentroute.cpp | 13 ------------- syncd/VendorSai.cpp | 4 ++-- vslib/sai_vs_segmentroute.cpp | 14 -------------- 3 files changed, 2 insertions(+), 29 deletions(-) delete mode 100644 lib/sai_redis_segmentroute.cpp delete mode 100644 vslib/sai_vs_segmentroute.cpp diff --git a/lib/sai_redis_segmentroute.cpp b/lib/sai_redis_segmentroute.cpp deleted file mode 100644 index cafd177316..0000000000 --- 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/syncd/VendorSai.cpp b/syncd/VendorSai.cpp index ea6c4ba378..d0ebefdd60 100644 --- a/syncd/VendorSai.cpp +++ b/syncd/VendorSai.cpp @@ -620,7 +620,7 @@ sai_status_t VendorSai::bulkCreate( ptr = m_apis.next_hop_group_api->create_next_hop_group_members; break; - case SAI_OBJECT_TYPE_SEGMENTROUTE_SIDLIST: + case SAI_OBJECT_TYPE_SRV6_SIDLIST: ptr = m_apis.srv6_api->create_srv6_sidlists; break; @@ -679,7 +679,7 @@ sai_status_t VendorSai::bulkRemove( ptr = m_apis.next_hop_group_api->remove_next_hop_group_members; break; - case SAI_OBJECT_TYPE_SEGMENTROUTE_SIDLIST: + case SAI_OBJECT_TYPE_SRV6_SIDLIST: ptr = m_apis.srv6_api->remove_srv6_sidlists; break; diff --git a/vslib/sai_vs_segmentroute.cpp b/vslib/sai_vs_segmentroute.cpp deleted file mode 100644 index 6ea4ef228f..0000000000 --- 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, -}; From 159d1454ec63a90366fa6f090027652e9b294f23 Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Thu, 9 Sep 2021 10:02:10 -0700 Subject: [PATCH 5/9] Remove extra case statement --- meta/SaiSerialize.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/meta/SaiSerialize.cpp b/meta/SaiSerialize.cpp index e3c1651bcd..d0b6b48ccb 100644 --- a/meta/SaiSerialize.cpp +++ b/meta/SaiSerialize.cpp @@ -452,10 +452,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; From 972d41cd5c43b64883c3d423a6700637d9aeb1ec Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Thu, 9 Sep 2021 13:15:53 -0700 Subject: [PATCH 6/9] Update API module name in test --- unittest/vslib/test_sai_vs_srv6.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/vslib/test_sai_vs_srv6.cpp b/unittest/vslib/test_sai_vs_srv6.cpp index a66a875504..96118c6d1e 100644 --- a/unittest/vslib/test_sai_vs_srv6.cpp +++ b/unittest/vslib/test_sai_vs_srv6.cpp @@ -10,7 +10,7 @@ TEST(libsaivs, srv6) { sai_srv6_api_t *api = nullptr; - sai_api_query(SAI_API_srv6, (void**)&api); + sai_api_query(SAI_API_SRV6, (void**)&api); EXPECT_NE(api, nullptr); From 068cea26c0dfcee7af670285508cfd8e854b0651 Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Tue, 21 Sep 2021 10:41:36 -0700 Subject: [PATCH 7/9] Update SAI version to V1.9.0 --- SAI | 2 +- lib/Makefile.am | 4 +++- lib/sai_redis.h | 2 ++ lib/sai_redis_interfacequery.cpp | 2 ++ lib/sai_redis_ipsec.cpp | 16 ++++++++++++++++ lib/sai_redis_my_mac.cpp | 8 ++++++++ lib/sai_redis_nexthopgroup.cpp | 2 ++ lib/sairediscommon.h | 11 ----------- vslib/Makefile.am | 4 +++- vslib/sai_vs_interfacequery.cpp | 2 ++ vslib/sai_vs_ipsec.cpp | 16 ++++++++++++++++ vslib/sai_vs_my_mac.cpp | 8 ++++++++ vslib/sai_vs_nexthopgroup.cpp | 2 ++ 13 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 lib/sai_redis_ipsec.cpp create mode 100644 lib/sai_redis_my_mac.cpp create mode 100644 vslib/sai_vs_ipsec.cpp create mode 100644 vslib/sai_vs_my_mac.cpp diff --git a/SAI b/SAI index bf3630316c..2ebde24c1d 160000 --- a/SAI +++ b/SAI @@ -1 +1 @@ -Subproject commit bf3630316cbef484e1015478b5746067bac4e2b8 +Subproject commit 2ebde24c1de6d930c5bbc20e7eb89d9f0867d4bc diff --git a/lib/Makefile.am b/lib/Makefile.am index 95f40b5105..e9d21e22b5 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -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/sai_redis.h b/lib/sai_redis.h index 6a2391e970..906fc65191 100644 --- a/lib/sai_redis.h +++ b/lib/sai_redis.h @@ -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 ad66097132..f7ee176888 100644 --- a/lib/sai_redis_interfacequery.cpp +++ b/lib/sai_redis_interfacequery.cpp @@ -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 0000000000..3cde2eeffe --- /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 0000000000..5866441482 --- /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 655deb16db..21d05db659 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/sairediscommon.h b/lib/sairediscommon.h index 7f3eeda965..c095ac4721 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/vslib/Makefile.am b/vslib/Makefile.am index 3e8df86bf3..be7e034eca 100644 --- a/vslib/Makefile.am +++ b/vslib/Makefile.am @@ -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/sai_vs_interfacequery.cpp b/vslib/sai_vs_interfacequery.cpp index d3b86ae287..a42b8021ae 100644 --- a/vslib/sai_vs_interfacequery.cpp +++ b/vslib/sai_vs_interfacequery.cpp @@ -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 0000000000..fa84d02252 --- /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_vlan_api = { + + VS_GENERIC_QUAD_API(ipsec) + VS_GENERIC_QUAD_API(ipsec_port) + VS_GENERIC_QUAD_API(ipsec_sa) + VS_GENERIC_STATS_API(ipsec_port) + 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 0000000000..a159602e11 --- /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 393e028e01..2a6e84d9a4 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) }; From 8276127633e712d0bfe23c14e97171848229a71c Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Tue, 21 Sep 2021 11:23:48 -0700 Subject: [PATCH 8/9] Revert SAI submodule update --- SAI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAI b/SAI index 2ebde24c1d..a6af2e8bb1 160000 --- a/SAI +++ b/SAI @@ -1 +1 @@ -Subproject commit 2ebde24c1de6d930c5bbc20e7eb89d9f0867d4bc +Subproject commit a6af2e8bb1563c90f4bb04d6487c4747e93eb07d From 21d3683044f3169915f1329a53a8af11cf43dc30 Mon Sep 17 00:00:00 2001 From: Kumaresh Perumal Date: Tue, 21 Sep 2021 11:24:39 -0700 Subject: [PATCH 9/9] Update SAI submodule to V1.9.0 --- SAI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAI b/SAI index a6af2e8bb1..2ebde24c1d 160000 --- a/SAI +++ b/SAI @@ -1 +1 @@ -Subproject commit a6af2e8bb1563c90f4bb04d6487c4747e93eb07d +Subproject commit 2ebde24c1de6d930c5bbc20e7eb89d9f0867d4bc