diff --git a/lib/ClientSai.cpp b/lib/ClientSai.cpp index f83d733db1..61c3f4cece 100644 --- a/lib/ClientSai.cpp +++ b/lib/ClientSai.cpp @@ -1610,6 +1610,129 @@ sai_status_t ClientSai::bulkSet( return waitForBulkResponse(SAI_COMMON_API_BULK_SET, (uint32_t)serialized_object_ids.size(), object_statuses); } +sai_status_t ClientSai::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(); + REDIS_CHECK_API_INITIALIZED(); + + std::vector serializedObjectIds; + + SWSS_LOG_NOTICE("SYNCD BULK ENTER SHELL"); + + for (uint32_t idx = 0; idx < object_count; idx++) + { +// SWSS_LOG_NOTICE("SYNCD BULK EMPLACE OID %" PRIx64, object_id[idx]); + serializedObjectIds.emplace_back(sai_serialize_object_id(object_id[idx])); + } + + return bulkGet(object_type, serializedObjectIds, attr_count, attr_list, mode, object_statuses); +} + +sai_status_t ClientSai::bulkGet( + _In_ sai_object_type_t object_type, + _In_ const std::vector &serialized_object_ids, + _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) +{ + SWSS_LOG_ENTER(); + + // TODO support mode + + SWSS_LOG_NOTICE("SYNCD BULK ENTER DO"); + + std::string str_object_type = sai_serialize_object_type(object_type); + + std::vector entries; + + for (size_t idx = 0; idx < serialized_object_ids.size(); ++idx) + { + auto entry = SaiAttributeList::serialize_attr_list(object_type, attr_count[idx], attr_list[idx], false); + + std::string str_attr = Globals::joinFieldValues(entry); + + swss::FieldValueTuple fvtNoStatus(serialized_object_ids[idx] , str_attr); + + entries.push_back(fvtNoStatus); + } + + /* + * We are adding number of entries to actually add ':' to be compatible + * with previous + */ + + // key: object_type:count + // field: object_id + // value: object_attrs + std::string key = str_object_type + ":" + std::to_string(entries.size()); + +// m_recorder->recordBulkGenericGet(str_object_type, entries); + + m_communicationChannel->set(key, entries, REDIS_ASIC_STATE_COMMAND_BULK_GET); + + swss::KeyOpFieldsValuesTuple kco; + auto status = waitForBulkGetResponse(object_type, serialized_object_ids, attr_count, attr_list, object_statuses, kco); + +// m_recorder->recordBulkGenericGetResponse(str_object_type, kfvFieldsValues(kco)); + + return status; +} + +sai_status_t ClientSai::waitForBulkGetResponse( + _In_ sai_object_type_t object_type, + _In_ const std::vector &serialized_object_ids, + _In_ const uint32_t *attr_count, + _Inout_ sai_attribute_t **attr_list, + _Out_ sai_status_t *object_statuses, + _Out_ swss::KeyOpFieldsValuesTuple &kco) +{ + SWSS_LOG_ENTER(); + + auto status = m_communicationChannel->wait(REDIS_ASIC_STATE_COMMAND_GETRESPONSE, kco); + + auto &values = kfvFieldsValues(kco); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_THROW("logic error, get bulk response returned non zero %d", status); + return status; + } + + uint32_t attr_index = 0; + + // Fetch all the status + for(uint32_t obj_index = 0; obj_index < serialized_object_ids.size(); obj_index++) + { +// sai_deserialize_status(fvField(values[obj_index]), object_statuses[obj_index]); + object_statuses[obj_index] = SAI_STATUS_SUCCESS; + } +// values.erase(values.begin(), values.begin() + serialized_object_ids.size()); + + // Fetch attribute list for each object + SaiAttributeList list(object_type, values, false); + +// SWSS_LOG_NOTICE("BULK GET OBJECTS %d", serialized_object_ids.size()); + + for(uint32_t obj_index = 0; obj_index < serialized_object_ids.size(); obj_index++) + { +// SWSS_LOG_NOTICE("BULK GET BEFORE TRANSFER %s %d attr index %d", serialized_object_ids[obj_index].c_str(), list.get_attr_list()[attr_index].value.u32, attr_index); + transfer_attributes(object_type, attr_count[obj_index], &(list.get_attr_list()[attr_index]), attr_list[obj_index], false); +// SWSS_LOG_NOTICE("BULK GET AFTER TRANSFER %s %d attr index %d", serialized_object_ids[obj_index].c_str(), attr_list[obj_index][0].value.u32); + attr_index += attr_count[obj_index]; + } + + return status; +} + // BULK RESPONSE HELPERS sai_status_t ClientSai::waitForBulkResponse( diff --git a/lib/ClientSai.h b/lib/ClientSai.h index f051a51d52..ee88508b57 100644 --- a/lib/ClientSai.h +++ b/lib/ClientSai.h @@ -88,6 +88,15 @@ namespace sairedis _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( @@ -200,6 +209,14 @@ namespace sairedis _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses); + sai_status_t bulkGet( + _In_ sai_object_type_t object_type, + _In_ const std::vector &serialized_object_ids, + _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); + private: // QUAD API response /** @@ -228,6 +245,13 @@ namespace sairedis _Inout_ sai_attribute_t *attr_list); private: // bulk QUAD API response + sai_status_t waitForBulkGetResponse( + _In_ sai_object_type_t object_type, + _In_ const std::vector &serialized_object_ids, + _In_ const uint32_t *attr_count, + _Inout_ sai_attribute_t **attr_list, + _Out_ sai_status_t *object_statuses, + _Out_ swss::KeyOpFieldsValuesTuple &kco); /** * @brief Wait for bulk response. diff --git a/lib/ClientServerSai.cpp b/lib/ClientServerSai.cpp index 71598a24e2..2e67752e76 100644 --- a/lib/ClientServerSai.cpp +++ b/lib/ClientServerSai.cpp @@ -364,6 +364,31 @@ sai_status_t ClientServerSai::bulkSet( object_statuses); } +sai_status_t ClientServerSai::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(); + REDIS_CHECK_API_INITIALIZED(); + +// SWSS_LOG_NOTICE("SYNCD BULK GET Sai stub"); + + return m_sai->bulkGet( + object_type, + object_count, + object_id, + attr_count, + attr_list, + mode, + object_statuses); +} + // BULK QUAD ENTRY #define DECLARE_BULK_CREATE_ENTRY(OT,ot) \ diff --git a/lib/ClientServerSai.h b/lib/ClientServerSai.h index e8fb165835..a04167c514 100644 --- a/lib/ClientServerSai.h +++ b/lib/ClientServerSai.h @@ -80,6 +80,15 @@ namespace sairedis _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( diff --git a/lib/Recorder.cpp b/lib/Recorder.cpp index 7e7280f972..903f77fe1e 100644 --- a/lib/Recorder.cpp +++ b/lib/Recorder.cpp @@ -613,6 +613,46 @@ void Recorder::recordGenericGetResponse( recordLine("G|" + sai_serialize_status(status) + "|" + Globals::joinFieldValues(arguments)); } +void Recorder::recordBulkGenericGet( + _In_ const std::string& objectType, + _In_ const std::vector& entriesWithStatus) +{ + SWSS_LOG_ENTER(); + + std::string joined; + + for (const auto &e: entriesWithStatus) + { + // ||obj_id|attr=val|attr=val|status||obj_id|attr=val|attr=val|status + + joined += "||" + fvField(e) + "|" + fvValue(e); + } + + // capital 'b' stands for bulk GET operation. + + recordLine("b|" + objectType + joined); +} + +void Recorder::recordBulkGenericGetResponse( + _In_ const std::string& objectType, + _In_ const std::vector& entriesWithStatus) +{ + SWSS_LOG_ENTER(); + + std::string joined; + + for (const auto &e: entriesWithStatus) + { + // ||obj_id|attr=val|attr=val|status||obj_id|attr=val|attr=val|status + + joined += "||" + fvField(e) + "|" + fvValue(e); + } + + // capital 'B' stands for bulk GET operation. + + recordLine("B|" + objectType + joined); +} + void Recorder::recordGenericGetStats( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/lib/Recorder.h b/lib/Recorder.h index 3d55dbf124..2159085a1b 100644 --- a/lib/Recorder.h +++ b/lib/Recorder.h @@ -160,6 +160,14 @@ namespace sairedis void recordGenericResponse( _In_ sai_status_t status); + void recordBulkGenericGet( + _In_ const std::string& objectType, + _In_ const std::vector& entriesWithStatus); + + void recordBulkGenericGetResponse( + _In_ const std::string& objectType, + _In_ const std::vector& entriesWithStatus); + public: // create ENTRY SAI_REDIS_RECORDER_DECLARE_RECORD_CREATE(fdb_entry); diff --git a/lib/RedisRemoteSaiInterface.cpp b/lib/RedisRemoteSaiInterface.cpp index 5e44c36d55..b5dfade850 100644 --- a/lib/RedisRemoteSaiInterface.cpp +++ b/lib/RedisRemoteSaiInterface.cpp @@ -1573,6 +1573,127 @@ sai_status_t RedisRemoteSaiInterface::bulkSet( return waitForBulkResponse(SAI_COMMON_API_BULK_SET, (uint32_t)serialized_object_ids.size(), object_statuses); } +sai_status_t RedisRemoteSaiInterface::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) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + +// SWSS_LOG_NOTICE("SYNCD BULK ENTER SHELL"); + + for (uint32_t idx = 0; idx < object_count; idx++) + { +// SWSS_LOG_NOTICE("SYNCD BULK EMPLACE OID %" PRIx64, object_id[idx]); + serializedObjectIds.emplace_back(sai_serialize_object_id(object_id[idx])); + } + + return bulkGet(object_type, serializedObjectIds, attr_count, attr_list, mode, object_statuses); +} + +sai_status_t RedisRemoteSaiInterface::bulkGet( + _In_ sai_object_type_t object_type, + _In_ const std::vector &serialized_object_ids, + _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) +{ + SWSS_LOG_ENTER(); + + // TODO support mode + + SWSS_LOG_NOTICE("SYNCD BULK ENTER DO"); + + std::string str_object_type = sai_serialize_object_type(object_type); + + std::vector entries; + + for (size_t idx = 0; idx < serialized_object_ids.size(); ++idx) + { + auto entry = SaiAttributeList::serialize_attr_list(object_type, attr_count[idx], attr_list[idx], false); + + std::string str_attr = Globals::joinFieldValues(entry); + + swss::FieldValueTuple fvtNoStatus(serialized_object_ids[idx] , str_attr); + + entries.push_back(fvtNoStatus); + } + + /* + * We are adding number of entries to actually add ':' to be compatible + * with previous + */ + + // key: object_type:count + // field: object_id + // value: object_attrs + std::string key = str_object_type + ":" + std::to_string(entries.size()); + + m_recorder->recordBulkGenericGet(str_object_type, entries); + + m_communicationChannel->set(key, entries, REDIS_ASIC_STATE_COMMAND_BULK_GET); + + swss::KeyOpFieldsValuesTuple kco; + auto status = waitForBulkGetResponse(object_type, serialized_object_ids, attr_count, attr_list, object_statuses, kco); + + m_recorder->recordBulkGenericGetResponse(str_object_type, kfvFieldsValues(kco)); + + return status; +} + +sai_status_t RedisRemoteSaiInterface::waitForBulkGetResponse( + _In_ sai_object_type_t object_type, + _In_ const std::vector &serialized_object_ids, + _In_ const uint32_t *attr_count, + _Inout_ sai_attribute_t **attr_list, + _Out_ sai_status_t *object_statuses, + _Out_ swss::KeyOpFieldsValuesTuple &kco) +{ + SWSS_LOG_ENTER(); + + auto status = m_communicationChannel->wait(REDIS_ASIC_STATE_COMMAND_GETRESPONSE, kco); + + auto &values = kfvFieldsValues(kco); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_THROW("logic error, get bulk response returned non zero %d", status); + return status; + } + + uint32_t attr_index = 0; + + // Fetch all the status + for(uint32_t obj_index = 0; obj_index < serialized_object_ids.size(); obj_index++) + { +// sai_deserialize_status(fvField(values[obj_index]), object_statuses[obj_index]); + object_statuses[obj_index] = SAI_STATUS_SUCCESS; + } +// values.erase(values.begin(), values.begin() + serialized_object_ids.size()); + + // Fetch attribute list for each object + SaiAttributeList list(object_type, values, false); + + SWSS_LOG_NOTICE("BULK GET OBJECTS %d", serialized_object_ids.size()); + + for(uint32_t obj_index = 0; obj_index < serialized_object_ids.size(); obj_index++) + { +// SWSS_LOG_NOTICE("BULK GET BEFORE TRANSFER %s %d attr index %d", serialized_object_ids[obj_index].c_str(), list.get_attr_list()[attr_index].value.u32, attr_index); + transfer_attributes(object_type, attr_count[obj_index], &(list.get_attr_list()[attr_index]), attr_list[obj_index], false); +// SWSS_LOG_NOTICE("BULK GET AFTER TRANSFER %s %d attr index %d", serialized_object_ids[obj_index].c_str(), attr_list[obj_index][0].value.u32); + attr_index += attr_count[obj_index]; + } + + return status; +} + sai_status_t RedisRemoteSaiInterface::bulkCreate( _In_ sai_object_type_t object_type, _In_ sai_object_id_t switch_id, diff --git a/lib/RedisRemoteSaiInterface.h b/lib/RedisRemoteSaiInterface.h index eb3014f259..9be7a2df8b 100644 --- a/lib/RedisRemoteSaiInterface.h +++ b/lib/RedisRemoteSaiInterface.h @@ -99,6 +99,15 @@ namespace sairedis _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( @@ -240,6 +249,14 @@ namespace sairedis _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses); + sai_status_t bulkGet( + _In_ sai_object_type_t object_type, + _In_ const std::vector &serialized_object_ids, + _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); + private: // QUAD API response /** @@ -281,6 +298,14 @@ namespace sairedis _In_ uint32_t object_count, _Out_ sai_status_t *object_statuses); + sai_status_t waitForBulkGetResponse( + _In_ sai_object_type_t object_type, + _In_ const std::vector &serialized_object_ids, + _In_ const uint32_t *attr_count, + _Inout_ sai_attribute_t **attr_list, + _Out_ sai_status_t *object_statuses, + _Out_ swss::KeyOpFieldsValuesTuple &kco); + private: // stats API response sai_status_t waitForGetStatsResponse( diff --git a/lib/Sai.cpp b/lib/Sai.cpp index ecbaed77fc..c9c6922fe1 100644 --- a/lib/Sai.cpp +++ b/lib/Sai.cpp @@ -472,6 +472,32 @@ sai_status_t Sai::bulkSet( object_statuses); } +sai_status_t Sai::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(); + REDIS_CHECK_API_INITIALIZED(); + REDIS_CHECK_CONTEXT(*object_id); + +// SWSS_LOG_NOTICE("SYNCD BULK GET Sai stub"); + + return context->m_meta->bulkGet( + object_type, + object_count, + object_id, + attr_count, + attr_list, + mode, + object_statuses); +} + // BULK QUAD ENTRY #define DECLARE_BULK_CREATE_ENTRY(OT,ot) \ diff --git a/lib/Sai.h b/lib/Sai.h index 3162ab30d0..8819b6f5c9 100644 --- a/lib/Sai.h +++ b/lib/Sai.h @@ -89,6 +89,15 @@ namespace sairedis _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( diff --git a/lib/ServerSai.cpp b/lib/ServerSai.cpp index 0e17ef0bd6..15154c4d63 100644 --- a/lib/ServerSai.cpp +++ b/lib/ServerSai.cpp @@ -384,6 +384,31 @@ sai_status_t ServerSai::bulkSet( object_statuses); } +sai_status_t ServerSai::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(); + REDIS_CHECK_API_INITIALIZED(); + + SWSS_LOG_NOTICE("SYNCD BULK GET ServerSai stub"); + + return m_sai->bulkGet( + object_type, + object_count, + object_id, + attr_count, + attr_list, + mode, + object_statuses); +} + // BULK QUAD ENTRY #define DECLARE_BULK_CREATE_ENTRY(OT,ot) \ diff --git a/lib/ServerSai.h b/lib/ServerSai.h index d9f27b4f83..74888e2910 100644 --- a/lib/ServerSai.h +++ b/lib/ServerSai.h @@ -85,6 +85,15 @@ namespace sairedis _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( diff --git a/lib/sai_redis.h b/lib/sai_redis.h index 906fc65191..0de59ccaf1 100644 --- a/lib/sai_redis.h +++ b/lib/sai_redis.h @@ -311,6 +311,27 @@ PRIVATE extern std::shared_ptr redis_sai; object_statuses); \ } +#define REDIS_BULK_GET_NEW(OT,fname) \ + static sai_status_t redis_bulk_get_ ## fname( \ + _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) \ +{ \ + SWSS_LOG_ENTER(); \ + /*SWSS_LOG_WARN("Example implementation");*/ \ + return redis_sai->bulkGet( \ + SAI_OBJECT_TYPE_ ## OT, \ + object_count, \ + object_id, \ + attr_count, \ + attr_list, \ + mode, \ + object_statuses); \ +} + #define REDIS_BULK_GET(OT,fname) \ static sai_status_t redis_bulk_get_ ## fname( \ _In_ uint32_t object_count, \ diff --git a/lib/sai_redis_buffer.cpp b/lib/sai_redis_buffer.cpp index 833ef3e13f..e533799ee0 100644 --- a/lib/sai_redis_buffer.cpp +++ b/lib/sai_redis_buffer.cpp @@ -6,6 +6,11 @@ REDIS_GENERIC_QUAD(BUFFER_PROFILE,buffer_profile); REDIS_GENERIC_STATS(BUFFER_POOL,buffer_pool); REDIS_GENERIC_STATS(INGRESS_PRIORITY_GROUP,ingress_priority_group); +REDIS_BULK_CREATE(INGRESS_PRIORITY_GROUP,ingress_priority_group); +REDIS_BULK_REMOVE(INGRESS_PRIORITY_GROUP,ingress_priority_group); +REDIS_BULK_SET(INGRESS_PRIORITY_GROUP,ingress_priority_group); +REDIS_BULK_GET(INGRESS_PRIORITY_GROUP,ingress_priority_group); + const sai_buffer_api_t redis_buffer_api = { REDIS_GENERIC_QUAD_API(buffer_pool) @@ -13,4 +18,9 @@ const sai_buffer_api_t redis_buffer_api = { REDIS_GENERIC_QUAD_API(ingress_priority_group) REDIS_GENERIC_STATS_API(ingress_priority_group) REDIS_GENERIC_QUAD_API(buffer_profile) + + redis_bulk_create_ingress_priority_group, + redis_bulk_remove_ingress_priority_group, + redis_bulk_set_ingress_priority_group, + redis_bulk_get_ingress_priority_group }; diff --git a/lib/sai_redis_hostif.cpp b/lib/sai_redis_hostif.cpp index fab7a9cfa7..9441362e7d 100644 --- a/lib/sai_redis_hostif.cpp +++ b/lib/sai_redis_hostif.cpp @@ -51,6 +51,10 @@ REDIS_GENERIC_QUAD(HOSTIF_TRAP_GROUP,hostif_trap_group); REDIS_GENERIC_QUAD(HOSTIF_TRAP,hostif_trap); REDIS_GENERIC_QUAD(HOSTIF_USER_DEFINED_TRAP,hostif_user_defined_trap); +REDIS_BULK_CREATE(HOSTIF,hostif); +REDIS_BULK_REMOVE(HOSTIF,hostif); +REDIS_BULK_SET(HOSTIF,hostif); +REDIS_BULK_GET(HOSTIF,hostif); const sai_hostif_api_t redis_hostif_api = { REDIS_GENERIC_QUAD_API(hostif) @@ -63,4 +67,9 @@ const sai_hostif_api_t redis_hostif_api = { redis_send_hostif_packet, redis_allocate_hostif_packet, redis_free_hostif_packet, + + redis_bulk_create_hostif, + redis_bulk_remove_hostif, + redis_bulk_set_hostif, + redis_bulk_get_hostif }; diff --git a/lib/sai_redis_nexthop.cpp b/lib/sai_redis_nexthop.cpp index 21dcca47d9..97fc345190 100644 --- a/lib/sai_redis_nexthop.cpp +++ b/lib/sai_redis_nexthop.cpp @@ -2,7 +2,15 @@ REDIS_GENERIC_QUAD(NEXT_HOP,next_hop); +REDIS_BULK_CREATE(NEXT_HOP,next_hop); +REDIS_BULK_REMOVE(NEXT_HOP,next_hop); +REDIS_BULK_SET(NEXT_HOP,next_hop); +REDIS_BULK_GET(NEXT_HOP,next_hop); const sai_next_hop_api_t redis_next_hop_api = { REDIS_GENERIC_QUAD_API(next_hop) + redis_bulk_create_next_hop, + redis_bulk_remove_next_hop, + redis_bulk_set_next_hop, + redis_bulk_get_next_hop }; diff --git a/lib/sai_redis_port.cpp b/lib/sai_redis_port.cpp index fa2501f5ce..0f0c7b88e2 100644 --- a/lib/sai_redis_port.cpp +++ b/lib/sai_redis_port.cpp @@ -15,6 +15,11 @@ REDIS_GENERIC_QUAD(PORT_CONNECTOR,port_connector); REDIS_GENERIC_STATS(PORT,port); REDIS_GENERIC_STATS(PORT_POOL,port_pool); +REDIS_BULK_CREATE(PORT,port); +REDIS_BULK_REMOVE(PORT,port); +REDIS_BULK_SET(PORT,port); +REDIS_BULK_GET_NEW(PORT,port); + const sai_port_api_t redis_port_api = { REDIS_GENERIC_QUAD_API(port) @@ -26,4 +31,9 @@ const sai_port_api_t redis_port_api = { REDIS_GENERIC_STATS_API(port_pool) REDIS_GENERIC_QUAD_API(port_connector) REDIS_GENERIC_QUAD_API(port_serdes) + + redis_bulk_create_port, + redis_bulk_remove_port, + redis_bulk_set_port, + redis_bulk_get_port }; diff --git a/lib/sai_redis_queue.cpp b/lib/sai_redis_queue.cpp index f05eb120aa..c10b368cd6 100644 --- a/lib/sai_redis_queue.cpp +++ b/lib/sai_redis_queue.cpp @@ -3,8 +3,18 @@ REDIS_GENERIC_QUAD(QUEUE,queue); REDIS_GENERIC_STATS(QUEUE,queue); +REDIS_BULK_CREATE(QUEUE,queue); +REDIS_BULK_REMOVE(QUEUE,queue); +REDIS_BULK_SET(QUEUE,queue); +REDIS_BULK_GET(QUEUE,queue); + const sai_queue_api_t redis_queue_api = { REDIS_GENERIC_QUAD_API(queue) REDIS_GENERIC_STATS_API(queue) + + redis_bulk_create_queue, + redis_bulk_remove_queue, + redis_bulk_set_queue, + redis_bulk_get_queue }; diff --git a/lib/sai_redis_schedulergroup.cpp b/lib/sai_redis_schedulergroup.cpp index 9941d87a7d..8626d8858b 100644 --- a/lib/sai_redis_schedulergroup.cpp +++ b/lib/sai_redis_schedulergroup.cpp @@ -2,7 +2,17 @@ REDIS_GENERIC_QUAD(SCHEDULER_GROUP,scheduler_group); +REDIS_BULK_CREATE(SCHEDULER_GROUP,scheduler_group); +REDIS_BULK_REMOVE(SCHEDULER_GROUP,scheduler_group); +REDIS_BULK_SET(SCHEDULER_GROUP,scheduler_group); +REDIS_BULK_GET_NEW(SCHEDULER_GROUP,scheduler_group); + const sai_scheduler_group_api_t redis_scheduler_group_api = { REDIS_GENERIC_QUAD_API(scheduler_group) + + redis_bulk_create_scheduler_group, + redis_bulk_remove_scheduler_group, + redis_bulk_set_scheduler_group, + redis_bulk_get_scheduler_group }; diff --git a/meta/DummySaiInterface.cpp b/meta/DummySaiInterface.cpp index 4814885473..9aff2228d7 100644 --- a/meta/DummySaiInterface.cpp +++ b/meta/DummySaiInterface.cpp @@ -376,19 +376,17 @@ sai_status_t DummySaiInterface::bulkSet( return m_status; } -sai_status_t DummySaiInterface::bulkSet( +sai_status_t DummySaiInterface::bulkGet( + _In_ sai_object_type_t object_type, _In_ uint32_t object_count, - _In_ const sai_my_sid_entry_t *my_sid_entry, - _In_ const sai_attribute_t *attr_list, + _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) { - SWSS_LOG_ENTER(); - - for (uint32_t idx = 0; idx < object_count; idx++) - object_statuses[idx] = m_status; - - return m_status; + SWSS_LOG_NOTICE("SYNCD BULK GET DummySaiInterface stub"); + return SAI_STATUS_SUCCESS; } sai_status_t DummySaiInterface::bulkCreate( diff --git a/meta/Meta.cpp b/meta/Meta.cpp index 346d7201d0..b14e03f1bc 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -2552,6 +2552,56 @@ sai_status_t Meta::bulkSet( return status; } +sai_status_t Meta::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) +{ +// SWSS_LOG_NOTICE("SYNCD BULK GET Meta stub"); +#if 0 + sai_status_t status = meta_sai_validate_oid(object_type, &object_id, SAI_NULL_OBJECT_ID, false); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } + + sai_object_meta_key_t meta_key = { .objecttype = object_type, .objectkey = { .key = { .object_id = object_id } } }; + + status = meta_generic_validation_get(meta_key, attr_count, attr_list); + + if (status != SAI_STATUS_SUCCESS) + { + return status; + } +#endif + auto status = m_implementation->bulkGet(object_type, object_count, object_id, attr_count, attr_list, mode, object_statuses); + + if (status == SAI_STATUS_SUCCESS) + { + for (uint32_t idx = 0; idx < object_count; idx++) + { + // TO DO: we should test object_statuses[idx] as well + sai_object_id_t switch_id = switchIdQuery(object_id[idx]); + + if (!m_oids.objectReferenceExists(switch_id)) + { + SWSS_LOG_ERROR("switch id 0x%" PRIx64 " doesn't exist", switch_id); + } + + sai_object_meta_key_t meta_key = { .objecttype = object_type, .objectkey = { .key = { .object_id = object_id[idx] } } }; + meta_generic_validation_post_get(meta_key, switch_id, attr_count[idx], attr_list[idx]); +// SWSS_LOG_NOTICE("SYNCD BULK GET meta oid %" PRIx64 "attr %d", object_id[idx], attr_list[idx][0].value.u32); + } + } + + return SAI_STATUS_SUCCESS; +} + sai_status_t Meta::bulkCreate( _In_ sai_object_type_t object_type, _In_ sai_object_id_t switchId, diff --git a/meta/Meta.h b/meta/Meta.h index 2c928e8a64..0a6ff95681 100644 --- a/meta/Meta.h +++ b/meta/Meta.h @@ -96,6 +96,15 @@ namespace saimeta _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( diff --git a/meta/SaiInterface.h b/meta/SaiInterface.h index fb8cdf0c42..f58cd91241 100644 --- a/meta/SaiInterface.h +++ b/meta/SaiInterface.h @@ -167,6 +167,15 @@ namespace sairedis _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) = 0; + virtual sai_status_t 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) = 0; + public: // QUAD meta key virtual sai_status_t create( diff --git a/syncd/Syncd.cpp b/syncd/Syncd.cpp index a4f3ff52c1..f567380c0c 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -342,6 +342,9 @@ sai_status_t Syncd::processSingleEvent( if (op == REDIS_ASIC_STATE_COMMAND_BULK_SET) return processBulkQuadEvent(SAI_COMMON_API_BULK_SET, kco); + if (op == REDIS_ASIC_STATE_COMMAND_BULK_GET) + return processBulkQuadEvent(SAI_COMMON_API_BULK_GET, kco); + if (op == REDIS_ASIC_STATE_COMMAND_NOTIFY) return processNotifySyncd(kco); @@ -901,8 +904,14 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode( } case SAI_COMMON_API_BULK_GET: - SWSS_LOG_THROW("GET bulk api is not implemented in init view mode, FIXME"); - + if (info->isobjectid) + { + return processBulkOid(objectType, objectIds, api, attributes, strAttributes); + } + else + { + SWSS_LOG_THROW("GET bulk api is not implemented in init view mode, FIXME"); + } default: SWSS_LOG_THROW("common bulk api (%s) is not implemented in init view mode", @@ -1710,6 +1719,10 @@ sai_status_t Syncd::processBulkOid( { status = processOid(objectType, objectIds[idx], SAI_COMMON_API_SET, attr_count, attr_list); } + else if (api == SAI_COMMON_API_BULK_GET) + { + status = processOid(objectType, objectIds[idx], SAI_COMMON_API_GET, attr_count, attr_list); + } else { SWSS_LOG_THROW("api %s is not supported in bulk mode", @@ -1731,9 +1744,16 @@ sai_status_t Syncd::processBulkOid( statuses[idx] = status; } - sendApiResponse(api, all, (uint32_t)objectIds.size(), statuses.data()); + if (api == SAI_COMMON_API_BULK_GET) + { + sendBulkGetResponse(objectType, objectIds, attributes, SAI_STATUS_SUCCESS); + } + else + { + sendApiResponse(api, all, (uint32_t)objectIds.size(), statuses.data()); - syncUpdateRedisBulkQuadEvent(api, statuses, objectType, objectIds, strAttributes); + syncUpdateRedisBulkQuadEvent(api, statuses, objectType, objectIds, strAttributes); + } return all; } @@ -2941,6 +2961,75 @@ void Syncd::sendGetResponse( SWSS_LOG_INFO("response for GET api was send"); } +void Syncd::sendBulkGetResponse( + _In_ sai_object_type_t objectType, + _In_ const std::vector& objectIdStrs, + _In_ const std::vector>& attributes, + _In_ sai_status_t status) +{ + SWSS_LOG_ENTER(); + + std::vector entry, entries; + + for (size_t idx = 0; idx < objectIdStrs.size(); ++idx) + { + auto& list = attributes[idx]; + + sai_attribute_t *attr_list = list->get_attr_list(); + uint32_t attr_count = list->get_attr_count(); + if (status == SAI_STATUS_SUCCESS) + { + sai_object_id_t object_id; + sai_deserialize_object_id(objectIdStrs[idx], object_id); + sai_object_id_t switchVid = VidManager::switchIdQuery(object_id); + m_translator->translateRidToVid(objectType, switchVid, attr_count, attr_list); + + /* + * Normal serialization + translate RID to VID. + */ + + entry = SaiAttributeList::serialize_attr_list( + objectType, + attr_count, + attr_list, + false); + + /* + * All oid values here are VIDs. + */ + + snoopGetResponse(objectType, objectIdStrs[idx], attr_count, attr_list); + + entries.insert(entries.end(), entry.begin(), entry.end()); + } + else + { + /* + * Some other error, don't send attributes at all. + */ + } + } + + for (const auto &e: entries) + { + SWSS_LOG_DEBUG("attr: %s: %s", fvField(e).c_str(), fvValue(e).c_str()); + } + + std::string strStatus = sai_serialize_status(status); + + SWSS_LOG_INFO("sending response for GET api with status: %s", strStatus.c_str()); + + /* + * Since we have only one get at a time, we don't have to serialize object + * type and object id, only get status is required to be returned. Get + * response will not put any data to table, only queue is used. + */ + + m_selectableChannel->set(strStatus, entries, REDIS_ASIC_STATE_COMMAND_GETRESPONSE); + + SWSS_LOG_INFO("response for GET api was send"); +} + void Syncd::snoopGetResponse( _In_ sai_object_type_t object_type, _In_ const std::string& strObjectId, // can be non object id diff --git a/syncd/Syncd.h b/syncd/Syncd.h index d841537035..730a675b2d 100644 --- a/syncd/Syncd.h +++ b/syncd/Syncd.h @@ -343,6 +343,12 @@ namespace syncd _In_ uint32_t attr_count, _In_ sai_attribute_t *attr_list); + void sendBulkGetResponse( + _In_ sai_object_type_t objectType, + _In_ const std::vector& objectIdStrs, + _In_ const std::vector>& attributes, + _In_ sai_status_t status); + void sendNotifyResponse( _In_ sai_status_t status); diff --git a/syncd/VendorSai.cpp b/syncd/VendorSai.cpp index 7776149429..4a321499bf 100644 --- a/syncd/VendorSai.cpp +++ b/syncd/VendorSai.cpp @@ -761,6 +761,24 @@ sai_status_t VendorSai::bulkSet( return SAI_STATUS_NOT_SUPPORTED; } +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(); + + SWSS_LOG_ERROR("not supported by SAI"); + + return SAI_STATUS_NOT_SUPPORTED; +} + // BULK QUAD ENTRY sai_status_t VendorSai::bulkCreate( diff --git a/syncd/VendorSai.h b/syncd/VendorSai.h index 091a2afda5..e98f85b67e 100644 --- a/syncd/VendorSai.h +++ b/syncd/VendorSai.h @@ -86,6 +86,15 @@ namespace syncd _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( diff --git a/vslib/Sai.cpp b/vslib/Sai.cpp index 79262ef8f4..4e9210b9d4 100644 --- a/vslib/Sai.cpp +++ b/vslib/Sai.cpp @@ -586,6 +586,31 @@ sai_status_t Sai::bulkSet( object_statuses); } +sai_status_t Sai::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(); + VS_CHECK_API_INITIALIZED(); + + SWSS_LOG_NOTICE("SYNCD BULK GET vsSai stub"); + + return m_meta->bulkGet( + object_type, + object_count, + object_id, + attr_count, + attr_list, + mode, + object_statuses); +} + // BULK QUAD ENTRY #define DECLARE_BULK_CREATE_ENTRY(OT,ot) \ diff --git a/vslib/Sai.h b/vslib/Sai.h index 7af8e39c14..dadb89d2a1 100644 --- a/vslib/Sai.h +++ b/vslib/Sai.h @@ -94,6 +94,15 @@ namespace saivs _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( diff --git a/vslib/VirtualSwitchSaiInterface.cpp b/vslib/VirtualSwitchSaiInterface.cpp index 77d81417d3..d3f91eefb8 100644 --- a/vslib/VirtualSwitchSaiInterface.cpp +++ b/vslib/VirtualSwitchSaiInterface.cpp @@ -1212,6 +1212,19 @@ sai_status_t VirtualSwitchSaiInterface::bulkSet( return ss->bulkSet(object_type, serialized_object_ids, attr_list, mode, object_statuses); } +sai_status_t VirtualSwitchSaiInterface::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) +{ + SWSS_LOG_NOTICE("SYNCD BULK GET VirtualSwitchSaiInterface stub"); + return SAI_STATUS_SUCCESS; +} + sai_status_t VirtualSwitchSaiInterface::bulkCreate( _In_ sai_object_type_t object_type, _In_ sai_object_id_t switch_id, diff --git a/vslib/VirtualSwitchSaiInterface.h b/vslib/VirtualSwitchSaiInterface.h index dc5d32c271..7c3f600165 100644 --- a/vslib/VirtualSwitchSaiInterface.h +++ b/vslib/VirtualSwitchSaiInterface.h @@ -93,6 +93,15 @@ namespace saivs _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_status_t *object_statuses) override; + virtual sai_status_t 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) override; + public: // stats API virtual sai_status_t getStats( diff --git a/vslib/sai_vs_buffer.cpp b/vslib/sai_vs_buffer.cpp index 32e1fa4a46..af42ff962c 100644 --- a/vslib/sai_vs_buffer.cpp +++ b/vslib/sai_vs_buffer.cpp @@ -6,6 +6,11 @@ VS_GENERIC_QUAD(BUFFER_PROFILE,buffer_profile); VS_GENERIC_STATS(BUFFER_POOL,buffer_pool); VS_GENERIC_STATS(INGRESS_PRIORITY_GROUP,ingress_priority_group); +VS_BULK_CREATE(INGRESS_PRIORITY_GROUP,ingress_priority_group); +VS_BULK_REMOVE(INGRESS_PRIORITY_GROUP,ingress_priority_group); +VS_BULK_SET(INGRESS_PRIORITY_GROUP,ingress_priority_group); +VS_BULK_GET(INGRESS_PRIORITY_GROUP,ingress_priority_group); + const sai_buffer_api_t vs_buffer_api = { VS_GENERIC_QUAD_API(buffer_pool) @@ -13,4 +18,9 @@ const sai_buffer_api_t vs_buffer_api = { VS_GENERIC_QUAD_API(ingress_priority_group) VS_GENERIC_STATS_API(ingress_priority_group) VS_GENERIC_QUAD_API(buffer_profile) + + vs_bulk_create_ingress_priority_group, + vs_bulk_remove_ingress_priority_group, + vs_bulk_set_ingress_priority_group, + vs_bulk_get_ingress_priority_group }; diff --git a/vslib/sai_vs_hostif.cpp b/vslib/sai_vs_hostif.cpp index 2a35c2bef2..207d58da08 100644 --- a/vslib/sai_vs_hostif.cpp +++ b/vslib/sai_vs_hostif.cpp @@ -51,6 +51,11 @@ VS_GENERIC_QUAD(HOSTIF_TRAP_GROUP,hostif_trap_group); VS_GENERIC_QUAD(HOSTIF_TRAP,hostif_trap); VS_GENERIC_QUAD(HOSTIF_USER_DEFINED_TRAP,hostif_user_defined_trap); +VS_BULK_CREATE(HOSTIF,hostif); +VS_BULK_REMOVE(HOSTIF,hostif); +VS_BULK_SET(HOSTIF,hostif); +VS_BULK_GET(HOSTIF,hostif); + const sai_hostif_api_t vs_hostif_api = { VS_GENERIC_QUAD_API(hostif) @@ -63,4 +68,9 @@ const sai_hostif_api_t vs_hostif_api = { vs_send_hostif_packet, vs_allocate_hostif_packet, vs_free_hostif_packet, + + vs_bulk_create_hostif, + vs_bulk_remove_hostif, + vs_bulk_set_hostif, + vs_bulk_get_hostif }; diff --git a/vslib/sai_vs_nexthop.cpp b/vslib/sai_vs_nexthop.cpp index 914233532e..765db0beaf 100644 --- a/vslib/sai_vs_nexthop.cpp +++ b/vslib/sai_vs_nexthop.cpp @@ -2,7 +2,17 @@ VS_GENERIC_QUAD(NEXT_HOP,next_hop); +VS_BULK_CREATE(NEXT_HOP,next_hop); +VS_BULK_REMOVE(NEXT_HOP,next_hop); +VS_BULK_SET(NEXT_HOP,next_hop); +VS_BULK_GET(NEXT_HOP,next_hop); + const sai_next_hop_api_t vs_next_hop_api = { VS_GENERIC_QUAD_API(next_hop) + + vs_bulk_create_next_hop, + vs_bulk_remove_next_hop, + vs_bulk_set_next_hop, + vs_bulk_get_next_hop }; diff --git a/vslib/sai_vs_port.cpp b/vslib/sai_vs_port.cpp index 79bccf7771..7dab83acac 100644 --- a/vslib/sai_vs_port.cpp +++ b/vslib/sai_vs_port.cpp @@ -15,6 +15,11 @@ VS_GENERIC_QUAD(PORT_SERDES,port_serdes); VS_GENERIC_STATS(PORT,port); VS_GENERIC_STATS(PORT_POOL,port_pool); +VS_BULK_CREATE(PORT,port); +VS_BULK_REMOVE(PORT,port); +VS_BULK_SET(PORT,port); +VS_BULK_GET(PORT,port); + const sai_port_api_t vs_port_api = { VS_GENERIC_QUAD_API(port) @@ -28,4 +33,9 @@ const sai_port_api_t vs_port_api = { VS_GENERIC_QUAD_API(port_connector) VS_GENERIC_QUAD_API(port_serdes) + + vs_bulk_create_port, + vs_bulk_remove_port, + vs_bulk_set_port, + vs_bulk_get_port }; diff --git a/vslib/sai_vs_queue.cpp b/vslib/sai_vs_queue.cpp index 75ab91adaf..19acdd173b 100644 --- a/vslib/sai_vs_queue.cpp +++ b/vslib/sai_vs_queue.cpp @@ -3,8 +3,18 @@ VS_GENERIC_QUAD(QUEUE,queue); VS_GENERIC_STATS(QUEUE,queue); +VS_BULK_CREATE(QUEUE,queue); +VS_BULK_REMOVE(QUEUE,queue); +VS_BULK_SET(QUEUE,queue); +VS_BULK_GET(QUEUE,queue); + const sai_queue_api_t vs_queue_api = { VS_GENERIC_QUAD_API(queue) VS_GENERIC_STATS_API(queue) + + vs_bulk_create_queue, + vs_bulk_remove_queue, + vs_bulk_set_queue, + vs_bulk_get_queue }; diff --git a/vslib/sai_vs_schedulergroup.cpp b/vslib/sai_vs_schedulergroup.cpp index ad7e12ec88..f62f041be6 100644 --- a/vslib/sai_vs_schedulergroup.cpp +++ b/vslib/sai_vs_schedulergroup.cpp @@ -2,7 +2,17 @@ VS_GENERIC_QUAD(SCHEDULER_GROUP,scheduler_group); +VS_BULK_CREATE(SCHEDULER_GROUP,scheduler_group); +VS_BULK_REMOVE(SCHEDULER_GROUP,scheduler_group); +VS_BULK_SET(SCHEDULER_GROUP,scheduler_group); +VS_BULK_GET(SCHEDULER_GROUP,scheduler_group); + const sai_scheduler_group_api_t vs_scheduler_group_api = { VS_GENERIC_QUAD_API(scheduler_group) + + vs_bulk_create_scheduler_group, + vs_bulk_remove_scheduler_group, + vs_bulk_set_scheduler_group, + vs_bulk_get_scheduler_group };