1ac19bd68SDeepak Kodihalli #include "dbus_to_host_effecters.hpp"
2ac19bd68SDeepak Kodihalli 
3c453e164SGeorge Liu #include <libpldm/pdr.h>
4c453e164SGeorge Liu #include <libpldm/platform.h>
5ac19bd68SDeepak Kodihalli 
649cfb138SRiya Dixit #include <phosphor-logging/lg2.hpp>
7ac19bd68SDeepak Kodihalli #include <xyz/openbmc_project/Common/error.hpp>
87b4d59aaSPavithra Barithaya #include <xyz/openbmc_project/State/Boot/Progress/client.hpp>
9ac19bd68SDeepak Kodihalli #include <xyz/openbmc_project/State/OperatingSystem/Status/server.hpp>
10ac19bd68SDeepak Kodihalli 
11ac19bd68SDeepak Kodihalli #include <fstream>
12ac19bd68SDeepak Kodihalli 
1349cfb138SRiya Dixit PHOSPHOR_LOG2_USING;
1449cfb138SRiya Dixit 
155079ac4aSBrad Bishop using namespace pldm::utils;
165079ac4aSBrad Bishop 
17ac19bd68SDeepak Kodihalli namespace pldm
18ac19bd68SDeepak Kodihalli {
19ac19bd68SDeepak Kodihalli namespace host_effecters
20ac19bd68SDeepak Kodihalli {
21ac19bd68SDeepak Kodihalli using InternalFailure =
22ac19bd68SDeepak Kodihalli     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
23ac19bd68SDeepak Kodihalli 
24ac19bd68SDeepak Kodihalli constexpr auto hostEffecterJson = "dbus_to_host_effecter.json";
25ac19bd68SDeepak Kodihalli 
populatePropVals(const Json & dBusValues,std::vector<PropertyValue> & propertyValues,const std::string & propertyType)26ac19bd68SDeepak Kodihalli void HostEffecterParser::populatePropVals(
27ac19bd68SDeepak Kodihalli     const Json& dBusValues, std::vector<PropertyValue>& propertyValues,
28ac19bd68SDeepak Kodihalli     const std::string& propertyType)
29ac19bd68SDeepak Kodihalli 
30ac19bd68SDeepak Kodihalli {
31ac19bd68SDeepak Kodihalli     for (const auto& elem : dBusValues)
32ac19bd68SDeepak Kodihalli     {
33ac19bd68SDeepak Kodihalli         auto value = jsonEntryToDbusVal(propertyType, elem);
34ac19bd68SDeepak Kodihalli         propertyValues.emplace_back(value);
35ac19bd68SDeepak Kodihalli     }
36ac19bd68SDeepak Kodihalli }
37ac19bd68SDeepak Kodihalli 
parseEffecterJson(const std::string & jsonPath)38ac19bd68SDeepak Kodihalli void HostEffecterParser::parseEffecterJson(const std::string& jsonPath)
39ac19bd68SDeepak Kodihalli {
40ac19bd68SDeepak Kodihalli     fs::path jsonDir(jsonPath);
41ac19bd68SDeepak Kodihalli     if (!fs::exists(jsonDir) || fs::is_empty(jsonDir))
42ac19bd68SDeepak Kodihalli     {
43*d6e10adaSRiya Dixit         error("Effecter json file for remote terminus '{PATH}' does not exist.",
44*d6e10adaSRiya Dixit               "PATH", jsonPath);
45ac19bd68SDeepak Kodihalli         return;
46ac19bd68SDeepak Kodihalli     }
47ac19bd68SDeepak Kodihalli 
48ac19bd68SDeepak Kodihalli     fs::path jsonFilePath = jsonDir / hostEffecterJson;
49ac19bd68SDeepak Kodihalli     if (!fs::exists(jsonFilePath))
50ac19bd68SDeepak Kodihalli     {
51*d6e10adaSRiya Dixit         error("Json at path '{PATH}' does not exist.", "PATH", jsonFilePath);
52ac19bd68SDeepak Kodihalli         throw InternalFailure();
53ac19bd68SDeepak Kodihalli     }
54ac19bd68SDeepak Kodihalli 
55ac19bd68SDeepak Kodihalli     std::ifstream jsonFile(jsonFilePath);
56ac19bd68SDeepak Kodihalli     auto data = Json::parse(jsonFile, nullptr, false);
57ac19bd68SDeepak Kodihalli     if (data.is_discarded())
58ac19bd68SDeepak Kodihalli     {
59*d6e10adaSRiya Dixit         error("Failed to parse json file {PATH}", "PATH", jsonFilePath);
60ac19bd68SDeepak Kodihalli         throw InternalFailure();
61ac19bd68SDeepak Kodihalli     }
62ac19bd68SDeepak Kodihalli     const Json empty{};
63ac19bd68SDeepak Kodihalli     const std::vector<Json> emptyList{};
64ac19bd68SDeepak Kodihalli 
65ac19bd68SDeepak Kodihalli     auto entries = data.value("entries", emptyList);
66ac19bd68SDeepak Kodihalli     for (const auto& entry : entries)
67ac19bd68SDeepak Kodihalli     {
68ac19bd68SDeepak Kodihalli         EffecterInfo effecterInfo;
69ac19bd68SDeepak Kodihalli         effecterInfo.mctpEid = entry.value("mctp_eid", 0xFF);
70ac19bd68SDeepak Kodihalli         auto jsonEffecterInfo = entry.value("effecter_info", empty);
716da4f91bSPatrick Williams         auto effecterId = jsonEffecterInfo.value("effecterID",
726da4f91bSPatrick Williams                                                  PLDM_INVALID_EFFECTER_ID);
73ac19bd68SDeepak Kodihalli         effecterInfo.containerId = jsonEffecterInfo.value("containerID", 0);
74ac19bd68SDeepak Kodihalli         effecterInfo.entityType = jsonEffecterInfo.value("entityType", 0);
756da4f91bSPatrick Williams         effecterInfo.entityInstance = jsonEffecterInfo.value("entityInstance",
766da4f91bSPatrick Williams                                                              0);
77ac19bd68SDeepak Kodihalli         effecterInfo.compEffecterCnt =
78ac19bd68SDeepak Kodihalli             jsonEffecterInfo.value("compositeEffecterCount", 0);
79ac19bd68SDeepak Kodihalli         auto effecters = entry.value("effecters", emptyList);
80ac19bd68SDeepak Kodihalli         for (const auto& effecter : effecters)
81ac19bd68SDeepak Kodihalli         {
82ac19bd68SDeepak Kodihalli             DBusEffecterMapping dbusInfo{};
83ac19bd68SDeepak Kodihalli             auto jsonDbusInfo = effecter.value("dbus_info", empty);
84ac19bd68SDeepak Kodihalli             dbusInfo.dbusMap.objectPath = jsonDbusInfo.value("object_path", "");
85ac19bd68SDeepak Kodihalli             dbusInfo.dbusMap.interface = jsonDbusInfo.value("interface", "");
866da4f91bSPatrick Williams             dbusInfo.dbusMap.propertyName = jsonDbusInfo.value("property_name",
876da4f91bSPatrick Williams                                                                "");
886da4f91bSPatrick Williams             dbusInfo.dbusMap.propertyType = jsonDbusInfo.value("property_type",
896da4f91bSPatrick Williams                                                                "");
90ac19bd68SDeepak Kodihalli             Json propertyValues = jsonDbusInfo["property_values"];
91ac19bd68SDeepak Kodihalli 
92ac19bd68SDeepak Kodihalli             populatePropVals(propertyValues, dbusInfo.propertyValues,
93ac19bd68SDeepak Kodihalli                              dbusInfo.dbusMap.propertyType);
94ac19bd68SDeepak Kodihalli 
95ac19bd68SDeepak Kodihalli             const std::vector<uint8_t> emptyStates{};
96ac19bd68SDeepak Kodihalli             auto state = effecter.value("state", empty);
97ac19bd68SDeepak Kodihalli             dbusInfo.state.stateSetId = state.value("id", 0);
98ac19bd68SDeepak Kodihalli             auto states = state.value("state_values", emptyStates);
99ac19bd68SDeepak Kodihalli             if (dbusInfo.propertyValues.size() != states.size())
100ac19bd68SDeepak Kodihalli             {
10149cfb138SRiya Dixit                 error(
102*d6e10adaSRiya Dixit                     "Number of states do not match with number of D-Bus property values in the json. Object path at '{PATH}' and property '{PROPERTY}' will not be monitored",
103*d6e10adaSRiya Dixit                     "PATH", dbusInfo.dbusMap.objectPath, "PROPERTY",
104*d6e10adaSRiya Dixit                     dbusInfo.dbusMap.propertyName);
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 
processHostEffecterChangeNotification(const DbusChgHostEffecterProps & chProperties,size_t effecterInfoIndex,size_t dbusInfoIndex,uint16_t effecterId)123ac19bd68SDeepak Kodihalli void HostEffecterParser::processHostEffecterChangeNotification(
124ac19bd68SDeepak Kodihalli     const DbusChgHostEffecterProps& chProperties, size_t effecterInfoIndex,
125ac19bd68SDeepak Kodihalli     size_t dbusInfoIndex, uint16_t effecterId)
126ac19bd68SDeepak Kodihalli {
1277b4d59aaSPavithra Barithaya     using BootProgress =
1287b4d59aaSPavithra Barithaya         sdbusplus::client::xyz::openbmc_project::state::boot::Progress<>;
1297b4d59aaSPavithra Barithaya 
130ac19bd68SDeepak Kodihalli     const auto& propertyName = hostEffecterInfo[effecterInfoIndex]
131ac19bd68SDeepak Kodihalli                                    .dbusInfo[dbusInfoIndex]
132ac19bd68SDeepak Kodihalli                                    .dbusMap.propertyName;
133ac19bd68SDeepak Kodihalli 
134ac19bd68SDeepak Kodihalli     const auto& it = chProperties.find(propertyName);
135ac19bd68SDeepak Kodihalli 
136ac19bd68SDeepak Kodihalli     if (it == chProperties.end())
137ac19bd68SDeepak Kodihalli     {
138ac19bd68SDeepak Kodihalli         return;
139ac19bd68SDeepak Kodihalli     }
140ac19bd68SDeepak Kodihalli 
141ac19bd68SDeepak Kodihalli     if (effecterId == PLDM_INVALID_EFFECTER_ID)
142ac19bd68SDeepak Kodihalli     {
143a4a96162SSampa Misra         constexpr auto localOrRemote = false;
144ac19bd68SDeepak Kodihalli         effecterId = findStateEffecterId(
145ac19bd68SDeepak Kodihalli             pdrRepo, hostEffecterInfo[effecterInfoIndex].entityType,
146ac19bd68SDeepak Kodihalli             hostEffecterInfo[effecterInfoIndex].entityInstance,
147ac19bd68SDeepak Kodihalli             hostEffecterInfo[effecterInfoIndex].containerId,
148ac19bd68SDeepak Kodihalli             hostEffecterInfo[effecterInfoIndex]
149ac19bd68SDeepak Kodihalli                 .dbusInfo[dbusInfoIndex]
150a4a96162SSampa Misra                 .state.stateSetId,
151a4a96162SSampa Misra             localOrRemote);
152ac19bd68SDeepak Kodihalli         if (effecterId == PLDM_INVALID_EFFECTER_ID)
153ac19bd68SDeepak Kodihalli         {
154*d6e10adaSRiya Dixit             error(
155*d6e10adaSRiya Dixit                 "Effecter ID '{EFFECTERID}' of entity type '{TYPE}', entityInstance '{INSTANCE}' and containerID '{CONTAINER_ID}' not found in pdr repo",
156*d6e10adaSRiya Dixit                 "EFFECTERID", effecterId, "TYPE",
157*d6e10adaSRiya Dixit                 hostEffecterInfo[effecterInfoIndex].entityType, "INSTANCE",
158*d6e10adaSRiya Dixit                 hostEffecterInfo[effecterInfoIndex].entityInstance,
159*d6e10adaSRiya Dixit                 "CONTAINER_ID",
160*d6e10adaSRiya Dixit                 hostEffecterInfo[effecterInfoIndex].containerId);
161ac19bd68SDeepak Kodihalli             return;
162ac19bd68SDeepak Kodihalli         }
163ac19bd68SDeepak Kodihalli     }
164ac19bd68SDeepak Kodihalli     constexpr auto hostStatePath = "/xyz/openbmc_project/state/host0";
165ac19bd68SDeepak Kodihalli 
166ac19bd68SDeepak Kodihalli     try
167ac19bd68SDeepak Kodihalli     {
168ac19bd68SDeepak Kodihalli         auto propVal = dbusHandler->getDbusPropertyVariant(
1697b4d59aaSPavithra Barithaya             hostStatePath, "BootProgress", BootProgress::interface);
170e4e2e824SPatrick Williams 
171e4e2e824SPatrick Williams         using Stages = BootProgress::ProgressStages;
172e4e2e824SPatrick Williams         auto currHostState = sdbusplus::message::convert_from_string<Stages>(
173e4e2e824SPatrick Williams                                  std::get<std::string>(propVal))
174e4e2e824SPatrick Williams                                  .value();
175e4e2e824SPatrick Williams 
176e4e2e824SPatrick Williams         if (currHostState != Stages::SystemInitComplete &&
177e4e2e824SPatrick Williams             currHostState != Stages::OSRunning &&
178e4e2e824SPatrick Williams             currHostState != Stages::SystemSetup)
179ac19bd68SDeepak Kodihalli         {
180*d6e10adaSRiya Dixit             info(
181*d6e10adaSRiya Dixit                 "Remote terminus is not up/active, current remote terminus state is: '{CURRENT_HOST_STATE}'",
182*d6e10adaSRiya Dixit                 "CURRENT_HOST_STATE", currHostState);
183ac19bd68SDeepak Kodihalli             return;
184ac19bd68SDeepak Kodihalli         }
185ac19bd68SDeepak Kodihalli     }
18684b790cbSPatrick Williams     catch (const sdbusplus::exception_t& e)
187ac19bd68SDeepak Kodihalli     {
18849cfb138SRiya Dixit         error(
189*d6e10adaSRiya Dixit             "Error in getting current remote terminus state. Will still continue to set the remote terminus effecter, error - {ERROR}",
190*d6e10adaSRiya Dixit             "ERROR", e);
191ac19bd68SDeepak Kodihalli     }
192ac19bd68SDeepak Kodihalli     uint8_t newState{};
193ac19bd68SDeepak Kodihalli     try
194ac19bd68SDeepak Kodihalli     {
1956da4f91bSPatrick Williams         newState = findNewStateValue(effecterInfoIndex, dbusInfoIndex,
1966da4f91bSPatrick Williams                                      it->second);
197ac19bd68SDeepak Kodihalli     }
198ac19bd68SDeepak Kodihalli     catch (const std::out_of_range& e)
199ac19bd68SDeepak Kodihalli     {
200*d6e10adaSRiya Dixit         error("Failed to find new state '{NEW_STATE}' in json, error - {ERROR}",
201*d6e10adaSRiya Dixit               "ERROR", e, "NEW_STATE", newState);
202ac19bd68SDeepak Kodihalli         return;
203ac19bd68SDeepak Kodihalli     }
204ac19bd68SDeepak Kodihalli 
205ac19bd68SDeepak Kodihalli     std::vector<set_effecter_state_field> stateField;
206ac19bd68SDeepak Kodihalli     for (uint8_t i = 0; i < hostEffecterInfo[effecterInfoIndex].compEffecterCnt;
207ac19bd68SDeepak Kodihalli          i++)
208ac19bd68SDeepak Kodihalli     {
209ac19bd68SDeepak Kodihalli         if (i == dbusInfoIndex)
210ac19bd68SDeepak Kodihalli         {
211ac19bd68SDeepak Kodihalli             stateField.push_back({PLDM_REQUEST_SET, newState});
212ac19bd68SDeepak Kodihalli         }
213ac19bd68SDeepak Kodihalli         else
214ac19bd68SDeepak Kodihalli         {
215ac19bd68SDeepak Kodihalli             stateField.push_back({PLDM_NO_CHANGE, 0});
216ac19bd68SDeepak Kodihalli         }
217ac19bd68SDeepak Kodihalli     }
218ac19bd68SDeepak Kodihalli     int rc{};
219ac19bd68SDeepak Kodihalli     try
220ac19bd68SDeepak Kodihalli     {
221ac19bd68SDeepak Kodihalli         rc = setHostStateEffecter(effecterInfoIndex, stateField, effecterId);
222ac19bd68SDeepak Kodihalli     }
223ac19bd68SDeepak Kodihalli     catch (const std::runtime_error& e)
224ac19bd68SDeepak Kodihalli     {
225*d6e10adaSRiya Dixit         error(
226*d6e10adaSRiya Dixit             "Failed to set remote terminus state effecter for effecter ID '{EFFECTERID}', error - {ERROR}",
227*d6e10adaSRiya Dixit             "ERROR", e, "EFFECTERID", effecterId);
228ac19bd68SDeepak Kodihalli         return;
229ac19bd68SDeepak Kodihalli     }
230ac19bd68SDeepak Kodihalli     if (rc != PLDM_SUCCESS)
231ac19bd68SDeepak Kodihalli     {
232*d6e10adaSRiya Dixit         error(
233*d6e10adaSRiya Dixit             "Failed to set the remote terminus state effecter for effecter ID '{EFFECTERID}', response code '{RC}'",
234*d6e10adaSRiya Dixit             "EFFECTERID", effecterId, "RC", rc);
235ac19bd68SDeepak Kodihalli     }
236ac19bd68SDeepak Kodihalli }
237ac19bd68SDeepak Kodihalli 
238ac19bd68SDeepak Kodihalli uint8_t
findNewStateValue(size_t effecterInfoIndex,size_t dbusInfoIndex,const PropertyValue & propertyValue)239ac19bd68SDeepak Kodihalli     HostEffecterParser::findNewStateValue(size_t effecterInfoIndex,
240ac19bd68SDeepak Kodihalli                                           size_t dbusInfoIndex,
241ac19bd68SDeepak Kodihalli                                           const PropertyValue& propertyValue)
242ac19bd68SDeepak Kodihalli {
243ac19bd68SDeepak Kodihalli     const auto& propValues = hostEffecterInfo[effecterInfoIndex]
244ac19bd68SDeepak Kodihalli                                  .dbusInfo[dbusInfoIndex]
245ac19bd68SDeepak Kodihalli                                  .propertyValues;
246ac19bd68SDeepak Kodihalli     auto it = std::find(propValues.begin(), propValues.end(), propertyValue);
247ac19bd68SDeepak Kodihalli     uint8_t newState{};
248ac19bd68SDeepak Kodihalli     if (it != propValues.end())
249ac19bd68SDeepak Kodihalli     {
250ac19bd68SDeepak Kodihalli         auto index = std::distance(propValues.begin(), it);
251ac19bd68SDeepak Kodihalli         newState = hostEffecterInfo[effecterInfoIndex]
252ac19bd68SDeepak Kodihalli                        .dbusInfo[dbusInfoIndex]
253ac19bd68SDeepak Kodihalli                        .state.states[index];
254ac19bd68SDeepak Kodihalli     }
255ac19bd68SDeepak Kodihalli     else
256ac19bd68SDeepak Kodihalli     {
257ac19bd68SDeepak Kodihalli         throw std::out_of_range("new state not found in json");
258ac19bd68SDeepak Kodihalli     }
259ac19bd68SDeepak Kodihalli     return newState;
260ac19bd68SDeepak Kodihalli }
261ac19bd68SDeepak Kodihalli 
setHostStateEffecter(size_t effecterInfoIndex,std::vector<set_effecter_state_field> & stateField,uint16_t effecterId)262ac19bd68SDeepak Kodihalli int HostEffecterParser::setHostStateEffecter(
263ac19bd68SDeepak Kodihalli     size_t effecterInfoIndex, std::vector<set_effecter_state_field>& stateField,
264ac19bd68SDeepak Kodihalli     uint16_t effecterId)
265ac19bd68SDeepak Kodihalli {
266ac19bd68SDeepak Kodihalli     uint8_t& mctpEid = hostEffecterInfo[effecterInfoIndex].mctpEid;
267ac19bd68SDeepak Kodihalli     uint8_t& compEffCnt = hostEffecterInfo[effecterInfoIndex].compEffecterCnt;
268a330b2f0SAndrew Jeffery     auto instanceId = instanceIdDb->next(mctpEid);
269ac19bd68SDeepak Kodihalli 
270ac19bd68SDeepak Kodihalli     std::vector<uint8_t> requestMsg(
271ac19bd68SDeepak Kodihalli         sizeof(pldm_msg_hdr) + sizeof(effecterId) + sizeof(compEffCnt) +
272ac19bd68SDeepak Kodihalli             sizeof(set_effecter_state_field) * compEffCnt,
273ac19bd68SDeepak Kodihalli         0);
274ac19bd68SDeepak Kodihalli     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
275ac19bd68SDeepak Kodihalli     auto rc = encode_set_state_effecter_states_req(
276ac19bd68SDeepak Kodihalli         instanceId, effecterId, compEffCnt, stateField.data(), request);
277ac19bd68SDeepak Kodihalli 
278ac19bd68SDeepak Kodihalli     if (rc != PLDM_SUCCESS)
279ac19bd68SDeepak Kodihalli     {
280*d6e10adaSRiya Dixit         error(
281*d6e10adaSRiya Dixit             "Failed to encode set state effecter states message for effecter ID '{EFFECTERID}' and instanceID '{INSTANCE}' with response code '{RC}'",
282*d6e10adaSRiya Dixit             "EFFECTERID", effecterId, "INSTANCE", instanceId, "RC", lg2::hex,
28349cfb138SRiya Dixit             rc);
284a330b2f0SAndrew Jeffery         instanceIdDb->free(mctpEid, instanceId);
285ac19bd68SDeepak Kodihalli         return rc;
286ac19bd68SDeepak Kodihalli     }
287ac19bd68SDeepak Kodihalli 
2886da4f91bSPatrick Williams     auto setStateEffecterStatesRespHandler =
2896da4f91bSPatrick Williams         [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) {
290c0c79481SSampa Misra         if (response == nullptr || !respMsgLen)
291ac19bd68SDeepak Kodihalli         {
29249cfb138SRiya Dixit             error(
293*d6e10adaSRiya Dixit                 "Failed to receive response for setting state effecter states.");
294c0c79481SSampa Misra             return;
295ac19bd68SDeepak Kodihalli         }
296ac19bd68SDeepak Kodihalli         uint8_t completionCode{};
29749cfb138SRiya Dixit         auto rc = decode_set_state_effecter_states_resp(response, respMsgLen,
29849cfb138SRiya Dixit                                                         &completionCode);
299c0c79481SSampa Misra         if (rc)
300ac19bd68SDeepak Kodihalli         {
301*d6e10adaSRiya Dixit             error(
302*d6e10adaSRiya Dixit                 "Failed to decode response of set state effecter states, response code '{RC}'",
30349cfb138SRiya Dixit                 "RC", rc);
304c0c79481SSampa Misra             pldm::utils::reportError(
30592fb0b55SManojkiran Eda                 "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed");
306ac19bd68SDeepak Kodihalli         }
307c0c79481SSampa Misra         if (completionCode)
308ac19bd68SDeepak Kodihalli         {
309*d6e10adaSRiya Dixit             error(
310*d6e10adaSRiya Dixit                 "Failed to set a remote terminus effecter, completion code '{CC}'",
311*d6e10adaSRiya Dixit                 "CC", completionCode);
312ac19bd68SDeepak Kodihalli             pldm::utils::reportError(
31392fb0b55SManojkiran Eda                 "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed");
314c0c79481SSampa Misra         }
315c0c79481SSampa Misra     };
316c0c79481SSampa Misra 
317c0c79481SSampa Misra     rc = handler->registerRequest(
318c0c79481SSampa Misra         mctpEid, instanceId, PLDM_PLATFORM, PLDM_SET_STATE_EFFECTER_STATES,
319c0c79481SSampa Misra         std::move(requestMsg), std::move(setStateEffecterStatesRespHandler));
320c0c79481SSampa Misra     if (rc)
321c0c79481SSampa Misra     {
322*d6e10adaSRiya Dixit         error(
323*d6e10adaSRiya Dixit             "Failed to send request to set an effecter on remote terminus for effecter ID '{EFFECTERID}', response code '{RC}'",
324*d6e10adaSRiya Dixit             "EFFECTERID", effecterId, "RC", rc);
325ac19bd68SDeepak Kodihalli     }
326ac19bd68SDeepak Kodihalli     return rc;
327ac19bd68SDeepak Kodihalli }
328ac19bd68SDeepak Kodihalli 
createHostEffecterMatch(const std::string & objectPath,const std::string & interface,size_t effecterInfoIndex,size_t dbusInfoIndex,uint16_t effecterId)329ac19bd68SDeepak Kodihalli void HostEffecterParser::createHostEffecterMatch(const std::string& objectPath,
330ac19bd68SDeepak Kodihalli                                                  const std::string& interface,
331ac19bd68SDeepak Kodihalli                                                  size_t effecterInfoIndex,
332ac19bd68SDeepak Kodihalli                                                  size_t dbusInfoIndex,
333ac19bd68SDeepak Kodihalli                                                  uint16_t effecterId)
334ac19bd68SDeepak Kodihalli {
335ac19bd68SDeepak Kodihalli     using namespace sdbusplus::bus::match::rules;
33684b790cbSPatrick Williams     effecterInfoMatch.emplace_back(std::make_unique<sdbusplus::bus::match_t>(
337ac19bd68SDeepak Kodihalli         pldm::utils::DBusHandler::getBus(),
338ac19bd68SDeepak Kodihalli         propertiesChanged(objectPath, interface),
339ac19bd68SDeepak Kodihalli         [this, effecterInfoIndex, dbusInfoIndex,
34084b790cbSPatrick Williams          effecterId](sdbusplus::message_t& msg) {
341ac19bd68SDeepak Kodihalli         DbusChgHostEffecterProps props;
342ac19bd68SDeepak Kodihalli         std::string iface;
343ac19bd68SDeepak Kodihalli         msg.read(iface, props);
34484b790cbSPatrick Williams         processHostEffecterChangeNotification(props, effecterInfoIndex,
34584b790cbSPatrick Williams                                               dbusInfoIndex, effecterId);
346ac19bd68SDeepak Kodihalli     }));
347ac19bd68SDeepak Kodihalli }
348ac19bd68SDeepak Kodihalli 
349ac19bd68SDeepak Kodihalli } // namespace host_effecters
350ac19bd68SDeepak Kodihalli } // namespace pldm
351