1ac19bd68SDeepak Kodihalli #include "dbus_to_host_effecters.hpp" 2ac19bd68SDeepak Kodihalli 3*c453e164SGeorge Liu #include <libpldm/pdr.h> 4*c453e164SGeorge Liu #include <libpldm/platform.h> 5*c453e164SGeorge Liu #include <libpldm/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." 169f2704dc3SAndrew Geissler "ProgressStages.OSStart") && 170f2704dc3SAndrew Geissler (currHostState != "xyz.openbmc_project.State.Boot.Progress." 171f2704dc3SAndrew Geissler "ProgressStages.SystemSetup")) 172ac19bd68SDeepak Kodihalli { 173ac19bd68SDeepak Kodihalli std::cout << "Host is not up. Current host state: " 174ac19bd68SDeepak Kodihalli << currHostState.c_str() << "\n"; 175ac19bd68SDeepak Kodihalli return; 176ac19bd68SDeepak Kodihalli } 177ac19bd68SDeepak Kodihalli } 17884b790cbSPatrick Williams catch (const sdbusplus::exception_t& e) 179ac19bd68SDeepak Kodihalli { 180ac19bd68SDeepak Kodihalli std::cerr << "Error in getting current host state. Will still " 181ac19bd68SDeepak Kodihalli "continue to set the host effecter \n"; 182ac19bd68SDeepak Kodihalli } 183ac19bd68SDeepak Kodihalli uint8_t newState{}; 184ac19bd68SDeepak Kodihalli try 185ac19bd68SDeepak Kodihalli { 186ac19bd68SDeepak Kodihalli newState = 187ac19bd68SDeepak Kodihalli findNewStateValue(effecterInfoIndex, dbusInfoIndex, it->second); 188ac19bd68SDeepak Kodihalli } 189ac19bd68SDeepak Kodihalli catch (const std::out_of_range& e) 190ac19bd68SDeepak Kodihalli { 191ac19bd68SDeepak Kodihalli std::cerr << "new state not found in json" 192ac19bd68SDeepak Kodihalli << "\n"; 193ac19bd68SDeepak Kodihalli return; 194ac19bd68SDeepak Kodihalli } 195ac19bd68SDeepak Kodihalli 196ac19bd68SDeepak Kodihalli std::vector<set_effecter_state_field> stateField; 197ac19bd68SDeepak Kodihalli for (uint8_t i = 0; i < hostEffecterInfo[effecterInfoIndex].compEffecterCnt; 198ac19bd68SDeepak Kodihalli i++) 199ac19bd68SDeepak Kodihalli { 200ac19bd68SDeepak Kodihalli if (i == dbusInfoIndex) 201ac19bd68SDeepak Kodihalli { 202ac19bd68SDeepak Kodihalli stateField.push_back({PLDM_REQUEST_SET, newState}); 203ac19bd68SDeepak Kodihalli } 204ac19bd68SDeepak Kodihalli else 205ac19bd68SDeepak Kodihalli { 206ac19bd68SDeepak Kodihalli stateField.push_back({PLDM_NO_CHANGE, 0}); 207ac19bd68SDeepak Kodihalli } 208ac19bd68SDeepak Kodihalli } 209ac19bd68SDeepak Kodihalli int rc{}; 210ac19bd68SDeepak Kodihalli try 211ac19bd68SDeepak Kodihalli { 212ac19bd68SDeepak Kodihalli rc = setHostStateEffecter(effecterInfoIndex, stateField, effecterId); 213ac19bd68SDeepak Kodihalli } 214ac19bd68SDeepak Kodihalli catch (const std::runtime_error& e) 215ac19bd68SDeepak Kodihalli { 216ac19bd68SDeepak Kodihalli std::cerr << "Could not set host state effecter \n"; 217ac19bd68SDeepak Kodihalli return; 218ac19bd68SDeepak Kodihalli } 219ac19bd68SDeepak Kodihalli if (rc != PLDM_SUCCESS) 220ac19bd68SDeepak Kodihalli { 221ac19bd68SDeepak Kodihalli std::cerr << "Could not set the host state effecter, rc= " << rc 222ac19bd68SDeepak Kodihalli << " \n"; 223ac19bd68SDeepak Kodihalli } 224ac19bd68SDeepak Kodihalli } 225ac19bd68SDeepak Kodihalli 226ac19bd68SDeepak Kodihalli uint8_t 227ac19bd68SDeepak Kodihalli HostEffecterParser::findNewStateValue(size_t effecterInfoIndex, 228ac19bd68SDeepak Kodihalli size_t dbusInfoIndex, 229ac19bd68SDeepak Kodihalli const PropertyValue& propertyValue) 230ac19bd68SDeepak Kodihalli { 231ac19bd68SDeepak Kodihalli const auto& propValues = hostEffecterInfo[effecterInfoIndex] 232ac19bd68SDeepak Kodihalli .dbusInfo[dbusInfoIndex] 233ac19bd68SDeepak Kodihalli .propertyValues; 234ac19bd68SDeepak Kodihalli auto it = std::find(propValues.begin(), propValues.end(), propertyValue); 235ac19bd68SDeepak Kodihalli uint8_t newState{}; 236ac19bd68SDeepak Kodihalli if (it != propValues.end()) 237ac19bd68SDeepak Kodihalli { 238ac19bd68SDeepak Kodihalli auto index = std::distance(propValues.begin(), it); 239ac19bd68SDeepak Kodihalli newState = hostEffecterInfo[effecterInfoIndex] 240ac19bd68SDeepak Kodihalli .dbusInfo[dbusInfoIndex] 241ac19bd68SDeepak Kodihalli .state.states[index]; 242ac19bd68SDeepak Kodihalli } 243ac19bd68SDeepak Kodihalli else 244ac19bd68SDeepak Kodihalli { 245ac19bd68SDeepak Kodihalli throw std::out_of_range("new state not found in json"); 246ac19bd68SDeepak Kodihalli } 247ac19bd68SDeepak Kodihalli return newState; 248ac19bd68SDeepak Kodihalli } 249ac19bd68SDeepak Kodihalli 250ac19bd68SDeepak Kodihalli int HostEffecterParser::setHostStateEffecter( 251ac19bd68SDeepak Kodihalli size_t effecterInfoIndex, std::vector<set_effecter_state_field>& stateField, 252ac19bd68SDeepak Kodihalli uint16_t effecterId) 253ac19bd68SDeepak Kodihalli { 254ac19bd68SDeepak Kodihalli uint8_t& mctpEid = hostEffecterInfo[effecterInfoIndex].mctpEid; 255ac19bd68SDeepak Kodihalli uint8_t& compEffCnt = hostEffecterInfo[effecterInfoIndex].compEffecterCnt; 256ac19bd68SDeepak Kodihalli auto instanceId = requester->getInstanceId(mctpEid); 257ac19bd68SDeepak Kodihalli 258ac19bd68SDeepak Kodihalli std::vector<uint8_t> requestMsg( 259ac19bd68SDeepak Kodihalli sizeof(pldm_msg_hdr) + sizeof(effecterId) + sizeof(compEffCnt) + 260ac19bd68SDeepak Kodihalli sizeof(set_effecter_state_field) * compEffCnt, 261ac19bd68SDeepak Kodihalli 0); 262ac19bd68SDeepak Kodihalli auto request = reinterpret_cast<pldm_msg*>(requestMsg.data()); 263ac19bd68SDeepak Kodihalli auto rc = encode_set_state_effecter_states_req( 264ac19bd68SDeepak Kodihalli instanceId, effecterId, compEffCnt, stateField.data(), request); 265ac19bd68SDeepak Kodihalli 266ac19bd68SDeepak Kodihalli if (rc != PLDM_SUCCESS) 267ac19bd68SDeepak Kodihalli { 268ac19bd68SDeepak Kodihalli std::cerr << "Message encode failure. PLDM error code = " << std::hex 269ac19bd68SDeepak Kodihalli << std::showbase << rc << "\n"; 270ac19bd68SDeepak Kodihalli requester->markFree(mctpEid, instanceId); 271ac19bd68SDeepak Kodihalli return rc; 272ac19bd68SDeepak Kodihalli } 273ac19bd68SDeepak Kodihalli 274c0c79481SSampa Misra auto setStateEffecterStatesRespHandler = 275c0c79481SSampa Misra [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) { 276c0c79481SSampa Misra if (response == nullptr || !respMsgLen) 277ac19bd68SDeepak Kodihalli { 278c0c79481SSampa Misra std::cerr << "Failed to receive response for " 279c0c79481SSampa Misra << "setStateEffecterStates command \n"; 280c0c79481SSampa Misra return; 281ac19bd68SDeepak Kodihalli } 282ac19bd68SDeepak Kodihalli uint8_t completionCode{}; 283c0c79481SSampa Misra auto rc = decode_set_state_effecter_states_resp( 284c0c79481SSampa Misra response, respMsgLen, &completionCode); 285c0c79481SSampa Misra if (rc) 286ac19bd68SDeepak Kodihalli { 287c0c79481SSampa Misra std::cerr << "Failed to decode setStateEffecterStates response," 288c0c79481SSampa Misra << " rc " << rc << "\n"; 289c0c79481SSampa Misra pldm::utils::reportError( 290c0c79481SSampa Misra "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed"); 291ac19bd68SDeepak Kodihalli } 292c0c79481SSampa Misra if (completionCode) 293ac19bd68SDeepak Kodihalli { 294c0c79481SSampa Misra std::cerr << "Failed to set a Host effecter " 295c0c79481SSampa Misra << ", cc=" << static_cast<unsigned>(completionCode) 296ac19bd68SDeepak Kodihalli << "\n"; 297ac19bd68SDeepak Kodihalli pldm::utils::reportError( 298c0c79481SSampa Misra "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed"); 299c0c79481SSampa Misra } 300c0c79481SSampa Misra }; 301c0c79481SSampa Misra 302c0c79481SSampa Misra rc = handler->registerRequest( 303c0c79481SSampa Misra mctpEid, instanceId, PLDM_PLATFORM, PLDM_SET_STATE_EFFECTER_STATES, 304c0c79481SSampa Misra std::move(requestMsg), std::move(setStateEffecterStatesRespHandler)); 305c0c79481SSampa Misra if (rc) 306c0c79481SSampa Misra { 307c0c79481SSampa Misra std::cerr << "Failed to send request to set an effecter on Host \n"; 308ac19bd68SDeepak Kodihalli } 309ac19bd68SDeepak Kodihalli return rc; 310ac19bd68SDeepak Kodihalli } 311ac19bd68SDeepak Kodihalli 312ac19bd68SDeepak Kodihalli void HostEffecterParser::createHostEffecterMatch(const std::string& objectPath, 313ac19bd68SDeepak Kodihalli const std::string& interface, 314ac19bd68SDeepak Kodihalli size_t effecterInfoIndex, 315ac19bd68SDeepak Kodihalli size_t dbusInfoIndex, 316ac19bd68SDeepak Kodihalli uint16_t effecterId) 317ac19bd68SDeepak Kodihalli { 318ac19bd68SDeepak Kodihalli using namespace sdbusplus::bus::match::rules; 31984b790cbSPatrick Williams effecterInfoMatch.emplace_back(std::make_unique<sdbusplus::bus::match_t>( 320ac19bd68SDeepak Kodihalli pldm::utils::DBusHandler::getBus(), 321ac19bd68SDeepak Kodihalli propertiesChanged(objectPath, interface), 322ac19bd68SDeepak Kodihalli [this, effecterInfoIndex, dbusInfoIndex, 32384b790cbSPatrick Williams effecterId](sdbusplus::message_t& msg) { 324ac19bd68SDeepak Kodihalli DbusChgHostEffecterProps props; 325ac19bd68SDeepak Kodihalli std::string iface; 326ac19bd68SDeepak Kodihalli msg.read(iface, props); 32784b790cbSPatrick Williams processHostEffecterChangeNotification(props, effecterInfoIndex, 32884b790cbSPatrick Williams dbusInfoIndex, effecterId); 329ac19bd68SDeepak Kodihalli })); 330ac19bd68SDeepak Kodihalli } 331ac19bd68SDeepak Kodihalli 332ac19bd68SDeepak Kodihalli } // namespace host_effecters 333ac19bd68SDeepak Kodihalli } // namespace pldm 334