syncd/VendorSai.cpp (1,646 lines of code) (raw):

#include "config.h" #include "VendorSai.h" #include "meta/sai_serialize.h" #include "swss/logger.h" #include <cinttypes> #include <cstring> using namespace syncd; #define MUTEX() std::lock_guard<std::mutex> _lock(m_apimutex) #define VENDOR_CHECK_API_INITIALIZED() \ if (!m_apiInitialized) { \ SWSS_LOG_ERROR("%s: api not initialized", __PRETTY_FUNCTION__); \ return SAI_STATUS_FAILURE; } VendorSai::VendorSai() { SWSS_LOG_ENTER(); m_apiInitialized = false; memset(&m_apis, 0, sizeof(m_apis)); sai_global_apis_t ga = { .api_initialize = &sai_api_initialize, .api_query = &sai_api_query, .api_uninitialize = &sai_api_uninitialize, .bulk_get_attribute = nullptr, #ifdef HAVE_SAI_BULK_OBJECT_CLEAR_STATS .bulk_object_clear_stats = &sai_bulk_object_clear_stats, #else .bulk_object_clear_stats = nullptr, #endif #ifdef HAVE_SAI_BULK_OBJECT_GET_STATS .bulk_object_get_stats = &sai_bulk_object_get_stats, #else .bulk_object_get_stats = nullptr, #endif .dbg_generate_dump = nullptr, .get_maximum_attribute_count = nullptr, .get_object_count = nullptr, .get_object_key = nullptr, .log_set = &sai_log_set, .object_type_get_availability = &sai_object_type_get_availability, .object_type_query = &sai_object_type_query, .query_api_version = &sai_query_api_version, .query_attribute_capability = &sai_query_attribute_capability, .query_attribute_enum_values_capability = &sai_query_attribute_enum_values_capability, .query_object_stage = nullptr, .query_stats_capability = &sai_query_stats_capability, .query_stats_st_capability = nullptr, .switch_id_query = &sai_switch_id_query, .tam_telemetry_get_data = nullptr, }; m_globalApis = ga; } VendorSai::~VendorSai() { SWSS_LOG_ENTER(); if (m_apiInitialized) { apiUninitialize(); } } // INITIALIZE UNINITIALIZE sai_status_t VendorSai::apiInitialize( _In_ uint64_t flags, _In_ const sai_service_method_table_t *service_method_table) { MUTEX(); SWSS_LOG_ENTER(); if (m_apiInitialized) { SWSS_LOG_ERROR("%s: api already initialized", __PRETTY_FUNCTION__); return SAI_STATUS_FAILURE; } if ((service_method_table == NULL)) { SWSS_LOG_ERROR("invalid service_method_table handle passed to SAI API initialize"); return SAI_STATUS_INVALID_PARAMETER; } memcpy(&m_service_method_table, service_method_table, sizeof(m_service_method_table)); auto status = m_globalApis.api_initialize(flags, service_method_table); if (status == SAI_STATUS_SUCCESS) { memset(&m_apis, 0, sizeof(m_apis)); int failed = sai_metadata_apis_query(m_globalApis.api_query, &m_apis); if (failed > 0) { SWSS_LOG_NOTICE("sai_api_query failed for %d apis", failed); } } sai_api_version_t version{}; auto api_status = m_globalApis.query_api_version(&version); if (api_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("failed to query SAI API version: %s", sai_serialize_status(api_status).c_str()); return api_status; } // please refer to https://github.com/sonic-net/sonic-sairedis/pull/1246 or commit 606703e1 sai_api_version_t minversion = SAI_VERSION(1,9,0); SWSS_LOG_NOTICE("SAI API vendor version: %" PRId64, version); SWSS_LOG_NOTICE("SAI API min version: %" PRId64, minversion); SWSS_LOG_NOTICE("SAI API headers version: %d", SAI_API_VERSION); if ((version < minversion) || (SAI_API_VERSION < minversion)) { SWSS_LOG_ERROR("SAI implementation API version %" PRId64 " or SAI headers API version %d does not meet minimum version requirements, min version required: %" PRId64, version, SAI_API_VERSION, minversion); return SAI_STATUS_FAILURE; } m_apiInitialized = true; return status; } sai_status_t VendorSai::apiUninitialize(void) { SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); auto status = m_globalApis.api_uninitialize(); if (status == SAI_STATUS_SUCCESS) { m_apiInitialized = false; memset(&m_apis, 0, sizeof(m_apis)); } return status; } // QUAD OID sai_status_t VendorSai::create( _In_ sai_object_type_t objectType, _Out_ sai_object_id_t* objectId, _In_ sai_object_id_t switchId, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_object_meta_key_t mk = { .objecttype = objectType, .objectkey = { .key = { .object_id = 0 } } }; auto status = sai_metadata_generic_create(&m_apis, &mk, switchId, attr_count, attr_list); if (status == SAI_STATUS_SUCCESS) { *objectId = mk.objectkey.key.object_id; } return status; } sai_status_t VendorSai::remove( _In_ sai_object_type_t objectType, _In_ sai_object_id_t objectId) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_object_meta_key_t mk = { .objecttype = objectType, .objectkey = { .key = { .object_id = objectId } } }; return sai_metadata_generic_remove(&m_apis, &mk); } sai_status_t VendorSai::set( _In_ sai_object_type_t objectType, _In_ sai_object_id_t objectId, _In_ const sai_attribute_t *attr) { std::unique_lock<std::mutex> _lock(m_apimutex); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_object_meta_key_t mk = { .objecttype = objectType, .objectkey = { .key = { .object_id = objectId } } }; if (objectType == SAI_OBJECT_TYPE_SWITCH && attr && attr->id == SAI_SWITCH_ATTR_SWITCH_SHELL_ENABLE) { // in case of diagnostic shell, this vendor api can be blocking, so // release lock here to not cause deadlock for other events in syncd _lock.unlock(); } return sai_metadata_generic_set(&m_apis, &mk, attr); } sai_status_t VendorSai::get( _In_ sai_object_type_t objectType, _In_ sai_object_id_t objectId, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_object_meta_key_t mk = { .objecttype = objectType, .objectkey = { .key = { .object_id = objectId } } }; return sai_metadata_generic_get(&m_apis, &mk, attr_count, attr_list); } // QUAD ENTRY #define DECLARE_CREATE_ENTRY(OT,ot) \ sai_status_t VendorSai::create( \ _In_ const sai_ ## ot ## _t* entry, \ _In_ uint32_t attr_count, \ _In_ const sai_attribute_t *attr_list) \ { \ MUTEX(); \ SWSS_LOG_ENTER(); \ VENDOR_CHECK_API_INITIALIZED(); \ auto info = sai_metadata_get_object_type_info( \ (sai_object_type_t)SAI_OBJECT_TYPE_ ## OT); \ sai_object_meta_key_t mk = { .objecttype = info->objecttype, \ .objectkey = { .key = { .ot = *entry } } }; \ return info->create(&mk, 0, attr_count, attr_list); \ } SAIREDIS_DECLARE_EVERY_ENTRY(DECLARE_CREATE_ENTRY); #define DECLARE_REMOVE_ENTRY(OT,ot) \ sai_status_t VendorSai::remove( \ _In_ const sai_ ## ot ## _t* entry) \ { \ MUTEX(); \ SWSS_LOG_ENTER(); \ VENDOR_CHECK_API_INITIALIZED(); \ auto info = sai_metadata_get_object_type_info( \ (sai_object_type_t)SAI_OBJECT_TYPE_ ## OT); \ sai_object_meta_key_t mk = { .objecttype = info->objecttype, \ .objectkey = { .key = { .ot = *entry } } }; \ return info->remove(&mk); \ } SAIREDIS_DECLARE_EVERY_ENTRY(DECLARE_REMOVE_ENTRY); #define DECLARE_SET_ENTRY(OT,ot) \ sai_status_t VendorSai::set( \ _In_ const sai_ ## ot ## _t* entry, \ _In_ const sai_attribute_t *attr) \ { \ MUTEX(); \ SWSS_LOG_ENTER(); \ VENDOR_CHECK_API_INITIALIZED(); \ auto info = sai_metadata_get_object_type_info( \ (sai_object_type_t) SAI_OBJECT_TYPE_ ## OT); \ sai_object_meta_key_t mk = { .objecttype = info->objecttype, \ .objectkey = { .key = { .ot = *entry } } }; \ return info->set(&mk, attr); \ } SAIREDIS_DECLARE_EVERY_ENTRY(DECLARE_SET_ENTRY); #define DECLARE_GET_ENTRY(OT,ot) \ sai_status_t VendorSai::get( \ _In_ const sai_ ## ot ## _t* entry, \ _In_ uint32_t attr_count, \ _Inout_ sai_attribute_t *attr_list) \ { \ MUTEX(); \ SWSS_LOG_ENTER(); \ VENDOR_CHECK_API_INITIALIZED(); \ auto info = sai_metadata_get_object_type_info( \ (sai_object_type_t) SAI_OBJECT_TYPE_ ## OT); \ sai_object_meta_key_t mk = { .objecttype = info->objecttype, \ .objectkey = { .key = { .ot = *entry } } }; \ return info->get(&mk, attr_count, attr_list); \ } SAIREDIS_DECLARE_EVERY_ENTRY(DECLARE_GET_ENTRY); // STATS sai_status_t VendorSai::getStats( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, _In_ uint32_t number_of_counters, _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); if (!counter_ids || !counters) { SWSS_LOG_ERROR("NULL pointer function argument"); return SAI_STATUS_INVALID_PARAMETER; } sai_object_meta_key_t mk = { .objecttype = object_type, .objectkey = { .key = { .object_id = object_id} } }; return sai_metadata_generic_get_stats(&m_apis, &mk, number_of_counters, counter_ids, counters); } sai_status_t VendorSai::queryStatsCapability( _In_ sai_object_id_t switchId, _In_ sai_object_type_t objectType, _Inout_ sai_stat_capability_list_t *stats_capability) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return m_globalApis.query_stats_capability( switchId, objectType, stats_capability); } sai_status_t VendorSai::queryStatsStCapability( _In_ sai_object_id_t switchId, _In_ sai_object_type_t objectType, _Inout_ sai_stat_st_capability_list_t *stats_capability) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return m_globalApis.query_stats_st_capability( switchId, objectType, stats_capability); } sai_status_t VendorSai::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, _In_ uint32_t number_of_counters, _In_ const sai_stat_id_t *counter_ids, _In_ sai_stats_mode_t mode, _Out_ uint64_t *counters) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_object_meta_key_t mk = { .objecttype = object_type, .objectkey = { .key = { .object_id = object_id} } }; return sai_metadata_generic_get_stats_ext(&m_apis, &mk, number_of_counters, counter_ids, mode, counters); } sai_status_t VendorSai::clearStats( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, _In_ uint32_t number_of_counters, _In_ const sai_stat_id_t *counter_ids) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_object_meta_key_t mk = { .objecttype = object_type, .objectkey = { .key = { .object_id = object_id} } }; return sai_metadata_generic_clear_stats(&m_apis, &mk, number_of_counters, counter_ids); } sai_status_t VendorSai::bulkGetStats( _In_ sai_object_id_t switchId, _In_ sai_object_type_t object_type, _In_ uint32_t object_count, _In_ const sai_object_key_t *object_key, _In_ uint32_t number_of_counters, _In_ const sai_stat_id_t *counter_ids, _In_ sai_stats_mode_t mode, _Inout_ sai_status_t *object_statuses, _Out_ uint64_t *counters) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return (m_globalApis.bulk_object_get_stats == nullptr) ? SAI_STATUS_NOT_IMPLEMENTED : m_globalApis.bulk_object_get_stats( switchId, object_type, object_count, object_key, number_of_counters, counter_ids, mode, object_statuses, counters); } sai_status_t VendorSai::bulkClearStats( _In_ sai_object_id_t switchId, _In_ sai_object_type_t object_type, _In_ uint32_t object_count, _In_ const sai_object_key_t *object_key, _In_ uint32_t number_of_counters, _In_ const sai_stat_id_t *counter_ids, _In_ sai_stats_mode_t mode, _Inout_ sai_status_t *object_statuses) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return (m_globalApis.bulk_object_clear_stats == nullptr) ? SAI_STATUS_NOT_IMPLEMENTED : m_globalApis.bulk_object_clear_stats( switchId, object_type, object_count, object_key, number_of_counters, counter_ids, mode, object_statuses); } // BULK QUAD OID sai_status_t VendorSai::bulkCreate( _In_ sai_object_type_t object_type, _In_ sai_object_id_t switch_id, _In_ uint32_t object_count, _In_ const uint32_t *attr_count, _In_ const sai_attribute_t **attr_list, _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_object_id_t *object_id, _Out_ sai_status_t *object_statuses) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_status_t (*ptr)( _In_ sai_object_id_t switch_id, _In_ uint32_t object_count, _In_ const uint32_t *attr_count, _In_ const sai_attribute_t **attr_list, _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_object_id_t *object_id, _Out_ sai_status_t *object_statuses); switch ((int)object_type) { case SAI_OBJECT_TYPE_PORT: ptr = m_apis.port_api->create_ports; break; case SAI_OBJECT_TYPE_LAG_MEMBER: ptr = m_apis.lag_api->create_lag_members; break; case SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER: ptr = m_apis.next_hop_group_api->create_next_hop_group_members; break; case SAI_OBJECT_TYPE_NEXT_HOP: ptr = m_apis.next_hop_api->create_next_hops; break; case SAI_OBJECT_TYPE_SRV6_SIDLIST: ptr = m_apis.srv6_api->create_srv6_sidlists; break; case SAI_OBJECT_TYPE_STP_PORT: ptr = m_apis.stp_api->create_stp_ports; break; case SAI_OBJECT_TYPE_VLAN_MEMBER: ptr = m_apis.vlan_api->create_vlan_members; break; case SAI_OBJECT_TYPE_ENI: ptr = m_apis.dash_eni_api->create_enis; break; case SAI_OBJECT_TYPE_VNET: ptr = m_apis.dash_vnet_api->create_vnets; break; case SAI_OBJECT_TYPE_DASH_ACL_GROUP: ptr = m_apis.dash_acl_api->create_dash_acl_groups; break; case SAI_OBJECT_TYPE_DASH_ACL_RULE: ptr = m_apis.dash_acl_api->create_dash_acl_rules; break; case SAI_OBJECT_TYPE_METER_RULE: ptr = m_apis.dash_meter_api->create_meter_rules; break; default: SWSS_LOG_ERROR("not implemented %s, FIXME", sai_serialize_object_type(object_type).c_str()); return SAI_STATUS_NOT_IMPLEMENTED; } if (!ptr) { SWSS_LOG_INFO("create bulk not supported from SAI, object_type = %s", sai_serialize_object_type(object_type).c_str()); return SAI_STATUS_NOT_SUPPORTED; } return ptr(switch_id, object_count, attr_count, attr_list, mode, object_id, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ sai_object_type_t object_type, _In_ uint32_t object_count, _In_ const sai_object_id_t *object_id, _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_status_t (*ptr)( _In_ uint32_t object_count, _In_ const sai_object_id_t *object_id, _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses); switch ((int)object_type) { case SAI_OBJECT_TYPE_PORT: ptr = m_apis.port_api->remove_ports; break; case SAI_OBJECT_TYPE_LAG_MEMBER: ptr = m_apis.lag_api->remove_lag_members; break; case SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER: ptr = m_apis.next_hop_group_api->remove_next_hop_group_members; break; case SAI_OBJECT_TYPE_NEXT_HOP: ptr = m_apis.next_hop_api->remove_next_hops; break; case SAI_OBJECT_TYPE_SRV6_SIDLIST: ptr = m_apis.srv6_api->remove_srv6_sidlists; break; case SAI_OBJECT_TYPE_STP_PORT: ptr = m_apis.stp_api->remove_stp_ports; break; case SAI_OBJECT_TYPE_VLAN_MEMBER: ptr = m_apis.vlan_api->remove_vlan_members; break; case SAI_OBJECT_TYPE_ENI: ptr = m_apis.dash_eni_api->remove_enis; break; case SAI_OBJECT_TYPE_VNET: ptr = m_apis.dash_vnet_api->remove_vnets; break; case SAI_OBJECT_TYPE_DASH_ACL_GROUP: ptr = m_apis.dash_acl_api->remove_dash_acl_groups; break; case SAI_OBJECT_TYPE_DASH_ACL_RULE: ptr = m_apis.dash_acl_api->remove_dash_acl_rules; break; case SAI_OBJECT_TYPE_METER_RULE: ptr = m_apis.dash_meter_api->remove_meter_rules; break; default: SWSS_LOG_ERROR("not implemented %s, FIXME", sai_serialize_object_type(object_type).c_str()); return SAI_STATUS_NOT_IMPLEMENTED; } if (!ptr) { SWSS_LOG_INFO("remove bulk not supported from SAI, object_type = %s", sai_serialize_object_type(object_type).c_str()); return SAI_STATUS_NOT_SUPPORTED; } return ptr(object_count, object_id, mode, object_statuses); } sai_status_t VendorSai::bulkSet( _In_ sai_object_type_t object_type, _In_ uint32_t object_count, _In_ const sai_object_id_t *object_id, _In_ const sai_attribute_t *attr_list, _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_bulk_object_set_attribute_fn ptr; switch (object_type) { case SAI_OBJECT_TYPE_PORT: ptr = m_apis.port_api->set_ports_attribute; break; case SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP: ptr = m_apis.buffer_api->set_ingress_priority_groups_attribute; break; case SAI_OBJECT_TYPE_QUEUE: ptr = m_apis.queue_api->set_queues_attribute; break; default: SWSS_LOG_ERROR("not implemented %s, FIXME", sai_serialize_object_type(object_type).c_str()); return SAI_STATUS_NOT_IMPLEMENTED; } if (!ptr) { SWSS_LOG_INFO("create bulk not supported from SAI, object_type = %s", sai_serialize_object_type(object_type).c_str()); return SAI_STATUS_NOT_SUPPORTED; } return ptr(object_count, object_id, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkGet( _In_ sai_object_type_t object_type, _In_ uint32_t object_count, _In_ const sai_object_id_t *object_id, _In_ const uint32_t *attr_count, _Inout_ sai_attribute_t **attr_list, _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); sai_bulk_object_get_attribute_fn ptr; switch (object_type) { case SAI_OBJECT_TYPE_PORT: ptr = m_apis.port_api->get_ports_attribute; break; default: SWSS_LOG_ERROR("not implemented %s, FIXME", sai_serialize_object_type(object_type).c_str()); return SAI_STATUS_NOT_IMPLEMENTED; } if (!ptr) { SWSS_LOG_INFO("get bulk not supported in SAI, object_type = %s", sai_serialize_object_type(object_type).c_str()); return SAI_STATUS_NOT_SUPPORTED; } return ptr(object_count, object_id, attr_count, attr_list, mode, object_statuses); } // BULK GET #define DECLARE_BULK_GET_ENTRY(OT,ot) \ sai_status_t VendorSai::bulkGet( \ _In_ uint32_t object_count, \ _In_ const sai_ ## ot ## _t *ot, \ _In_ const uint32_t *attr_count, \ _Inout_ sai_attribute_t **attr_list, \ _In_ sai_bulk_op_error_mode_t mode, \ _Out_ sai_status_t *object_statuses) \ { \ MUTEX(); \ SWSS_LOG_ENTER(); \ VENDOR_CHECK_API_INITIALIZED(); \ SWSS_LOG_ERROR("FIXME not implemented"); \ return SAI_STATUS_NOT_IMPLEMENTED; \ } SAIREDIS_DECLARE_EVERY_BULK_ENTRY(DECLARE_BULK_GET_ENTRY); // BULK QUAD ENTRY sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_route_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.route_api->create_route_entries) { SWSS_LOG_INFO("create_route_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.route_api->create_route_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_fdb_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.fdb_api->create_fdb_entries) { SWSS_LOG_INFO("create_fdb_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.fdb_api->create_fdb_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_inseg_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.mpls_api->create_inseg_entries) { SWSS_LOG_INFO("create_inseg_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.mpls_api->create_inseg_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_nat_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.nat_api->create_nat_entries) { SWSS_LOG_INFO("create_nat_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.nat_api->create_nat_entries( object_count, entries, attr_count, attr_list, mode, 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); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_neighbor_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.neighbor_api->create_neighbor_entries) { SWSS_LOG_INFO("create_neighbor_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.neighbor_api->create_neighbor_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_direction_lookup_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.dash_direction_lookup_api->create_direction_lookup_entries) { SWSS_LOG_INFO("create_direction_lookup_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_direction_lookup_api->create_direction_lookup_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_eni_ether_address_map_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.dash_eni_api->create_eni_ether_address_map_entries) { SWSS_LOG_INFO("create_eni_ether_address_map_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_eni_api->create_eni_ether_address_map_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_vip_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.dash_vip_api->create_vip_entries) { SWSS_LOG_INFO("create_vip_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_vip_api->create_vip_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_inbound_routing_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.dash_inbound_routing_api->create_inbound_routing_entries) { SWSS_LOG_INFO("create_inbound_routing_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_inbound_routing_api->create_inbound_routing_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_pa_validation_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.dash_pa_validation_api->create_pa_validation_entries) { SWSS_LOG_INFO("create_pa_validation_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_pa_validation_api->create_pa_validation_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_outbound_routing_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.dash_outbound_routing_api->create_outbound_routing_entries) { SWSS_LOG_INFO("create_outbound_routing_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_outbound_routing_api->create_outbound_routing_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_outbound_ca_to_pa_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.dash_outbound_ca_to_pa_api->create_outbound_ca_to_pa_entries) { SWSS_LOG_INFO("create_outbound_ca_to_pa_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_outbound_ca_to_pa_api->create_outbound_ca_to_pa_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_flow_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.dash_flow_api->create_flow_entries) { SWSS_LOG_INFO("create_flow_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_flow_api->create_flow_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkCreate( _In_ uint32_t object_count, _In_ const sai_meter_bucket_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.dash_meter_api->create_meter_bucket_entries) { SWSS_LOG_INFO("create_meter_bucket_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_meter_api->create_meter_bucket_entries( object_count, entries, attr_count, attr_list, mode, object_statuses); } // BULK REMOVE sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_route_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.route_api->remove_route_entries) { SWSS_LOG_INFO("remove_route_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.route_api->remove_route_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_fdb_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.fdb_api->remove_fdb_entries) { SWSS_LOG_INFO("remove_fdb_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.fdb_api->remove_fdb_entries( object_count, entries, mode, object_statuses);; } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_inseg_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.mpls_api->remove_inseg_entries) { SWSS_LOG_INFO("remove_inseg_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.mpls_api->remove_inseg_entries( object_count, entries, mode, object_statuses);; } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_nat_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.nat_api->remove_nat_entries) { SWSS_LOG_INFO("remove_nat_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.nat_api->remove_nat_entries( object_count, entries, mode, 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); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_neighbor_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.neighbor_api->remove_neighbor_entries) { SWSS_LOG_INFO("remove_neighbor_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.neighbor_api->remove_neighbor_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_direction_lookup_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.dash_direction_lookup_api->remove_direction_lookup_entries) { SWSS_LOG_INFO("remove_direction_lookup_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_direction_lookup_api->remove_direction_lookup_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_eni_ether_address_map_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.dash_eni_api->remove_eni_ether_address_map_entries) { SWSS_LOG_INFO("remove_eni_ether_address_map_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_eni_api->remove_eni_ether_address_map_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_vip_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.dash_vip_api->remove_vip_entries) { SWSS_LOG_INFO("remove_vip_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_vip_api->remove_vip_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_inbound_routing_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.dash_inbound_routing_api->remove_inbound_routing_entries) { SWSS_LOG_INFO("remove_inbound_routing_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_inbound_routing_api->remove_inbound_routing_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_pa_validation_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.dash_pa_validation_api->remove_pa_validation_entries) { SWSS_LOG_INFO("remove_pa_validation_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_pa_validation_api->remove_pa_validation_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_outbound_routing_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.dash_outbound_routing_api->remove_outbound_routing_entries) { SWSS_LOG_INFO("remove_outbound_routing_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_outbound_routing_api->remove_outbound_routing_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_outbound_ca_to_pa_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.dash_outbound_ca_to_pa_api->remove_outbound_ca_to_pa_entries) { SWSS_LOG_INFO("remove_outbound_ca_to_pa_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_outbound_ca_to_pa_api->remove_outbound_ca_to_pa_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_flow_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.dash_flow_api->remove_flow_entries) { SWSS_LOG_INFO("remove_flow_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_flow_api->remove_flow_entries( object_count, entries, mode, object_statuses); } sai_status_t VendorSai::bulkRemove( _In_ uint32_t object_count, _In_ const sai_meter_bucket_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.dash_meter_api->remove_meter_bucket_entries) { SWSS_LOG_INFO("remove_meter_bucket_entries is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.dash_meter_api->remove_meter_bucket_entries( object_count, entries, mode, object_statuses); } // BULK SET sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_route_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.route_api->set_route_entries_attribute) { SWSS_LOG_INFO("set_route_entries_attribute is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.route_api->set_route_entries_attribute( object_count, entries, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_fdb_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.fdb_api->set_fdb_entries_attribute) { SWSS_LOG_INFO("set_fdb_entries_attribute is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.fdb_api->set_fdb_entries_attribute( object_count, entries, attr_list, mode, object_statuses);; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_inseg_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.mpls_api->set_inseg_entries_attribute) { SWSS_LOG_INFO("set_inseg_entries_attribute is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.mpls_api->set_inseg_entries_attribute( object_count, entries, attr_list, mode, object_statuses);; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_nat_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.nat_api->set_nat_entries_attribute) { SWSS_LOG_INFO("set_nat_entries_attribute is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.nat_api->set_nat_entries_attribute( object_count, entries, attr_list, mode, 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); } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_neighbor_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.neighbor_api->set_neighbor_entries_attribute) { SWSS_LOG_INFO("set_neighbor_entries_attribute is not supported"); return SAI_STATUS_NOT_SUPPORTED; } return m_apis.neighbor_api->set_neighbor_entries_attribute( object_count, entries, attr_list, mode, object_statuses); } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_direction_lookup_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(); return SAI_STATUS_NOT_SUPPORTED; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_eni_ether_address_map_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(); return SAI_STATUS_NOT_SUPPORTED; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_vip_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(); return SAI_STATUS_NOT_SUPPORTED; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_inbound_routing_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(); return SAI_STATUS_NOT_SUPPORTED; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_pa_validation_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(); return SAI_STATUS_NOT_SUPPORTED; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_outbound_routing_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(); return SAI_STATUS_NOT_SUPPORTED; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_outbound_ca_to_pa_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(); return SAI_STATUS_NOT_SUPPORTED; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_flow_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(); return SAI_STATUS_NOT_SUPPORTED; } sai_status_t VendorSai::bulkSet( _In_ uint32_t object_count, _In_ const sai_meter_bucket_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(); return SAI_STATUS_NOT_SUPPORTED; } // NON QUAD API sai_status_t VendorSai::flushFdbEntries( _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return m_apis.fdb_api->flush_fdb_entries(switch_id, attr_count, attr_list); } sai_status_t VendorSai::switchMdioRead( _In_ sai_object_id_t switch_id, _In_ uint32_t device_addr, _In_ uint32_t start_reg_addr, _In_ uint32_t number_of_registers, _Out_ uint32_t *reg_val) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return m_apis.switch_api->switch_mdio_read(switch_id, device_addr, start_reg_addr, number_of_registers, reg_val); } sai_status_t VendorSai::switchMdioWrite( _In_ sai_object_id_t switch_id, _In_ uint32_t device_addr, _In_ uint32_t start_reg_addr, _In_ uint32_t number_of_registers, _In_ const uint32_t *reg_val) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return m_apis.switch_api->switch_mdio_write(switch_id, device_addr, start_reg_addr, number_of_registers, reg_val); } sai_status_t VendorSai::switchMdioCl22Read( _In_ sai_object_id_t switch_id, _In_ uint32_t device_addr, _In_ uint32_t start_reg_addr, _In_ uint32_t number_of_registers, _Out_ uint32_t *reg_val) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); #if (SAI_API_VERSION >= SAI_VERSION(1, 11, 0)) return m_apis.switch_api->switch_mdio_cl22_read(switch_id, device_addr, start_reg_addr, number_of_registers, reg_val); #else return m_apis.switch_api->switch_mdio_read(switch_id, device_addr, start_reg_addr, number_of_registers, reg_val); #endif } sai_status_t VendorSai::switchMdioCl22Write( _In_ sai_object_id_t switch_id, _In_ uint32_t device_addr, _In_ uint32_t start_reg_addr, _In_ uint32_t number_of_registers, _In_ const uint32_t *reg_val) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); #if (SAI_API_VERSION >= SAI_VERSION(1, 11, 0)) return m_apis.switch_api->switch_mdio_cl22_write(switch_id, device_addr, start_reg_addr, number_of_registers, reg_val); #else return m_apis.switch_api->switch_mdio_write(switch_id, device_addr, start_reg_addr, number_of_registers, reg_val); #endif } // SAI API sai_status_t VendorSai::objectTypeGetAvailability( _In_ sai_object_id_t switchId, _In_ sai_object_type_t objectType, _In_ uint32_t attrCount, _In_ const sai_attribute_t *attrList, _Out_ uint64_t *count) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return m_globalApis.object_type_get_availability( switchId, objectType, attrCount, attrList, count); } sai_status_t VendorSai::queryAttributeCapability( _In_ sai_object_id_t switchId, _In_ sai_object_type_t objectType, _In_ sai_attr_id_t attrId, _Out_ sai_attr_capability_t *capability) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return m_globalApis.query_attribute_capability( switchId, objectType, attrId, capability); } sai_status_t VendorSai::queryAttributeEnumValuesCapability( _In_ sai_object_id_t switchId, _In_ sai_object_type_t objectType, _In_ sai_attr_id_t attrId, _Inout_ sai_s32_list_t *enum_values_capability) { MUTEX(); SWSS_LOG_ENTER(); VENDOR_CHECK_API_INITIALIZED(); return m_globalApis.query_attribute_enum_values_capability( switchId, objectType, attrId, enum_values_capability); } sai_object_type_t VendorSai::objectTypeQuery( _In_ sai_object_id_t objectId) { SWSS_LOG_ENTER(); if (!m_apiInitialized) { SWSS_LOG_ERROR("%s: SAI API not initialized", __PRETTY_FUNCTION__); return SAI_OBJECT_TYPE_NULL; } return m_globalApis.object_type_query(objectId); } sai_object_id_t VendorSai::switchIdQuery( _In_ sai_object_id_t objectId) { SWSS_LOG_ENTER(); if (!m_apiInitialized) { SWSS_LOG_ERROR("%s: SAI API not initialized", __PRETTY_FUNCTION__); return SAI_NULL_OBJECT_ID; } return m_globalApis.switch_id_query(objectId); } sai_status_t VendorSai::logSet( _In_ sai_api_t api, _In_ sai_log_level_t log_level) { MUTEX(); SWSS_LOG_ENTER(); m_logLevelMap[api] = log_level; return m_globalApis.log_set(api, log_level); } sai_status_t VendorSai::queryApiVersion( _Out_ sai_api_version_t *version) { SWSS_LOG_ENTER(); return m_globalApis.query_api_version(version); } sai_log_level_t VendorSai::logGet( _In_ sai_api_t api) { MUTEX(); SWSS_LOG_ENTER(); auto it = m_logLevelMap.find(api); if (it != m_logLevelMap.end()) { return it->second; } // no level defined yet, just return default return SAI_LOG_LEVEL_NOTICE; }