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