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