From cd1d520b615e1ca6c577e4f7fa6c96e4ef020c7b Mon Sep 17 00:00:00 2001 From: Mihir Patel Date: Thu, 2 Nov 2023 01:39:42 +0000 Subject: [PATCH 1/3] [orchagent] Modifying NPU_SI_SETTINGS_SYNC_STATUS based on NPU SI settings application status Signed-off-by: Mihir Patel --- orchagent/portsorch.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index c31b3a468f..b559b0cef3 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -4066,6 +4066,15 @@ void PortsOrch::doPortTask(Consumer &consumer) SWSS_LOG_NOTICE("Set port %s SI settings is successful", p.m_alias.c_str()); p.m_preemphasis = serdes_attr; m_portList[p.m_alias] = p; + + string value; + bool foundNPUSiSettingsSyncStatus = m_portTable->hget(p.m_alias, "NPU_SI_SETTINGS_SYNC_STATUS", value); + if (foundNPUSiSettingsSyncStatus) { + m_portTable->hset(p.m_alias, "NPU_SI_SETTINGS_SYNC_STATUS", "NPU_SI_SETTINGS_DONE"); + SWSS_LOG_NOTICE("NPU_SI_SETTINGS_SYNC_STATUS modified to NPU_SI_SETTINGS_DONE for port %s", p.m_alias.c_str()); + } else { + SWSS_LOG_ERROR("Unable to find NPU_SI_SETTINGS_SYNC_STATUS for port %s", p.m_alias.c_str()); + } } else { From d91a4f8bd1ca128b2abad493bc770e6fe29ffe7b Mon Sep 17 00:00:00 2001 From: Mihir Patel Date: Fri, 5 Jan 2024 03:36:43 +0000 Subject: [PATCH 2/3] Replaced APPL_DB with STATE_DB for handling NPU_SI_SETTINGS_SYNC_STATUS --- orchagent/portsorch.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index d054994065..e5c7969aaf 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -4111,9 +4111,9 @@ void PortsOrch::doPortTask(Consumer &consumer) m_portList[p.m_alias] = p; string value; - bool foundNPUSiSettingsSyncStatus = m_portTable->hget(p.m_alias, "NPU_SI_SETTINGS_SYNC_STATUS", value); + bool foundNPUSiSettingsSyncStatus = m_portStateTable.hget(p.m_alias, "NPU_SI_SETTINGS_SYNC_STATUS", value); if (foundNPUSiSettingsSyncStatus) { - m_portTable->hset(p.m_alias, "NPU_SI_SETTINGS_SYNC_STATUS", "NPU_SI_SETTINGS_DONE"); + m_portStateTable.hset(p.m_alias, "NPU_SI_SETTINGS_SYNC_STATUS", "NPU_SI_SETTINGS_DONE"); SWSS_LOG_NOTICE("NPU_SI_SETTINGS_SYNC_STATUS modified to NPU_SI_SETTINGS_DONE for port %s", p.m_alias.c_str()); } else { SWSS_LOG_ERROR("Unable to find NPU_SI_SETTINGS_SYNC_STATUS for port %s", p.m_alias.c_str()); From 92e944b4b98843bcdb5bdd4a3d3b0d375e07362d Mon Sep 17 00:00:00 2001 From: Mihir Patel Date: Sun, 7 Jan 2024 02:28:47 +0000 Subject: [PATCH 3/3] Added unit-test --- tests/mock_tests/mock_table.cpp | 25 +++++++++++++++++++++++++ tests/mock_tests/portsorch_ut.cpp | 20 ++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/tests/mock_tests/mock_table.cpp b/tests/mock_tests/mock_table.cpp index 4d512a9835..f94a526857 100644 --- a/tests/mock_tests/mock_table.cpp +++ b/tests/mock_tests/mock_table.cpp @@ -64,6 +64,31 @@ namespace swss table[key] = values; } + void Table::hset(const std::string &key, + const std::string &field, + const std::string &value, + const std::string & /*op*/, + const std::string & /*prefix*/) + { + auto &table = gDB[m_pipe->getDbId()][getTableName()]; + std::vector &fvs = table[key]; + + // Search for field in fvs and update it if exists, else add new field value tuple + for (auto &it : fvs) + { + if (it.first == field) + { + it.second = value; + return; + } + } + + // Add new field value tuple + FieldValueTuple tuple(field, value); + fvs.push_back(tuple); + table[key] = fvs; + } + void Table::getKeys(std::vector &keys) { keys.clear(); diff --git a/tests/mock_tests/portsorch_ut.cpp b/tests/mock_tests/portsorch_ut.cpp index fca4f34beb..92ad39d0f9 100644 --- a/tests/mock_tests/portsorch_ut.cpp +++ b/tests/mock_tests/portsorch_ut.cpp @@ -867,6 +867,12 @@ namespace portsorch_test // Refill consumer consumer->addToSync(kfvSerdes); + // Initialize NPU_SI_SETTINGS_SYNC_STATUS in STATE_DB + Table state_port_table(m_state_db.get(), STATE_PORT_TABLE_NAME); + state_port_table.set("Ethernet0", { + {"NPU_SI_SETTINGS_SYNC_STATUS", "NPU_SI_SETTINGS_NOTIFIED"} + }); + _hook_sai_port_api(); uint32_t current_sai_api_call_count = _sai_set_admin_state_down_count; @@ -878,6 +884,20 @@ namespace portsorch_test ASSERT_TRUE(gPortsOrch->getPort("Ethernet0", p)); ASSERT_TRUE(p.m_admin_state_up); + // Verify NPU_SI_SETTINGS_SYNC_STATUS is set by orchagent + std::vector values; + state_port_table.get("Ethernet0", values); + string npu_si_settings_sync_status_val = "INVALID"; + for (auto &valueTuple : values) + { + if (fvField(valueTuple) == "NPU_SI_SETTINGS_SYNC_STATUS") + { + npu_si_settings_sync_status_val = fvValue(valueTuple); + break; + } + } + ASSERT_EQ(npu_si_settings_sync_status_val, "NPU_SI_SETTINGS_DONE"); + // Verify idriver std::vector idriver = { 0x6, 0x6, 0x6, 0x6 }; ASSERT_EQ(p.m_preemphasis.at(SAI_PORT_SERDES_ATTR_IDRIVER), idriver);