xref: /openbmc/pldm/platform-mc/dbus_to_terminus_effecters.cpp (revision 22bcb07d7f48f5ff237776bf6450baca3875db20)
1dd1f28b8SManojkiran Eda #include "dbus_to_terminus_effecters.hpp"
2dd1f28b8SManojkiran Eda 
3dd1f28b8SManojkiran Eda #include <libpldm/pdr.h>
4dd1f28b8SManojkiran Eda #include <libpldm/platform.h>
5dd1f28b8SManojkiran Eda 
6dd1f28b8SManojkiran Eda #include <phosphor-logging/lg2.hpp>
7dd1f28b8SManojkiran Eda #include <xyz/openbmc_project/Common/error.hpp>
8dd1f28b8SManojkiran Eda #include <xyz/openbmc_project/State/Boot/Progress/client.hpp>
9dd1f28b8SManojkiran Eda #include <xyz/openbmc_project/State/OperatingSystem/Status/server.hpp>
10dd1f28b8SManojkiran Eda 
11dd1f28b8SManojkiran Eda #include <fstream>
12dd1f28b8SManojkiran Eda 
13dd1f28b8SManojkiran Eda PHOSPHOR_LOG2_USING;
14dd1f28b8SManojkiran Eda 
15dd1f28b8SManojkiran Eda using namespace pldm::utils;
16dd1f28b8SManojkiran Eda 
17dd1f28b8SManojkiran Eda namespace pldm
18dd1f28b8SManojkiran Eda {
19dd1f28b8SManojkiran Eda namespace host_effecters
20dd1f28b8SManojkiran Eda {
21dd1f28b8SManojkiran Eda using InternalFailure =
22dd1f28b8SManojkiran Eda     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
23dd1f28b8SManojkiran Eda 
24dd1f28b8SManojkiran Eda constexpr auto hostEffecterJson = "dbus_to_terminus_effecter.json";
25dd1f28b8SManojkiran Eda 
populatePropVals(const Json & dBusValues,std::vector<PropertyValue> & propertyValues,const std::string & propertyType)26dd1f28b8SManojkiran Eda void HostEffecterParser::populatePropVals(
27dd1f28b8SManojkiran Eda     const Json& dBusValues, std::vector<PropertyValue>& propertyValues,
28dd1f28b8SManojkiran Eda     const std::string& propertyType)
29dd1f28b8SManojkiran Eda 
30dd1f28b8SManojkiran Eda {
31dd1f28b8SManojkiran Eda     for (const auto& elem : dBusValues)
32dd1f28b8SManojkiran Eda     {
33dd1f28b8SManojkiran Eda         auto value = jsonEntryToDbusVal(propertyType, elem);
34dd1f28b8SManojkiran Eda         propertyValues.emplace_back(value);
35dd1f28b8SManojkiran Eda     }
36dd1f28b8SManojkiran Eda }
37dd1f28b8SManojkiran Eda 
parseEffecterJson(const std::string & jsonPath)38dd1f28b8SManojkiran Eda void HostEffecterParser::parseEffecterJson(const std::string& jsonPath)
39dd1f28b8SManojkiran Eda {
40dd1f28b8SManojkiran Eda     fs::path jsonDir(jsonPath);
41dd1f28b8SManojkiran Eda     if (!fs::exists(jsonDir) || fs::is_empty(jsonDir))
42dd1f28b8SManojkiran Eda     {
43dd1f28b8SManojkiran Eda         error("Effecter json file for remote terminus '{PATH}' does not exist.",
44dd1f28b8SManojkiran Eda               "PATH", jsonPath);
45dd1f28b8SManojkiran Eda         return;
46dd1f28b8SManojkiran Eda     }
47dd1f28b8SManojkiran Eda 
48dd1f28b8SManojkiran Eda     fs::path jsonFilePath = jsonDir / hostEffecterJson;
49dd1f28b8SManojkiran Eda     if (!fs::exists(jsonFilePath))
50dd1f28b8SManojkiran Eda     {
51dd1f28b8SManojkiran Eda         error("Json at path '{PATH}' does not exist.", "PATH", jsonFilePath);
52dd1f28b8SManojkiran Eda         throw InternalFailure();
53dd1f28b8SManojkiran Eda     }
54dd1f28b8SManojkiran Eda 
55dd1f28b8SManojkiran Eda     std::ifstream jsonFile(jsonFilePath);
56dd1f28b8SManojkiran Eda     auto data = Json::parse(jsonFile, nullptr, false);
57dd1f28b8SManojkiran Eda     if (data.is_discarded())
58dd1f28b8SManojkiran Eda     {
59dd1f28b8SManojkiran Eda         error("Failed to parse json file {PATH}", "PATH", jsonFilePath);
60dd1f28b8SManojkiran Eda         throw InternalFailure();
61dd1f28b8SManojkiran Eda     }
62dd1f28b8SManojkiran Eda     const Json empty{};
63dd1f28b8SManojkiran Eda     const std::vector<Json> emptyList{};
64dd1f28b8SManojkiran Eda 
65dd1f28b8SManojkiran Eda     auto entries = data.value("entries", emptyList);
66dd1f28b8SManojkiran Eda     for (const auto& entry : entries)
67dd1f28b8SManojkiran Eda     {
68dd1f28b8SManojkiran Eda         EffecterInfo effecterInfo;
69dd1f28b8SManojkiran Eda         effecterInfo.mctpEid = entry.value("mctp_eid", 0xFF);
70dd1f28b8SManojkiran Eda         effecterInfo.terminusName = entry.value("terminus_name", "");
71dd1f28b8SManojkiran Eda         auto jsonEffecterInfo = entry.value("effecter_info", empty);
72dd1f28b8SManojkiran Eda         auto effecterId =
73dd1f28b8SManojkiran Eda             jsonEffecterInfo.value("effecterID", PLDM_INVALID_EFFECTER_ID);
74dd1f28b8SManojkiran Eda         /* default as PLDM_STATE_EFFECTER_PDR */
75dd1f28b8SManojkiran Eda         auto effecterPdrType =
76dd1f28b8SManojkiran Eda             jsonEffecterInfo.value("effecterPdrType", PLDM_STATE_EFFECTER_PDR);
77dd1f28b8SManojkiran Eda         if (effecterPdrType != PLDM_STATE_EFFECTER_PDR &&
78dd1f28b8SManojkiran Eda             effecterPdrType != PLDM_NUMERIC_EFFECTER_PDR)
79dd1f28b8SManojkiran Eda         {
80dd1f28b8SManojkiran Eda             error(
81dd1f28b8SManojkiran Eda                 "Effecter PDRType not supported {TYPE} of effecterID '{EFFECTERID}'",
82dd1f28b8SManojkiran Eda                 "TYPE", effecterPdrType, "EFFECTERID", effecterId);
83dd1f28b8SManojkiran Eda             continue;
84dd1f28b8SManojkiran Eda         }
85dd1f28b8SManojkiran Eda         effecterInfo.effecterPdrType = effecterPdrType;
86dd1f28b8SManojkiran Eda         effecterInfo.containerId = jsonEffecterInfo.value("containerID", 0);
87dd1f28b8SManojkiran Eda         effecterInfo.entityType = jsonEffecterInfo.value("entityType", 0);
88dd1f28b8SManojkiran Eda         effecterInfo.entityInstance =
89dd1f28b8SManojkiran Eda             jsonEffecterInfo.value("entityInstance", 0);
90dd1f28b8SManojkiran Eda         effecterInfo.compEffecterCnt =
91dd1f28b8SManojkiran Eda             jsonEffecterInfo.value("compositeEffecterCount", 0);
92dd1f28b8SManojkiran Eda         effecterInfo.checkHostState =
93dd1f28b8SManojkiran Eda             jsonEffecterInfo.value("checkHostState", true);
94dd1f28b8SManojkiran Eda         auto effecters = entry.value("effecters", emptyList);
95dd1f28b8SManojkiran Eda 
96dd1f28b8SManojkiran Eda         if (effecterPdrType == PLDM_NUMERIC_EFFECTER_PDR)
97dd1f28b8SManojkiran Eda         {
98dd1f28b8SManojkiran Eda             for (const auto& effecter : effecters)
99dd1f28b8SManojkiran Eda             {
100dd1f28b8SManojkiran Eda                 DBusNumericEffecterMapping dbusInfo{};
101dd1f28b8SManojkiran Eda                 auto jsonDbusInfo = effecter.value("dbus_info", empty);
102dd1f28b8SManojkiran Eda                 dbusInfo.dataSize = effecter.value("effecterDataSize", 0);
103dd1f28b8SManojkiran Eda                 dbusInfo.unitModifier = effecter.value("unitModifier", 0);
104dd1f28b8SManojkiran Eda                 dbusInfo.resolution = effecter.value("resolution", 1);
105dd1f28b8SManojkiran Eda                 dbusInfo.offset = effecter.value("offset", 0);
106dd1f28b8SManojkiran Eda                 dbusInfo.dbusMap.objectPath =
107dd1f28b8SManojkiran Eda                     jsonDbusInfo.value("object_path", "");
108dd1f28b8SManojkiran Eda                 dbusInfo.dbusMap.interface =
109dd1f28b8SManojkiran Eda                     jsonDbusInfo.value("interface", "");
110dd1f28b8SManojkiran Eda                 dbusInfo.dbusMap.propertyName =
111dd1f28b8SManojkiran Eda                     jsonDbusInfo.value("property_name", "");
112dd1f28b8SManojkiran Eda                 dbusInfo.dbusMap.propertyType =
113dd1f28b8SManojkiran Eda                     jsonDbusInfo.value("property_type", "");
114dd1f28b8SManojkiran Eda                 /**
115dd1f28b8SManojkiran Eda                  * Only support these property type for Numeric Effecter D-Bus
116dd1f28b8SManojkiran Eda                  * property:
117dd1f28b8SManojkiran Eda                  * "uint8_t", "int16_t",  "uint16_t", "int32_t", "uint32_t",
118dd1f28b8SManojkiran Eda                  * "int64_t", "uint64_t", "double"
119dd1f28b8SManojkiran Eda                  */
120dd1f28b8SManojkiran Eda                 if (!dbusValueNumericTypeNames.contains(
121dd1f28b8SManojkiran Eda                         dbusInfo.dbusMap.propertyType))
122dd1f28b8SManojkiran Eda                 {
123dd1f28b8SManojkiran Eda                     lg2::error(
124dd1f28b8SManojkiran Eda                         "Invalid PropertyType {TYPE} of object path {PATH} property name {NAME}",
125dd1f28b8SManojkiran Eda                         "TYPE", dbusInfo.dbusMap.propertyType, "PATH",
126dd1f28b8SManojkiran Eda                         dbusInfo.dbusMap.objectPath, "NAME",
127dd1f28b8SManojkiran Eda                         dbusInfo.dbusMap.propertyName);
128dd1f28b8SManojkiran Eda                     continue;
129dd1f28b8SManojkiran Eda                 }
130dd1f28b8SManojkiran Eda 
131dd1f28b8SManojkiran Eda                 dbusInfo.propertyValue =
132dd1f28b8SManojkiran Eda                     std::numeric_limits<double>::quiet_NaN();
133dd1f28b8SManojkiran Eda                 auto effecterInfoIndex = hostEffecterInfo.size();
134dd1f28b8SManojkiran Eda                 auto dbusInfoIndex = effecterInfo.dbusInfo.size();
135dd1f28b8SManojkiran Eda                 createHostEffecterMatch(
136dd1f28b8SManojkiran Eda                     dbusInfo.dbusMap.objectPath, dbusInfo.dbusMap.interface,
137dd1f28b8SManojkiran Eda                     effecterInfoIndex, dbusInfoIndex, effecterId);
138dd1f28b8SManojkiran Eda                 effecterInfo.dbusNumericEffecterInfo.emplace_back(
139dd1f28b8SManojkiran Eda                     std::move(dbusInfo));
140dd1f28b8SManojkiran Eda             }
141dd1f28b8SManojkiran Eda             hostEffecterInfo.emplace_back(std::move(effecterInfo));
142dd1f28b8SManojkiran Eda             continue;
143dd1f28b8SManojkiran Eda         }
144dd1f28b8SManojkiran Eda 
145dd1f28b8SManojkiran Eda         for (const auto& effecter : effecters)
146dd1f28b8SManojkiran Eda         {
147dd1f28b8SManojkiran Eda             DBusEffecterMapping dbusInfo{};
148dd1f28b8SManojkiran Eda             auto jsonDbusInfo = effecter.value("dbus_info", empty);
149dd1f28b8SManojkiran Eda             dbusInfo.dbusMap.objectPath = jsonDbusInfo.value("object_path", "");
150dd1f28b8SManojkiran Eda             dbusInfo.dbusMap.interface = jsonDbusInfo.value("interface", "");
151dd1f28b8SManojkiran Eda             dbusInfo.dbusMap.propertyName =
152dd1f28b8SManojkiran Eda                 jsonDbusInfo.value("property_name", "");
153dd1f28b8SManojkiran Eda             dbusInfo.dbusMap.propertyType =
154dd1f28b8SManojkiran Eda                 jsonDbusInfo.value("property_type", "");
155dd1f28b8SManojkiran Eda             Json propertyValues = jsonDbusInfo["property_values"];
156dd1f28b8SManojkiran Eda 
157dd1f28b8SManojkiran Eda             populatePropVals(propertyValues, dbusInfo.propertyValues,
158dd1f28b8SManojkiran Eda                              dbusInfo.dbusMap.propertyType);
159dd1f28b8SManojkiran Eda 
160dd1f28b8SManojkiran Eda             const std::vector<uint8_t> emptyStates{};
161dd1f28b8SManojkiran Eda             auto state = effecter.value("state", empty);
162dd1f28b8SManojkiran Eda             dbusInfo.state.stateSetId = state.value("id", 0);
163dd1f28b8SManojkiran Eda             auto states = state.value("state_values", emptyStates);
164dd1f28b8SManojkiran Eda             if (dbusInfo.propertyValues.size() != states.size())
165dd1f28b8SManojkiran Eda             {
166dd1f28b8SManojkiran Eda                 error(
167dd1f28b8SManojkiran Eda                     "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",
168dd1f28b8SManojkiran Eda                     "PATH", dbusInfo.dbusMap.objectPath, "PROPERTY",
169dd1f28b8SManojkiran Eda                     dbusInfo.dbusMap.propertyName);
170dd1f28b8SManojkiran Eda                 continue;
171dd1f28b8SManojkiran Eda             }
172dd1f28b8SManojkiran Eda             for (const auto& s : states)
173dd1f28b8SManojkiran Eda             {
174dd1f28b8SManojkiran Eda                 dbusInfo.state.states.emplace_back(s);
175dd1f28b8SManojkiran Eda             }
176dd1f28b8SManojkiran Eda 
177dd1f28b8SManojkiran Eda             auto effecterInfoIndex = hostEffecterInfo.size();
178dd1f28b8SManojkiran Eda             auto dbusInfoIndex = effecterInfo.dbusInfo.size();
179dd1f28b8SManojkiran Eda             createHostEffecterMatch(
180dd1f28b8SManojkiran Eda                 dbusInfo.dbusMap.objectPath, dbusInfo.dbusMap.interface,
181dd1f28b8SManojkiran Eda                 effecterInfoIndex, dbusInfoIndex, effecterId);
182dd1f28b8SManojkiran Eda             effecterInfo.dbusInfo.emplace_back(std::move(dbusInfo));
183dd1f28b8SManojkiran Eda         }
184dd1f28b8SManojkiran Eda         hostEffecterInfo.emplace_back(std::move(effecterInfo));
185dd1f28b8SManojkiran Eda     }
186dd1f28b8SManojkiran Eda }
187dd1f28b8SManojkiran Eda 
isHostOn(void)188dd1f28b8SManojkiran Eda bool HostEffecterParser::isHostOn(void)
189dd1f28b8SManojkiran Eda {
190dd1f28b8SManojkiran Eda     using BootProgress =
191dd1f28b8SManojkiran Eda         sdbusplus::client::xyz::openbmc_project::state::boot::Progress<>;
192dd1f28b8SManojkiran Eda     constexpr auto hostStatePath = "/xyz/openbmc_project/state/host0";
193dd1f28b8SManojkiran Eda     try
194dd1f28b8SManojkiran Eda     {
195dd1f28b8SManojkiran Eda         auto propVal = dbusHandler->getDbusPropertyVariant(
196dd1f28b8SManojkiran Eda             hostStatePath, "BootProgress", BootProgress::interface);
197dd1f28b8SManojkiran Eda 
198dd1f28b8SManojkiran Eda         using Stages = BootProgress::ProgressStages;
199dd1f28b8SManojkiran Eda         auto currHostState = sdbusplus::message::convert_from_string<Stages>(
200dd1f28b8SManojkiran Eda                                  std::get<std::string>(propVal))
201dd1f28b8SManojkiran Eda                                  .value();
202dd1f28b8SManojkiran Eda 
203dd1f28b8SManojkiran Eda         if (currHostState != Stages::SystemInitComplete &&
204dd1f28b8SManojkiran Eda             currHostState != Stages::OSRunning &&
205dd1f28b8SManojkiran Eda             currHostState != Stages::SystemSetup &&
206dd1f28b8SManojkiran Eda             currHostState != Stages::OEM)
207dd1f28b8SManojkiran Eda         {
208dd1f28b8SManojkiran Eda             info(
209dd1f28b8SManojkiran Eda                 "Remote terminus is not up/active, current remote terminus state is: '{CURRENT_HOST_STATE}'",
210dd1f28b8SManojkiran Eda                 "CURRENT_HOST_STATE", currHostState);
211dd1f28b8SManojkiran Eda             return false;
212dd1f28b8SManojkiran Eda         }
213dd1f28b8SManojkiran Eda     }
214dd1f28b8SManojkiran Eda     catch (const sdbusplus::exception_t& e)
215dd1f28b8SManojkiran Eda     {
216dd1f28b8SManojkiran Eda         error(
217dd1f28b8SManojkiran Eda             "Error in getting current remote terminus state. Will still continue to set the remote terminus effecter, error - {ERROR}",
218dd1f28b8SManojkiran Eda             "ERROR", e);
219dd1f28b8SManojkiran Eda         return false;
220dd1f28b8SManojkiran Eda     }
221dd1f28b8SManojkiran Eda 
222dd1f28b8SManojkiran Eda     return true;
223dd1f28b8SManojkiran Eda }
224dd1f28b8SManojkiran Eda 
processHostEffecterChangeNotification(const DbusChgHostEffecterProps & chProperties,size_t effecterInfoIndex,size_t dbusInfoIndex,uint16_t effecterId)225dd1f28b8SManojkiran Eda void HostEffecterParser::processHostEffecterChangeNotification(
226dd1f28b8SManojkiran Eda     const DbusChgHostEffecterProps& chProperties, size_t effecterInfoIndex,
227dd1f28b8SManojkiran Eda     size_t dbusInfoIndex, uint16_t effecterId)
228dd1f28b8SManojkiran Eda {
229dd1f28b8SManojkiran Eda     const auto& pdrType = hostEffecterInfo[effecterInfoIndex].effecterPdrType;
230dd1f28b8SManojkiran Eda     if (pdrType == PLDM_NUMERIC_EFFECTER_PDR)
231dd1f28b8SManojkiran Eda     {
232dd1f28b8SManojkiran Eda         processTerminusNumericEffecterChangeNotification(
233dd1f28b8SManojkiran Eda             chProperties, effecterInfoIndex, dbusInfoIndex, effecterId);
234dd1f28b8SManojkiran Eda         return;
235dd1f28b8SManojkiran Eda     }
236dd1f28b8SManojkiran Eda     const auto& propertyName = hostEffecterInfo[effecterInfoIndex]
237dd1f28b8SManojkiran Eda                                    .dbusInfo[dbusInfoIndex]
238dd1f28b8SManojkiran Eda                                    .dbusMap.propertyName;
239dd1f28b8SManojkiran Eda 
240dd1f28b8SManojkiran Eda     const auto& it = chProperties.find(propertyName);
241dd1f28b8SManojkiran Eda 
242dd1f28b8SManojkiran Eda     if (it == chProperties.end())
243dd1f28b8SManojkiran Eda     {
244dd1f28b8SManojkiran Eda         return;
245dd1f28b8SManojkiran Eda     }
246dd1f28b8SManojkiran Eda 
247dd1f28b8SManojkiran Eda     if (effecterId == PLDM_INVALID_EFFECTER_ID)
248dd1f28b8SManojkiran Eda     {
249dd1f28b8SManojkiran Eda         constexpr auto localOrRemote = false;
250dd1f28b8SManojkiran Eda         effecterId = findStateEffecterId(
251dd1f28b8SManojkiran Eda             pdrRepo, hostEffecterInfo[effecterInfoIndex].entityType,
252dd1f28b8SManojkiran Eda             hostEffecterInfo[effecterInfoIndex].entityInstance,
253dd1f28b8SManojkiran Eda             hostEffecterInfo[effecterInfoIndex].containerId,
254dd1f28b8SManojkiran Eda             hostEffecterInfo[effecterInfoIndex]
255dd1f28b8SManojkiran Eda                 .dbusInfo[dbusInfoIndex]
256dd1f28b8SManojkiran Eda                 .state.stateSetId,
257dd1f28b8SManojkiran Eda             localOrRemote);
258dd1f28b8SManojkiran Eda         if (effecterId == PLDM_INVALID_EFFECTER_ID)
259dd1f28b8SManojkiran Eda         {
260dd1f28b8SManojkiran Eda             error(
261dd1f28b8SManojkiran Eda                 "Effecter ID '{EFFECTERID}' of entity type '{TYPE}', entityInstance '{INSTANCE}' and containerID '{CONTAINER_ID}' not found in pdr repo",
262dd1f28b8SManojkiran Eda                 "EFFECTERID", effecterId, "TYPE",
263dd1f28b8SManojkiran Eda                 hostEffecterInfo[effecterInfoIndex].entityType, "INSTANCE",
264dd1f28b8SManojkiran Eda                 hostEffecterInfo[effecterInfoIndex].entityInstance,
265dd1f28b8SManojkiran Eda                 "CONTAINER_ID",
266dd1f28b8SManojkiran Eda                 hostEffecterInfo[effecterInfoIndex].containerId);
267dd1f28b8SManojkiran Eda             return;
268dd1f28b8SManojkiran Eda         }
269dd1f28b8SManojkiran Eda     }
270dd1f28b8SManojkiran Eda 
271dd1f28b8SManojkiran Eda     if (!isHostOn())
272dd1f28b8SManojkiran Eda     {
273dd1f28b8SManojkiran Eda         return;
274dd1f28b8SManojkiran Eda     }
275dd1f28b8SManojkiran Eda 
276dd1f28b8SManojkiran Eda     uint8_t newState{};
277dd1f28b8SManojkiran Eda     try
278dd1f28b8SManojkiran Eda     {
279dd1f28b8SManojkiran Eda         newState =
280dd1f28b8SManojkiran Eda             findNewStateValue(effecterInfoIndex, dbusInfoIndex, it->second);
281dd1f28b8SManojkiran Eda     }
282dd1f28b8SManojkiran Eda     catch (const std::out_of_range& e)
283dd1f28b8SManojkiran Eda     {
284dd1f28b8SManojkiran Eda         error("Failed to find new state '{NEW_STATE}' in json, error - {ERROR}",
285dd1f28b8SManojkiran Eda               "ERROR", e, "NEW_STATE", newState);
286dd1f28b8SManojkiran Eda         return;
287dd1f28b8SManojkiran Eda     }
288dd1f28b8SManojkiran Eda 
289dd1f28b8SManojkiran Eda     std::vector<set_effecter_state_field> stateField;
290dd1f28b8SManojkiran Eda     for (uint8_t i = 0; i < hostEffecterInfo[effecterInfoIndex].compEffecterCnt;
291dd1f28b8SManojkiran Eda          i++)
292dd1f28b8SManojkiran Eda     {
293dd1f28b8SManojkiran Eda         if (i == dbusInfoIndex)
294dd1f28b8SManojkiran Eda         {
295dd1f28b8SManojkiran Eda             stateField.push_back({PLDM_REQUEST_SET, newState});
296dd1f28b8SManojkiran Eda         }
297dd1f28b8SManojkiran Eda         else
298dd1f28b8SManojkiran Eda         {
299dd1f28b8SManojkiran Eda             stateField.push_back({PLDM_NO_CHANGE, 0});
300dd1f28b8SManojkiran Eda         }
301dd1f28b8SManojkiran Eda     }
302dd1f28b8SManojkiran Eda     int rc{};
303dd1f28b8SManojkiran Eda     try
304dd1f28b8SManojkiran Eda     {
305dd1f28b8SManojkiran Eda         rc = setHostStateEffecter(effecterInfoIndex, stateField, effecterId);
306dd1f28b8SManojkiran Eda     }
307dd1f28b8SManojkiran Eda     catch (const std::runtime_error& e)
308dd1f28b8SManojkiran Eda     {
309dd1f28b8SManojkiran Eda         error(
310dd1f28b8SManojkiran Eda             "Failed to set remote terminus state effecter for effecter ID '{EFFECTERID}', error - {ERROR}",
311dd1f28b8SManojkiran Eda             "ERROR", e, "EFFECTERID", effecterId);
312dd1f28b8SManojkiran Eda         return;
313dd1f28b8SManojkiran Eda     }
314dd1f28b8SManojkiran Eda     if (rc != PLDM_SUCCESS)
315dd1f28b8SManojkiran Eda     {
316dd1f28b8SManojkiran Eda         error(
317dd1f28b8SManojkiran Eda             "Failed to set the remote terminus state effecter for effecter ID '{EFFECTERID}', response code '{RC}'",
318dd1f28b8SManojkiran Eda             "EFFECTERID", effecterId, "RC", rc);
319dd1f28b8SManojkiran Eda     }
320dd1f28b8SManojkiran Eda }
321dd1f28b8SManojkiran Eda 
adjustValue(double value,double offset,double resolution,int8_t modify)322dd1f28b8SManojkiran Eda double HostEffecterParser::adjustValue(double value, double offset,
323dd1f28b8SManojkiran Eda                                        double resolution, int8_t modify)
324dd1f28b8SManojkiran Eda {
325dd1f28b8SManojkiran Eda     double unitModifier = std::pow(10, signed(modify));
326dd1f28b8SManojkiran Eda     return std::round((value - offset) * resolution / unitModifier);
327dd1f28b8SManojkiran Eda }
328dd1f28b8SManojkiran Eda 
processTerminusNumericEffecterChangeNotification(const DbusChgHostEffecterProps & chProperties,size_t effecterInfoIndex,size_t dbusInfoIndex,uint16_t effecterId)329dd1f28b8SManojkiran Eda void HostEffecterParser::processTerminusNumericEffecterChangeNotification(
330dd1f28b8SManojkiran Eda     const DbusChgHostEffecterProps& chProperties, size_t effecterInfoIndex,
331dd1f28b8SManojkiran Eda     size_t dbusInfoIndex, uint16_t effecterId)
332dd1f28b8SManojkiran Eda {
333dd1f28b8SManojkiran Eda     const auto& checkHost = hostEffecterInfo[effecterInfoIndex].checkHostState;
334dd1f28b8SManojkiran Eda     const auto& propValues = hostEffecterInfo[effecterInfoIndex]
335dd1f28b8SManojkiran Eda                                  .dbusNumericEffecterInfo[dbusInfoIndex];
336dd1f28b8SManojkiran Eda     const auto& propertyName = propValues.dbusMap.propertyName;
337dd1f28b8SManojkiran Eda     const auto& propertyType = propValues.dbusMap.propertyType;
338dd1f28b8SManojkiran Eda 
339dd1f28b8SManojkiran Eda     if (effecterId == PLDM_INVALID_EFFECTER_ID)
340dd1f28b8SManojkiran Eda     {
341dd1f28b8SManojkiran Eda         lg2::error(
342dd1f28b8SManojkiran Eda             "Dbus to PLDM Numeric Effecter setting requires valid effecter ID. Invalid effecter ID {EFFECTER_ID}",
343dd1f28b8SManojkiran Eda             "EFFECTER_ID", effecterId);
344dd1f28b8SManojkiran Eda     }
345dd1f28b8SManojkiran Eda 
346dd1f28b8SManojkiran Eda     if (!dbusValueNumericTypeNames.contains(propertyType))
347dd1f28b8SManojkiran Eda     {
348dd1f28b8SManojkiran Eda         lg2::error(
349dd1f28b8SManojkiran Eda             "DBus Value to PLDM Numeric Effecter setting only supports D-Bus Numeric data type. Invalid type {TYPE}",
350dd1f28b8SManojkiran Eda             "TYPE", propertyType);
351dd1f28b8SManojkiran Eda         return;
352dd1f28b8SManojkiran Eda     }
353dd1f28b8SManojkiran Eda 
354dd1f28b8SManojkiran Eda     const auto& it = chProperties.find(propertyName);
355dd1f28b8SManojkiran Eda 
356dd1f28b8SManojkiran Eda     if (it == chProperties.end())
357dd1f28b8SManojkiran Eda     {
358dd1f28b8SManojkiran Eda         return;
359dd1f28b8SManojkiran Eda     }
360dd1f28b8SManojkiran Eda 
361dd1f28b8SManojkiran Eda     double val = std::numeric_limits<double>::quiet_NaN();
362dd1f28b8SManojkiran Eda     if (!pldm::utils::dbusPropValuesToDouble(propertyType, it->second, &val))
363dd1f28b8SManojkiran Eda     {
364dd1f28b8SManojkiran Eda         lg2::error(
365dd1f28b8SManojkiran Eda             "DBus Value to PLDM Numeric Effecter setting only supports Numeric D-Bus data type. Invalid type {TYPE}",
366dd1f28b8SManojkiran Eda             "TYPE", propertyType);
367dd1f28b8SManojkiran Eda         return;
368dd1f28b8SManojkiran Eda     }
369dd1f28b8SManojkiran Eda 
370dd1f28b8SManojkiran Eda     /* Update the current value of D-Bus interface*/
371dd1f28b8SManojkiran Eda     if (std::isfinite(val) && !std::isfinite(propValues.propertyValue))
372dd1f28b8SManojkiran Eda     {
373dd1f28b8SManojkiran Eda         hostEffecterInfo[effecterInfoIndex]
374dd1f28b8SManojkiran Eda             .dbusNumericEffecterInfo[dbusInfoIndex]
375dd1f28b8SManojkiran Eda             .propertyValue = val;
376dd1f28b8SManojkiran Eda         return;
377dd1f28b8SManojkiran Eda     }
378dd1f28b8SManojkiran Eda 
379dd1f28b8SManojkiran Eda     /* Bypass the setting when the current value is NA or setting value is NA */
380dd1f28b8SManojkiran Eda     if (!std::isfinite(propValues.propertyValue) || !std::isfinite(val))
381dd1f28b8SManojkiran Eda     {
382dd1f28b8SManojkiran Eda         return;
383dd1f28b8SManojkiran Eda     }
384dd1f28b8SManojkiran Eda 
385dd1f28b8SManojkiran Eda     /* Setting value equals the D-Bus value which is real value of effecter */
386dd1f28b8SManojkiran Eda     if (val == propValues.propertyValue)
387dd1f28b8SManojkiran Eda     {
388dd1f28b8SManojkiran Eda         return;
389dd1f28b8SManojkiran Eda     }
390dd1f28b8SManojkiran Eda 
391dd1f28b8SManojkiran Eda     double rawValue = adjustValue(val, propValues.offset, propValues.resolution,
392dd1f28b8SManojkiran Eda                                   propValues.unitModifier);
393dd1f28b8SManojkiran Eda 
394dd1f28b8SManojkiran Eda     if (checkHost && !isHostOn())
395dd1f28b8SManojkiran Eda     {
396dd1f28b8SManojkiran Eda         return;
397dd1f28b8SManojkiran Eda     }
398dd1f28b8SManojkiran Eda 
399dd1f28b8SManojkiran Eda     try
400dd1f28b8SManojkiran Eda     {
401dd1f28b8SManojkiran Eda         auto rc = setTerminusNumericEffecter(effecterInfoIndex, effecterId,
402dd1f28b8SManojkiran Eda                                              propValues.dataSize, rawValue);
403dd1f28b8SManojkiran Eda         if (rc)
404dd1f28b8SManojkiran Eda         {
405dd1f28b8SManojkiran Eda             error(
406dd1f28b8SManojkiran Eda                 "Could not set the numeric effecter ID '{EFFECTERID}' return code '{RC}'",
407dd1f28b8SManojkiran Eda                 "EFFECTERID", effecterId, "RC", rc);
408dd1f28b8SManojkiran Eda             return;
409dd1f28b8SManojkiran Eda         }
410dd1f28b8SManojkiran Eda     }
411dd1f28b8SManojkiran Eda     catch (const std::runtime_error& e)
412dd1f28b8SManojkiran Eda     {
413dd1f28b8SManojkiran Eda         error("Could not set numeric effecter ID= '{EFFECTERID}'", "EFFECTERID",
414dd1f28b8SManojkiran Eda               effecterId);
415dd1f28b8SManojkiran Eda         return;
416dd1f28b8SManojkiran Eda     }
417dd1f28b8SManojkiran Eda 
418dd1f28b8SManojkiran Eda     hostEffecterInfo[effecterInfoIndex]
419dd1f28b8SManojkiran Eda         .dbusNumericEffecterInfo[dbusInfoIndex]
420dd1f28b8SManojkiran Eda         .propertyValue = val;
421dd1f28b8SManojkiran Eda 
422dd1f28b8SManojkiran Eda     return;
423dd1f28b8SManojkiran Eda }
424dd1f28b8SManojkiran Eda 
findNewStateValue(size_t effecterInfoIndex,size_t dbusInfoIndex,const PropertyValue & propertyValue)425dd1f28b8SManojkiran Eda uint8_t HostEffecterParser::findNewStateValue(
426dd1f28b8SManojkiran Eda     size_t effecterInfoIndex, size_t dbusInfoIndex,
427dd1f28b8SManojkiran Eda     const PropertyValue& propertyValue)
428dd1f28b8SManojkiran Eda {
429dd1f28b8SManojkiran Eda     const auto& propValues = hostEffecterInfo[effecterInfoIndex]
430dd1f28b8SManojkiran Eda                                  .dbusInfo[dbusInfoIndex]
431dd1f28b8SManojkiran Eda                                  .propertyValues;
432dd1f28b8SManojkiran Eda     auto it = std::find(propValues.begin(), propValues.end(), propertyValue);
433dd1f28b8SManojkiran Eda     uint8_t newState{};
434dd1f28b8SManojkiran Eda     if (it != propValues.end())
435dd1f28b8SManojkiran Eda     {
436dd1f28b8SManojkiran Eda         auto index = std::distance(propValues.begin(), it);
437dd1f28b8SManojkiran Eda         newState = hostEffecterInfo[effecterInfoIndex]
438dd1f28b8SManojkiran Eda                        .dbusInfo[dbusInfoIndex]
439dd1f28b8SManojkiran Eda                        .state.states[index];
440dd1f28b8SManojkiran Eda     }
441dd1f28b8SManojkiran Eda     else
442dd1f28b8SManojkiran Eda     {
443dd1f28b8SManojkiran Eda         throw std::out_of_range("new state not found in json");
444dd1f28b8SManojkiran Eda     }
445dd1f28b8SManojkiran Eda     return newState;
446dd1f28b8SManojkiran Eda }
447dd1f28b8SManojkiran Eda 
getEffecterDataSize(uint8_t effecterDataSize)448dd1f28b8SManojkiran Eda size_t getEffecterDataSize(uint8_t effecterDataSize)
449dd1f28b8SManojkiran Eda {
450dd1f28b8SManojkiran Eda     switch (effecterDataSize)
451dd1f28b8SManojkiran Eda     {
452dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_UINT8:
453dd1f28b8SManojkiran Eda             return sizeof(uint8_t);
454dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_SINT8:
455dd1f28b8SManojkiran Eda             return sizeof(int8_t);
456dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_UINT16:
457dd1f28b8SManojkiran Eda             return sizeof(uint16_t);
458dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_SINT16:
459dd1f28b8SManojkiran Eda             return sizeof(int16_t);
460dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_UINT32:
461dd1f28b8SManojkiran Eda             return sizeof(uint32_t);
462dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_SINT32:
463dd1f28b8SManojkiran Eda             return sizeof(int32_t);
464dd1f28b8SManojkiran Eda         default:
465dd1f28b8SManojkiran Eda             return 0;
466dd1f28b8SManojkiran Eda     }
467dd1f28b8SManojkiran Eda }
468dd1f28b8SManojkiran Eda 
setTerminusNumericEffecter(size_t effecterInfoIndex,uint16_t effecterId,uint8_t dataSize,double rawValue)469dd1f28b8SManojkiran Eda int HostEffecterParser::setTerminusNumericEffecter(
470dd1f28b8SManojkiran Eda     size_t effecterInfoIndex, uint16_t effecterId, uint8_t dataSize,
471dd1f28b8SManojkiran Eda     double rawValue)
472dd1f28b8SManojkiran Eda {
473dd1f28b8SManojkiran Eda     std::string terminusName = hostEffecterInfo[effecterInfoIndex].terminusName;
474dd1f28b8SManojkiran Eda     uint8_t& mctpEid = hostEffecterInfo[effecterInfoIndex].mctpEid;
475dd1f28b8SManojkiran Eda     if (!terminusName.empty())
476dd1f28b8SManojkiran Eda     {
477dd1f28b8SManojkiran Eda         auto tmpEid = platformManager->getActiveEidByName(terminusName);
478dd1f28b8SManojkiran Eda         if (tmpEid)
479dd1f28b8SManojkiran Eda         {
480dd1f28b8SManojkiran Eda             mctpEid = tmpEid.value();
481dd1f28b8SManojkiran Eda         }
482dd1f28b8SManojkiran Eda     }
483dd1f28b8SManojkiran Eda 
484*22bcb07dSManojKiran Eda     auto instanceId = instanceIdDb->next(mctpEid);
485dd1f28b8SManojkiran Eda     int rc = PLDM_ERROR;
486dd1f28b8SManojkiran Eda     std::vector<uint8_t> requestMsg;
487dd1f28b8SManojkiran Eda 
488dd1f28b8SManojkiran Eda     /**
489dd1f28b8SManojkiran Eda      * PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES = 4. It includes the 1 byte
490dd1f28b8SManojkiran Eda      * value for effecterValue as `Table 48 - SetNumericEffecterValue command
491dd1f28b8SManojkiran Eda      * format` DSP0248 V1.3.0 So the payload_length of `SetNumericEffecterValue`
492dd1f28b8SManojkiran Eda      * request message will be payload_length =
493dd1f28b8SManojkiran Eda      * PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES - 1 + sizeof(dataType)
494dd1f28b8SManojkiran Eda      */
495dd1f28b8SManojkiran Eda     size_t payload_length = PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES - 1 +
496dd1f28b8SManojkiran Eda                             getEffecterDataSize(dataSize);
497dd1f28b8SManojkiran Eda     requestMsg.resize(sizeof(pldm_msg_hdr) + payload_length);
498dd1f28b8SManojkiran Eda     auto request = new (requestMsg.data()) pldm_msg;
499dd1f28b8SManojkiran Eda     switch (dataSize)
500dd1f28b8SManojkiran Eda     {
501dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_UINT8:
502dd1f28b8SManojkiran Eda         {
503dd1f28b8SManojkiran Eda             auto value_uint8 = (uint8_t)rawValue;
504dd1f28b8SManojkiran Eda             rc = encode_set_numeric_effecter_value_req(
505dd1f28b8SManojkiran Eda                 instanceId, effecterId, dataSize,
506dd1f28b8SManojkiran Eda                 reinterpret_cast<uint8_t*>(&value_uint8), request,
507dd1f28b8SManojkiran Eda                 payload_length);
508dd1f28b8SManojkiran Eda             break;
509dd1f28b8SManojkiran Eda         }
510dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_SINT8:
511dd1f28b8SManojkiran Eda         {
512dd1f28b8SManojkiran Eda             auto value_int8 = (int8_t)rawValue;
513dd1f28b8SManojkiran Eda             rc = encode_set_numeric_effecter_value_req(
514dd1f28b8SManojkiran Eda                 instanceId, effecterId, dataSize,
515dd1f28b8SManojkiran Eda                 reinterpret_cast<uint8_t*>(&value_int8), request,
516dd1f28b8SManojkiran Eda                 payload_length);
517dd1f28b8SManojkiran Eda             break;
518dd1f28b8SManojkiran Eda         }
519dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_UINT16:
520dd1f28b8SManojkiran Eda         {
521dd1f28b8SManojkiran Eda             auto value_uint16 = (uint16_t)rawValue;
522dd1f28b8SManojkiran Eda             rc = encode_set_numeric_effecter_value_req(
523dd1f28b8SManojkiran Eda                 instanceId, effecterId, dataSize,
524dd1f28b8SManojkiran Eda                 reinterpret_cast<uint8_t*>(&value_uint16), request,
525dd1f28b8SManojkiran Eda                 payload_length);
526dd1f28b8SManojkiran Eda             break;
527dd1f28b8SManojkiran Eda         }
528dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_SINT16:
529dd1f28b8SManojkiran Eda         {
530dd1f28b8SManojkiran Eda             auto value_int16 = (int16_t)rawValue;
531dd1f28b8SManojkiran Eda             rc = encode_set_numeric_effecter_value_req(
532dd1f28b8SManojkiran Eda                 instanceId, effecterId, dataSize,
533dd1f28b8SManojkiran Eda                 reinterpret_cast<uint8_t*>(&value_int16), request,
534dd1f28b8SManojkiran Eda                 payload_length);
535dd1f28b8SManojkiran Eda             break;
536dd1f28b8SManojkiran Eda         }
537dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_UINT32:
538dd1f28b8SManojkiran Eda         {
539dd1f28b8SManojkiran Eda             auto value_uint32 = (uint32_t)rawValue;
540dd1f28b8SManojkiran Eda             rc = encode_set_numeric_effecter_value_req(
541dd1f28b8SManojkiran Eda                 instanceId, effecterId, dataSize,
542dd1f28b8SManojkiran Eda                 reinterpret_cast<uint8_t*>(&value_uint32), request,
543dd1f28b8SManojkiran Eda                 payload_length);
544dd1f28b8SManojkiran Eda             break;
545dd1f28b8SManojkiran Eda         }
546dd1f28b8SManojkiran Eda         case PLDM_EFFECTER_DATA_SIZE_SINT32:
547dd1f28b8SManojkiran Eda         {
548dd1f28b8SManojkiran Eda             auto value_int32 = (int32_t)rawValue;
549dd1f28b8SManojkiran Eda             rc = encode_set_numeric_effecter_value_req(
550dd1f28b8SManojkiran Eda                 instanceId, effecterId, dataSize,
551dd1f28b8SManojkiran Eda                 reinterpret_cast<uint8_t*>(&value_int32), request,
552dd1f28b8SManojkiran Eda                 payload_length);
553dd1f28b8SManojkiran Eda             break;
554dd1f28b8SManojkiran Eda         }
555dd1f28b8SManojkiran Eda         default:
556dd1f28b8SManojkiran Eda             break;
557dd1f28b8SManojkiran Eda     }
558dd1f28b8SManojkiran Eda 
559dd1f28b8SManojkiran Eda     if (rc)
560dd1f28b8SManojkiran Eda     {
561dd1f28b8SManojkiran Eda         error(
562dd1f28b8SManojkiran Eda             "Failed to encode set numeric effecter request message for effecter ID '{EFFECTERID}' and instanceID '{INSTANCE}' with error code '{RC}'",
563dd1f28b8SManojkiran Eda             "EFFECTERID", effecterId, "INSTANCE", instanceId, "RC", lg2::hex,
564dd1f28b8SManojkiran Eda             rc);
565dd1f28b8SManojkiran Eda 
566dd1f28b8SManojkiran Eda         instanceIdDb->free(mctpEid, instanceId);
567dd1f28b8SManojkiran Eda         return rc;
568dd1f28b8SManojkiran Eda     }
569dd1f28b8SManojkiran Eda 
570dd1f28b8SManojkiran Eda     auto setNumericEffecterRespHandler = [effecterId](mctp_eid_t /*eid*/,
571dd1f28b8SManojkiran Eda                                                       const pldm_msg* response,
572dd1f28b8SManojkiran Eda                                                       size_t respMsgLen) {
573dd1f28b8SManojkiran Eda         if (response == nullptr || !respMsgLen)
574dd1f28b8SManojkiran Eda         {
575dd1f28b8SManojkiran Eda             error(
576dd1f28b8SManojkiran Eda                 "Failed to receive response for setNumericEffecterValue command");
577dd1f28b8SManojkiran Eda             return;
578dd1f28b8SManojkiran Eda         }
579dd1f28b8SManojkiran Eda         uint8_t completionCode{};
580dd1f28b8SManojkiran Eda         auto rc = decode_set_numeric_effecter_value_resp(response, respMsgLen,
581dd1f28b8SManojkiran Eda                                                          &completionCode);
582dd1f28b8SManojkiran Eda 
583dd1f28b8SManojkiran Eda         if (rc)
584dd1f28b8SManojkiran Eda         {
585dd1f28b8SManojkiran Eda             error(
586dd1f28b8SManojkiran Eda                 "Failed to decode set numeric effecter response message for effecter ID '{EFFECTERID}' with error code '{RC}'",
587dd1f28b8SManojkiran Eda                 "EFFECTERID", effecterId, "RC", lg2::hex, rc);
588dd1f28b8SManojkiran Eda         }
589dd1f28b8SManojkiran Eda         if (completionCode)
590dd1f28b8SManojkiran Eda         {
591dd1f28b8SManojkiran Eda             error(
592dd1f28b8SManojkiran Eda                 "Failed to set numeric effecter for effecter ID '{EFFECTERID}' with complete code '{CC}'",
593dd1f28b8SManojkiran Eda                 "EFFECTERID", effecterId, "CC", lg2::hex, completionCode);
594dd1f28b8SManojkiran Eda         }
595dd1f28b8SManojkiran Eda     };
596dd1f28b8SManojkiran Eda 
597dd1f28b8SManojkiran Eda     rc = handler->registerRequest(
598dd1f28b8SManojkiran Eda         mctpEid, instanceId, PLDM_PLATFORM, PLDM_SET_NUMERIC_EFFECTER_VALUE,
599dd1f28b8SManojkiran Eda         std::move(requestMsg), std::move(setNumericEffecterRespHandler));
600dd1f28b8SManojkiran Eda     if (rc)
601dd1f28b8SManojkiran Eda     {
602dd1f28b8SManojkiran Eda         error("Failed to send request to set an effecter on Host");
603dd1f28b8SManojkiran Eda     }
604dd1f28b8SManojkiran Eda     return rc;
605dd1f28b8SManojkiran Eda }
606dd1f28b8SManojkiran Eda 
setHostStateEffecter(size_t effecterInfoIndex,std::vector<set_effecter_state_field> & stateField,uint16_t effecterId)607dd1f28b8SManojkiran Eda int HostEffecterParser::setHostStateEffecter(
608dd1f28b8SManojkiran Eda     size_t effecterInfoIndex, std::vector<set_effecter_state_field>& stateField,
609dd1f28b8SManojkiran Eda     uint16_t effecterId)
610dd1f28b8SManojkiran Eda {
611dd1f28b8SManojkiran Eda     std::string terminusName = hostEffecterInfo[effecterInfoIndex].terminusName;
612dd1f28b8SManojkiran Eda     uint8_t& mctpEid = hostEffecterInfo[effecterInfoIndex].mctpEid;
613dd1f28b8SManojkiran Eda     if (!terminusName.empty())
614dd1f28b8SManojkiran Eda     {
615dd1f28b8SManojkiran Eda         auto tmpEid = platformManager->getActiveEidByName(terminusName);
616dd1f28b8SManojkiran Eda         if (tmpEid)
617dd1f28b8SManojkiran Eda         {
618dd1f28b8SManojkiran Eda             mctpEid = tmpEid.value();
619dd1f28b8SManojkiran Eda         }
620dd1f28b8SManojkiran Eda     }
621dd1f28b8SManojkiran Eda 
622dd1f28b8SManojkiran Eda     uint8_t& compEffCnt = hostEffecterInfo[effecterInfoIndex].compEffecterCnt;
623*22bcb07dSManojKiran Eda     auto instanceId = instanceIdDb->next(mctpEid);
624dd1f28b8SManojkiran Eda 
625dd1f28b8SManojkiran Eda     std::vector<uint8_t> requestMsg(
626dd1f28b8SManojkiran Eda         sizeof(pldm_msg_hdr) + sizeof(effecterId) + sizeof(compEffCnt) +
627dd1f28b8SManojkiran Eda             sizeof(set_effecter_state_field) * compEffCnt,
628dd1f28b8SManojkiran Eda         0);
629dd1f28b8SManojkiran Eda     auto request = new (requestMsg.data()) pldm_msg;
630dd1f28b8SManojkiran Eda     auto rc = encode_set_state_effecter_states_req(
631dd1f28b8SManojkiran Eda         instanceId, effecterId, compEffCnt, stateField.data(), request);
632dd1f28b8SManojkiran Eda 
633dd1f28b8SManojkiran Eda     if (rc != PLDM_SUCCESS)
634dd1f28b8SManojkiran Eda     {
635dd1f28b8SManojkiran Eda         error(
636dd1f28b8SManojkiran Eda             "Failed to encode set state effecter states message for effecter ID '{EFFECTERID}' and instanceID '{INSTANCE}' with response code '{RC}'",
637dd1f28b8SManojkiran Eda             "EFFECTERID", effecterId, "INSTANCE", instanceId, "RC", lg2::hex,
638dd1f28b8SManojkiran Eda             rc);
639dd1f28b8SManojkiran Eda         instanceIdDb->free(mctpEid, instanceId);
640dd1f28b8SManojkiran Eda         return rc;
641dd1f28b8SManojkiran Eda     }
642dd1f28b8SManojkiran Eda 
643dd1f28b8SManojkiran Eda     auto setStateEffecterStatesRespHandler = [](mctp_eid_t /*eid*/,
644dd1f28b8SManojkiran Eda                                                 const pldm_msg* response,
645dd1f28b8SManojkiran Eda                                                 size_t respMsgLen) {
646dd1f28b8SManojkiran Eda         if (response == nullptr || !respMsgLen)
647dd1f28b8SManojkiran Eda         {
648dd1f28b8SManojkiran Eda             error(
649dd1f28b8SManojkiran Eda                 "Failed to receive response for setting state effecter states.");
650dd1f28b8SManojkiran Eda             return;
651dd1f28b8SManojkiran Eda         }
652dd1f28b8SManojkiran Eda         uint8_t completionCode{};
653dd1f28b8SManojkiran Eda         auto rc = decode_set_state_effecter_states_resp(response, respMsgLen,
654dd1f28b8SManojkiran Eda                                                         &completionCode);
655dd1f28b8SManojkiran Eda         if (rc)
656dd1f28b8SManojkiran Eda         {
657dd1f28b8SManojkiran Eda             error(
658dd1f28b8SManojkiran Eda                 "Failed to decode response of set state effecter states, response code '{RC}'",
659dd1f28b8SManojkiran Eda                 "RC", rc);
660dd1f28b8SManojkiran Eda             pldm::utils::reportError(
661dd1f28b8SManojkiran Eda                 "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed");
662dd1f28b8SManojkiran Eda         }
663dd1f28b8SManojkiran Eda         if (completionCode)
664dd1f28b8SManojkiran Eda         {
665dd1f28b8SManojkiran Eda             error(
666dd1f28b8SManojkiran Eda                 "Failed to set a remote terminus effecter, completion code '{CC}'",
667dd1f28b8SManojkiran Eda                 "CC", completionCode);
668dd1f28b8SManojkiran Eda             pldm::utils::reportError(
669dd1f28b8SManojkiran Eda                 "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed");
670dd1f28b8SManojkiran Eda         }
671dd1f28b8SManojkiran Eda     };
672dd1f28b8SManojkiran Eda 
673dd1f28b8SManojkiran Eda     rc = handler->registerRequest(
674dd1f28b8SManojkiran Eda         mctpEid, instanceId, PLDM_PLATFORM, PLDM_SET_STATE_EFFECTER_STATES,
675dd1f28b8SManojkiran Eda         std::move(requestMsg), std::move(setStateEffecterStatesRespHandler));
676dd1f28b8SManojkiran Eda     if (rc)
677dd1f28b8SManojkiran Eda     {
678dd1f28b8SManojkiran Eda         error(
679dd1f28b8SManojkiran Eda             "Failed to send request to set an effecter on remote terminus for effecter ID '{EFFECTERID}', response code '{RC}'",
680dd1f28b8SManojkiran Eda             "EFFECTERID", effecterId, "RC", rc);
681dd1f28b8SManojkiran Eda     }
682dd1f28b8SManojkiran Eda     return rc;
683dd1f28b8SManojkiran Eda }
684dd1f28b8SManojkiran Eda 
createHostEffecterMatch(const std::string & objectPath,const std::string & interface,size_t effecterInfoIndex,size_t dbusInfoIndex,uint16_t effecterId)685dd1f28b8SManojkiran Eda void HostEffecterParser::createHostEffecterMatch(
686dd1f28b8SManojkiran Eda     const std::string& objectPath, const std::string& interface,
687dd1f28b8SManojkiran Eda     size_t effecterInfoIndex, size_t dbusInfoIndex, uint16_t effecterId)
688dd1f28b8SManojkiran Eda {
689dd1f28b8SManojkiran Eda     using namespace sdbusplus::bus::match::rules;
690dd1f28b8SManojkiran Eda     effecterInfoMatch.emplace_back(std::make_unique<sdbusplus::bus::match_t>(
691dd1f28b8SManojkiran Eda         pldm::utils::DBusHandler::getBus(),
692dd1f28b8SManojkiran Eda         propertiesChanged(objectPath, interface),
693dd1f28b8SManojkiran Eda         [this, effecterInfoIndex, dbusInfoIndex,
694dd1f28b8SManojkiran Eda          effecterId](sdbusplus::message_t& msg) {
695dd1f28b8SManojkiran Eda             DbusChgHostEffecterProps props;
696dd1f28b8SManojkiran Eda             std::string iface;
697dd1f28b8SManojkiran Eda             msg.read(iface, props);
698dd1f28b8SManojkiran Eda             processHostEffecterChangeNotification(props, effecterInfoIndex,
699dd1f28b8SManojkiran Eda                                                   dbusInfoIndex, effecterId);
700dd1f28b8SManojkiran Eda         }));
701dd1f28b8SManojkiran Eda }
702dd1f28b8SManojkiran Eda 
703dd1f28b8SManojkiran Eda } // namespace host_effecters
704dd1f28b8SManojkiran Eda } // namespace pldm
705