From b76773f00f0a964338c2e45a3cad56c44e898e61 Mon Sep 17 00:00:00 2001 From: "david.zagury" Date: Tue, 26 May 2026 01:04:18 +0300 Subject: [PATCH 1/2] [vslib] Advertise SAI_TAM_TEL_TYPE_ATTR_MODE capability What I did Add SwitchStateBase::queryTamTelTypeModeCapability that returns both SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE and SAI_TAM_TEL_TYPE_MODE_MIXED_TYPE, and dispatch SAI_OBJECT_TYPE_TAM_TEL_TYPE / SAI_TAM_TEL_TYPE_ATTR_MODE in queryAttrEnumValuesCapability through it. Mirrors the existing queryTamTransportTypeCapability and queryTamBindPointTypeCapability helpers and their dispatch branches. Why I did it The orchagent in sonic-swss now queries this enum capability when selecting between SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE (current default) and SAI_TAM_TEL_TYPE_MODE_MIXED_TYPE on platforms that only support the latter. Previously saivs returned SAI_STATUS_NOT_SUPPORTED for this query, forcing orchagent into a spec-default fallback. Returning both modes lets DVS exercise the orchagent's capability-query path end-to-end; the orchagent's selection rule still picks SINGLE_TYPE when both are advertised, so existing DVS tests that assert SAI_TAM_TEL_TYPE_ATTR_MODE=SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE continue to pass. Signed-off-by: david.zagury --- vslib/SwitchStateBase.cpp | 25 +++++++++++++++++++++++++ vslib/SwitchStateBase.h | 3 +++ 2 files changed, 28 insertions(+) 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); From 9fe1a4e16dda71076dbc09550e1357e6a5a4283b Mon Sep 17 00:00:00 2001 From: "david.zagury" Date: Sun, 12 Jul 2026 12:06:47 +0300 Subject: [PATCH 2/2] [vslib][test] Cover queryTamTelTypeModeCapability in vstest What I did Add SwitchStateBaseTest::tamTelTypeModeCapabilitiesGet, a gtest case that calls queryAttrEnumValuesCapability(TAM_TEL_TYPE, ATTR_MODE) twice: first with a zero-sized buffer to exercise the BUFFER_OVERFLOW branch and confirm the reported size, then with an adequately sized buffer to exercise the SUCCESS branch and verify the returned enum set equals {SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE, SAI_TAM_TEL_TYPE_MODE_MIXED_TYPE}. The test is placed next to the sibling tamTransportTypeCapabilitiesGet and tamBindPointTypeCapabilitiesGet cases and follows the same pattern. Why I did it The coverage.Azure.sonic-sairedis.amd64 check for PR #1969 reported 8% diff coverage (11 of 12 new lines uncovered) against the 80% threshold because the vstest suite never invoked queryTamTelTypeModeCapability or the corresponding dispatch branch in queryAttrEnumValuesCapability. The new test drives both branches of the helper and the dispatch, bringing diff coverage on the added lines to 100% and clearing the gate. Signed-off-by: david.zagury --- unittest/vslib/TestSwitchStateBase.cpp | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) 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);