diff --git a/unittest/vslib/TestSwitchStateBase.cpp b/unittest/vslib/TestSwitchStateBase.cpp index d7364214a2..a4266139e5 100644 --- a/unittest/vslib/TestSwitchStateBase.cpp +++ b/unittest/vslib/TestSwitchStateBase.cpp @@ -312,6 +312,38 @@ TEST_F(SwitchStateBaseTest, tamBindPointTypeCapabilitiesGet) ASSERT_EQ(static_cast(values[0]), SAI_TAM_BIND_POINT_TYPE_SWITCH); } +TEST_F(SwitchStateBaseTest, tamTelTypeModeCapabilitiesGet) +{ + sai_s32_list_t data = { .count = 0, .list = nullptr }; + + auto status = m_ss->queryAttrEnumValuesCapability( + m_swid, SAI_OBJECT_TYPE_TAM_TEL_TYPE, SAI_TAM_TEL_TYPE_ATTR_MODE, &data + ); + ASSERT_EQ(status, SAI_STATUS_BUFFER_OVERFLOW); + ASSERT_EQ(data.count, 2U); + + std::vector values(data.count); + data.list = values.data(); + + status = m_ss->queryAttrEnumValuesCapability( + m_swid, SAI_OBJECT_TYPE_TAM_TEL_TYPE, SAI_TAM_TEL_TYPE_ATTR_MODE, &data + ); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + ASSERT_EQ(data.count, 2U); + + const std::set expected = { + SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE, + SAI_TAM_TEL_TYPE_MODE_MIXED_TYPE, + }; + + std::set actual; + std::transform( + values.cbegin(), values.cend(), std::inserter(actual, actual.begin()), + [](sai_int32_t value) { return static_cast(value); } + ); + ASSERT_EQ(expected, actual); +} + TEST_F(SwitchStateBaseTest, switchQoSMaxNumOfTrafficClasses) { ASSERT_EQ(m_ss->set_maximum_number_of_traffic_classes(), SAI_STATUS_SUCCESS); diff --git a/vslib/SwitchStateBase.cpp b/vslib/SwitchStateBase.cpp index b596ebf3a9..85bcc8cd6a 100644 --- a/vslib/SwitchStateBase.cpp +++ b/vslib/SwitchStateBase.cpp @@ -4321,6 +4321,27 @@ sai_status_t SwitchStateBase::queryTamBindPointTypeCapability( return SAI_STATUS_SUCCESS; } +sai_status_t SwitchStateBase::queryTamTelTypeModeCapability( + _Inout_ sai_s32_list_t *enum_values_capability) +{ + SWSS_LOG_ENTER(); + + /* SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE and SAI_TAM_TEL_TYPE_MODE_MIXED_TYPE. */ + constexpr uint32_t value_count = 2; + + if (enum_values_capability->count < value_count) + { + enum_values_capability->count = value_count; + return SAI_STATUS_BUFFER_OVERFLOW; + } + + enum_values_capability->count = value_count; + enum_values_capability->list[0] = SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE; + enum_values_capability->list[1] = SAI_TAM_TEL_TYPE_MODE_MIXED_TYPE; + + return SAI_STATUS_SUCCESS; +} + sai_status_t SwitchStateBase::queryIcmpEchoSessionStatsCountModeCapability( _Inout_ sai_s32_list_t *enum_values_capability) { @@ -4390,6 +4411,10 @@ sai_status_t SwitchStateBase::queryAttrEnumValuesCapability( { return queryTamBindPointTypeCapability(enum_values_capability); } + else if (object_type == SAI_OBJECT_TYPE_TAM_TEL_TYPE && attr_id == SAI_TAM_TEL_TYPE_ATTR_MODE) + { + return queryTamTelTypeModeCapability(enum_values_capability); + } else if (object_type == SAI_OBJECT_TYPE_ICMP_ECHO_SESSION && attr_id == SAI_ICMP_ECHO_SESSION_ATTR_STATS_COUNT_MODE) { return queryIcmpEchoSessionStatsCountModeCapability(enum_values_capability); diff --git a/vslib/SwitchStateBase.h b/vslib/SwitchStateBase.h index ea1b844b04..9a007672e4 100644 --- a/vslib/SwitchStateBase.h +++ b/vslib/SwitchStateBase.h @@ -785,6 +785,9 @@ namespace saivs virtual sai_status_t queryTamBindPointTypeCapability( _Inout_ sai_s32_list_t *enum_values_capability); + virtual sai_status_t queryTamTelTypeModeCapability( + _Inout_ sai_s32_list_t *enum_values_capability); + virtual sai_status_t queryIcmpEchoSessionStatsCountModeCapability( _Inout_ sai_s32_list_t *enum_values_capability);