diff --git a/src/DbInterface.cpp b/src/DbInterface.cpp index 86c8a274..d5f43572 100644 --- a/src/DbInterface.cpp +++ b/src/DbInterface.cpp @@ -865,6 +865,46 @@ void DbInterface::getSoCIpAddress(std::shared_ptr configDbCon processSoCIpAddress(entries); } +// +// ---> getMuxModeConfig(); +// +// retrieve MUX mode configuration +// +std::map DbInterface::getMuxModeConfig() +{ + MUXLOGINFO("Reading MUX mode configuration"); + std::shared_ptr configDbPtr = std::make_shared ("CONFIG_DB", 0); + swss::Table configDbMuxCableTable(configDbPtr.get(), CFG_MUX_CABLE_TABLE_NAME); + std::vector entries; + std::map PortToMuxModeConfigMapping; + + configDbMuxCableTable.getContent(entries); + + for (auto &entry: entries) { + std::string portName = kfvKey(entry); + std::vector fieldValues = kfvFieldsValues(entry); + + std::vector::const_iterator cit = std::find_if( + fieldValues.cbegin(), + fieldValues.cend(), + [] (const swss::FieldValueTuple &fv) {return fvField(fv) == "state";} + ); + + if (cit != fieldValues.cend()) { + const std::string f = cit->first; + std::string muxMode = cit->second; + + MUXLOGDEBUG(boost::format("port: %s, mode mux %s = %s") % portName % f % muxMode); + + PortToMuxModeConfigMapping[portName] = muxMode; + } else { + MUXLOGERROR(boost::format("port: %s, mode mux is not found in %s table") % portName % CFG_MUX_CABLE_TABLE_NAME); + } + } + + return PortToMuxModeConfigMapping; +} + // ---> warmRestartReconciliation(const std::string &portName); // // port warm restart reconciliation procedure diff --git a/src/DbInterface.h b/src/DbInterface.h index f6200f05..23eba275 100644 --- a/src/DbInterface.h +++ b/src/DbInterface.h @@ -388,6 +388,15 @@ class DbInterface */ virtual void setWarmStartStateReconciled(){swss::WarmStart::setWarmStartState("linkmgrd", swss::WarmStart::RECONCILED);}; + /** + *@method getMuxModeConfig + * + *@brief retrieve mux mode config + * + *@return port to mux mode map + */ + virtual std::map getMuxModeConfig(); + private: friend class test::MuxManagerTest; diff --git a/src/MuxManager.cpp b/src/MuxManager.cpp index a11ce8ac..212dff0c 100644 --- a/src/MuxManager.cpp +++ b/src/MuxManager.cpp @@ -570,8 +570,15 @@ void MuxManager::handleWarmRestartReconciliationTimeout(const boost::system::err MUXLOGWARNING("Reconciliation timed out after warm restart, set service to reconciled now."); } - int rc = system("sudo config muxcable mode auto all"); - MUXLOGWARNING(boost::format("config mux mode back to auto completed with return code %d") % rc); + std::map muxModeMap = mDbInterfacePtr->getMuxModeConfig(); + for (auto it = muxModeMap.begin(); it != muxModeMap.end(); ++it) { + if (it->second == "auto") { + continue; + } + + MUXLOGWARNING(boost::format("config mux mode back to auto for %s") % it->first); + mDbInterfacePtr->setMuxMode(it->first, "auto"); + } mDbInterfacePtr->setWarmStartStateReconciled(); } diff --git a/test/FakeDbInterface.cpp b/test/FakeDbInterface.cpp index 319ae05b..311b98ed 100644 --- a/test/FakeDbInterface.cpp +++ b/test/FakeDbInterface.cpp @@ -132,4 +132,13 @@ void FakeDbInterface::postSwitchCause( mLastPostedSwitchCause = cause; } +std::map FakeDbInterface::getMuxModeConfig() +{ + mGetMuxModeConfigInvokeCount++; + + std::map muxModeConfig; + muxModeConfig["Ethernet0"] = "manual"; + return muxModeConfig; +} + } /* namespace test */ diff --git a/test/FakeDbInterface.h b/test/FakeDbInterface.h index 13307ebf..99bec86a 100644 --- a/test/FakeDbInterface.h +++ b/test/FakeDbInterface.h @@ -39,6 +39,7 @@ class FakeDbInterface: public mux::DbInterface virtual void handleSetMuxState(const std::string portName, mux_state::MuxState::Label label) override; virtual void handleSetPeerMuxState(const std::string portName, mux_state::MuxState::Label label) override; virtual void getMuxState(const std::string &portName) override; + virtual std::map getMuxModeConfig() override; virtual void probeMuxState(const std::string &portName) override; virtual void handleProbeForwardingState(const std::string portName) override; virtual void setMuxLinkmgrState( @@ -95,6 +96,7 @@ class FakeDbInterface: public mux::DbInterface uint32_t mSetMuxModeInvokeCount = 0; uint32_t mSetWarmStartStateReconciledInvokeCount = 0; uint32_t mPostSwitchCauseInvokeCount = 0; + uint32_t mGetMuxModeConfigInvokeCount = 0; link_manager::ActiveStandbyStateMachine::SwitchCause mLastPostedSwitchCause;