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