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