diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 98c13b7dc7e..e5c7969aaf9 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -4109,6 +4109,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_portStateTable.hget(p.m_alias, "NPU_SI_SETTINGS_SYNC_STATUS", value); + if (foundNPUSiSettingsSyncStatus) { + 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()); + } } else { diff --git a/tests/mock_tests/mock_table.cpp b/tests/mock_tests/mock_table.cpp index 4d512a98354..f94a5268573 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 fca4f34bebf..92ad39d0f9b 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);