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