diff --git a/unittest/vslib/TestSwitchMLNX2700.cpp b/unittest/vslib/TestSwitchMLNX2700.cpp index 157497efe5..8f9b3c0d9b 100644 --- a/unittest/vslib/TestSwitchMLNX2700.cpp +++ b/unittest/vslib/TestSwitchMLNX2700.cpp @@ -600,17 +600,20 @@ TEST(SwitchMLNX2700, test_stats_query_capability) std::make_shared(0, scc), sc); - sai_stat_capability_t capability_list[91]; + std::vector capability_list; sai_stat_capability_list_t stats_capability; - stats_capability.count = 1; - stats_capability.list = capability_list; + /* Get queue stats capability */ + stats_capability.count = 0; + stats_capability.list = nullptr; + EXPECT_EQ(sw.queryStatsCapability(0x2100000000, SAI_OBJECT_TYPE_QUEUE, &stats_capability), SAI_STATUS_BUFFER_OVERFLOW); - stats_capability.count = SAI_QUEUE_STAT_DELAY_WATERMARK_NS; + capability_list.resize(stats_capability.count); + stats_capability.list = capability_list.data(); EXPECT_EQ(sw.queryStatsCapability(0x2100000000, SAI_OBJECT_TYPE_QUEUE, @@ -618,12 +621,16 @@ TEST(SwitchMLNX2700, test_stats_query_capability) SAI_STATUS_SUCCESS); /* Get port stats capability */ - stats_capability.count = 1; + stats_capability.count = 0; + stats_capability.list = nullptr; + EXPECT_EQ(sw.queryStatsCapability(0x2100000000, SAI_OBJECT_TYPE_PORT, &stats_capability), SAI_STATUS_BUFFER_OVERFLOW); - stats_capability.count = 91; + + capability_list.resize(stats_capability.count); + stats_capability.list = capability_list.data(); EXPECT_EQ(sw.queryStatsCapability(0x2100000000, SAI_OBJECT_TYPE_PORT, diff --git a/unittest/vslib/TestVirtualSwitchSaiInterface.cpp b/unittest/vslib/TestVirtualSwitchSaiInterface.cpp index fe019813c6..686205590b 100644 --- a/unittest/vslib/TestVirtualSwitchSaiInterface.cpp +++ b/unittest/vslib/TestVirtualSwitchSaiInterface.cpp @@ -161,12 +161,12 @@ TEST_F(VirtualSwitchSaiInterfaceTest, bulkGet) TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsCapability) { - sai_stat_capability_t capability_list[91]; + std::vector capability_list; sai_stat_capability_list_t stats_capability; - stats_capability.list = capability_list; /* Queue stats capability get */ - stats_capability.count = 1; + stats_capability.count = 0; + stats_capability.list = nullptr; EXPECT_EQ(SAI_STATUS_BUFFER_OVERFLOW, m_vssai->queryStatsCapability( @@ -174,6 +174,9 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsCapability) SAI_OBJECT_TYPE_QUEUE, &stats_capability)); + capability_list.resize(stats_capability.count); + stats_capability.list = capability_list.data(); + EXPECT_EQ(SAI_STATUS_SUCCESS, m_vssai->queryStatsCapability( m_swid, @@ -181,7 +184,8 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsCapability) &stats_capability)); /* Port stats capability get */ - stats_capability.count = 1; + stats_capability.count = 0; + stats_capability.list = nullptr; EXPECT_EQ(SAI_STATUS_BUFFER_OVERFLOW, m_vssai->queryStatsCapability( @@ -189,7 +193,9 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsCapability) SAI_OBJECT_TYPE_PORT, &stats_capability)); - stats_capability.count = 91; + capability_list.resize(stats_capability.count); + stats_capability.list = capability_list.data(); + EXPECT_EQ(SAI_STATUS_SUCCESS, m_vssai->queryStatsCapability( m_swid, @@ -199,12 +205,12 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsCapability) TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsStCapability) { - sai_stat_st_capability_t capability_list[91]; + std::vector capability_list; sai_stat_st_capability_list_t stats_capability; - stats_capability.list = capability_list; /* Queue stats capability get */ - stats_capability.count = 1; + stats_capability.count = 0; + stats_capability.list = nullptr; EXPECT_EQ(SAI_STATUS_BUFFER_OVERFLOW, m_vssai->queryStatsStCapability( @@ -212,6 +218,9 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsStCapability) SAI_OBJECT_TYPE_QUEUE, &stats_capability)); + capability_list.resize(stats_capability.count); + stats_capability.list = capability_list.data(); + EXPECT_EQ(SAI_STATUS_SUCCESS, m_vssai->queryStatsStCapability( m_swid, @@ -219,7 +228,8 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsStCapability) &stats_capability)); /* Port stats capability get */ - stats_capability.count = 1; + stats_capability.count = 0; + stats_capability.list = nullptr; EXPECT_EQ(SAI_STATUS_BUFFER_OVERFLOW, m_vssai->queryStatsStCapability( @@ -227,7 +237,9 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsStCapability) SAI_OBJECT_TYPE_PORT, &stats_capability)); - stats_capability.count = 91; + capability_list.resize(stats_capability.count); + stats_capability.list = capability_list.data(); + EXPECT_EQ(SAI_STATUS_SUCCESS, m_vssai->queryStatsStCapability( m_swid, diff --git a/vslib/SwitchStateBase.cpp b/vslib/SwitchStateBase.cpp index 36a4375086..d6144547ab 100644 --- a/vslib/SwitchStateBase.cpp +++ b/vslib/SwitchStateBase.cpp @@ -4077,141 +4077,176 @@ sai_status_t SwitchStateBase::queryAttributeCapability( return SAI_STATUS_SUCCESS; } -sai_status_t SwitchStateBase::queryStatsCapability( - _In_ sai_object_id_t switchId, - _In_ sai_object_type_t objectType, +sai_status_t SwitchStateBase::queryPortStatsCapability( _Inout_ sai_stat_capability_list_t *stats_capability) { SWSS_LOG_ENTER(); - uint32_t i = 0; - uint32_t stats_count = 0; - if (objectType == SAI_OBJECT_TYPE_QUEUE) + static std::vector portStatList = { + SAI_PORT_STAT_IF_IN_OCTETS, + SAI_PORT_STAT_IF_IN_UCAST_PKTS, + SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS, + SAI_PORT_STAT_IF_IN_DISCARDS, + SAI_PORT_STAT_IF_IN_ERRORS, + SAI_PORT_STAT_IF_IN_UNKNOWN_PROTOS, + SAI_PORT_STAT_IF_IN_BROADCAST_PKTS, + SAI_PORT_STAT_IF_IN_MULTICAST_PKTS, + SAI_PORT_STAT_IF_IN_VLAN_DISCARDS, + SAI_PORT_STAT_IF_OUT_OCTETS, + SAI_PORT_STAT_IF_OUT_UCAST_PKTS, + SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS, + SAI_PORT_STAT_IF_OUT_DISCARDS, + SAI_PORT_STAT_IF_OUT_ERRORS, + SAI_PORT_STAT_IF_OUT_QLEN, + SAI_PORT_STAT_IF_OUT_BROADCAST_PKTS, + SAI_PORT_STAT_IF_OUT_MULTICAST_PKTS, + SAI_PORT_STAT_ETHER_STATS_DROP_EVENTS, + SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS, + SAI_PORT_STAT_ETHER_STATS_BROADCAST_PKTS, + SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS, + SAI_PORT_STAT_ETHER_STATS_FRAGMENTS, + SAI_PORT_STAT_ETHER_STATS_PKTS_64_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_65_TO_127_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_128_TO_255_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_256_TO_511_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_512_TO_1023_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_1024_TO_1518_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_1519_TO_2047_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_2048_TO_4095_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_4096_TO_9216_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS_9217_TO_16383_OCTETS, + SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS, + SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS, + SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS, + SAI_PORT_STAT_ETHER_STATS_JABBERS, + SAI_PORT_STAT_ETHER_STATS_OCTETS, + SAI_PORT_STAT_ETHER_STATS_PKTS, + SAI_PORT_STAT_ETHER_STATS_COLLISIONS, + SAI_PORT_STAT_ETHER_STATS_CRC_ALIGN_ERRORS, + SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS, + SAI_PORT_STAT_ETHER_STATS_RX_NO_ERRORS, + SAI_PORT_STAT_GREEN_WRED_DROPPED_PACKETS, + SAI_PORT_STAT_GREEN_WRED_DROPPED_BYTES, + SAI_PORT_STAT_YELLOW_WRED_DROPPED_PACKETS, + SAI_PORT_STAT_YELLOW_WRED_DROPPED_BYTES, + SAI_PORT_STAT_RED_WRED_DROPPED_PACKETS, + SAI_PORT_STAT_RED_WRED_DROPPED_BYTES, + SAI_PORT_STAT_WRED_DROPPED_PACKETS, + SAI_PORT_STAT_WRED_DROPPED_BYTES, + SAI_PORT_STAT_ECN_MARKED_PACKETS, + SAI_PORT_STAT_PFC_0_RX_PKTS, + SAI_PORT_STAT_PFC_0_TX_PKTS, + SAI_PORT_STAT_PFC_1_RX_PKTS, + SAI_PORT_STAT_PFC_1_TX_PKTS, + SAI_PORT_STAT_PFC_2_RX_PKTS, + SAI_PORT_STAT_PFC_2_TX_PKTS, + SAI_PORT_STAT_PFC_3_RX_PKTS, + SAI_PORT_STAT_PFC_3_TX_PKTS, + SAI_PORT_STAT_PFC_4_RX_PKTS, + SAI_PORT_STAT_PFC_4_TX_PKTS, + SAI_PORT_STAT_PFC_5_RX_PKTS, + SAI_PORT_STAT_PFC_5_TX_PKTS, + SAI_PORT_STAT_PFC_6_RX_PKTS, + SAI_PORT_STAT_PFC_6_TX_PKTS, + SAI_PORT_STAT_PFC_7_RX_PKTS, + SAI_PORT_STAT_PFC_7_TX_PKTS, + SAI_PORT_STAT_PFC_0_RX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_0_TX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_1_RX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_1_TX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_2_RX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_2_TX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_3_RX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_3_TX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_4_RX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_4_TX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_5_RX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_5_TX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_6_RX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_6_TX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_7_RX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_7_TX_PAUSE_DURATION_US, + SAI_PORT_STAT_PFC_0_ON2OFF_RX_PKTS, + SAI_PORT_STAT_PFC_1_ON2OFF_RX_PKTS, + SAI_PORT_STAT_PFC_2_ON2OFF_RX_PKTS, + SAI_PORT_STAT_PFC_3_ON2OFF_RX_PKTS, + SAI_PORT_STAT_PFC_4_ON2OFF_RX_PKTS, + SAI_PORT_STAT_PFC_5_ON2OFF_RX_PKTS, + SAI_PORT_STAT_PFC_6_ON2OFF_RX_PKTS, + SAI_PORT_STAT_PFC_7_ON2OFF_RX_PKTS, + SAI_PORT_STAT_TRIM_PACKETS + }; + + if (stats_capability->count < portStatList.size()) { - stats_count = SAI_QUEUE_STAT_DELAY_WATERMARK_NS; - if (stats_capability->count < stats_count ) - { - stats_capability->count = stats_count; - return SAI_STATUS_BUFFER_OVERFLOW; - } + stats_capability->count = static_cast(portStatList.size()); + return SAI_STATUS_BUFFER_OVERFLOW; + } - stats_capability->count = stats_count; + stats_capability->count = static_cast(portStatList.size()); - for(i = 0; i < stats_capability->count; i++) - { - stats_capability->list[i].stat_modes = SAI_STATS_MODE_READ_AND_CLEAR | SAI_STATS_MODE_READ ; - stats_capability->list[i].stat_enum = i; - } + for (std::uint32_t i = 0; i < portStatList.size(); i++) + { + stats_capability->list[i].stat_modes = SAI_STATS_MODE_READ_AND_CLEAR | SAI_STATS_MODE_READ; + stats_capability->list[i].stat_enum = static_cast(portStatList.at(i)); + } - return SAI_STATUS_SUCCESS; + return SAI_STATUS_SUCCESS; +} + +sai_status_t SwitchStateBase::queryQueueStatsCapability( + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + static std::vector queueStatList = { + SAI_QUEUE_STAT_PACKETS, + SAI_QUEUE_STAT_BYTES, + SAI_QUEUE_STAT_DROPPED_PACKETS, + SAI_QUEUE_STAT_DROPPED_BYTES, + SAI_QUEUE_STAT_WRED_DROPPED_PACKETS, + SAI_QUEUE_STAT_WRED_DROPPED_BYTES, + SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES, + SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES, + SAI_QUEUE_STAT_WRED_ECN_MARKED_PACKETS, + SAI_QUEUE_STAT_WRED_ECN_MARKED_BYTES, + SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL, + SAI_QUEUE_STAT_WATERMARK_LEVEL, + SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS, + SAI_QUEUE_STAT_TRIM_PACKETS + }; + + if (stats_capability->count < queueStatList.size()) + { + stats_capability->count = static_cast(queueStatList.size()); + return SAI_STATUS_BUFFER_OVERFLOW; } - else if (objectType == SAI_OBJECT_TYPE_PORT) + + stats_capability->count = static_cast(queueStatList.size()); + + for (std::uint32_t i = 0; i < queueStatList.size(); i++) { - if (stats_capability->count < 91) - { - stats_capability->count = 91; - return SAI_STATUS_BUFFER_OVERFLOW; - } + stats_capability->list[i].stat_modes = SAI_STATS_MODE_READ_AND_CLEAR | SAI_STATS_MODE_READ; + stats_capability->list[i].stat_enum = static_cast(queueStatList.at(i)); + } - stats_capability->count = 91; - stats_capability->list[0].stat_enum = SAI_PORT_STAT_IF_IN_OCTETS; - stats_capability->list[1].stat_enum = SAI_PORT_STAT_IF_IN_UCAST_PKTS; - stats_capability->list[2].stat_enum = SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS; - stats_capability->list[3].stat_enum = SAI_PORT_STAT_IF_IN_DISCARDS; - stats_capability->list[4].stat_enum = SAI_PORT_STAT_IF_IN_ERRORS; - stats_capability->list[5].stat_enum = SAI_PORT_STAT_IF_IN_UNKNOWN_PROTOS; - stats_capability->list[6].stat_enum = SAI_PORT_STAT_IF_IN_BROADCAST_PKTS; - stats_capability->list[7].stat_enum = SAI_PORT_STAT_IF_IN_MULTICAST_PKTS; - stats_capability->list[8].stat_enum = SAI_PORT_STAT_IF_IN_VLAN_DISCARDS; - stats_capability->list[9].stat_enum = SAI_PORT_STAT_IF_OUT_OCTETS; - stats_capability->list[10].stat_enum = SAI_PORT_STAT_IF_OUT_UCAST_PKTS; - stats_capability->list[11].stat_enum = SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS; - stats_capability->list[12].stat_enum = SAI_PORT_STAT_IF_OUT_DISCARDS; - stats_capability->list[13].stat_enum = SAI_PORT_STAT_IF_OUT_ERRORS; - stats_capability->list[14].stat_enum = SAI_PORT_STAT_IF_OUT_QLEN; - stats_capability->list[15].stat_enum = SAI_PORT_STAT_IF_OUT_BROADCAST_PKTS; - stats_capability->list[16].stat_enum = SAI_PORT_STAT_IF_OUT_MULTICAST_PKTS; - stats_capability->list[17].stat_enum = SAI_PORT_STAT_ETHER_STATS_DROP_EVENTS; - stats_capability->list[18].stat_enum = SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS; - stats_capability->list[19].stat_enum = SAI_PORT_STAT_ETHER_STATS_BROADCAST_PKTS; - stats_capability->list[20].stat_enum = SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS; - stats_capability->list[21].stat_enum = SAI_PORT_STAT_ETHER_STATS_FRAGMENTS; - stats_capability->list[22].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_64_OCTETS; - stats_capability->list[23].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_65_TO_127_OCTETS; - stats_capability->list[24].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_128_TO_255_OCTETS; - stats_capability->list[25].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_256_TO_511_OCTETS; - stats_capability->list[26].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_512_TO_1023_OCTETS; - stats_capability->list[27].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_1024_TO_1518_OCTETS; - stats_capability->list[28].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_1519_TO_2047_OCTETS; - stats_capability->list[29].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_2048_TO_4095_OCTETS; - stats_capability->list[30].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_4096_TO_9216_OCTETS; - stats_capability->list[31].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_9217_TO_16383_OCTETS; - stats_capability->list[32].stat_enum = SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS; - stats_capability->list[33].stat_enum = SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS; - stats_capability->list[34].stat_enum = SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS; - stats_capability->list[35].stat_enum = SAI_PORT_STAT_ETHER_STATS_JABBERS; - stats_capability->list[36].stat_enum = SAI_PORT_STAT_ETHER_STATS_OCTETS; - stats_capability->list[37].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS; - stats_capability->list[38].stat_enum = SAI_PORT_STAT_ETHER_STATS_COLLISIONS; - stats_capability->list[39].stat_enum = SAI_PORT_STAT_ETHER_STATS_CRC_ALIGN_ERRORS; - stats_capability->list[40].stat_enum = SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS; - stats_capability->list[41].stat_enum = SAI_PORT_STAT_ETHER_STATS_RX_NO_ERRORS; - stats_capability->list[42].stat_enum = SAI_PORT_STAT_GREEN_WRED_DROPPED_PACKETS; - stats_capability->list[43].stat_enum = SAI_PORT_STAT_GREEN_WRED_DROPPED_BYTES; - stats_capability->list[44].stat_enum = SAI_PORT_STAT_YELLOW_WRED_DROPPED_PACKETS; - stats_capability->list[45].stat_enum = SAI_PORT_STAT_YELLOW_WRED_DROPPED_BYTES; - stats_capability->list[46].stat_enum = SAI_PORT_STAT_RED_WRED_DROPPED_PACKETS; - stats_capability->list[47].stat_enum = SAI_PORT_STAT_RED_WRED_DROPPED_BYTES; - stats_capability->list[48].stat_enum = SAI_PORT_STAT_WRED_DROPPED_PACKETS; - stats_capability->list[49].stat_enum = SAI_PORT_STAT_WRED_DROPPED_BYTES; - stats_capability->list[50].stat_enum = SAI_PORT_STAT_ECN_MARKED_PACKETS; - stats_capability->list[51].stat_enum = SAI_PORT_STAT_PFC_0_RX_PKTS; - stats_capability->list[52].stat_enum = SAI_PORT_STAT_PFC_0_TX_PKTS; - stats_capability->list[53].stat_enum = SAI_PORT_STAT_PFC_1_RX_PKTS; - stats_capability->list[54].stat_enum = SAI_PORT_STAT_PFC_1_TX_PKTS; - stats_capability->list[55].stat_enum = SAI_PORT_STAT_PFC_2_RX_PKTS; - stats_capability->list[56].stat_enum = SAI_PORT_STAT_PFC_2_TX_PKTS; - stats_capability->list[57].stat_enum = SAI_PORT_STAT_PFC_3_RX_PKTS; - stats_capability->list[58].stat_enum = SAI_PORT_STAT_PFC_3_TX_PKTS; - stats_capability->list[59].stat_enum = SAI_PORT_STAT_PFC_4_RX_PKTS; - stats_capability->list[60].stat_enum = SAI_PORT_STAT_PFC_4_TX_PKTS; - stats_capability->list[61].stat_enum = SAI_PORT_STAT_PFC_5_RX_PKTS; - stats_capability->list[62].stat_enum = SAI_PORT_STAT_PFC_5_TX_PKTS; - stats_capability->list[63].stat_enum = SAI_PORT_STAT_PFC_6_RX_PKTS; - stats_capability->list[64].stat_enum = SAI_PORT_STAT_PFC_6_TX_PKTS; - stats_capability->list[65].stat_enum = SAI_PORT_STAT_PFC_7_RX_PKTS; - stats_capability->list[66].stat_enum = SAI_PORT_STAT_PFC_7_TX_PKTS; - stats_capability->list[67].stat_enum = SAI_PORT_STAT_PFC_0_RX_PAUSE_DURATION_US; - stats_capability->list[68].stat_enum = SAI_PORT_STAT_PFC_0_TX_PAUSE_DURATION_US; - stats_capability->list[69].stat_enum = SAI_PORT_STAT_PFC_1_RX_PAUSE_DURATION_US; - stats_capability->list[70].stat_enum = SAI_PORT_STAT_PFC_1_TX_PAUSE_DURATION_US; - stats_capability->list[71].stat_enum = SAI_PORT_STAT_PFC_2_RX_PAUSE_DURATION_US; - stats_capability->list[72].stat_enum = SAI_PORT_STAT_PFC_2_TX_PAUSE_DURATION_US; - stats_capability->list[73].stat_enum = SAI_PORT_STAT_PFC_3_RX_PAUSE_DURATION_US; - stats_capability->list[74].stat_enum = SAI_PORT_STAT_PFC_3_TX_PAUSE_DURATION_US; - stats_capability->list[75].stat_enum = SAI_PORT_STAT_PFC_4_RX_PAUSE_DURATION_US; - stats_capability->list[76].stat_enum = SAI_PORT_STAT_PFC_4_TX_PAUSE_DURATION_US; - stats_capability->list[77].stat_enum = SAI_PORT_STAT_PFC_5_RX_PAUSE_DURATION_US; - stats_capability->list[78].stat_enum = SAI_PORT_STAT_PFC_5_TX_PAUSE_DURATION_US; - stats_capability->list[79].stat_enum = SAI_PORT_STAT_PFC_6_RX_PAUSE_DURATION_US; - stats_capability->list[80].stat_enum = SAI_PORT_STAT_PFC_6_TX_PAUSE_DURATION_US; - stats_capability->list[81].stat_enum = SAI_PORT_STAT_PFC_7_RX_PAUSE_DURATION_US; - stats_capability->list[82].stat_enum = SAI_PORT_STAT_PFC_7_TX_PAUSE_DURATION_US; - stats_capability->list[83].stat_enum = SAI_PORT_STAT_PFC_0_ON2OFF_RX_PKTS; - stats_capability->list[84].stat_enum = SAI_PORT_STAT_PFC_1_ON2OFF_RX_PKTS; - stats_capability->list[85].stat_enum = SAI_PORT_STAT_PFC_2_ON2OFF_RX_PKTS; - stats_capability->list[86].stat_enum = SAI_PORT_STAT_PFC_3_ON2OFF_RX_PKTS; - stats_capability->list[87].stat_enum = SAI_PORT_STAT_PFC_4_ON2OFF_RX_PKTS; - stats_capability->list[88].stat_enum = SAI_PORT_STAT_PFC_5_ON2OFF_RX_PKTS; - stats_capability->list[89].stat_enum = SAI_PORT_STAT_PFC_6_ON2OFF_RX_PKTS; - stats_capability->list[90].stat_enum = SAI_PORT_STAT_PFC_7_ON2OFF_RX_PKTS; - - for(i = 0; i < stats_capability->count; i++) - { - stats_capability->list[i].stat_modes = SAI_STATS_MODE_READ_AND_CLEAR | SAI_STATS_MODE_READ ; - } + return SAI_STATUS_SUCCESS; +} - return SAI_STATUS_SUCCESS; +sai_status_t SwitchStateBase::queryStatsCapability( + _In_ sai_object_id_t switchId, + _In_ sai_object_type_t objectType, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + SWSS_LOG_ENTER(); + + if (objectType == SAI_OBJECT_TYPE_QUEUE) + { + return queryQueueStatsCapability(stats_capability); + } + else if (objectType == SAI_OBJECT_TYPE_PORT) + { + return queryPortStatsCapability(stats_capability); } return SAI_STATUS_NOT_SUPPORTED; diff --git a/vslib/SwitchStateBase.h b/vslib/SwitchStateBase.h index 79295550c9..d223a46b91 100644 --- a/vslib/SwitchStateBase.h +++ b/vslib/SwitchStateBase.h @@ -745,6 +745,14 @@ namespace saivs virtual sai_status_t queryPortAutonegFecOverrideSupportCapability( _Out_ sai_attr_capability_t *attr_capability); + protected: + + virtual sai_status_t queryPortStatsCapability( + _Inout_ sai_stat_capability_list_t *stats_capability); + + virtual sai_status_t queryQueueStatsCapability( + _Inout_ sai_stat_capability_list_t *stats_capability); + public: // TODO private std::set m_fdb_info_set; diff --git a/vslib/VirtualSwitchSaiInterface.cpp b/vslib/VirtualSwitchSaiInterface.cpp index 866c8a0a64..becc53c191 100644 --- a/vslib/VirtualSwitchSaiInterface.cpp +++ b/vslib/VirtualSwitchSaiInterface.cpp @@ -1003,133 +1003,6 @@ sai_status_t VirtualSwitchSaiInterface::queryStatsCapability( auto ss = m_switchStateMap.at(switchId); - - if (objectType == SAI_OBJECT_TYPE_QUEUE) - { - if (stats_capability->count < SAI_OBJECT_TYPE_QUEUE) - { - stats_capability->count = SAI_QUEUE_STAT_DELAY_WATERMARK_NS; - return SAI_STATUS_BUFFER_OVERFLOW; - } - - stats_capability->count = SAI_QUEUE_STAT_DELAY_WATERMARK_NS; - - for(uint32_t i = 0; i < stats_capability->count; i++) - { - stats_capability->list[i].stat_modes = SAI_STATS_MODE_READ_AND_CLEAR | SAI_STATS_MODE_READ; - stats_capability->list[i].stat_enum = i; - } - - return SAI_STATUS_SUCCESS; - } - else if (objectType == SAI_OBJECT_TYPE_PORT) - { - if (stats_capability->count < 91) - { - stats_capability->count = 91; - return SAI_STATUS_BUFFER_OVERFLOW; - } - - stats_capability->count = 91; - stats_capability->list[0].stat_enum = SAI_PORT_STAT_IF_IN_OCTETS; - stats_capability->list[1].stat_enum = SAI_PORT_STAT_IF_IN_UCAST_PKTS; - stats_capability->list[2].stat_enum = SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS; - stats_capability->list[3].stat_enum = SAI_PORT_STAT_IF_IN_DISCARDS; - stats_capability->list[4].stat_enum = SAI_PORT_STAT_IF_IN_ERRORS; - stats_capability->list[5].stat_enum = SAI_PORT_STAT_IF_IN_UNKNOWN_PROTOS; - stats_capability->list[6].stat_enum = SAI_PORT_STAT_IF_IN_BROADCAST_PKTS; - stats_capability->list[7].stat_enum = SAI_PORT_STAT_IF_IN_MULTICAST_PKTS; - stats_capability->list[8].stat_enum = SAI_PORT_STAT_IF_IN_VLAN_DISCARDS; - stats_capability->list[9].stat_enum = SAI_PORT_STAT_IF_OUT_OCTETS; - stats_capability->list[10].stat_enum = SAI_PORT_STAT_IF_OUT_UCAST_PKTS; - stats_capability->list[11].stat_enum = SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS; - stats_capability->list[12].stat_enum = SAI_PORT_STAT_IF_OUT_DISCARDS; - stats_capability->list[13].stat_enum = SAI_PORT_STAT_IF_OUT_ERRORS; - stats_capability->list[14].stat_enum = SAI_PORT_STAT_IF_OUT_QLEN; - stats_capability->list[15].stat_enum = SAI_PORT_STAT_IF_OUT_BROADCAST_PKTS; - stats_capability->list[16].stat_enum = SAI_PORT_STAT_IF_OUT_MULTICAST_PKTS; - stats_capability->list[17].stat_enum = SAI_PORT_STAT_ETHER_STATS_DROP_EVENTS; - stats_capability->list[18].stat_enum = SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS; - stats_capability->list[19].stat_enum = SAI_PORT_STAT_ETHER_STATS_BROADCAST_PKTS; - stats_capability->list[20].stat_enum = SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS; - stats_capability->list[21].stat_enum = SAI_PORT_STAT_ETHER_STATS_FRAGMENTS; - stats_capability->list[22].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_64_OCTETS; - stats_capability->list[23].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_65_TO_127_OCTETS; - stats_capability->list[24].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_128_TO_255_OCTETS; - stats_capability->list[25].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_256_TO_511_OCTETS; - stats_capability->list[26].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_512_TO_1023_OCTETS; - stats_capability->list[27].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_1024_TO_1518_OCTETS; - stats_capability->list[28].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_1519_TO_2047_OCTETS; - stats_capability->list[29].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_2048_TO_4095_OCTETS; - stats_capability->list[30].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_4096_TO_9216_OCTETS; - stats_capability->list[31].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS_9217_TO_16383_OCTETS; - stats_capability->list[32].stat_enum = SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS; - stats_capability->list[33].stat_enum = SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS; - stats_capability->list[34].stat_enum = SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS; - stats_capability->list[35].stat_enum = SAI_PORT_STAT_ETHER_STATS_JABBERS; - stats_capability->list[36].stat_enum = SAI_PORT_STAT_ETHER_STATS_OCTETS; - stats_capability->list[37].stat_enum = SAI_PORT_STAT_ETHER_STATS_PKTS; - stats_capability->list[38].stat_enum = SAI_PORT_STAT_ETHER_STATS_COLLISIONS; - stats_capability->list[39].stat_enum = SAI_PORT_STAT_ETHER_STATS_CRC_ALIGN_ERRORS; - stats_capability->list[40].stat_enum = SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS; - stats_capability->list[41].stat_enum = SAI_PORT_STAT_ETHER_STATS_RX_NO_ERRORS; - stats_capability->list[42].stat_enum = SAI_PORT_STAT_GREEN_WRED_DROPPED_PACKETS; - stats_capability->list[43].stat_enum = SAI_PORT_STAT_GREEN_WRED_DROPPED_BYTES; - stats_capability->list[44].stat_enum = SAI_PORT_STAT_YELLOW_WRED_DROPPED_PACKETS; - stats_capability->list[45].stat_enum = SAI_PORT_STAT_YELLOW_WRED_DROPPED_BYTES; - stats_capability->list[46].stat_enum = SAI_PORT_STAT_RED_WRED_DROPPED_PACKETS; - stats_capability->list[47].stat_enum = SAI_PORT_STAT_RED_WRED_DROPPED_BYTES; - stats_capability->list[48].stat_enum = SAI_PORT_STAT_WRED_DROPPED_PACKETS; - stats_capability->list[49].stat_enum = SAI_PORT_STAT_WRED_DROPPED_BYTES; - stats_capability->list[50].stat_enum = SAI_PORT_STAT_ECN_MARKED_PACKETS; - stats_capability->list[51].stat_enum = SAI_PORT_STAT_PFC_0_RX_PKTS; - stats_capability->list[52].stat_enum = SAI_PORT_STAT_PFC_0_TX_PKTS; - stats_capability->list[53].stat_enum = SAI_PORT_STAT_PFC_1_RX_PKTS; - stats_capability->list[54].stat_enum = SAI_PORT_STAT_PFC_1_TX_PKTS; - stats_capability->list[55].stat_enum = SAI_PORT_STAT_PFC_2_RX_PKTS; - stats_capability->list[56].stat_enum = SAI_PORT_STAT_PFC_2_TX_PKTS; - stats_capability->list[57].stat_enum = SAI_PORT_STAT_PFC_3_RX_PKTS; - stats_capability->list[58].stat_enum = SAI_PORT_STAT_PFC_3_TX_PKTS; - stats_capability->list[59].stat_enum = SAI_PORT_STAT_PFC_4_RX_PKTS; - stats_capability->list[60].stat_enum = SAI_PORT_STAT_PFC_4_TX_PKTS; - stats_capability->list[61].stat_enum = SAI_PORT_STAT_PFC_5_RX_PKTS; - stats_capability->list[62].stat_enum = SAI_PORT_STAT_PFC_5_TX_PKTS; - stats_capability->list[63].stat_enum = SAI_PORT_STAT_PFC_6_RX_PKTS; - stats_capability->list[64].stat_enum = SAI_PORT_STAT_PFC_6_TX_PKTS; - stats_capability->list[65].stat_enum = SAI_PORT_STAT_PFC_7_RX_PKTS; - stats_capability->list[66].stat_enum = SAI_PORT_STAT_PFC_7_TX_PKTS; - stats_capability->list[67].stat_enum = SAI_PORT_STAT_PFC_0_RX_PAUSE_DURATION_US; - stats_capability->list[68].stat_enum = SAI_PORT_STAT_PFC_0_TX_PAUSE_DURATION_US; - stats_capability->list[69].stat_enum = SAI_PORT_STAT_PFC_1_RX_PAUSE_DURATION_US; - stats_capability->list[70].stat_enum = SAI_PORT_STAT_PFC_1_TX_PAUSE_DURATION_US; - stats_capability->list[71].stat_enum = SAI_PORT_STAT_PFC_2_RX_PAUSE_DURATION_US; - stats_capability->list[72].stat_enum = SAI_PORT_STAT_PFC_2_TX_PAUSE_DURATION_US; - stats_capability->list[73].stat_enum = SAI_PORT_STAT_PFC_3_RX_PAUSE_DURATION_US; - stats_capability->list[74].stat_enum = SAI_PORT_STAT_PFC_3_TX_PAUSE_DURATION_US; - stats_capability->list[75].stat_enum = SAI_PORT_STAT_PFC_4_RX_PAUSE_DURATION_US; - stats_capability->list[76].stat_enum = SAI_PORT_STAT_PFC_4_TX_PAUSE_DURATION_US; - stats_capability->list[77].stat_enum = SAI_PORT_STAT_PFC_5_RX_PAUSE_DURATION_US; - stats_capability->list[78].stat_enum = SAI_PORT_STAT_PFC_5_TX_PAUSE_DURATION_US; - stats_capability->list[79].stat_enum = SAI_PORT_STAT_PFC_6_RX_PAUSE_DURATION_US; - stats_capability->list[80].stat_enum = SAI_PORT_STAT_PFC_6_TX_PAUSE_DURATION_US; - stats_capability->list[81].stat_enum = SAI_PORT_STAT_PFC_7_RX_PAUSE_DURATION_US; - stats_capability->list[82].stat_enum = SAI_PORT_STAT_PFC_7_TX_PAUSE_DURATION_US; - stats_capability->list[83].stat_enum = SAI_PORT_STAT_PFC_0_ON2OFF_RX_PKTS; - stats_capability->list[84].stat_enum = SAI_PORT_STAT_PFC_1_ON2OFF_RX_PKTS; - stats_capability->list[85].stat_enum = SAI_PORT_STAT_PFC_2_ON2OFF_RX_PKTS; - stats_capability->list[86].stat_enum = SAI_PORT_STAT_PFC_3_ON2OFF_RX_PKTS; - stats_capability->list[87].stat_enum = SAI_PORT_STAT_PFC_4_ON2OFF_RX_PKTS; - stats_capability->list[88].stat_enum = SAI_PORT_STAT_PFC_5_ON2OFF_RX_PKTS; - stats_capability->list[89].stat_enum = SAI_PORT_STAT_PFC_6_ON2OFF_RX_PKTS; - stats_capability->list[90].stat_enum = SAI_PORT_STAT_PFC_7_ON2OFF_RX_PKTS; - for(uint32_t i = 0; i < stats_capability->count; i++) - { - stats_capability->list[i].stat_modes = SAI_STATS_MODE_READ_AND_CLEAR | SAI_STATS_MODE_READ ; - } - - return SAI_STATUS_SUCCESS; - } - return ss->queryStatsCapability( switchId, objectType,