From 32805419e61795bf5bc268e21ad50b44bc11402c Mon Sep 17 00:00:00 2001 From: Shlomi Bitton Date: Tue, 31 Aug 2021 10:15:27 +0000 Subject: [PATCH 1/4] Query counters capabilities with new SAI API Signed-off-by: Shlomi Bitton --- lib/ClientSai.cpp | 10 + lib/ClientSai.h | 5 + lib/ClientServerSai.cpp | 12 + lib/ClientServerSai.h | 5 + lib/RedisRemoteSaiInterface.cpp | 10 + lib/RedisRemoteSaiInterface.h | 5 + lib/Sai.cpp | 10 + lib/Sai.h | 5 + lib/ServerSai.cpp | 10 + lib/ServerSai.h | 5 + meta/DummySaiInterface.cpp | 10 + meta/DummySaiInterface.h | 5 + meta/Meta.cpp | 10 + meta/Meta.h | 5 + meta/SaiInterface.h | 5 + syncd/FlexCounter.cpp | 341 +++++++++++++++++++++++++--- syncd/FlexCounter.h | 37 +++ syncd/VendorSai.cpp | 15 ++ syncd/VendorSai.h | 5 + vslib/Sai.cpp | 10 + vslib/Sai.h | 5 + vslib/VirtualSwitchSaiInterface.cpp | 10 + vslib/VirtualSwitchSaiInterface.h | 5 + vslib/sai_vs_interfacequery.cpp | 10 + 24 files changed, 524 insertions(+), 26 deletions(-) diff --git a/lib/ClientSai.cpp b/lib/ClientSai.cpp index efd7a22887..5e38d0cb33 100644 --- a/lib/ClientSai.cpp +++ b/lib/ClientSai.cpp @@ -886,6 +886,16 @@ sai_status_t ClientSai::getStats( return waitForGetStatsResponse(number_of_counters, counters); } +sai_status_t ClientSai::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t ClientSai::waitForGetStatsResponse( _In_ uint32_t number_of_counters, _Out_ uint64_t *counters) diff --git a/lib/ClientSai.h b/lib/ClientSai.h index 31e36946fe..f051a51d52 100644 --- a/lib/ClientSai.h +++ b/lib/ClientSai.h @@ -97,6 +97,11 @@ namespace sairedis _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/lib/ClientServerSai.cpp b/lib/ClientServerSai.cpp index 93b3514ce9..71598a24e2 100644 --- a/lib/ClientServerSai.cpp +++ b/lib/ClientServerSai.cpp @@ -247,6 +247,18 @@ sai_status_t ClientServerSai::getStats( counters); } +sai_status_t ClientServerSai::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(); + REDIS_CHECK_API_INITIALIZED(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t ClientServerSai::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/lib/ClientServerSai.h b/lib/ClientServerSai.h index 8f13863781..e8fb165835 100644 --- a/lib/ClientServerSai.h +++ b/lib/ClientServerSai.h @@ -89,6 +89,11 @@ namespace sairedis _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/lib/RedisRemoteSaiInterface.cpp b/lib/RedisRemoteSaiInterface.cpp index 3c0870bcab..1605f4c0f0 100644 --- a/lib/RedisRemoteSaiInterface.cpp +++ b/lib/RedisRemoteSaiInterface.cpp @@ -1125,6 +1125,16 @@ sai_status_t RedisRemoteSaiInterface::getStats( return waitForGetStatsResponse(number_of_counters, counters); } +sai_status_t RedisRemoteSaiInterface::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t RedisRemoteSaiInterface::waitForGetStatsResponse( _In_ uint32_t number_of_counters, _Out_ uint64_t *counters) diff --git a/lib/RedisRemoteSaiInterface.h b/lib/RedisRemoteSaiInterface.h index e4482ba1e8..eb3014f259 100644 --- a/lib/RedisRemoteSaiInterface.h +++ b/lib/RedisRemoteSaiInterface.h @@ -108,6 +108,11 @@ namespace sairedis _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/lib/Sai.cpp b/lib/Sai.cpp index 3f146efd2c..ecbaed77fc 100644 --- a/lib/Sai.cpp +++ b/lib/Sai.cpp @@ -351,6 +351,16 @@ sai_status_t Sai::getStats( counters); } +sai_status_t Sai::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t Sai::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/lib/Sai.h b/lib/Sai.h index 00849f9055..3162ab30d0 100644 --- a/lib/Sai.h +++ b/lib/Sai.h @@ -98,6 +98,11 @@ namespace sairedis _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/lib/ServerSai.cpp b/lib/ServerSai.cpp index eecf5fb031..cc91cc6516 100644 --- a/lib/ServerSai.cpp +++ b/lib/ServerSai.cpp @@ -269,6 +269,16 @@ sai_status_t ServerSai::getStats( counters); } +sai_status_t ServerSai::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t ServerSai::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/lib/ServerSai.h b/lib/ServerSai.h index 1626871932..d9f27b4f83 100644 --- a/lib/ServerSai.h +++ b/lib/ServerSai.h @@ -94,6 +94,11 @@ namespace sairedis _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/meta/DummySaiInterface.cpp b/meta/DummySaiInterface.cpp index 245f725cd3..3606ba2755 100644 --- a/meta/DummySaiInterface.cpp +++ b/meta/DummySaiInterface.cpp @@ -179,6 +179,16 @@ sai_status_t DummySaiInterface::getStats( return m_status; } +sai_status_t DummySaiInterface::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t DummySaiInterface::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/meta/DummySaiInterface.h b/meta/DummySaiInterface.h index 14bb89dab2..d40db53476 100644 --- a/meta/DummySaiInterface.h +++ b/meta/DummySaiInterface.h @@ -98,6 +98,11 @@ namespace saimeta _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/meta/Meta.cpp b/meta/Meta.cpp index 5a4b8d4b64..b2884c5dfb 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -1870,6 +1870,16 @@ sai_status_t Meta::getStats( return status; } +sai_status_t Meta::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t Meta::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/meta/Meta.h b/meta/Meta.h index 28fec1c86d..07f17f36b9 100644 --- a/meta/Meta.h +++ b/meta/Meta.h @@ -105,6 +105,11 @@ namespace saimeta _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/meta/SaiInterface.h b/meta/SaiInterface.h index c1e794133f..1c6043447d 100644 --- a/meta/SaiInterface.h +++ b/meta/SaiInterface.h @@ -194,6 +194,11 @@ namespace sairedis _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) = 0; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) = 0; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index fd132b5368..eed09879ee 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -7,6 +7,7 @@ #include "swss/tokenize.h" #include +#include using namespace syncd; @@ -1033,6 +1034,11 @@ bool FlexCounter::isBufferPoolCounterSupported( return m_supportedBufferPoolCounters.count(counter) != 0; } +bool FlexCounter::isStatsModeSupported(uint32_t statsMode, sai_stats_mode_t statCapability) +{ + return statsMode & statCapability; +} + void FlexCounter::collectCounters( _In_ swss::Table &countersTable) { @@ -1757,16 +1763,49 @@ void FlexCounter::endFlexCounterThread(void) SWSS_LOG_INFO("Flex Counter thread ended"); } -void FlexCounter::updateSupportedPortCounters( - _In_ sai_object_id_t portRid) +sai_status_t FlexCounter::querySupportedPortCounters( + sai_object_id_t portRid) { - SWSS_LOG_ENTER(); + sai_stat_capability_list_t stats_capability; + stats_capability.count = 0; + stats_capability.list = nullptr; - if (m_supportedPortCounters.size()) + /* First call is to check the size needed to allocate */ + sai_status_t status = m_vendorSai->queryStatsCapability( + portRid, + SAI_OBJECT_TYPE_PORT, + &stats_capability); + + /* Second call is for query statistics capability */ + if (status == SAI_STATUS_BUFFER_OVERFLOW) { - return; + std::vector statCapabilityList(stats_capability.count); + stats_capability.list = statCapabilityList.data(); + status = m_vendorSai->queryStatsCapability( + portRid, + SAI_OBJECT_TYPE_PORT, + &stats_capability); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("Unable to get port supported counters for %s", + sai_serialize_object_id(portRid).c_str()); + } + else + { + for (auto statCapability: statCapabilityList) + { + sai_port_stat_t counter = static_cast(statCapability.stat_enum); + m_supportedPortCounters.insert(counter); + } + } } + return status; +} +void FlexCounter::getSupportedPortCounters( + sai_object_id_t portRid) +{ uint64_t value; for (int id = SAI_PORT_STAT_IF_IN_OCTETS; id <= SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS; ++id) @@ -1789,6 +1828,25 @@ void FlexCounter::updateSupportedPortCounters( } } +void FlexCounter::updateSupportedPortCounters( + _In_ sai_object_id_t portRid) +{ + SWSS_LOG_ENTER(); + + if (m_supportedPortCounters.size()) + { + return; + } + + /* Query SAI supported port counters */ + sai_status_t status = querySupportedPortCounters(portRid); + if (status != SAI_STATUS_SUCCESS) + { + /* Fallback to legacy approach */ + getSupportedPortCounters(portRid); + } +} + std::vector FlexCounter::saiCheckSupportedPortDebugCounters( _In_ sai_object_id_t portId, _In_ const std::vector &counterIds) @@ -1831,15 +1889,56 @@ std::vector FlexCounter::saiCheckSupportedPortDebugCounters( return supportedPortDebugCounters; } -void FlexCounter::updateSupportedQueueCounters( - _In_ sai_object_id_t queueId, - _In_ const std::vector &counterIds) +sai_status_t FlexCounter::querySupportedQueueCounters( + sai_object_id_t queueId) { - SWSS_LOG_ENTER(); + sai_stat_capability_list_t stats_capability; + stats_capability.count = 0; + stats_capability.list = nullptr; - uint64_t value; + /* First call is to check the size needed to allocate */ + sai_status_t status = m_vendorSai->queryStatsCapability( + queueId, + SAI_OBJECT_TYPE_QUEUE, + &stats_capability); - m_supportedQueueCounters.clear(); + /* Second call is for query statistics capability */ + if (status == SAI_STATUS_BUFFER_OVERFLOW) + { + std::vector statCapabilityList(stats_capability.count); + stats_capability.list = statCapabilityList.data(); + status = m_vendorSai->queryStatsCapability( + queueId, + SAI_OBJECT_TYPE_QUEUE, + &stats_capability); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("Unable to get queue supported counters for %s", + sai_serialize_object_id(queueId).c_str()); + } + else + { + for (auto statCapability: statCapabilityList) + { + auto currentStatModes = statCapability.stat_modes; + if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR && !isStatsModeSupported(currentStatModes, SAI_STATS_MODE_READ_AND_CLEAR)) + { + continue; + } + sai_queue_stat_t counter = static_cast(statCapability.stat_enum); + m_supportedQueueCounters.insert(counter); + } + } + } + return status; +} + +void FlexCounter::getSupportedQueueCounters( + sai_object_id_t queueId, + const std::vector &counterIds) +{ + uint64_t value; for (auto &counter : counterIds) { @@ -1879,15 +1978,73 @@ void FlexCounter::updateSupportedQueueCounters( } } -void FlexCounter::updateSupportedPriorityGroupCounters( - _In_ sai_object_id_t priorityGroupRid, - _In_ const std::vector &counterIds) +void FlexCounter::updateSupportedQueueCounters( + _In_ sai_object_id_t queueId, + _In_ const std::vector &counterIds) { SWSS_LOG_ENTER(); - uint64_t value; + m_supportedQueueCounters.clear(); - m_supportedPriorityGroupCounters.clear(); + /* Query SAI supported queue counters */ + sai_status_t status = querySupportedQueueCounters(queueId); + if (status != SAI_STATUS_SUCCESS) + { + /* Fallback to legacy approach */ + getSupportedQueueCounters(queueId, counterIds); + } +} + +sai_status_t FlexCounter::querySupportedPriorityGroupCounters( + sai_object_id_t priorityGroupRid) +{ + sai_stat_capability_list_t stats_capability; + stats_capability.count = 0; + stats_capability.list = nullptr; + + /* First call is to check the size needed to allocate */ + sai_status_t status = m_vendorSai->queryStatsCapability( + priorityGroupRid, + SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, + &stats_capability); + + /* Second call is for query statistics capability */ + if (status == SAI_STATUS_BUFFER_OVERFLOW) + { + std::vector statCapabilityList(stats_capability.count); + stats_capability.list = statCapabilityList.data(); + status = m_vendorSai->queryStatsCapability(priorityGroupRid, + SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, + &stats_capability); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("Unable to get priority group supported counters for %s", + sai_serialize_object_id(priorityGroupRid).c_str()); + } + else + { + + for (auto statCapability: statCapabilityList) + { + auto currentStatModes = statCapability.stat_modes; + if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR && !isStatsModeSupported(currentStatModes, SAI_STATS_MODE_READ_AND_CLEAR)) + { + continue; + } + sai_ingress_priority_group_stat_t counter = static_cast(statCapability.stat_enum); + m_supportedPriorityGroupCounters.insert(counter); + } + } + } + return status; +} + +void FlexCounter::getSupportedPriorityGroupCounters( + sai_object_id_t priorityGroupRid, + const std::vector &counterIds) +{ + uint64_t value; for (auto &counter : counterIds) { @@ -1933,17 +2090,68 @@ void FlexCounter::updateSupportedPriorityGroupCounters( } } -void FlexCounter::updateSupportedRifCounters( - _In_ sai_object_id_t rifRid) +void FlexCounter::updateSupportedPriorityGroupCounters( + _In_ sai_object_id_t priorityGroupRid, + _In_ const std::vector &counterIds) { SWSS_LOG_ENTER(); - if (m_supportedRifCounters.size()) + m_supportedPriorityGroupCounters.clear(); + + /* Query SAI supported priority group counters */ + sai_status_t status = querySupportedPriorityGroupCounters(priorityGroupRid); + if (status != SAI_STATUS_SUCCESS) { - return; + /* Fallback to legacy approach */ + getSupportedPriorityGroupCounters(priorityGroupRid, counterIds); + } +} + +sai_status_t FlexCounter::querySupportedRifCounters( + sai_object_id_t rifRid) +{ + sai_stat_capability_list_t stats_capability; + stats_capability.count = 0; + stats_capability.list = nullptr; + + /* First call is to check the size needed to allocate */ + sai_status_t status = m_vendorSai->queryStatsCapability( + rifRid, + SAI_OBJECT_TYPE_ROUTER_INTERFACE, + &stats_capability); + + /* Second call is for query statistics capability */ + if (status == SAI_STATUS_BUFFER_OVERFLOW) + { + std::vector statCapabilityList(stats_capability.count); + stats_capability.list = statCapabilityList.data(); + status = m_vendorSai->queryStatsCapability( + rifRid, + SAI_OBJECT_TYPE_ROUTER_INTERFACE, + &stats_capability); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("Unable to get routed port supported counters for %s", + sai_serialize_object_id(rifRid).c_str()); + } + else + { + for (auto statCapability: statCapabilityList) + { + sai_router_interface_stat_t counter = static_cast(statCapability.stat_enum); + m_supportedRifCounters.insert(counter); + } + } } + return status; +} +void FlexCounter::getSupportedRifCounters( + sai_object_id_t rifRid) +{ uint64_t value; + for (int cntr_id = SAI_ROUTER_INTERFACE_STAT_IN_OCTETS; cntr_id <= SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS; ++cntr_id) { sai_router_interface_stat_t counter = static_cast(cntr_id); @@ -1969,16 +2177,79 @@ void FlexCounter::updateSupportedRifCounters( } } -void FlexCounter::updateSupportedBufferPoolCounters( - _In_ sai_object_id_t bufferPoolId, - _In_ const std::vector &counterIds, - _In_ sai_stats_mode_t statsMode) +void FlexCounter::updateSupportedRifCounters( + _In_ sai_object_id_t rifRid) { SWSS_LOG_ENTER(); - uint64_t value; - m_supportedBufferPoolCounters.clear(); + if (m_supportedRifCounters.size()) + { + return; + } + + /* Query SAI supported rif counters */ + sai_status_t status = querySupportedRifCounters(rifRid); + if (status != SAI_STATUS_SUCCESS) + { + /* Fallback to legacy approach */ + getSupportedRifCounters(rifRid); + } +} + +sai_status_t FlexCounter::querySupportedBufferPoolCounters( + sai_object_id_t bufferPoolId, + sai_stats_mode_t statsMode) +{ + sai_stat_capability_list_t stats_capability; + stats_capability.count = 0; + stats_capability.list = nullptr; + /* First call is to check the size needed to allocate */ + sai_status_t status = m_vendorSai->queryStatsCapability( + bufferPoolId, + SAI_OBJECT_TYPE_BUFFER_POOL, + &stats_capability); + + /* Second call is for query statistics capability */ + if (status == SAI_STATUS_BUFFER_OVERFLOW) + { + std::vector statCapabilityList(stats_capability.count); + stats_capability.list = statCapabilityList.data(); + status = m_vendorSai->queryStatsCapability( + bufferPoolId, + SAI_OBJECT_TYPE_BUFFER_POOL, + &stats_capability); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("Unable to get buffer pool supported counters for %s", + sai_serialize_object_id(bufferPoolId).c_str()); + } + else + { + for (auto statCapability: statCapabilityList) + { + auto currentStatModes = statCapability.stat_modes; + if ((m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR || statsMode == SAI_STATS_MODE_READ_AND_CLEAR) && + !isStatsModeSupported(currentStatModes, SAI_STATS_MODE_READ_AND_CLEAR)) + { + continue; + } + sai_buffer_pool_stat_t counter = static_cast(statCapability.stat_enum); + m_supportedBufferPoolCounters.insert(counter); + } + } + } + return status; +} + +void FlexCounter::getSupportedBufferPoolCounters( + sai_object_id_t bufferPoolId, + const std::vector &counterIds, + sai_stats_mode_t statsMode) +{ + uint64_t value; + for (const auto &counterId : counterIds) { sai_status_t status = m_vendorSai->getStats( @@ -2023,6 +2294,24 @@ void FlexCounter::updateSupportedBufferPoolCounters( } } +void FlexCounter::updateSupportedBufferPoolCounters( + _In_ sai_object_id_t bufferPoolId, + _In_ const std::vector &counterIds, + _In_ sai_stats_mode_t statsMode) +{ + SWSS_LOG_ENTER(); + + m_supportedBufferPoolCounters.clear(); + + /* Query SAI supported buffer pool counters */ + sai_status_t status = querySupportedBufferPoolCounters(bufferPoolId, statsMode); + if (status != SAI_STATUS_SUCCESS) + { + /* Fallback to legacy approach */ + getSupportedBufferPoolCounters(bufferPoolId, counterIds, statsMode); + } +} + std::vector FlexCounter::saiCheckSupportedSwitchDebugCounters( _In_ sai_object_id_t switchId, _In_ const std::vector &counterIds) diff --git a/syncd/FlexCounter.h b/syncd/FlexCounter.h index 4a30cf6c95..67b15d21b4 100644 --- a/syncd/FlexCounter.h +++ b/syncd/FlexCounter.h @@ -185,8 +185,17 @@ namespace syncd bool isBufferPoolCounterSupported( _In_ sai_buffer_pool_stat_t counter) const; + bool isStatsModeSupported( + uint32_t statsMode, sai_stats_mode_t statCapability); + private: // update supported counters + sai_status_t querySupportedPortCounters( + sai_object_id_t portRid); + + void getSupportedPortCounters( + sai_object_id_t portRid); + void updateSupportedPortCounters( _In_ sai_object_id_t portRid); @@ -194,18 +203,46 @@ namespace syncd _In_ sai_object_id_t portRid, _In_ const std::vector &counterIds); + sai_status_t querySupportedQueueCounters( + sai_object_id_t queueId); + + void getSupportedQueueCounters( + sai_object_id_t queueId, const std::vector &counterIds); + void updateSupportedQueueCounters( _In_ sai_object_id_t queueRid, _In_ const std::vector &counterIds); + sai_status_t querySupportedRifCounters( + sai_object_id_t rifRid); + + void getSupportedRifCounters( + sai_object_id_t rifRid); + void updateSupportedRifCounters( _In_ sai_object_id_t rifRid); + sai_status_t querySupportedBufferPoolCounters( + sai_object_id_t bufferPoolId, + sai_stats_mode_t statsMode); + + void getSupportedBufferPoolCounters( + sai_object_id_t bufferPoolId, + const std::vector &counterIds, + sai_stats_mode_t statsMode); + void updateSupportedBufferPoolCounters( _In_ sai_object_id_t bufferPoolRid, _In_ const std::vector &counterIds, _In_ sai_stats_mode_t statsMode); + sai_status_t querySupportedPriorityGroupCounters( + sai_object_id_t priorityGroupRid); + + void getSupportedPriorityGroupCounters( + sai_object_id_t priorityGroupRid, + const std::vector &counterIds); + void updateSupportedPriorityGroupCounters( _In_ sai_object_id_t priorityGroupRid, _In_ const std::vector &counterIds); diff --git a/syncd/VendorSai.cpp b/syncd/VendorSai.cpp index 637955d7a6..c8c78fe4e1 100644 --- a/syncd/VendorSai.cpp +++ b/syncd/VendorSai.cpp @@ -427,6 +427,21 @@ sai_status_t VendorSai::getStats( return ptr(object_id, 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 sai_query_stats_capability( + switchId, + objectType, + stats_capability); +} + sai_status_t VendorSai::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/syncd/VendorSai.h b/syncd/VendorSai.h index cc6f7746ed..091a2afda5 100644 --- a/syncd/VendorSai.h +++ b/syncd/VendorSai.h @@ -95,6 +95,11 @@ namespace syncd _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/vslib/Sai.cpp b/vslib/Sai.cpp index 09558f643f..823cb75e53 100644 --- a/vslib/Sai.cpp +++ b/vslib/Sai.cpp @@ -466,6 +466,16 @@ sai_status_t Sai::getStats( counters); } +sai_status_t Sai::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t Sai::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/vslib/Sai.h b/vslib/Sai.h index 86c186c893..7af8e39c14 100644 --- a/vslib/Sai.h +++ b/vslib/Sai.h @@ -103,6 +103,11 @@ namespace saivs _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/vslib/VirtualSwitchSaiInterface.cpp b/vslib/VirtualSwitchSaiInterface.cpp index 14bd9dce10..37e3c2eb5a 100644 --- a/vslib/VirtualSwitchSaiInterface.cpp +++ b/vslib/VirtualSwitchSaiInterface.cpp @@ -857,6 +857,16 @@ sai_status_t VirtualSwitchSaiInterface::getStats( counters); } +sai_status_t VirtualSwitchSaiInterface::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_status_t VirtualSwitchSaiInterface::getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/vslib/VirtualSwitchSaiInterface.h b/vslib/VirtualSwitchSaiInterface.h index 518def4d2e..dc5d32c271 100644 --- a/vslib/VirtualSwitchSaiInterface.h +++ b/vslib/VirtualSwitchSaiInterface.h @@ -102,6 +102,11 @@ namespace saivs _In_ const sai_stat_id_t *counter_ids, _Out_ uint64_t *counters) override; + virtual sai_status_t queryStatsCapability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) override; + virtual sai_status_t getStatsExt( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, diff --git a/vslib/sai_vs_interfacequery.cpp b/vslib/sai_vs_interfacequery.cpp index 1393d18a6d..5aa89cb4be 100644 --- a/vslib/sai_vs_interfacequery.cpp +++ b/vslib/sai_vs_interfacequery.cpp @@ -180,3 +180,13 @@ sai_object_id_t sai_switch_id_query( return vs_sai->switchIdQuery(objectId); } + +sai_status_t sai_query_stats_capability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} From 386ac320fdc1cfe2ab108dfd443479ac0d599ecf Mon Sep 17 00:00:00 2001 From: Shlomi Bitton Date: Thu, 9 Sep 2021 09:21:25 +0000 Subject: [PATCH 2/4] Add VS environment implementation for new API Signed-off-by: Shlomi Bitton --- meta/Meta.cpp | 41 ++++++++++++++++++++++++++++- meta/Meta.h | 4 +++ vslib/Sai.cpp | 7 ++++- vslib/SwitchState.cpp | 29 ++++++++++++++++++++ vslib/SwitchState.h | 5 ++++ vslib/VirtualSwitchSaiInterface.cpp | 31 +++++++++++++++++++++- vslib/sai_vs_interfacequery.cpp | 2 +- 7 files changed, 115 insertions(+), 4 deletions(-) diff --git a/meta/Meta.cpp b/meta/Meta.cpp index b2884c5dfb..539b1bd07b 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -1850,6 +1850,37 @@ sai_status_t Meta::meta_validate_stats( return SAI_STATUS_SUCCESS; } +sai_status_t Meta::meta_validate_query_stats_capability( + _In_ sai_object_type_t object_type, + _In_ sai_object_id_t object_id) +{ + SWSS_LOG_ENTER(); + + PARAMETER_CHECK_OBJECT_TYPE_VALID(object_type); + PARAMETER_CHECK_OID_OBJECT_TYPE(object_id, object_type); + PARAMETER_CHECK_OID_EXISTS(object_id, object_type); + + sai_object_id_t switch_id = switchIdQuery(object_id); + + // checks also if object type is OID + sai_status_t status = meta_sai_validate_oid(object_type, &object_id, switch_id, false); + + CHECK_STATUS_SUCCESS(status); + + auto info = sai_metadata_get_object_type_info(object_type); + + PARAMETER_CHECK_IF_NOT_NULL(info); + + if (info->statenum == nullptr) + { + SWSS_LOG_ERROR("%s does not support stats", info->objecttypename); + + return SAI_STATUS_INVALID_PARAMETER; + } + + return SAI_STATUS_SUCCESS; +} + sai_status_t Meta::getStats( _In_ sai_object_type_t object_type, _In_ sai_object_id_t object_id, @@ -1877,7 +1908,15 @@ sai_status_t Meta::queryStatsCapability( { SWSS_LOG_ENTER(); - return SAI_STATUS_NOT_IMPLEMENTED; + auto status = meta_validate_query_stats_capability(objectType, switchId); + + CHECK_STATUS_SUCCESS(status); + + status = m_implementation->queryStatsCapability(switchId, objectType, stats_capability); + + // no post validation required + + return status; } sai_status_t Meta::getStatsExt( diff --git a/meta/Meta.h b/meta/Meta.h index 07f17f36b9..cc33b6bcc8 100644 --- a/meta/Meta.h +++ b/meta/Meta.h @@ -399,6 +399,10 @@ namespace saimeta _Out_ uint64_t *counters, _In_ sai_stats_mode_t mode); + sai_status_t meta_validate_query_stats_capability( + _In_ sai_object_type_t object_type, + _In_ sai_object_id_t object_id); + private: // validate OID sai_status_t meta_sai_validate_oid( diff --git a/vslib/Sai.cpp b/vslib/Sai.cpp index 823cb75e53..79262ef8f4 100644 --- a/vslib/Sai.cpp +++ b/vslib/Sai.cpp @@ -471,9 +471,14 @@ sai_status_t Sai::queryStatsCapability( _In_ sai_object_type_t objectType, _Inout_ sai_stat_capability_list_t *stats_capability) { + MUTEX(); SWSS_LOG_ENTER(); + VS_CHECK_API_INITIALIZED(); - return SAI_STATUS_NOT_IMPLEMENTED; + return m_meta->queryStatsCapability( + switchId, + objectType, + stats_capability); } sai_status_t Sai::getStatsExt( diff --git a/vslib/SwitchState.cpp b/vslib/SwitchState.cpp index fe42c5c45f..589eb64450 100644 --- a/vslib/SwitchState.cpp +++ b/vslib/SwitchState.cpp @@ -278,6 +278,35 @@ sai_status_t SwitchState::getStatsExt( return SAI_STATUS_SUCCESS; } +sai_status_t SwitchState::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + auto info = sai_metadata_get_object_type_info(objectType); + + if (stats_capability->count == 0 || stats_capability->list == nullptr) + { + stats_capability->count = (uint32_t)info->statenum->valuescount; + return SAI_STATUS_BUFFER_OVERFLOW; + } + + SWSS_LOG_NOTICE("query counter capability for object ID %s of counter type %s", + sai_serialize_object_id(switchId).c_str(), + info->statenum->name); + + auto statenumlist = info->statenum->values; + + for (uint32_t i = 0; i < stats_capability->count; i++) + { + stats_capability->list[i].stat_enum = statenumlist[i]; + stats_capability->list[i].stat_modes = SAI_STATS_MODE_READ_AND_CLEAR; + } + return SAI_STATUS_SUCCESS; +} + std::shared_ptr SwitchState::getMeta() { SWSS_LOG_ENTER(); diff --git a/vslib/SwitchState.h b/vslib/SwitchState.h index 204aa814bf..01c435a73a 100644 --- a/vslib/SwitchState.h +++ b/vslib/SwitchState.h @@ -56,6 +56,11 @@ namespace saivs _In_ sai_stats_mode_t mode, _Out_ uint64_t *counters); + sai_status_t queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability); + public: sai_object_id_t getSwitchId() const; diff --git a/vslib/VirtualSwitchSaiInterface.cpp b/vslib/VirtualSwitchSaiInterface.cpp index 37e3c2eb5a..2c9bdf460a 100644 --- a/vslib/VirtualSwitchSaiInterface.cpp +++ b/vslib/VirtualSwitchSaiInterface.cpp @@ -864,7 +864,36 @@ sai_status_t VirtualSwitchSaiInterface::queryStatsCapability( { SWSS_LOG_ENTER(); - return SAI_STATUS_NOT_IMPLEMENTED; + sai_object_id_t switch_id = SAI_NULL_OBJECT_ID; + + if (m_switchStateMap.size() == 0) + { + SWSS_LOG_ERROR("no switch!, was removed but some function still call"); + return SAI_STATUS_FAILURE; + } + + if (m_switchStateMap.size() == 1) + { + switch_id = m_switchStateMap.begin()->first; + } + else + { + SWSS_LOG_THROW("multiple switches not supported, FIXME"); + } + + if (m_switchStateMap.find(switch_id) == m_switchStateMap.end()) + { + SWSS_LOG_ERROR("failed to find switch %s in switch state map", sai_serialize_object_id(switch_id).c_str()); + + return SAI_STATUS_FAILURE; + } + + auto ss = m_switchStateMap.at(switch_id); + + return ss->queryStatsCapability( + switchId, + objectType, + stats_capability); } sai_status_t VirtualSwitchSaiInterface::getStatsExt( diff --git a/vslib/sai_vs_interfacequery.cpp b/vslib/sai_vs_interfacequery.cpp index 5aa89cb4be..d4ff79019b 100644 --- a/vslib/sai_vs_interfacequery.cpp +++ b/vslib/sai_vs_interfacequery.cpp @@ -188,5 +188,5 @@ sai_status_t sai_query_stats_capability( { SWSS_LOG_ENTER(); - return SAI_STATUS_NOT_IMPLEMENTED; + return vs_sai->queryStatsCapability(switch_id, object_type, stats_capability); } From 68d8d788510c4d0e6caa842b06f874e1bca86d80 Mon Sep 17 00:00:00 2001 From: Shlomi Bitton Date: Sun, 3 Oct 2021 15:42:28 +0000 Subject: [PATCH 3/4] Add SWSS_LOG_ENTER() for missing functions. Remove trailing white spaces --- syncd/FlexCounter.cpp | 88 ++++++++++++++++++++++++++++--------------- syncd/FlexCounter.h | 2 +- 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index eed09879ee..038257826e 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -1036,6 +1036,8 @@ bool FlexCounter::isBufferPoolCounterSupported( bool FlexCounter::isStatsModeSupported(uint32_t statsMode, sai_stats_mode_t statCapability) { + SWSS_LOG_ENTER(); + return statsMode & statCapability; } @@ -1766,14 +1768,16 @@ void FlexCounter::endFlexCounterThread(void) sai_status_t FlexCounter::querySupportedPortCounters( sai_object_id_t portRid) { + SWSS_LOG_ENTER(); + sai_stat_capability_list_t stats_capability; stats_capability.count = 0; stats_capability.list = nullptr; /* First call is to check the size needed to allocate */ sai_status_t status = m_vendorSai->queryStatsCapability( - portRid, - SAI_OBJECT_TYPE_PORT, + portRid, + SAI_OBJECT_TYPE_PORT, &stats_capability); /* Second call is for query statistics capability */ @@ -1782,13 +1786,13 @@ sai_status_t FlexCounter::querySupportedPortCounters( std::vector statCapabilityList(stats_capability.count); stats_capability.list = statCapabilityList.data(); status = m_vendorSai->queryStatsCapability( - portRid, - SAI_OBJECT_TYPE_PORT, + portRid, + SAI_OBJECT_TYPE_PORT, &stats_capability); - + if (status != SAI_STATUS_SUCCESS) { - SWSS_LOG_INFO("Unable to get port supported counters for %s", + SWSS_LOG_INFO("Unable to get port supported counters for %s", sai_serialize_object_id(portRid).c_str()); } else @@ -1806,6 +1810,8 @@ sai_status_t FlexCounter::querySupportedPortCounters( void FlexCounter::getSupportedPortCounters( sai_object_id_t portRid) { + SWSS_LOG_ENTER(); + uint64_t value; for (int id = SAI_PORT_STAT_IF_IN_OCTETS; id <= SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS; ++id) @@ -1845,6 +1851,10 @@ void FlexCounter::updateSupportedPortCounters( /* Fallback to legacy approach */ getSupportedPortCounters(portRid); } + else + { + SWSS_LOG_NOTICE("SHLOMI updateSupportedPortCounters with new API"); + } } std::vector FlexCounter::saiCheckSupportedPortDebugCounters( @@ -1892,14 +1902,16 @@ std::vector FlexCounter::saiCheckSupportedPortDebugCounters( sai_status_t FlexCounter::querySupportedQueueCounters( sai_object_id_t queueId) { + SWSS_LOG_ENTER(); + sai_stat_capability_list_t stats_capability; stats_capability.count = 0; stats_capability.list = nullptr; /* First call is to check the size needed to allocate */ sai_status_t status = m_vendorSai->queryStatsCapability( - queueId, - SAI_OBJECT_TYPE_QUEUE, + queueId, + SAI_OBJECT_TYPE_QUEUE, &stats_capability); /* Second call is for query statistics capability */ @@ -1908,13 +1920,13 @@ sai_status_t FlexCounter::querySupportedQueueCounters( std::vector statCapabilityList(stats_capability.count); stats_capability.list = statCapabilityList.data(); status = m_vendorSai->queryStatsCapability( - queueId, - SAI_OBJECT_TYPE_QUEUE, + queueId, + SAI_OBJECT_TYPE_QUEUE, &stats_capability); if (status != SAI_STATUS_SUCCESS) { - SWSS_LOG_INFO("Unable to get queue supported counters for %s", + SWSS_LOG_INFO("Unable to get queue supported counters for %s", sai_serialize_object_id(queueId).c_str()); } else @@ -1935,9 +1947,11 @@ sai_status_t FlexCounter::querySupportedQueueCounters( } void FlexCounter::getSupportedQueueCounters( - sai_object_id_t queueId, + sai_object_id_t queueId, const std::vector &counterIds) { + SWSS_LOG_ENTER(); + uint64_t value; for (auto &counter : counterIds) @@ -1998,14 +2012,16 @@ void FlexCounter::updateSupportedQueueCounters( sai_status_t FlexCounter::querySupportedPriorityGroupCounters( sai_object_id_t priorityGroupRid) { + SWSS_LOG_ENTER(); + sai_stat_capability_list_t stats_capability; stats_capability.count = 0; stats_capability.list = nullptr; /* First call is to check the size needed to allocate */ sai_status_t status = m_vendorSai->queryStatsCapability( - priorityGroupRid, - SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, + priorityGroupRid, + SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, &stats_capability); /* Second call is for query statistics capability */ @@ -2013,18 +2029,18 @@ sai_status_t FlexCounter::querySupportedPriorityGroupCounters( { std::vector statCapabilityList(stats_capability.count); stats_capability.list = statCapabilityList.data(); - status = m_vendorSai->queryStatsCapability(priorityGroupRid, - SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, + status = m_vendorSai->queryStatsCapability(priorityGroupRid, + SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, &stats_capability); if (status != SAI_STATUS_SUCCESS) { - SWSS_LOG_INFO("Unable to get priority group supported counters for %s", + SWSS_LOG_INFO("Unable to get priority group supported counters for %s", sai_serialize_object_id(priorityGroupRid).c_str()); } else { - + for (auto statCapability: statCapabilityList) { auto currentStatModes = statCapability.stat_modes; @@ -2041,9 +2057,11 @@ sai_status_t FlexCounter::querySupportedPriorityGroupCounters( } void FlexCounter::getSupportedPriorityGroupCounters( - sai_object_id_t priorityGroupRid, + sai_object_id_t priorityGroupRid, const std::vector &counterIds) { + SWSS_LOG_ENTER(); + uint64_t value; for (auto &counter : counterIds) @@ -2104,20 +2122,22 @@ void FlexCounter::updateSupportedPriorityGroupCounters( { /* Fallback to legacy approach */ getSupportedPriorityGroupCounters(priorityGroupRid, counterIds); - } + } } sai_status_t FlexCounter::querySupportedRifCounters( sai_object_id_t rifRid) { + SWSS_LOG_ENTER(); + sai_stat_capability_list_t stats_capability; stats_capability.count = 0; stats_capability.list = nullptr; /* First call is to check the size needed to allocate */ sai_status_t status = m_vendorSai->queryStatsCapability( - rifRid, - SAI_OBJECT_TYPE_ROUTER_INTERFACE, + rifRid, + SAI_OBJECT_TYPE_ROUTER_INTERFACE, &stats_capability); /* Second call is for query statistics capability */ @@ -2126,8 +2146,8 @@ sai_status_t FlexCounter::querySupportedRifCounters( std::vector statCapabilityList(stats_capability.count); stats_capability.list = statCapabilityList.data(); status = m_vendorSai->queryStatsCapability( - rifRid, - SAI_OBJECT_TYPE_ROUTER_INTERFACE, + rifRid, + SAI_OBJECT_TYPE_ROUTER_INTERFACE, &stats_capability); if (status != SAI_STATUS_SUCCESS) @@ -2150,8 +2170,10 @@ sai_status_t FlexCounter::querySupportedRifCounters( void FlexCounter::getSupportedRifCounters( sai_object_id_t rifRid) { + SWSS_LOG_ENTER(); + uint64_t value; - + for (int cntr_id = SAI_ROUTER_INTERFACE_STAT_IN_OCTETS; cntr_id <= SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS; ++cntr_id) { sai_router_interface_stat_t counter = static_cast(cntr_id); @@ -2200,14 +2222,16 @@ sai_status_t FlexCounter::querySupportedBufferPoolCounters( sai_object_id_t bufferPoolId, sai_stats_mode_t statsMode) { + SWSS_LOG_ENTER(); + sai_stat_capability_list_t stats_capability; stats_capability.count = 0; stats_capability.list = nullptr; /* First call is to check the size needed to allocate */ sai_status_t status = m_vendorSai->queryStatsCapability( - bufferPoolId, - SAI_OBJECT_TYPE_BUFFER_POOL, + bufferPoolId, + SAI_OBJECT_TYPE_BUFFER_POOL, &stats_capability); /* Second call is for query statistics capability */ @@ -2216,8 +2240,8 @@ sai_status_t FlexCounter::querySupportedBufferPoolCounters( std::vector statCapabilityList(stats_capability.count); stats_capability.list = statCapabilityList.data(); status = m_vendorSai->queryStatsCapability( - bufferPoolId, - SAI_OBJECT_TYPE_BUFFER_POOL, + bufferPoolId, + SAI_OBJECT_TYPE_BUFFER_POOL, &stats_capability); if (status != SAI_STATUS_SUCCESS) @@ -2230,7 +2254,7 @@ sai_status_t FlexCounter::querySupportedBufferPoolCounters( for (auto statCapability: statCapabilityList) { auto currentStatModes = statCapability.stat_modes; - if ((m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR || statsMode == SAI_STATS_MODE_READ_AND_CLEAR) && + if ((m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR || statsMode == SAI_STATS_MODE_READ_AND_CLEAR) && !isStatsModeSupported(currentStatModes, SAI_STATS_MODE_READ_AND_CLEAR)) { continue; @@ -2248,8 +2272,10 @@ void FlexCounter::getSupportedBufferPoolCounters( const std::vector &counterIds, sai_stats_mode_t statsMode) { + SWSS_LOG_ENTER(); + uint64_t value; - + for (const auto &counterId : counterIds) { sai_status_t status = m_vendorSai->getStats( diff --git a/syncd/FlexCounter.h b/syncd/FlexCounter.h index 67b15d21b4..588648a9a9 100644 --- a/syncd/FlexCounter.h +++ b/syncd/FlexCounter.h @@ -240,7 +240,7 @@ namespace syncd sai_object_id_t priorityGroupRid); void getSupportedPriorityGroupCounters( - sai_object_id_t priorityGroupRid, + sai_object_id_t priorityGroupRid, const std::vector &counterIds); void updateSupportedPriorityGroupCounters( From 4239283c855a79740cec59ba418876beca854378 Mon Sep 17 00:00:00 2001 From: Shlomi Bitton Date: Mon, 4 Oct 2021 14:31:51 +0000 Subject: [PATCH 4/4] Fix comments --- syncd/FlexCounter.cpp | 38 ++++++++++++++--------------- syncd/FlexCounter.h | 31 +++++++++++------------ vslib/VirtualSwitchSaiInterface.cpp | 23 +++-------------- 3 files changed, 37 insertions(+), 55 deletions(-) diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 038257826e..679f03a654 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -1034,7 +1034,9 @@ bool FlexCounter::isBufferPoolCounterSupported( return m_supportedBufferPoolCounters.count(counter) != 0; } -bool FlexCounter::isStatsModeSupported(uint32_t statsMode, sai_stats_mode_t statCapability) +bool FlexCounter::isStatsModeSupported( + _In_ uint32_t statsMode, + _In_ sai_stats_mode_t statCapability) { SWSS_LOG_ENTER(); @@ -1766,7 +1768,7 @@ void FlexCounter::endFlexCounterThread(void) } sai_status_t FlexCounter::querySupportedPortCounters( - sai_object_id_t portRid) + _In_ sai_object_id_t portRid) { SWSS_LOG_ENTER(); @@ -1808,7 +1810,7 @@ sai_status_t FlexCounter::querySupportedPortCounters( } void FlexCounter::getSupportedPortCounters( - sai_object_id_t portRid) + _In_ sai_object_id_t portRid) { SWSS_LOG_ENTER(); @@ -1851,10 +1853,6 @@ void FlexCounter::updateSupportedPortCounters( /* Fallback to legacy approach */ getSupportedPortCounters(portRid); } - else - { - SWSS_LOG_NOTICE("SHLOMI updateSupportedPortCounters with new API"); - } } std::vector FlexCounter::saiCheckSupportedPortDebugCounters( @@ -1900,7 +1898,7 @@ std::vector FlexCounter::saiCheckSupportedPortDebugCounters( } sai_status_t FlexCounter::querySupportedQueueCounters( - sai_object_id_t queueId) + _In_ sai_object_id_t queueId) { SWSS_LOG_ENTER(); @@ -1947,8 +1945,8 @@ sai_status_t FlexCounter::querySupportedQueueCounters( } void FlexCounter::getSupportedQueueCounters( - sai_object_id_t queueId, - const std::vector &counterIds) + _In_ sai_object_id_t queueId, + _In_ const std::vector &counterIds) { SWSS_LOG_ENTER(); @@ -2010,7 +2008,7 @@ void FlexCounter::updateSupportedQueueCounters( } sai_status_t FlexCounter::querySupportedPriorityGroupCounters( - sai_object_id_t priorityGroupRid) + _In_ sai_object_id_t priorityGroupRid) { SWSS_LOG_ENTER(); @@ -2057,8 +2055,8 @@ sai_status_t FlexCounter::querySupportedPriorityGroupCounters( } void FlexCounter::getSupportedPriorityGroupCounters( - sai_object_id_t priorityGroupRid, - const std::vector &counterIds) + _In_ sai_object_id_t priorityGroupRid, + _In_ const std::vector &counterIds) { SWSS_LOG_ENTER(); @@ -2126,7 +2124,7 @@ void FlexCounter::updateSupportedPriorityGroupCounters( } sai_status_t FlexCounter::querySupportedRifCounters( - sai_object_id_t rifRid) + _In_ sai_object_id_t rifRid) { SWSS_LOG_ENTER(); @@ -2168,7 +2166,7 @@ sai_status_t FlexCounter::querySupportedRifCounters( } void FlexCounter::getSupportedRifCounters( - sai_object_id_t rifRid) + _In_ sai_object_id_t rifRid) { SWSS_LOG_ENTER(); @@ -2219,8 +2217,8 @@ void FlexCounter::updateSupportedRifCounters( } sai_status_t FlexCounter::querySupportedBufferPoolCounters( - sai_object_id_t bufferPoolId, - sai_stats_mode_t statsMode) + _In_ sai_object_id_t bufferPoolId, + _In_ sai_stats_mode_t statsMode) { SWSS_LOG_ENTER(); @@ -2268,9 +2266,9 @@ sai_status_t FlexCounter::querySupportedBufferPoolCounters( } void FlexCounter::getSupportedBufferPoolCounters( - sai_object_id_t bufferPoolId, - const std::vector &counterIds, - sai_stats_mode_t statsMode) + _In_ sai_object_id_t bufferPoolId, + _In_ const std::vector &counterIds, + _In_ sai_stats_mode_t statsMode) { SWSS_LOG_ENTER(); diff --git a/syncd/FlexCounter.h b/syncd/FlexCounter.h index 588648a9a9..58483bb7df 100644 --- a/syncd/FlexCounter.h +++ b/syncd/FlexCounter.h @@ -186,15 +186,16 @@ namespace syncd _In_ sai_buffer_pool_stat_t counter) const; bool isStatsModeSupported( - uint32_t statsMode, sai_stats_mode_t statCapability); + _In_ uint32_t statsMode, + _In_ sai_stats_mode_t statCapability); private: // update supported counters sai_status_t querySupportedPortCounters( - sai_object_id_t portRid); + _In_ sai_object_id_t portRid); void getSupportedPortCounters( - sai_object_id_t portRid); + _In_ sai_object_id_t portRid); void updateSupportedPortCounters( _In_ sai_object_id_t portRid); @@ -204,32 +205,32 @@ namespace syncd _In_ const std::vector &counterIds); sai_status_t querySupportedQueueCounters( - sai_object_id_t queueId); + _In_ sai_object_id_t queueId); void getSupportedQueueCounters( - sai_object_id_t queueId, const std::vector &counterIds); + _In_ sai_object_id_t queueId, const std::vector &counterIds); void updateSupportedQueueCounters( _In_ sai_object_id_t queueRid, _In_ const std::vector &counterIds); sai_status_t querySupportedRifCounters( - sai_object_id_t rifRid); + _In_ sai_object_id_t rifRid); void getSupportedRifCounters( - sai_object_id_t rifRid); + _In_ sai_object_id_t rifRid); void updateSupportedRifCounters( _In_ sai_object_id_t rifRid); sai_status_t querySupportedBufferPoolCounters( - sai_object_id_t bufferPoolId, - sai_stats_mode_t statsMode); + _In_ sai_object_id_t bufferPoolId, + _In_ sai_stats_mode_t statsMode); void getSupportedBufferPoolCounters( - sai_object_id_t bufferPoolId, - const std::vector &counterIds, - sai_stats_mode_t statsMode); + _In_ sai_object_id_t bufferPoolId, + _In_ const std::vector &counterIds, + _In_ sai_stats_mode_t statsMode); void updateSupportedBufferPoolCounters( _In_ sai_object_id_t bufferPoolRid, @@ -237,11 +238,11 @@ namespace syncd _In_ sai_stats_mode_t statsMode); sai_status_t querySupportedPriorityGroupCounters( - sai_object_id_t priorityGroupRid); + _In_ sai_object_id_t priorityGroupRid); void getSupportedPriorityGroupCounters( - sai_object_id_t priorityGroupRid, - const std::vector &counterIds); + _In_ sai_object_id_t priorityGroupRid, + _In_ const std::vector &counterIds); void updateSupportedPriorityGroupCounters( _In_ sai_object_id_t priorityGroupRid, diff --git a/vslib/VirtualSwitchSaiInterface.cpp b/vslib/VirtualSwitchSaiInterface.cpp index 2c9bdf460a..c663e1753e 100644 --- a/vslib/VirtualSwitchSaiInterface.cpp +++ b/vslib/VirtualSwitchSaiInterface.cpp @@ -864,31 +864,14 @@ sai_status_t VirtualSwitchSaiInterface::queryStatsCapability( { SWSS_LOG_ENTER(); - sai_object_id_t switch_id = SAI_NULL_OBJECT_ID; - - if (m_switchStateMap.size() == 0) + if (m_switchStateMap.find(switchId) == m_switchStateMap.end()) { - SWSS_LOG_ERROR("no switch!, was removed but some function still call"); - return SAI_STATUS_FAILURE; - } - - if (m_switchStateMap.size() == 1) - { - switch_id = m_switchStateMap.begin()->first; - } - else - { - SWSS_LOG_THROW("multiple switches not supported, FIXME"); - } - - if (m_switchStateMap.find(switch_id) == m_switchStateMap.end()) - { - SWSS_LOG_ERROR("failed to find switch %s in switch state map", sai_serialize_object_id(switch_id).c_str()); + SWSS_LOG_ERROR("failed to find switch %s in switch state map", sai_serialize_object_id(switchId).c_str()); return SAI_STATUS_FAILURE; } - auto ss = m_switchStateMap.at(switch_id); + auto ss = m_switchStateMap.at(switchId); return ss->queryStatsCapability( switchId,