1ac19bd68SDeepak Kodihalli #include "dbus_to_host_effecters.hpp" 2ac19bd68SDeepak Kodihalli 3ac19bd68SDeepak Kodihalli #include "libpldm/pdr.h" 4ac19bd68SDeepak Kodihalli #include "libpldm/platform.h" 5ac19bd68SDeepak Kodihalli #include "libpldm/requester/pldm.h" 6ac19bd68SDeepak Kodihalli 7ac19bd68SDeepak Kodihalli #include <xyz/openbmc_project/Common/error.hpp> 8ac19bd68SDeepak Kodihalli #include <xyz/openbmc_project/State/OperatingSystem/Status/server.hpp> 9ac19bd68SDeepak Kodihalli 10ac19bd68SDeepak Kodihalli #include <fstream> 11ac19bd68SDeepak Kodihalli #include <iostream> 12ac19bd68SDeepak Kodihalli 135079ac4aSBrad Bishop using namespace pldm::utils; 145079ac4aSBrad Bishop 15ac19bd68SDeepak Kodihalli namespace pldm 16ac19bd68SDeepak Kodihalli { 17ac19bd68SDeepak Kodihalli namespace host_effecters 18ac19bd68SDeepak Kodihalli { 19ac19bd68SDeepak Kodihalli 20ac19bd68SDeepak Kodihalli using InternalFailure = 21ac19bd68SDeepak Kodihalli sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 22ac19bd68SDeepak Kodihalli 23ac19bd68SDeepak Kodihalli constexpr auto hostEffecterJson = "dbus_to_host_effecter.json"; 24ac19bd68SDeepak Kodihalli 25ac19bd68SDeepak Kodihalli void HostEffecterParser::populatePropVals( 26ac19bd68SDeepak Kodihalli const Json& dBusValues, std::vector<PropertyValue>& propertyValues, 27ac19bd68SDeepak Kodihalli const std::string& propertyType) 28ac19bd68SDeepak Kodihalli 29ac19bd68SDeepak Kodihalli { 30ac19bd68SDeepak Kodihalli for (const auto& elem : dBusValues) 31ac19bd68SDeepak Kodihalli { 32ac19bd68SDeepak Kodihalli auto value = jsonEntryToDbusVal(propertyType, elem); 33ac19bd68SDeepak Kodihalli propertyValues.emplace_back(value); 34ac19bd68SDeepak Kodihalli } 35ac19bd68SDeepak Kodihalli } 36ac19bd68SDeepak Kodihalli 37ac19bd68SDeepak Kodihalli void HostEffecterParser::parseEffecterJson(const std::string& jsonPath) 38ac19bd68SDeepak Kodihalli { 39ac19bd68SDeepak Kodihalli fs::path jsonDir(jsonPath); 40ac19bd68SDeepak Kodihalli if (!fs::exists(jsonDir) || fs::is_empty(jsonDir)) 41ac19bd68SDeepak Kodihalli { 42ac19bd68SDeepak Kodihalli std::cerr << "Host Effecter json path does not exist, DIR=" << jsonPath 43ac19bd68SDeepak Kodihalli << "\n"; 44ac19bd68SDeepak Kodihalli return; 45ac19bd68SDeepak Kodihalli } 46ac19bd68SDeepak Kodihalli 47ac19bd68SDeepak Kodihalli fs::path jsonFilePath = jsonDir / hostEffecterJson; 48ac19bd68SDeepak Kodihalli if (!fs::exists(jsonFilePath)) 49ac19bd68SDeepak Kodihalli { 50ac19bd68SDeepak Kodihalli std::cerr << "json does not exist, PATH=" << jsonFilePath << "\n"; 51ac19bd68SDeepak Kodihalli throw InternalFailure(); 52ac19bd68SDeepak Kodihalli } 53ac19bd68SDeepak Kodihalli 54ac19bd68SDeepak Kodihalli std::ifstream jsonFile(jsonFilePath); 55ac19bd68SDeepak Kodihalli auto data = Json::parse(jsonFile, nullptr, false); 56ac19bd68SDeepak Kodihalli if (data.is_discarded()) 57ac19bd68SDeepak Kodihalli { 58ac19bd68SDeepak Kodihalli std::cerr << "Parsing json file failed, FILE=" << jsonFilePath << "\n"; 59ac19bd68SDeepak Kodihalli throw InternalFailure(); 60ac19bd68SDeepak Kodihalli } 61ac19bd68SDeepak Kodihalli const Json empty{}; 62ac19bd68SDeepak Kodihalli const std::vector<Json> emptyList{}; 63ac19bd68SDeepak Kodihalli 64ac19bd68SDeepak Kodihalli auto entries = data.value("entries", emptyList); 65ac19bd68SDeepak Kodihalli for (const auto& entry : entries) 66ac19bd68SDeepak Kodihalli { 67ac19bd68SDeepak Kodihalli EffecterInfo effecterInfo; 68ac19bd68SDeepak Kodihalli effecterInfo.mctpEid = entry.value("mctp_eid", 0xFF); 69ac19bd68SDeepak Kodihalli auto jsonEffecterInfo = entry.value("effecter_info", empty); 70ac19bd68SDeepak Kodihalli auto effecterId = 71ac19bd68SDeepak Kodihalli jsonEffecterInfo.value("effecterID", PLDM_INVALID_EFFECTER_ID); 72ac19bd68SDeepak Kodihalli effecterInfo.containerId = jsonEffecterInfo.value("containerID", 0); 73ac19bd68SDeepak Kodihalli effecterInfo.entityType = jsonEffecterInfo.value("entityType", 0); 74ac19bd68SDeepak Kodihalli effecterInfo.entityInstance = 75ac19bd68SDeepak Kodihalli jsonEffecterInfo.value("entityInstance", 0); 76ac19bd68SDeepak Kodihalli effecterInfo.compEffecterCnt = 77ac19bd68SDeepak Kodihalli jsonEffecterInfo.value("compositeEffecterCount", 0); 78ac19bd68SDeepak Kodihalli auto effecters = entry.value("effecters", emptyList); 79ac19bd68SDeepak Kodihalli for (const auto& effecter : effecters) 80ac19bd68SDeepak Kodihalli { 81ac19bd68SDeepak Kodihalli DBusEffecterMapping dbusInfo{}; 82ac19bd68SDeepak Kodihalli auto jsonDbusInfo = effecter.value("dbus_info", empty); 83ac19bd68SDeepak Kodihalli dbusInfo.dbusMap.objectPath = jsonDbusInfo.value("object_path", ""); 84ac19bd68SDeepak Kodihalli dbusInfo.dbusMap.interface = jsonDbusInfo.value("interface", ""); 85ac19bd68SDeepak Kodihalli dbusInfo.dbusMap.propertyName = 86ac19bd68SDeepak Kodihalli jsonDbusInfo.value("property_name", ""); 87ac19bd68SDeepak Kodihalli dbusInfo.dbusMap.propertyType = 88ac19bd68SDeepak Kodihalli jsonDbusInfo.value("property_type", ""); 89ac19bd68SDeepak Kodihalli Json propertyValues = jsonDbusInfo["property_values"]; 90ac19bd68SDeepak Kodihalli 91ac19bd68SDeepak Kodihalli populatePropVals(propertyValues, dbusInfo.propertyValues, 92ac19bd68SDeepak Kodihalli dbusInfo.dbusMap.propertyType); 93ac19bd68SDeepak Kodihalli 94ac19bd68SDeepak Kodihalli const std::vector<uint8_t> emptyStates{}; 95ac19bd68SDeepak Kodihalli auto state = effecter.value("state", empty); 96ac19bd68SDeepak Kodihalli dbusInfo.state.stateSetId = state.value("id", 0); 97ac19bd68SDeepak Kodihalli auto states = state.value("state_values", emptyStates); 98ac19bd68SDeepak Kodihalli if (dbusInfo.propertyValues.size() != states.size()) 99ac19bd68SDeepak Kodihalli { 100ac19bd68SDeepak Kodihalli std::cerr << "Number of states do not match with" 101ac19bd68SDeepak Kodihalli << " number of D-Bus property values in the json. " 102ac19bd68SDeepak Kodihalli << "Object path " << dbusInfo.dbusMap.objectPath 103ac19bd68SDeepak Kodihalli << " and property " << dbusInfo.dbusMap.propertyName 104ac19bd68SDeepak Kodihalli << " will not be monitored \n"; 105ac19bd68SDeepak Kodihalli continue; 106ac19bd68SDeepak Kodihalli } 107ac19bd68SDeepak Kodihalli for (const auto& s : states) 108ac19bd68SDeepak Kodihalli { 109ac19bd68SDeepak Kodihalli dbusInfo.state.states.emplace_back(s); 110ac19bd68SDeepak Kodihalli } 111ac19bd68SDeepak Kodihalli 112ac19bd68SDeepak Kodihalli auto effecterInfoIndex = hostEffecterInfo.size(); 113ac19bd68SDeepak Kodihalli auto dbusInfoIndex = effecterInfo.dbusInfo.size(); 114ac19bd68SDeepak Kodihalli createHostEffecterMatch( 115ac19bd68SDeepak Kodihalli dbusInfo.dbusMap.objectPath, dbusInfo.dbusMap.interface, 116ac19bd68SDeepak Kodihalli effecterInfoIndex, dbusInfoIndex, effecterId); 117ac19bd68SDeepak Kodihalli effecterInfo.dbusInfo.emplace_back(std::move(dbusInfo)); 118ac19bd68SDeepak Kodihalli } 119ac19bd68SDeepak Kodihalli hostEffecterInfo.emplace_back(std::move(effecterInfo)); 120ac19bd68SDeepak Kodihalli } 121ac19bd68SDeepak Kodihalli } 122ac19bd68SDeepak Kodihalli 123ac19bd68SDeepak Kodihalli void HostEffecterParser::processHostEffecterChangeNotification( 124ac19bd68SDeepak Kodihalli const DbusChgHostEffecterProps& chProperties, size_t effecterInfoIndex, 125ac19bd68SDeepak Kodihalli size_t dbusInfoIndex, uint16_t effecterId) 126ac19bd68SDeepak Kodihalli { 127ac19bd68SDeepak Kodihalli const auto& propertyName = hostEffecterInfo[effecterInfoIndex] 128ac19bd68SDeepak Kodihalli .dbusInfo[dbusInfoIndex] 129ac19bd68SDeepak Kodihalli .dbusMap.propertyName; 130ac19bd68SDeepak Kodihalli 131ac19bd68SDeepak Kodihalli const auto& it = chProperties.find(propertyName); 132ac19bd68SDeepak Kodihalli 133ac19bd68SDeepak Kodihalli if (it == chProperties.end()) 134ac19bd68SDeepak Kodihalli { 135ac19bd68SDeepak Kodihalli return; 136ac19bd68SDeepak Kodihalli } 137ac19bd68SDeepak Kodihalli 138ac19bd68SDeepak Kodihalli if (effecterId == PLDM_INVALID_EFFECTER_ID) 139ac19bd68SDeepak Kodihalli { 140a4a96162SSampa Misra constexpr auto localOrRemote = false; 141ac19bd68SDeepak Kodihalli effecterId = findStateEffecterId( 142ac19bd68SDeepak Kodihalli pdrRepo, hostEffecterInfo[effecterInfoIndex].entityType, 143ac19bd68SDeepak Kodihalli hostEffecterInfo[effecterInfoIndex].entityInstance, 144ac19bd68SDeepak Kodihalli hostEffecterInfo[effecterInfoIndex].containerId, 145ac19bd68SDeepak Kodihalli hostEffecterInfo[effecterInfoIndex] 146ac19bd68SDeepak Kodihalli .dbusInfo[dbusInfoIndex] 147a4a96162SSampa Misra .state.stateSetId, 148a4a96162SSampa Misra localOrRemote); 149ac19bd68SDeepak Kodihalli if (effecterId == PLDM_INVALID_EFFECTER_ID) 150ac19bd68SDeepak Kodihalli { 151ac19bd68SDeepak Kodihalli std::cerr << "Effecter id not found in pdr repo \n"; 152ac19bd68SDeepak Kodihalli return; 153ac19bd68SDeepak Kodihalli } 154ac19bd68SDeepak Kodihalli } 155ac19bd68SDeepak Kodihalli constexpr auto hostStateInterface = 1565dad5f4cSTom Joseph "xyz.openbmc_project.State.Boot.Progress"; 157ac19bd68SDeepak Kodihalli constexpr auto hostStatePath = "/xyz/openbmc_project/state/host0"; 158ac19bd68SDeepak Kodihalli 159ac19bd68SDeepak Kodihalli try 160ac19bd68SDeepak Kodihalli { 161ac19bd68SDeepak Kodihalli auto propVal = dbusHandler->getDbusPropertyVariant( 1625dad5f4cSTom Joseph hostStatePath, "BootProgress", hostStateInterface); 163ac19bd68SDeepak Kodihalli const auto& currHostState = std::get<std::string>(propVal); 1645dad5f4cSTom Joseph if ((currHostState != "xyz.openbmc_project.State.Boot.Progress." 1655dad5f4cSTom Joseph "ProgressStages.SystemInitComplete") && 1665dad5f4cSTom Joseph (currHostState != "xyz.openbmc_project.State.Boot.Progress." 1675dad5f4cSTom Joseph "ProgressStages.OSRunning") && 1685dad5f4cSTom Joseph (currHostState != "xyz.openbmc_project.State.Boot.Progress." 1695dad5f4cSTom Joseph "ProgressStages.OSStart")) 170ac19bd68SDeepak Kodihalli { 171ac19bd68SDeepak Kodihalli std::cout << "Host is not up. Current host state: " 172ac19bd68SDeepak Kodihalli << currHostState.c_str() << "\n"; 173ac19bd68SDeepak Kodihalli return; 174ac19bd68SDeepak Kodihalli } 175ac19bd68SDeepak Kodihalli } 176*4fea7a20SPatrick Williams catch (const sdbusplus::exception::exception& e) 177ac19bd68SDeepak Kodihalli { 178ac19bd68SDeepak Kodihalli std::cerr << "Error in getting current host state. Will still " 179ac19bd68SDeepak Kodihalli "continue to set the host effecter \n"; 180ac19bd68SDeepak Kodihalli } 181ac19bd68SDeepak Kodihalli uint8_t newState{}; 182ac19bd68SDeepak Kodihalli try 183ac19bd68SDeepak Kodihalli { 184ac19bd68SDeepak Kodihalli newState = 185ac19bd68SDeepak Kodihalli findNewStateValue(effecterInfoIndex, dbusInfoIndex, it->second); 186ac19bd68SDeepak Kodihalli } 187ac19bd68SDeepak Kodihalli catch (const std::out_of_range& e) 188ac19bd68SDeepak Kodihalli { 189ac19bd68SDeepak Kodihalli std::cerr << "new state not found in json" 190ac19bd68SDeepak Kodihalli << "\n"; 191ac19bd68SDeepak Kodihalli return; 192ac19bd68SDeepak Kodihalli } 193ac19bd68SDeepak Kodihalli 194ac19bd68SDeepak Kodihalli std::vector<set_effecter_state_field> stateField; 195ac19bd68SDeepak Kodihalli for (uint8_t i = 0; i < hostEffecterInfo[effecterInfoIndex].compEffecterCnt; 196ac19bd68SDeepak Kodihalli i++) 197ac19bd68SDeepak Kodihalli { 198ac19bd68SDeepak Kodihalli if (i == dbusInfoIndex) 199ac19bd68SDeepak Kodihalli { 200ac19bd68SDeepak Kodihalli stateField.push_back({PLDM_REQUEST_SET, newState}); 201ac19bd68SDeepak Kodihalli } 202ac19bd68SDeepak Kodihalli else 203ac19bd68SDeepak Kodihalli { 204ac19bd68SDeepak Kodihalli stateField.push_back({PLDM_NO_CHANGE, 0}); 205ac19bd68SDeepak Kodihalli } 206ac19bd68SDeepak Kodihalli } 207ac19bd68SDeepak Kodihalli int rc{}; 208ac19bd68SDeepak Kodihalli try 209ac19bd68SDeepak Kodihalli { 210ac19bd68SDeepak Kodihalli rc = setHostStateEffecter(effecterInfoIndex, stateField, effecterId); 211ac19bd68SDeepak Kodihalli } 212ac19bd68SDeepak Kodihalli catch (const std::runtime_error& e) 213ac19bd68SDeepak Kodihalli { 214ac19bd68SDeepak Kodihalli std::cerr << "Could not set host state effecter \n"; 215ac19bd68SDeepak Kodihalli return; 216ac19bd68SDeepak Kodihalli } 217ac19bd68SDeepak Kodihalli if (rc != PLDM_SUCCESS) 218ac19bd68SDeepak Kodihalli { 219ac19bd68SDeepak Kodihalli std::cerr << "Could not set the host state effecter, rc= " << rc 220ac19bd68SDeepak Kodihalli << " \n"; 221ac19bd68SDeepak Kodihalli } 222ac19bd68SDeepak Kodihalli } 223ac19bd68SDeepak Kodihalli 224ac19bd68SDeepak Kodihalli uint8_t 225ac19bd68SDeepak Kodihalli HostEffecterParser::findNewStateValue(size_t effecterInfoIndex, 226ac19bd68SDeepak Kodihalli size_t dbusInfoIndex, 227ac19bd68SDeepak Kodihalli const PropertyValue& propertyValue) 228ac19bd68SDeepak Kodihalli { 229ac19bd68SDeepak Kodihalli const auto& propValues = hostEffecterInfo[effecterInfoIndex] 230ac19bd68SDeepak Kodihalli .dbusInfo[dbusInfoIndex] 231ac19bd68SDeepak Kodihalli .propertyValues; 232ac19bd68SDeepak Kodihalli auto it = std::find(propValues.begin(), propValues.end(), propertyValue); 233ac19bd68SDeepak Kodihalli uint8_t newState{}; 234ac19bd68SDeepak Kodihalli if (it != propValues.end()) 235ac19bd68SDeepak Kodihalli { 236ac19bd68SDeepak Kodihalli auto index = std::distance(propValues.begin(), it); 237ac19bd68SDeepak Kodihalli newState = hostEffecterInfo[effecterInfoIndex] 238ac19bd68SDeepak Kodihalli .dbusInfo[dbusInfoIndex] 239ac19bd68SDeepak Kodihalli .state.states[index]; 240ac19bd68SDeepak Kodihalli } 241ac19bd68SDeepak Kodihalli else 242ac19bd68SDeepak Kodihalli { 243ac19bd68SDeepak Kodihalli throw std::out_of_range("new state not found in json"); 244ac19bd68SDeepak Kodihalli } 245ac19bd68SDeepak Kodihalli return newState; 246ac19bd68SDeepak Kodihalli } 247ac19bd68SDeepak Kodihalli 248ac19bd68SDeepak Kodihalli int HostEffecterParser::setHostStateEffecter( 249ac19bd68SDeepak Kodihalli size_t effecterInfoIndex, std::vector<set_effecter_state_field>& stateField, 250ac19bd68SDeepak Kodihalli uint16_t effecterId) 251ac19bd68SDeepak Kodihalli { 252ac19bd68SDeepak Kodihalli uint8_t& mctpEid = hostEffecterInfo[effecterInfoIndex].mctpEid; 253ac19bd68SDeepak Kodihalli uint8_t& compEffCnt = hostEffecterInfo[effecterInfoIndex].compEffecterCnt; 254ac19bd68SDeepak Kodihalli auto instanceId = requester->getInstanceId(mctpEid); 255ac19bd68SDeepak Kodihalli 256ac19bd68SDeepak Kodihalli std::vector<uint8_t> requestMsg( 257ac19bd68SDeepak Kodihalli sizeof(pldm_msg_hdr) + sizeof(effecterId) + sizeof(compEffCnt) + 258ac19bd68SDeepak Kodihalli sizeof(set_effecter_state_field) * compEffCnt, 259ac19bd68SDeepak Kodihalli 0); 260ac19bd68SDeepak Kodihalli auto request = reinterpret_cast<pldm_msg*>(requestMsg.data()); 261ac19bd68SDeepak Kodihalli auto rc = encode_set_state_effecter_states_req( 262ac19bd68SDeepak Kodihalli instanceId, effecterId, compEffCnt, stateField.data(), request); 263ac19bd68SDeepak Kodihalli 264ac19bd68SDeepak Kodihalli if (rc != PLDM_SUCCESS) 265ac19bd68SDeepak Kodihalli { 266ac19bd68SDeepak Kodihalli std::cerr << "Message encode failure. PLDM error code = " << std::hex 267ac19bd68SDeepak Kodihalli << std::showbase << rc << "\n"; 268ac19bd68SDeepak Kodihalli requester->markFree(mctpEid, instanceId); 269ac19bd68SDeepak Kodihalli return rc; 270ac19bd68SDeepak Kodihalli } 271ac19bd68SDeepak Kodihalli 272ac19bd68SDeepak Kodihalli if (verbose) 273ac19bd68SDeepak Kodihalli { 274ac19bd68SDeepak Kodihalli if (requestMsg.size()) 275ac19bd68SDeepak Kodihalli { 276ac19bd68SDeepak Kodihalli std::ostringstream tempStream; 277ac19bd68SDeepak Kodihalli for (int byte : requestMsg) 278ac19bd68SDeepak Kodihalli { 279ac19bd68SDeepak Kodihalli tempStream << std::setfill('0') << std::setw(2) << std::hex 280ac19bd68SDeepak Kodihalli << byte << " "; 281ac19bd68SDeepak Kodihalli } 282ac19bd68SDeepak Kodihalli std::cout << tempStream.str() << std::endl; 283ac19bd68SDeepak Kodihalli } 284ac19bd68SDeepak Kodihalli } 285c0c79481SSampa Misra auto setStateEffecterStatesRespHandler = 286c0c79481SSampa Misra [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) { 287c0c79481SSampa Misra if (response == nullptr || !respMsgLen) 288ac19bd68SDeepak Kodihalli { 289c0c79481SSampa Misra std::cerr << "Failed to receive response for " 290c0c79481SSampa Misra << "setStateEffecterStates command \n"; 291c0c79481SSampa Misra return; 292ac19bd68SDeepak Kodihalli } 293ac19bd68SDeepak Kodihalli uint8_t completionCode{}; 294c0c79481SSampa Misra auto rc = decode_set_state_effecter_states_resp( 295c0c79481SSampa Misra response, respMsgLen, &completionCode); 296c0c79481SSampa Misra if (rc) 297ac19bd68SDeepak Kodihalli { 298c0c79481SSampa Misra std::cerr << "Failed to decode setStateEffecterStates response," 299c0c79481SSampa Misra << " rc " << rc << "\n"; 300c0c79481SSampa Misra pldm::utils::reportError( 301c0c79481SSampa Misra "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed"); 302ac19bd68SDeepak Kodihalli } 303c0c79481SSampa Misra if (completionCode) 304ac19bd68SDeepak Kodihalli { 305c0c79481SSampa Misra std::cerr << "Failed to set a Host effecter " 306c0c79481SSampa Misra << ", cc=" << static_cast<unsigned>(completionCode) 307ac19bd68SDeepak Kodihalli << "\n"; 308ac19bd68SDeepak Kodihalli pldm::utils::reportError( 309c0c79481SSampa Misra "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed"); 310c0c79481SSampa Misra } 311c0c79481SSampa Misra }; 312c0c79481SSampa Misra 313c0c79481SSampa Misra rc = handler->registerRequest( 314c0c79481SSampa Misra mctpEid, instanceId, PLDM_PLATFORM, PLDM_SET_STATE_EFFECTER_STATES, 315c0c79481SSampa Misra std::move(requestMsg), std::move(setStateEffecterStatesRespHandler)); 316c0c79481SSampa Misra if (rc) 317c0c79481SSampa Misra { 318c0c79481SSampa Misra std::cerr << "Failed to send request to set an effecter on Host \n"; 319ac19bd68SDeepak Kodihalli } 320ac19bd68SDeepak Kodihalli return rc; 321ac19bd68SDeepak Kodihalli } 322ac19bd68SDeepak Kodihalli 323ac19bd68SDeepak Kodihalli void HostEffecterParser::createHostEffecterMatch(const std::string& objectPath, 324ac19bd68SDeepak Kodihalli const std::string& interface, 325ac19bd68SDeepak Kodihalli size_t effecterInfoIndex, 326ac19bd68SDeepak Kodihalli size_t dbusInfoIndex, 327ac19bd68SDeepak Kodihalli uint16_t effecterId) 328ac19bd68SDeepak Kodihalli { 329ac19bd68SDeepak Kodihalli using namespace sdbusplus::bus::match::rules; 330ac19bd68SDeepak Kodihalli effecterInfoMatch.emplace_back( 331ac19bd68SDeepak Kodihalli std::make_unique<sdbusplus::bus::match::match>( 332ac19bd68SDeepak Kodihalli pldm::utils::DBusHandler::getBus(), 333ac19bd68SDeepak Kodihalli propertiesChanged(objectPath, interface), 334ac19bd68SDeepak Kodihalli [this, effecterInfoIndex, dbusInfoIndex, 335ac19bd68SDeepak Kodihalli effecterId](sdbusplus::message::message& msg) { 336ac19bd68SDeepak Kodihalli DbusChgHostEffecterProps props; 337ac19bd68SDeepak Kodihalli std::string iface; 338ac19bd68SDeepak Kodihalli msg.read(iface, props); 339ac19bd68SDeepak Kodihalli processHostEffecterChangeNotification( 340ac19bd68SDeepak Kodihalli props, effecterInfoIndex, dbusInfoIndex, effecterId); 341ac19bd68SDeepak Kodihalli })); 342ac19bd68SDeepak Kodihalli } 343ac19bd68SDeepak Kodihalli 344ac19bd68SDeepak Kodihalli } // namespace host_effecters 345ac19bd68SDeepak Kodihalli } // namespace pldm 346