1557dfb00SDeepak Kodihalli #include "platform.hpp"
2557dfb00SDeepak Kodihalli 
3b70a1964STom Joseph #include "common/types.hpp"
4d130e1a3SDeepak Kodihalli #include "common/utils.hpp"
5c4959c3cSTom Joseph #include "event_parser.hpp"
612afe110SSampa Misra #include "pdr.hpp"
7456c9a2fSGeorge Liu #include "pdr_numeric_effecter.hpp"
8a2870726SGeorge Liu #include "pdr_state_effecter.hpp"
9adbe1726SGeorge Liu #include "pdr_state_sensor.hpp"
10362c18ddSGeorge Liu #include "pdr_utils.hpp"
11eccb0c56SGeorge Liu #include "platform_numeric_effecter.hpp"
120d7aca8cSGeorge Liu #include "platform_state_effecter.hpp"
13362c18ddSGeorge Liu #include "platform_state_sensor.hpp"
1490314a3fSSagar Srinivas #include "pldmd/dbus_impl_requester.hpp"
1590314a3fSSagar Srinivas #include "pldmd/handler.hpp"
1690314a3fSSagar Srinivas #include "requester/handler.hpp"
1783409573SGeorge Liu 
18c453e164SGeorge Liu #include <libpldm/entity.h>
19c453e164SGeorge Liu #include <libpldm/state_set.h>
20cc5f1586SManojkiran Eda 
2149cfb138SRiya Dixit #include <phosphor-logging/lg2.hpp>
2249cfb138SRiya Dixit 
2349cfb138SRiya Dixit PHOSPHOR_LOG2_USING;
2449cfb138SRiya Dixit 
255079ac4aSBrad Bishop using namespace pldm::utils;
265079ac4aSBrad Bishop using namespace pldm::responder::pdr;
275079ac4aSBrad Bishop using namespace pldm::responder::pdr_utils;
285079ac4aSBrad Bishop 
29557dfb00SDeepak Kodihalli namespace pldm
30557dfb00SDeepak Kodihalli {
31557dfb00SDeepak Kodihalli namespace responder
32557dfb00SDeepak Kodihalli {
33a2fa0709SSampa Misra namespace platform
34a2fa0709SSampa Misra {
35c682fe2dSDeepak Kodihalli using InternalFailure =
36c682fe2dSDeepak Kodihalli     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
37c682fe2dSDeepak Kodihalli 
381ec85d4bSGeorge Liu static const Json empty{};
391ec85d4bSGeorge Liu 
addDbusObjMaps(uint16_t id,std::tuple<pdr_utils::DbusMappings,pdr_utils::DbusValMaps> dbusObj,TypeId typeId)40a2870726SGeorge Liu void Handler::addDbusObjMaps(
41adbe1726SGeorge Liu     uint16_t id,
42adbe1726SGeorge Liu     std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps> dbusObj,
43adbe1726SGeorge Liu     TypeId typeId)
441ec85d4bSGeorge Liu {
45adbe1726SGeorge Liu     if (typeId == TypeId::PLDM_SENSOR_ID)
46adbe1726SGeorge Liu     {
47adbe1726SGeorge Liu         sensorDbusObjMaps.emplace(id, dbusObj);
48adbe1726SGeorge Liu     }
49adbe1726SGeorge Liu     else
50adbe1726SGeorge Liu     {
51adbe1726SGeorge Liu         effecterDbusObjMaps.emplace(id, dbusObj);
52adbe1726SGeorge Liu     }
531ec85d4bSGeorge Liu }
541ec85d4bSGeorge Liu 
55a2870726SGeorge Liu const std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>&
getDbusObjMaps(uint16_t id,TypeId typeId) const56adbe1726SGeorge Liu     Handler::getDbusObjMaps(uint16_t id, TypeId typeId) const
571ec85d4bSGeorge Liu {
58adbe1726SGeorge Liu     if (typeId == TypeId::PLDM_SENSOR_ID)
59adbe1726SGeorge Liu     {
60adbe1726SGeorge Liu         return sensorDbusObjMaps.at(id);
61adbe1726SGeorge Liu     }
62adbe1726SGeorge Liu     else
63adbe1726SGeorge Liu     {
64adbe1726SGeorge Liu         return effecterDbusObjMaps.at(id);
65adbe1726SGeorge Liu     }
661ec85d4bSGeorge Liu }
671ec85d4bSGeorge Liu 
generate(const pldm::utils::DBusHandler & dBusIntf,const std::vector<fs::path> & dir,Repo & repo)6836e81352SGeorge Liu void Handler::generate(const pldm::utils::DBusHandler& dBusIntf,
693c50c82aSKamalkumar Patel                        const std::vector<fs::path>& dir, Repo& repo)
70c682fe2dSDeepak Kodihalli {
713c50c82aSKamalkumar Patel     for (const auto& directory : dir)
723c50c82aSKamalkumar Patel     {
7389644441SRiya Dixit         info("Checking if directory '{DIRECTORY}' exists", "DIRECTORY",
7489644441SRiya Dixit              directory);
753c50c82aSKamalkumar Patel         if (!fs::exists(directory))
76c6e49c4fSDeepak Kodihalli         {
77c6e49c4fSDeepak Kodihalli             return;
78c6e49c4fSDeepak Kodihalli         }
793c50c82aSKamalkumar Patel     }
80c6e49c4fSDeepak Kodihalli 
81c682fe2dSDeepak Kodihalli     // A map of PDR type to a lambda that handles creation of that PDR type.
82c682fe2dSDeepak Kodihalli     // The lambda essentially would parse the platform specific PDR JSONs to
83c682fe2dSDeepak Kodihalli     // generate the PDR structures. This function iterates through the map to
84c682fe2dSDeepak Kodihalli     // invoke all lambdas, so that all PDR types can be created.
85a2870726SGeorge Liu 
86a675662cSPatrick Williams     const std::map<Type, generatePDR> generateHandlers = {
87a675662cSPatrick Williams         {PLDM_STATE_EFFECTER_PDR,
88a675662cSPatrick Williams          [this](const DBusHandler& dBusIntf, const auto& json,
89a675662cSPatrick Williams                 RepoInterface& repo) {
906da4f91bSPatrick Williams         pdr_state_effecter::generateStateEffecterPDR<pldm::utils::DBusHandler,
916da4f91bSPatrick Williams                                                      Handler>(dBusIntf, json,
926da4f91bSPatrick Williams                                                               *this, repo);
93456c9a2fSGeorge Liu     }},
94456c9a2fSGeorge Liu         {PLDM_NUMERIC_EFFECTER_PDR,
95a675662cSPatrick Williams          [this](const DBusHandler& dBusIntf, const auto& json,
96a675662cSPatrick Williams                 RepoInterface& repo) {
9736e81352SGeorge Liu         pdr_numeric_effecter::generateNumericEffecterPDR<
986da4f91bSPatrick Williams             pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this, repo);
99adbe1726SGeorge Liu     }},
100adbe1726SGeorge Liu         {PLDM_STATE_SENSOR_PDR, [this](const DBusHandler& dBusIntf,
101adbe1726SGeorge Liu                                        const auto& json, RepoInterface& repo) {
102adbe1726SGeorge Liu         pdr_state_sensor::generateStateSensorPDR<pldm::utils::DBusHandler,
103a675662cSPatrick Williams                                                  Handler>(dBusIntf, json, *this,
104a675662cSPatrick Williams                                                           repo);
105c682fe2dSDeepak Kodihalli     }}};
106c682fe2dSDeepak Kodihalli 
107c682fe2dSDeepak Kodihalli     Type pdrType{};
1083c50c82aSKamalkumar Patel     for (const auto& directory : dir)
1093c50c82aSKamalkumar Patel     {
1103c50c82aSKamalkumar Patel         for (const auto& dirEntry : fs::directory_iterator(directory))
111c682fe2dSDeepak Kodihalli         {
112c682fe2dSDeepak Kodihalli             try
113c682fe2dSDeepak Kodihalli             {
1143c50c82aSKamalkumar Patel                 if (fs::is_regular_file(dirEntry.path().string()))
1153c50c82aSKamalkumar Patel                 {
116c682fe2dSDeepak Kodihalli                     auto json = readJson(dirEntry.path().string());
117c682fe2dSDeepak Kodihalli                     if (!json.empty())
118c682fe2dSDeepak Kodihalli                     {
1191ec85d4bSGeorge Liu                         auto effecterPDRs = json.value("effecterPDRs", empty);
1201ec85d4bSGeorge Liu                         for (const auto& effecter : effecterPDRs)
1211ec85d4bSGeorge Liu                         {
1221ec85d4bSGeorge Liu                             pdrType = effecter.value("pdrType", 0);
1233c50c82aSKamalkumar Patel                             generateHandlers.at(pdrType)(dBusIntf, effecter,
1243c50c82aSKamalkumar Patel                                                          repo);
1251ec85d4bSGeorge Liu                         }
126adbe1726SGeorge Liu 
127adbe1726SGeorge Liu                         auto sensorPDRs = json.value("sensorPDRs", empty);
128adbe1726SGeorge Liu                         for (const auto& sensor : sensorPDRs)
129adbe1726SGeorge Liu                         {
130adbe1726SGeorge Liu                             pdrType = sensor.value("pdrType", 0);
1313c50c82aSKamalkumar Patel                             generateHandlers.at(pdrType)(dBusIntf, sensor,
1323c50c82aSKamalkumar Patel                                                          repo);
1333c50c82aSKamalkumar Patel                         }
134adbe1726SGeorge Liu                     }
135c682fe2dSDeepak Kodihalli                 }
136c682fe2dSDeepak Kodihalli             }
137c682fe2dSDeepak Kodihalli             catch (const InternalFailure& e)
138c682fe2dSDeepak Kodihalli             {
13949cfb138SRiya Dixit                 error(
14089644441SRiya Dixit                     "PDR config directory '{PATH}' does not exist or empty for '{TYPE}' pdr, error - {ERROR}",
14189644441SRiya Dixit                     "PATH", dirEntry.path(), "TYPE", pdrType, "ERROR", e);
142c682fe2dSDeepak Kodihalli             }
143c682fe2dSDeepak Kodihalli             catch (const Json::exception& e)
144c682fe2dSDeepak Kodihalli             {
14589644441SRiya Dixit                 error(
14689644441SRiya Dixit                     "Failed to parse PDR JSON file for '{TYPE}' pdr, error - {ERROR}",
1473c50c82aSKamalkumar Patel                     "TYPE", pdrType, "ERROR", e);
148c682fe2dSDeepak Kodihalli                 pldm::utils::reportError(
1493c50c82aSKamalkumar Patel                     "xyz.openbmc_project.PLDM.Error.Generate.PDRJsonFileParseFail");
150c682fe2dSDeepak Kodihalli             }
151c682fe2dSDeepak Kodihalli             catch (const std::exception& e)
152c682fe2dSDeepak Kodihalli             {
15389644441SRiya Dixit                 error(
15489644441SRiya Dixit                     "Failed to parse PDR JSON file for '{TYPE}' pdr, error - {ERROR}",
1553c50c82aSKamalkumar Patel                     "TYPE", pdrType, "ERROR", e);
156c682fe2dSDeepak Kodihalli                 pldm::utils::reportError(
1573c50c82aSKamalkumar Patel                     "xyz.openbmc_project.PLDM.Error.Generate.PDRJsonFileParseFail");
1583c50c82aSKamalkumar Patel             }
159c682fe2dSDeepak Kodihalli         }
160c682fe2dSDeepak Kodihalli     }
161c682fe2dSDeepak Kodihalli }
16292fb0b55SManojkiran Eda 
getPDR(const pldm_msg * request,size_t payloadLength)163bc669f1bSDeepak Kodihalli Response Handler::getPDR(const pldm_msg* request, size_t payloadLength)
164557dfb00SDeepak Kodihalli {
16599854a70SPavithra Barithaya     if (hostPDRHandler)
16699854a70SPavithra Barithaya     {
16799854a70SPavithra Barithaya         if (hostPDRHandler->isHostUp() && oemPlatformHandler != nullptr)
16899854a70SPavithra Barithaya         {
16999854a70SPavithra Barithaya             auto rc = oemPlatformHandler->checkBMCState();
17099854a70SPavithra Barithaya             if (rc != PLDM_SUCCESS)
17199854a70SPavithra Barithaya             {
17299854a70SPavithra Barithaya                 return ccOnlyResponse(request, PLDM_ERROR_NOT_READY);
17399854a70SPavithra Barithaya             }
17499854a70SPavithra Barithaya         }
17599854a70SPavithra Barithaya     }
17699854a70SPavithra Barithaya 
17799854a70SPavithra Barithaya     // Build FRU table if not built, since entity association PDR's
17899854a70SPavithra Barithaya     // are built when the FRU table is constructed.
17933e9c7eaSTom Joseph     if (fruHandler)
18033e9c7eaSTom Joseph     {
18133e9c7eaSTom Joseph         fruHandler->buildFRUTable();
18233e9c7eaSTom Joseph     }
18333e9c7eaSTom Joseph 
184d680ae03SGeorge Liu     if (!pdrCreated)
185d680ae03SGeorge Liu     {
186d680ae03SGeorge Liu         generateTerminusLocatorPDR(pdrRepo);
1873c50c82aSKamalkumar Patel         if (platformConfigHandler)
1883c50c82aSKamalkumar Patel         {
1893c50c82aSKamalkumar Patel             auto systemType = platformConfigHandler->getPlatformName();
1903c50c82aSKamalkumar Patel             if (systemType.has_value())
1913c50c82aSKamalkumar Patel             {
1923c50c82aSKamalkumar Patel                 // In case of normal poweron , the system type would have been
1933c50c82aSKamalkumar Patel                 // already filled by entity manager when ever BMC reaches Ready
1943c50c82aSKamalkumar Patel                 // state. If this is not filled by time we get a getpdr request
1953c50c82aSKamalkumar Patel                 // we can assume that the entity manager service is not present
1963c50c82aSKamalkumar Patel                 // on this system & continue to build the common PDR's.
1973c50c82aSKamalkumar Patel                 pdrJsonsDir.push_back(pdrJsonDir / systemType.value());
1983c50c82aSKamalkumar Patel             }
1993c50c82aSKamalkumar Patel         }
2003c50c82aSKamalkumar Patel 
20178a225a2SSagar Srinivas         if (oemPlatformHandler != nullptr)
20278a225a2SSagar Srinivas         {
20378a225a2SSagar Srinivas             oemPlatformHandler->buildOEMPDR(pdrRepo);
20478a225a2SSagar Srinivas         }
2053c50c82aSKamalkumar Patel         generate(*dBusIntf, pdrJsonsDir, pdrRepo);
20678a225a2SSagar Srinivas 
207d680ae03SGeorge Liu         pdrCreated = true;
2085eed8e55SGeorge Liu 
2095eed8e55SGeorge Liu         if (dbusToPLDMEventHandler)
2105eed8e55SGeorge Liu         {
2115fb37d57SSampa Misra             deferredGetPDREvent = std::make_unique<sdeventplus::source::Defer>(
2125fb37d57SSampa Misra                 event,
2135fb37d57SSampa Misra                 std::bind(std::mem_fn(&pldm::responder::platform::Handler::
2145fb37d57SSampa Misra                                           _processPostGetPDRActions),
2155fb37d57SSampa Misra                           this, std::placeholders::_1));
2165eed8e55SGeorge Liu         }
217d680ae03SGeorge Liu     }
218d680ae03SGeorge Liu 
219557dfb00SDeepak Kodihalli     Response response(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES, 0);
220557dfb00SDeepak Kodihalli 
221557dfb00SDeepak Kodihalli     if (payloadLength != PLDM_GET_PDR_REQ_BYTES)
222557dfb00SDeepak Kodihalli     {
223fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
224557dfb00SDeepak Kodihalli     }
225557dfb00SDeepak Kodihalli 
226557dfb00SDeepak Kodihalli     uint32_t recordHandle{};
227557dfb00SDeepak Kodihalli     uint32_t dataTransferHandle{};
228557dfb00SDeepak Kodihalli     uint8_t transferOpFlag{};
229557dfb00SDeepak Kodihalli     uint16_t reqSizeBytes{};
230557dfb00SDeepak Kodihalli     uint16_t recordChangeNum{};
231557dfb00SDeepak Kodihalli 
232fb8611dcSGeorge Liu     auto rc = decode_get_pdr_req(request, payloadLength, &recordHandle,
233fb8611dcSGeorge Liu                                  &dataTransferHandle, &transferOpFlag,
234fb8611dcSGeorge Liu                                  &reqSizeBytes, &recordChangeNum);
235fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
236fb8611dcSGeorge Liu     {
237fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
238fb8611dcSGeorge Liu     }
239557dfb00SDeepak Kodihalli 
240557dfb00SDeepak Kodihalli     uint16_t respSizeBytes{};
241557dfb00SDeepak Kodihalli     uint8_t* recordData = nullptr;
242557dfb00SDeepak Kodihalli     try
243557dfb00SDeepak Kodihalli     {
244e53193faSGeorge Liu         pdr_utils::PdrEntry e;
245e53193faSGeorge Liu         auto record = pdr::getRecordByHandle(pdrRepo, recordHandle, e);
246e53193faSGeorge Liu         if (record == NULL)
247e53193faSGeorge Liu         {
248e53193faSGeorge Liu             return CmdHandler::ccOnlyResponse(
249e53193faSGeorge Liu                 request, PLDM_PLATFORM_INVALID_RECORD_HANDLE);
250e53193faSGeorge Liu         }
251e53193faSGeorge Liu 
252557dfb00SDeepak Kodihalli         if (reqSizeBytes)
253557dfb00SDeepak Kodihalli         {
254e53193faSGeorge Liu             respSizeBytes = e.size;
255557dfb00SDeepak Kodihalli             if (respSizeBytes > reqSizeBytes)
256557dfb00SDeepak Kodihalli             {
257557dfb00SDeepak Kodihalli                 respSizeBytes = reqSizeBytes;
258557dfb00SDeepak Kodihalli             }
259e53193faSGeorge Liu             recordData = e.data;
260557dfb00SDeepak Kodihalli         }
261557dfb00SDeepak Kodihalli         response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES +
262557dfb00SDeepak Kodihalli                             respSizeBytes,
263557dfb00SDeepak Kodihalli                         0);
26431a78447SManojkiran Eda         auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
26522b5a7d7SDeepak Kodihalli         rc = encode_get_pdr_resp(
26622b5a7d7SDeepak Kodihalli             request->hdr.instance_id, PLDM_SUCCESS, e.handle.nextRecordHandle,
26722b5a7d7SDeepak Kodihalli             0, PLDM_START_AND_END, respSizeBytes, recordData, 0, responsePtr);
268fb8611dcSGeorge Liu         if (rc != PLDM_SUCCESS)
269fb8611dcSGeorge Liu         {
270fb8611dcSGeorge Liu             return ccOnlyResponse(request, rc);
271fb8611dcSGeorge Liu         }
272557dfb00SDeepak Kodihalli     }
273557dfb00SDeepak Kodihalli     catch (const std::exception& e)
274557dfb00SDeepak Kodihalli     {
27589644441SRiya Dixit         error(
27689644441SRiya Dixit             "Failed to access PDR record handle '{RECORD_HANDLE}', error - {ERROR}",
27789644441SRiya Dixit             "RECORD_HANDLE", recordHandle, "ERROR", e);
278fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR);
279557dfb00SDeepak Kodihalli     }
280557dfb00SDeepak Kodihalli     return response;
281557dfb00SDeepak Kodihalli }
282557dfb00SDeepak Kodihalli 
setStateEffecterStates(const pldm_msg * request,size_t payloadLength)283bc669f1bSDeepak Kodihalli Response Handler::setStateEffecterStates(const pldm_msg* request,
284bc669f1bSDeepak Kodihalli                                          size_t payloadLength)
285a2fa0709SSampa Misra {
286a2fa0709SSampa Misra     Response response(
287a2fa0709SSampa Misra         sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES, 0);
288a2fa0709SSampa Misra     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
289a2fa0709SSampa Misra     uint16_t effecterId;
290a2fa0709SSampa Misra     uint8_t compEffecterCnt;
291a2fa0709SSampa Misra     constexpr auto maxCompositeEffecterCnt = 8;
292a2fa0709SSampa Misra     std::vector<set_effecter_state_field> stateField(maxCompositeEffecterCnt,
293a2fa0709SSampa Misra                                                      {0, 0});
294a2fa0709SSampa Misra 
295a2fa0709SSampa Misra     if ((payloadLength > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) ||
296a2fa0709SSampa Misra         (payloadLength < sizeof(effecterId) + sizeof(compEffecterCnt) +
297a2fa0709SSampa Misra                              sizeof(set_effecter_state_field)))
298a2fa0709SSampa Misra     {
299fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
300a2fa0709SSampa Misra     }
301a2fa0709SSampa Misra 
302a2fa0709SSampa Misra     int rc = decode_set_state_effecter_states_req(request, payloadLength,
303a2fa0709SSampa Misra                                                   &effecterId, &compEffecterCnt,
304a2fa0709SSampa Misra                                                   stateField.data());
305a2fa0709SSampa Misra 
306fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
307a2fa0709SSampa Misra     {
308fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
309fb8611dcSGeorge Liu     }
31083409573SGeorge Liu 
311fb8611dcSGeorge Liu     stateField.resize(compEffecterCnt);
31283409573SGeorge Liu     const pldm::utils::DBusHandler dBusIntf;
313aea5dde1SSampa Misra     uint16_t entityType{};
314aea5dde1SSampa Misra     uint16_t entityInstance{};
315aea5dde1SSampa Misra     uint16_t stateSetId{};
316aea5dde1SSampa Misra 
317aea5dde1SSampa Misra     if (isOemStateEffecter(*this, effecterId, compEffecterCnt, entityType,
318aea5dde1SSampa Misra                            entityInstance, stateSetId) &&
319321804e9SManojkiran Eda         oemPlatformHandler != nullptr &&
320321804e9SManojkiran Eda         !effecterDbusObjMaps.contains(effecterId))
321aea5dde1SSampa Misra     {
3223a0e3b9bSSampa Misra         rc = oemPlatformHandler->oemSetStateEffecterStatesHandler(
3233fbd39ebSVarsha Kaverappa             entityType, entityInstance, stateSetId, compEffecterCnt, stateField,
3243fbd39ebSVarsha Kaverappa             effecterId);
325aea5dde1SSampa Misra     }
326aea5dde1SSampa Misra     else
327aea5dde1SSampa Misra     {
3280d7aca8cSGeorge Liu         rc = platform_state_effecter::setStateEffecterStatesHandler<
3290d7aca8cSGeorge Liu             pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
3300d7aca8cSGeorge Liu                                                stateField);
331aea5dde1SSampa Misra     }
332fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
333fb8611dcSGeorge Liu     {
334fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
335a2fa0709SSampa Misra     }
336a2fa0709SSampa Misra 
337fb8611dcSGeorge Liu     rc = encode_set_state_effecter_states_resp(request->hdr.instance_id, rc,
338a2fa0709SSampa Misra                                                responsePtr);
339fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
340fb8611dcSGeorge Liu     {
341fb8611dcSGeorge Liu         return ccOnlyResponse(request, rc);
342fb8611dcSGeorge Liu     }
343fb8611dcSGeorge Liu 
344a2fa0709SSampa Misra     return response;
345a2fa0709SSampa Misra }
346a2fa0709SSampa Misra 
platformEventMessage(const pldm_msg * request,size_t payloadLength)34756e45c58STom Joseph Response Handler::platformEventMessage(const pldm_msg* request,
34856e45c58STom Joseph                                        size_t payloadLength)
34956e45c58STom Joseph {
35056e45c58STom Joseph     uint8_t formatVersion{};
35156e45c58STom Joseph     uint8_t tid{};
35256e45c58STom Joseph     uint8_t eventClass{};
35356e45c58STom Joseph     size_t offset{};
35456e45c58STom Joseph 
35556e45c58STom Joseph     auto rc = decode_platform_event_message_req(
35656e45c58STom Joseph         request, payloadLength, &formatVersion, &tid, &eventClass, &offset);
35756e45c58STom Joseph     if (rc != PLDM_SUCCESS)
35856e45c58STom Joseph     {
35956e45c58STom Joseph         return CmdHandler::ccOnlyResponse(request, rc);
36056e45c58STom Joseph     }
36156e45c58STom Joseph 
362a6a8ccd9SSagar Srinivas     if (eventClass == PLDM_HEARTBEAT_TIMER_ELAPSED_EVENT)
363a6a8ccd9SSagar Srinivas     {
364a6a8ccd9SSagar Srinivas         rc = PLDM_SUCCESS;
36579669c94SSagar Srinivas         if (oemPlatformHandler)
36679669c94SSagar Srinivas         {
36718145f7dSSagar Srinivas             if (oemPlatformHandler->watchDogRunning())
36818145f7dSSagar Srinivas             {
36979669c94SSagar Srinivas                 oemPlatformHandler->resetWatchDogTimer();
37079669c94SSagar Srinivas             }
37118145f7dSSagar Srinivas             else
37218145f7dSSagar Srinivas             {
37318145f7dSSagar Srinivas                 oemPlatformHandler->setSurvTimer(tid, true);
37418145f7dSSagar Srinivas             }
37518145f7dSSagar Srinivas         }
376a6a8ccd9SSagar Srinivas     }
377a6a8ccd9SSagar Srinivas     else
378a6a8ccd9SSagar Srinivas     {
37956e45c58STom Joseph         try
38056e45c58STom Joseph         {
38156e45c58STom Joseph             const auto& handlers = eventHandlers.at(eventClass);
38256e45c58STom Joseph             for (const auto& handler : handlers)
38356e45c58STom Joseph             {
3846da4f91bSPatrick Williams                 auto rc = handler(request, payloadLength, formatVersion, tid,
3856da4f91bSPatrick Williams                                   offset);
38656e45c58STom Joseph                 if (rc != PLDM_SUCCESS)
38756e45c58STom Joseph                 {
38856e45c58STom Joseph                     return CmdHandler::ccOnlyResponse(request, rc);
38956e45c58STom Joseph                 }
39056e45c58STom Joseph             }
39156e45c58STom Joseph         }
39256e45c58STom Joseph         catch (const std::out_of_range& e)
39356e45c58STom Joseph         {
39489644441SRiya Dixit             error("Failed to handle platform event msg, error - {ERROR}",
39589644441SRiya Dixit                   "ERROR", e);
39656e45c58STom Joseph             return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_DATA);
39756e45c58STom Joseph         }
398a6a8ccd9SSagar Srinivas     }
39956e45c58STom Joseph     Response response(
40056e45c58STom Joseph         sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES, 0);
40156e45c58STom Joseph     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
40256e45c58STom Joseph 
40356e45c58STom Joseph     rc = encode_platform_event_message_resp(request->hdr.instance_id, rc,
40456e45c58STom Joseph                                             PLDM_EVENT_NO_LOGGING, responsePtr);
40556e45c58STom Joseph     if (rc != PLDM_SUCCESS)
40656e45c58STom Joseph     {
40756e45c58STom Joseph         return ccOnlyResponse(request, rc);
40856e45c58STom Joseph     }
40956e45c58STom Joseph 
41056e45c58STom Joseph     return response;
41156e45c58STom Joseph }
41256e45c58STom Joseph 
sensorEvent(const pldm_msg * request,size_t payloadLength,uint8_t,uint8_t tid,size_t eventDataOffset)41356e45c58STom Joseph int Handler::sensorEvent(const pldm_msg* request, size_t payloadLength,
414c4959c3cSTom Joseph                          uint8_t /*formatVersion*/, uint8_t tid,
41556e45c58STom Joseph                          size_t eventDataOffset)
41656e45c58STom Joseph {
41756e45c58STom Joseph     uint16_t sensorId{};
41856e45c58STom Joseph     uint8_t eventClass{};
41956e45c58STom Joseph     size_t eventClassDataOffset{};
4206da4f91bSPatrick Williams     auto eventData = reinterpret_cast<const uint8_t*>(request->payload) +
4216da4f91bSPatrick Williams                      eventDataOffset;
42256e45c58STom Joseph     auto eventDataSize = payloadLength - eventDataOffset;
42356e45c58STom Joseph 
42456e45c58STom Joseph     auto rc = decode_sensor_event_data(eventData, eventDataSize, &sensorId,
42556e45c58STom Joseph                                        &eventClass, &eventClassDataOffset);
42656e45c58STom Joseph     if (rc != PLDM_SUCCESS)
42756e45c58STom Joseph     {
42856e45c58STom Joseph         return rc;
42956e45c58STom Joseph     }
43056e45c58STom Joseph 
43175330f36SZahed Hossain     auto eventClassData = reinterpret_cast<const uint8_t*>(request->payload) +
43275330f36SZahed Hossain                           eventDataOffset + eventClassDataOffset;
4336da4f91bSPatrick Williams     auto eventClassDataSize = payloadLength - eventDataOffset -
4346da4f91bSPatrick Williams                               eventClassDataOffset;
43575330f36SZahed Hossain 
43656e45c58STom Joseph     if (eventClass == PLDM_STATE_SENSOR_STATE)
43756e45c58STom Joseph     {
43856e45c58STom Joseph         uint8_t sensorOffset{};
43956e45c58STom Joseph         uint8_t eventState{};
44056e45c58STom Joseph         uint8_t previousEventState{};
44156e45c58STom Joseph 
44275330f36SZahed Hossain         rc = decode_state_sensor_data(eventClassData, eventClassDataSize,
44356e45c58STom Joseph                                       &sensorOffset, &eventState,
44456e45c58STom Joseph                                       &previousEventState);
44575330f36SZahed Hossain         if (rc != PLDM_SUCCESS)
44675330f36SZahed Hossain         {
44775330f36SZahed Hossain             return PLDM_ERROR;
44875330f36SZahed Hossain         }
44975330f36SZahed Hossain 
450fe4d88bbSChicago Duan         // Emitting state sensor event signal
451fe4d88bbSChicago Duan         emitStateSensorEventSignal(tid, sensorId, sensorOffset, eventState,
452fe4d88bbSChicago Duan                                    previousEventState);
453fe4d88bbSChicago Duan 
454c4959c3cSTom Joseph         // If there are no HOST PDR's, there is no further action
455c4959c3cSTom Joseph         if (hostPDRHandler == NULL)
456c4959c3cSTom Joseph         {
457c4959c3cSTom Joseph             return PLDM_SUCCESS;
458c4959c3cSTom Joseph         }
459c4959c3cSTom Joseph 
460c4959c3cSTom Joseph         // Handle PLDM events for which PDR is available
461c4959c3cSTom Joseph         SensorEntry sensorEntry{tid, sensorId};
462b70a1964STom Joseph 
463b70a1964STom Joseph         pldm::pdr::EntityInfo entityInfo{};
464b70a1964STom Joseph         pldm::pdr::CompositeSensorStates compositeSensorStates{};
465e3607a3cSSagar Srinivas         std::vector<pldm::pdr::StateSetId> stateSetIds{};
466b70a1964STom Joseph 
467c4959c3cSTom Joseph         try
468c4959c3cSTom Joseph         {
469e3607a3cSSagar Srinivas             std::tie(entityInfo, compositeSensorStates, stateSetIds) =
470c4959c3cSTom Joseph                 hostPDRHandler->lookupSensorInfo(sensorEntry);
471b70a1964STom Joseph         }
47258cbcaf2SKamalkumar Patel         catch (const std::out_of_range&)
473b70a1964STom Joseph         {
474b70a1964STom Joseph             // If there is no mapping for tid, sensorId combination, try
475b70a1964STom Joseph             // PLDM_TID_RESERVED, sensorId for terminus that is yet to
476b70a1964STom Joseph             // implement TL PDR.
477b70a1964STom Joseph             try
478b70a1964STom Joseph             {
479b70a1964STom Joseph                 sensorEntry.terminusID = PLDM_TID_RESERVED;
480e3607a3cSSagar Srinivas                 std::tie(entityInfo, compositeSensorStates, stateSetIds) =
481b70a1964STom Joseph                     hostPDRHandler->lookupSensorInfo(sensorEntry);
482b70a1964STom Joseph             }
483b70a1964STom Joseph             // If there is no mapping for events return PLDM_SUCCESS
48458cbcaf2SKamalkumar Patel             catch (const std::out_of_range&)
485b70a1964STom Joseph             {
486b70a1964STom Joseph                 return PLDM_SUCCESS;
487b70a1964STom Joseph             }
488b70a1964STom Joseph         }
489b70a1964STom Joseph 
490c4959c3cSTom Joseph         if (sensorOffset >= compositeSensorStates.size())
491c4959c3cSTom Joseph         {
492c4959c3cSTom Joseph             return PLDM_ERROR_INVALID_DATA;
493c4959c3cSTom Joseph         }
494c4959c3cSTom Joseph 
495c4959c3cSTom Joseph         const auto& possibleStates = compositeSensorStates[sensorOffset];
49606f9b29eSSagar Srinivas         if (!possibleStates.contains(eventState))
497c4959c3cSTom Joseph         {
498c4959c3cSTom Joseph             return PLDM_ERROR_INVALID_DATA;
499c4959c3cSTom Joseph         }
500c4959c3cSTom Joseph 
501c4959c3cSTom Joseph         const auto& [containerId, entityType, entityInstance] = entityInfo;
502fa084700SManojkiran Eda         events::StateSensorEntry stateSensorEntry{containerId,
503fa084700SManojkiran Eda                                                   entityType,
504fa084700SManojkiran Eda                                                   entityInstance,
505fa084700SManojkiran Eda                                                   sensorOffset,
506fa084700SManojkiran Eda                                                   stateSetIds[sensorOffset],
507fa084700SManojkiran Eda                                                   false};
5083aec997cSPavithra Barithaya         return hostPDRHandler->handleStateSensorEvent(stateSensorEntry,
5093aec997cSPavithra Barithaya                                                       eventState);
510c4959c3cSTom Joseph     }
51156e45c58STom Joseph     else
51256e45c58STom Joseph     {
51356e45c58STom Joseph         return PLDM_ERROR_INVALID_DATA;
51456e45c58STom Joseph     }
51556e45c58STom Joseph 
51656e45c58STom Joseph     return PLDM_SUCCESS;
51756e45c58STom Joseph }
51856e45c58STom Joseph 
pldmPDRRepositoryChgEvent(const pldm_msg * request,size_t payloadLength,uint8_t,uint8_t tid,size_t eventDataOffset)5198cb6f665SDeepak Kodihalli int Handler::pldmPDRRepositoryChgEvent(const pldm_msg* request,
5208cb6f665SDeepak Kodihalli                                        size_t payloadLength,
5213ca40453SManojkiran Eda                                        uint8_t /*formatVersion*/, uint8_t tid,
5223ca40453SManojkiran Eda                                        size_t eventDataOffset)
5238cb6f665SDeepak Kodihalli {
5248cb6f665SDeepak Kodihalli     uint8_t eventDataFormat{};
5258cb6f665SDeepak Kodihalli     uint8_t numberOfChangeRecords{};
5268cb6f665SDeepak Kodihalli     size_t dataOffset{};
5278cb6f665SDeepak Kodihalli 
5286da4f91bSPatrick Williams     auto eventData = reinterpret_cast<const uint8_t*>(request->payload) +
5296da4f91bSPatrick Williams                      eventDataOffset;
5308cb6f665SDeepak Kodihalli     auto eventDataSize = payloadLength - eventDataOffset;
5318cb6f665SDeepak Kodihalli 
5328cb6f665SDeepak Kodihalli     auto rc = decode_pldm_pdr_repository_chg_event_data(
5338cb6f665SDeepak Kodihalli         eventData, eventDataSize, &eventDataFormat, &numberOfChangeRecords,
5348cb6f665SDeepak Kodihalli         &dataOffset);
5358cb6f665SDeepak Kodihalli     if (rc != PLDM_SUCCESS)
5368cb6f665SDeepak Kodihalli     {
5378cb6f665SDeepak Kodihalli         return rc;
5388cb6f665SDeepak Kodihalli     }
5398cb6f665SDeepak Kodihalli 
5408cb6f665SDeepak Kodihalli     PDRRecordHandles pdrRecordHandles;
5417246e0cdSDeepak Kodihalli 
5427246e0cdSDeepak Kodihalli     if (eventDataFormat == FORMAT_IS_PDR_TYPES)
5437246e0cdSDeepak Kodihalli     {
5447246e0cdSDeepak Kodihalli         return PLDM_ERROR_INVALID_DATA;
5457246e0cdSDeepak Kodihalli     }
5467246e0cdSDeepak Kodihalli 
5478cb6f665SDeepak Kodihalli     if (eventDataFormat == FORMAT_IS_PDR_HANDLES)
5488cb6f665SDeepak Kodihalli     {
5498cb6f665SDeepak Kodihalli         uint8_t eventDataOperation{};
5508cb6f665SDeepak Kodihalli         uint8_t numberOfChangeEntries{};
5518cb6f665SDeepak Kodihalli 
5528cb6f665SDeepak Kodihalli         auto changeRecordData = eventData + dataOffset;
5538cb6f665SDeepak Kodihalli         auto changeRecordDataSize = eventDataSize - dataOffset;
5548cb6f665SDeepak Kodihalli 
5558cb6f665SDeepak Kodihalli         while (changeRecordDataSize)
5568cb6f665SDeepak Kodihalli         {
5578cb6f665SDeepak Kodihalli             rc = decode_pldm_pdr_repository_change_record_data(
5588cb6f665SDeepak Kodihalli                 changeRecordData, changeRecordDataSize, &eventDataOperation,
5598cb6f665SDeepak Kodihalli                 &numberOfChangeEntries, &dataOffset);
5608cb6f665SDeepak Kodihalli 
5618cb6f665SDeepak Kodihalli             if (rc != PLDM_SUCCESS)
5628cb6f665SDeepak Kodihalli             {
5638cb6f665SDeepak Kodihalli                 return rc;
5648cb6f665SDeepak Kodihalli             }
5658cb6f665SDeepak Kodihalli 
566ae5c97ebSPavithra Barithaya             if (eventDataOperation == PLDM_RECORDS_ADDED ||
567ae5c97ebSPavithra Barithaya                 eventDataOperation == PLDM_RECORDS_MODIFIED)
5688cb6f665SDeepak Kodihalli             {
569ae5c97ebSPavithra Barithaya                 if (eventDataOperation == PLDM_RECORDS_MODIFIED)
570ae5c97ebSPavithra Barithaya                 {
571ae5c97ebSPavithra Barithaya                     hostPDRHandler->isHostPdrModified = true;
572ae5c97ebSPavithra Barithaya                 }
573ae5c97ebSPavithra Barithaya 
5748cb6f665SDeepak Kodihalli                 rc = getPDRRecordHandles(
5758cb6f665SDeepak Kodihalli                     reinterpret_cast<const ChangeEntry*>(changeRecordData +
5768cb6f665SDeepak Kodihalli                                                          dataOffset),
5778cb6f665SDeepak Kodihalli                     changeRecordDataSize - dataOffset,
5788cb6f665SDeepak Kodihalli                     static_cast<size_t>(numberOfChangeEntries),
5798cb6f665SDeepak Kodihalli                     pdrRecordHandles);
5808cb6f665SDeepak Kodihalli 
5818cb6f665SDeepak Kodihalli                 if (rc != PLDM_SUCCESS)
5828cb6f665SDeepak Kodihalli                 {
5838cb6f665SDeepak Kodihalli                     return rc;
5848cb6f665SDeepak Kodihalli                 }
5858cb6f665SDeepak Kodihalli             }
5868cb6f665SDeepak Kodihalli 
5876da4f91bSPatrick Williams             changeRecordData += dataOffset +
5886da4f91bSPatrick Williams                                 (numberOfChangeEntries * sizeof(ChangeEntry));
5898cb6f665SDeepak Kodihalli             changeRecordDataSize -=
5908cb6f665SDeepak Kodihalli                 dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry));
5918cb6f665SDeepak Kodihalli         }
5927246e0cdSDeepak Kodihalli     }
5937246e0cdSDeepak Kodihalli     if (hostPDRHandler)
5948cb6f665SDeepak Kodihalli     {
5953ca40453SManojkiran Eda         // if we get a Repository change event with the eventDataFormat
5963ca40453SManojkiran Eda         // as REFRESH_ENTIRE_REPOSITORY, then delete all the PDR's that
5973ca40453SManojkiran Eda         // have the matched Terminus handle
5983ca40453SManojkiran Eda         if (eventDataFormat == REFRESH_ENTIRE_REPOSITORY)
5993ca40453SManojkiran Eda         {
6003ca40453SManojkiran Eda             // We cannot get the Repo change event from the Terminus
6013ca40453SManojkiran Eda             // that is not already added to the BMC repository
6023ca40453SManojkiran Eda 
60352aad393SPavithra Barithaya             for (auto it = hostPDRHandler->tlPDRInfo.cbegin();
60452aad393SPavithra Barithaya                  it != hostPDRHandler->tlPDRInfo.cend();)
6053ca40453SManojkiran Eda             {
60652aad393SPavithra Barithaya                 if (std::get<0>(it->second) == tid)
6073ca40453SManojkiran Eda                 {
6083ca40453SManojkiran Eda                     pldm_pdr_remove_pdrs_by_terminus_handle(pdrRepo.getPdr(),
60952aad393SPavithra Barithaya                                                             it->first);
61052aad393SPavithra Barithaya                     hostPDRHandler->tlPDRInfo.erase(it++);
61152aad393SPavithra Barithaya                 }
61252aad393SPavithra Barithaya                 else
61352aad393SPavithra Barithaya                 {
61452aad393SPavithra Barithaya                     ++it;
6153ca40453SManojkiran Eda                 }
6163ca40453SManojkiran Eda             }
6173ca40453SManojkiran Eda         }
6188cb6f665SDeepak Kodihalli         hostPDRHandler->fetchPDR(std::move(pdrRecordHandles));
6198cb6f665SDeepak Kodihalli     }
6208cb6f665SDeepak Kodihalli 
6218cb6f665SDeepak Kodihalli     return PLDM_SUCCESS;
6228cb6f665SDeepak Kodihalli }
6238cb6f665SDeepak Kodihalli 
getPDRRecordHandles(const ChangeEntry * changeEntryData,size_t changeEntryDataSize,size_t numberOfChangeEntries,PDRRecordHandles & pdrRecordHandles)6248cb6f665SDeepak Kodihalli int Handler::getPDRRecordHandles(const ChangeEntry* changeEntryData,
6258cb6f665SDeepak Kodihalli                                  size_t changeEntryDataSize,
6268cb6f665SDeepak Kodihalli                                  size_t numberOfChangeEntries,
6278cb6f665SDeepak Kodihalli                                  PDRRecordHandles& pdrRecordHandles)
6288cb6f665SDeepak Kodihalli {
6298cb6f665SDeepak Kodihalli     if (numberOfChangeEntries > (changeEntryDataSize / sizeof(ChangeEntry)))
6308cb6f665SDeepak Kodihalli     {
6318cb6f665SDeepak Kodihalli         return PLDM_ERROR_INVALID_DATA;
6328cb6f665SDeepak Kodihalli     }
6338cb6f665SDeepak Kodihalli     for (size_t i = 0; i < numberOfChangeEntries; i++)
6348cb6f665SDeepak Kodihalli     {
6358cb6f665SDeepak Kodihalli         pdrRecordHandles.push_back(changeEntryData[i]);
6368cb6f665SDeepak Kodihalli     }
6378cb6f665SDeepak Kodihalli     return PLDM_SUCCESS;
6388cb6f665SDeepak Kodihalli }
6398cb6f665SDeepak Kodihalli 
getNumericEffecterValue(const pldm_msg * request,size_t payloadLength)6406ece21fbSArchana Kakani Response Handler::getNumericEffecterValue(const pldm_msg* request,
6416ece21fbSArchana Kakani                                           size_t payloadLength)
6426ece21fbSArchana Kakani {
6436ece21fbSArchana Kakani     if (payloadLength != PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES)
6446ece21fbSArchana Kakani     {
6456ece21fbSArchana Kakani         return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
6466ece21fbSArchana Kakani     }
6476ece21fbSArchana Kakani 
6486ece21fbSArchana Kakani     uint16_t effecterId{};
6496ece21fbSArchana Kakani     auto rc = decode_get_numeric_effecter_value_req(request, payloadLength,
6506ece21fbSArchana Kakani                                                     &effecterId);
6516ece21fbSArchana Kakani     if (rc != PLDM_SUCCESS)
6526ece21fbSArchana Kakani     {
6536ece21fbSArchana Kakani         return ccOnlyResponse(request, rc);
6546ece21fbSArchana Kakani     }
6556ece21fbSArchana Kakani 
6566ece21fbSArchana Kakani     const pldm::utils::DBusHandler dBusIntf;
6576ece21fbSArchana Kakani     uint8_t effecterDataSize{};
6586ece21fbSArchana Kakani     pldm::utils::PropertyValue dbusValue;
6596ece21fbSArchana Kakani     std::string propertyType;
6606ece21fbSArchana Kakani     using effecterOperationalState = uint8_t;
6616ece21fbSArchana Kakani     using completionCode = uint8_t;
6626ece21fbSArchana Kakani 
6636ece21fbSArchana Kakani     rc = platform_numeric_effecter::getNumericEffecterData<
6646ece21fbSArchana Kakani         pldm::utils::DBusHandler, Handler>(
6656ece21fbSArchana Kakani         dBusIntf, *this, effecterId, effecterDataSize, propertyType, dbusValue);
6666ece21fbSArchana Kakani 
6676ece21fbSArchana Kakani     if (rc != PLDM_SUCCESS)
6686ece21fbSArchana Kakani     {
6696ece21fbSArchana Kakani         return ccOnlyResponse(request, rc);
6706ece21fbSArchana Kakani     }
6716ece21fbSArchana Kakani 
6726ece21fbSArchana Kakani     // Refer DSP0248_1.2.0.pdf (section 22.3, Table 48)
6736ece21fbSArchana Kakani     // Completion Code (uint8), Effecter Data Size(uint8), Effecter Operational
6746ece21fbSArchana Kakani     // State(uint8), PendingValue (uint8|sint8|uint16|sint16|uint32|sint32 )
6756ece21fbSArchana Kakani     // PresentValue (uint8|sint8|uint16|sint16|uint32|sint32 )
6766ece21fbSArchana Kakani     // Size of PendingValue and PresentValue calculated based on size is
6776ece21fbSArchana Kakani     // provided in effecter data size
6786ece21fbSArchana Kakani     size_t responsePayloadLength = sizeof(completionCode) +
6796ece21fbSArchana Kakani                                    sizeof(effecterDataSize) +
6806ece21fbSArchana Kakani                                    sizeof(effecterOperationalState) +
6816ece21fbSArchana Kakani                                    getEffecterDataSize(effecterDataSize) +
6826ece21fbSArchana Kakani                                    getEffecterDataSize(effecterDataSize);
6836ece21fbSArchana Kakani 
6846ece21fbSArchana Kakani     Response response(responsePayloadLength + sizeof(pldm_msg_hdr));
6856ece21fbSArchana Kakani     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
6866ece21fbSArchana Kakani 
6876ece21fbSArchana Kakani     rc = platform_numeric_effecter::getNumericEffecterValueHandler(
6886ece21fbSArchana Kakani         propertyType, dbusValue, effecterDataSize, responsePtr,
6896ece21fbSArchana Kakani         responsePayloadLength, request->hdr.instance_id);
6906ece21fbSArchana Kakani 
6916ece21fbSArchana Kakani     if (rc != PLDM_SUCCESS)
6926ece21fbSArchana Kakani     {
6936ece21fbSArchana Kakani         error(
69489644441SRiya Dixit             "Failed to get response of GetNumericEffecterValue for effecter ID '{EFFECTERID}', response code '{RC}'.",
69589644441SRiya Dixit             "EFFECTERID", effecterId, "RC", rc);
6966ece21fbSArchana Kakani         return ccOnlyResponse(request, rc);
6976ece21fbSArchana Kakani     }
6986ece21fbSArchana Kakani     return response;
6996ece21fbSArchana Kakani }
7006ece21fbSArchana Kakani 
setNumericEffecterValue(const pldm_msg * request,size_t payloadLength)701eccb0c56SGeorge Liu Response Handler::setNumericEffecterValue(const pldm_msg* request,
702eccb0c56SGeorge Liu                                           size_t payloadLength)
703eccb0c56SGeorge Liu {
704eccb0c56SGeorge Liu     Response response(sizeof(pldm_msg_hdr) +
705eccb0c56SGeorge Liu                       PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
706eccb0c56SGeorge Liu     uint16_t effecterId{};
707eccb0c56SGeorge Liu     uint8_t effecterDataSize{};
708eccb0c56SGeorge Liu     uint8_t effecterValue[4] = {};
709eccb0c56SGeorge Liu 
710eccb0c56SGeorge Liu     if ((payloadLength > sizeof(effecterId) + sizeof(effecterDataSize) +
711eccb0c56SGeorge Liu                              sizeof(union_effecter_data_size)) ||
712eccb0c56SGeorge Liu         (payloadLength < sizeof(effecterId) + sizeof(effecterDataSize) + 1))
713eccb0c56SGeorge Liu     {
714eccb0c56SGeorge Liu         return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
715eccb0c56SGeorge Liu     }
716eccb0c56SGeorge Liu 
717eccb0c56SGeorge Liu     int rc = decode_set_numeric_effecter_value_req(
7188fbf3cccSAndrew Jeffery         request, payloadLength, &effecterId, &effecterDataSize, effecterValue);
719eccb0c56SGeorge Liu 
720eccb0c56SGeorge Liu     if (rc == PLDM_SUCCESS)
721eccb0c56SGeorge Liu     {
722eccb0c56SGeorge Liu         const pldm::utils::DBusHandler dBusIntf;
723eccb0c56SGeorge Liu         rc = platform_numeric_effecter::setNumericEffecterValueHandler<
724eccb0c56SGeorge Liu             pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
725eccb0c56SGeorge Liu                                                effecterDataSize, effecterValue,
726eccb0c56SGeorge Liu                                                sizeof(effecterValue));
727eccb0c56SGeorge Liu     }
728eccb0c56SGeorge Liu 
729eccb0c56SGeorge Liu     return ccOnlyResponse(request, rc);
730eccb0c56SGeorge Liu }
731eccb0c56SGeorge Liu 
generateTerminusLocatorPDR(Repo & repo)73212afe110SSampa Misra void Handler::generateTerminusLocatorPDR(Repo& repo)
73312afe110SSampa Misra {
73412afe110SSampa Misra     std::vector<uint8_t> pdrBuffer(sizeof(pldm_terminus_locator_pdr));
73512afe110SSampa Misra 
73612afe110SSampa Misra     auto pdr = reinterpret_cast<pldm_terminus_locator_pdr*>(pdrBuffer.data());
73712afe110SSampa Misra 
73812afe110SSampa Misra     pdr->hdr.record_handle = 0;
73912afe110SSampa Misra     pdr->hdr.version = 1;
74012afe110SSampa Misra     pdr->hdr.type = PLDM_TERMINUS_LOCATOR_PDR;
74112afe110SSampa Misra     pdr->hdr.record_change_num = 0;
74212afe110SSampa Misra     pdr->hdr.length = sizeof(pldm_terminus_locator_pdr) - sizeof(pldm_pdr_hdr);
743cc5f1586SManojkiran Eda     pdr->terminus_handle = TERMINUS_HANDLE;
74412afe110SSampa Misra     pdr->validity = PLDM_TL_PDR_VALID;
745cc5f1586SManojkiran Eda     pdr->tid = TERMINUS_ID;
74612afe110SSampa Misra     pdr->container_id = 0x0;
74712afe110SSampa Misra     pdr->terminus_locator_type = PLDM_TERMINUS_LOCATOR_TYPE_MCTP_EID;
74812afe110SSampa Misra     pdr->terminus_locator_value_size =
74912afe110SSampa Misra         sizeof(pldm_terminus_locator_type_mctp_eid);
75012afe110SSampa Misra     auto locatorValue = reinterpret_cast<pldm_terminus_locator_type_mctp_eid*>(
75112afe110SSampa Misra         pdr->terminus_locator_value);
75212afe110SSampa Misra     locatorValue->eid = BmcMctpEid;
75312afe110SSampa Misra 
75412afe110SSampa Misra     PdrEntry pdrEntry{};
75512afe110SSampa Misra     pdrEntry.data = pdrBuffer.data();
75612afe110SSampa Misra     pdrEntry.size = pdrBuffer.size();
75712afe110SSampa Misra     repo.addRecord(pdrEntry);
75860e1fe91SManojkiran Eda     if (hostPDRHandler)
75960e1fe91SManojkiran Eda     {
76060e1fe91SManojkiran Eda         hostPDRHandler->tlPDRInfo.insert_or_assign(
76160e1fe91SManojkiran Eda             pdr->terminus_handle,
76260e1fe91SManojkiran Eda             std::make_tuple(pdr->tid, locatorValue->eid, pdr->validity));
76360e1fe91SManojkiran Eda     }
76412afe110SSampa Misra }
765362c18ddSGeorge Liu 
getStateSensorReadings(const pldm_msg * request,size_t payloadLength)766362c18ddSGeorge Liu Response Handler::getStateSensorReadings(const pldm_msg* request,
767362c18ddSGeorge Liu                                          size_t payloadLength)
768362c18ddSGeorge Liu {
769362c18ddSGeorge Liu     uint16_t sensorId{};
770362c18ddSGeorge Liu     bitfield8_t sensorRearm{};
771362c18ddSGeorge Liu     uint8_t reserved{};
772362c18ddSGeorge Liu 
77387083f26SPavithra Barithaya     if (payloadLength != PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES)
774362c18ddSGeorge Liu     {
775362c18ddSGeorge Liu         return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
776362c18ddSGeorge Liu     }
777362c18ddSGeorge Liu 
778362c18ddSGeorge Liu     int rc = decode_get_state_sensor_readings_req(
779362c18ddSGeorge Liu         request, payloadLength, &sensorId, &sensorRearm, &reserved);
780362c18ddSGeorge Liu 
781362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
782362c18ddSGeorge Liu     {
783362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
784362c18ddSGeorge Liu     }
785362c18ddSGeorge Liu 
786362c18ddSGeorge Liu     // 0x01 to 0x08
787c1230ca1SGeorge Liu     uint8_t sensorRearmCount = std::popcount(sensorRearm.byte);
788aea5dde1SSampa Misra     std::vector<get_sensor_state_field> stateField(sensorRearmCount);
789362c18ddSGeorge Liu     uint8_t comSensorCnt{};
790362c18ddSGeorge Liu     const pldm::utils::DBusHandler dBusIntf;
791aea5dde1SSampa Misra 
792aea5dde1SSampa Misra     uint16_t entityType{};
793aea5dde1SSampa Misra     uint16_t entityInstance{};
794aea5dde1SSampa Misra     uint16_t stateSetId{};
795aea5dde1SSampa Misra 
796aea5dde1SSampa Misra     if (isOemStateSensor(*this, sensorId, sensorRearmCount, comSensorCnt,
797aea5dde1SSampa Misra                          entityType, entityInstance, stateSetId) &&
798321804e9SManojkiran Eda         oemPlatformHandler != nullptr && !sensorDbusObjMaps.contains(sensorId))
799aea5dde1SSampa Misra     {
800aea5dde1SSampa Misra         rc = oemPlatformHandler->getOemStateSensorReadingsHandler(
801aea5dde1SSampa Misra             entityType, entityInstance, stateSetId, comSensorCnt, stateField);
802aea5dde1SSampa Misra     }
803aea5dde1SSampa Misra     else
804aea5dde1SSampa Misra     {
805362c18ddSGeorge Liu         rc = platform_state_sensor::getStateSensorReadingsHandler<
806ae933cc2SManojkiran Eda             pldm::utils::DBusHandler, Handler>(
807ae933cc2SManojkiran Eda             dBusIntf, *this, sensorId, sensorRearmCount, comSensorCnt,
808ae933cc2SManojkiran Eda             stateField, dbusToPLDMEventHandler->getSensorCache());
809aea5dde1SSampa Misra     }
810362c18ddSGeorge Liu 
811362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
812362c18ddSGeorge Liu     {
813362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
814362c18ddSGeorge Liu     }
815362c18ddSGeorge Liu 
816362c18ddSGeorge Liu     Response response(sizeof(pldm_msg_hdr) +
817362c18ddSGeorge Liu                       PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
818362c18ddSGeorge Liu                       sizeof(get_sensor_state_field) * comSensorCnt);
819362c18ddSGeorge Liu     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
820362c18ddSGeorge Liu     rc = encode_get_state_sensor_readings_resp(request->hdr.instance_id, rc,
821362c18ddSGeorge Liu                                                comSensorCnt, stateField.data(),
822362c18ddSGeorge Liu                                                responsePtr);
823362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
824362c18ddSGeorge Liu     {
825362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
826362c18ddSGeorge Liu     }
827362c18ddSGeorge Liu 
828362c18ddSGeorge Liu     return response;
829362c18ddSGeorge Liu }
830362c18ddSGeorge Liu 
_processPostGetPDRActions(sdeventplus::source::EventBase &)83199854a70SPavithra Barithaya void Handler::_processPostGetPDRActions(sdeventplus::source::EventBase&
83299854a70SPavithra Barithaya                                         /*source */)
8335fb37d57SSampa Misra {
8345fb37d57SSampa Misra     deferredGetPDREvent.reset();
8355fb37d57SSampa Misra     dbusToPLDMEventHandler->listenSensorEvent(pdrRepo, sensorDbusObjMaps);
8365fb37d57SSampa Misra }
8375fb37d57SSampa Misra 
isOemStateSensor(Handler & handler,uint16_t sensorId,uint8_t sensorRearmCount,uint8_t & compSensorCnt,uint16_t & entityType,uint16_t & entityInstance,uint16_t & stateSetId)838aea5dde1SSampa Misra bool isOemStateSensor(Handler& handler, uint16_t sensorId,
839aea5dde1SSampa Misra                       uint8_t sensorRearmCount, uint8_t& compSensorCnt,
840aea5dde1SSampa Misra                       uint16_t& entityType, uint16_t& entityInstance,
841aea5dde1SSampa Misra                       uint16_t& stateSetId)
842aea5dde1SSampa Misra {
843aea5dde1SSampa Misra     pldm_state_sensor_pdr* pdr = nullptr;
844aea5dde1SSampa Misra 
845aea5dde1SSampa Misra     std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateSensorPdrRepo(
846aea5dde1SSampa Misra         pldm_pdr_init(), pldm_pdr_destroy);
847acb20299SAndrew Jeffery     if (!stateSensorPdrRepo)
848acb20299SAndrew Jeffery     {
849acb20299SAndrew Jeffery         error("Failed to instantiate state sensor PDR repository");
850acb20299SAndrew Jeffery         return false;
851acb20299SAndrew Jeffery     }
852aea5dde1SSampa Misra     Repo stateSensorPDRs(stateSensorPdrRepo.get());
853aea5dde1SSampa Misra     getRepoByType(handler.getRepo(), stateSensorPDRs, PLDM_STATE_SENSOR_PDR);
854aea5dde1SSampa Misra     if (stateSensorPDRs.empty())
855aea5dde1SSampa Misra     {
85649cfb138SRiya Dixit         error("Failed to get record by PDR type");
857aea5dde1SSampa Misra         return false;
858aea5dde1SSampa Misra     }
859aea5dde1SSampa Misra 
860aea5dde1SSampa Misra     PdrEntry pdrEntry{};
861aea5dde1SSampa Misra     auto pdrRecord = stateSensorPDRs.getFirstRecord(pdrEntry);
862aea5dde1SSampa Misra     while (pdrRecord)
863aea5dde1SSampa Misra     {
864aea5dde1SSampa Misra         pdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdrEntry.data);
865aea5dde1SSampa Misra         assert(pdr != NULL);
866aea5dde1SSampa Misra         if (pdr->sensor_id != sensorId)
867aea5dde1SSampa Misra         {
868aea5dde1SSampa Misra             pdr = nullptr;
869aea5dde1SSampa Misra             pdrRecord = stateSensorPDRs.getNextRecord(pdrRecord, pdrEntry);
870aea5dde1SSampa Misra             continue;
871aea5dde1SSampa Misra         }
872aea5dde1SSampa Misra         auto tmpEntityType = pdr->entity_type;
873aea5dde1SSampa Misra         auto tmpEntityInstance = pdr->entity_instance;
874aea5dde1SSampa Misra         auto tmpCompSensorCnt = pdr->composite_sensor_count;
875aea5dde1SSampa Misra         auto tmpPossibleStates =
876aea5dde1SSampa Misra             reinterpret_cast<state_sensor_possible_states*>(
877aea5dde1SSampa Misra                 pdr->possible_states);
878aea5dde1SSampa Misra         auto tmpStateSetId = tmpPossibleStates->state_set_id;
879aea5dde1SSampa Misra 
880aea5dde1SSampa Misra         if (sensorRearmCount > tmpCompSensorCnt)
881aea5dde1SSampa Misra         {
88249cfb138SRiya Dixit             error(
88389644441SRiya Dixit                 "The requester sent wrong sensor rearm count '{SENSOR_REARM_COUNT}' for the sensor ID '{SENSORID}'.",
88489644441SRiya Dixit                 "SENSOR_REARM_COUNT", (uint16_t)sensorRearmCount, "SENSORID",
88589644441SRiya Dixit                 sensorId);
886aea5dde1SSampa Misra             break;
887aea5dde1SSampa Misra         }
888aea5dde1SSampa Misra 
889aea5dde1SSampa Misra         if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START &&
890aea5dde1SSampa Misra              tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) ||
891aea5dde1SSampa Misra             (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START &&
892aea5dde1SSampa Misra              tmpStateSetId < PLDM_OEM_STATE_SET_ID_END))
893aea5dde1SSampa Misra         {
894aea5dde1SSampa Misra             entityType = tmpEntityType;
895aea5dde1SSampa Misra             entityInstance = tmpEntityInstance;
896aea5dde1SSampa Misra             stateSetId = tmpStateSetId;
897aea5dde1SSampa Misra             compSensorCnt = tmpCompSensorCnt;
898aea5dde1SSampa Misra             return true;
899aea5dde1SSampa Misra         }
900aea5dde1SSampa Misra         else
901aea5dde1SSampa Misra         {
902aea5dde1SSampa Misra             return false;
903aea5dde1SSampa Misra         }
904aea5dde1SSampa Misra     }
905aea5dde1SSampa Misra     return false;
906aea5dde1SSampa Misra }
907aea5dde1SSampa Misra 
isOemStateEffecter(Handler & handler,uint16_t effecterId,uint8_t compEffecterCnt,uint16_t & entityType,uint16_t & entityInstance,uint16_t & stateSetId)908aea5dde1SSampa Misra bool isOemStateEffecter(Handler& handler, uint16_t effecterId,
909aea5dde1SSampa Misra                         uint8_t compEffecterCnt, uint16_t& entityType,
910aea5dde1SSampa Misra                         uint16_t& entityInstance, uint16_t& stateSetId)
911aea5dde1SSampa Misra {
912aea5dde1SSampa Misra     pldm_state_effecter_pdr* pdr = nullptr;
913aea5dde1SSampa Misra 
914aea5dde1SSampa Misra     std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateEffecterPdrRepo(
915aea5dde1SSampa Misra         pldm_pdr_init(), pldm_pdr_destroy);
916acb20299SAndrew Jeffery     if (!stateEffecterPdrRepo)
917acb20299SAndrew Jeffery     {
918acb20299SAndrew Jeffery         error("Failed to instantiate state effecter PDR repository");
919acb20299SAndrew Jeffery         return false;
920acb20299SAndrew Jeffery     }
921aea5dde1SSampa Misra     Repo stateEffecterPDRs(stateEffecterPdrRepo.get());
922aea5dde1SSampa Misra     getRepoByType(handler.getRepo(), stateEffecterPDRs,
923aea5dde1SSampa Misra                   PLDM_STATE_EFFECTER_PDR);
924aea5dde1SSampa Misra     if (stateEffecterPDRs.empty())
925aea5dde1SSampa Misra     {
92649cfb138SRiya Dixit         error("Failed to get record by PDR type");
927aea5dde1SSampa Misra         return false;
928aea5dde1SSampa Misra     }
929aea5dde1SSampa Misra 
930aea5dde1SSampa Misra     PdrEntry pdrEntry{};
931aea5dde1SSampa Misra     auto pdrRecord = stateEffecterPDRs.getFirstRecord(pdrEntry);
932aea5dde1SSampa Misra     while (pdrRecord)
933aea5dde1SSampa Misra     {
934aea5dde1SSampa Misra         pdr = reinterpret_cast<pldm_state_effecter_pdr*>(pdrEntry.data);
935aea5dde1SSampa Misra         assert(pdr != NULL);
936aea5dde1SSampa Misra         if (pdr->effecter_id != effecterId)
937aea5dde1SSampa Misra         {
938aea5dde1SSampa Misra             pdr = nullptr;
939aea5dde1SSampa Misra             pdrRecord = stateEffecterPDRs.getNextRecord(pdrRecord, pdrEntry);
940aea5dde1SSampa Misra             continue;
941aea5dde1SSampa Misra         }
942aea5dde1SSampa Misra 
943aea5dde1SSampa Misra         auto tmpEntityType = pdr->entity_type;
944aea5dde1SSampa Misra         auto tmpEntityInstance = pdr->entity_instance;
945aea5dde1SSampa Misra         auto tmpPossibleStates =
946aea5dde1SSampa Misra             reinterpret_cast<state_effecter_possible_states*>(
947aea5dde1SSampa Misra                 pdr->possible_states);
948aea5dde1SSampa Misra         auto tmpStateSetId = tmpPossibleStates->state_set_id;
949aea5dde1SSampa Misra 
950aea5dde1SSampa Misra         if (compEffecterCnt > pdr->composite_effecter_count)
951aea5dde1SSampa Misra         {
95249cfb138SRiya Dixit             error(
95389644441SRiya Dixit                 "The requester sent wrong composite effecter count '{COMPOSITE_EFFECTER_COUNT}' for the effecter ID '{EFFECTERID}'.",
954*1e5c81e0SRiya Dixit                 "COMPOSITE_EFFECTER_COUNT", compEffecterCnt, "EFFECTERID",
955*1e5c81e0SRiya Dixit                 effecterId);
956aea5dde1SSampa Misra             return false;
957aea5dde1SSampa Misra         }
958aea5dde1SSampa Misra 
959aea5dde1SSampa Misra         if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START &&
960aea5dde1SSampa Misra              tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) ||
961aea5dde1SSampa Misra             (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START &&
962aea5dde1SSampa Misra              tmpStateSetId < PLDM_OEM_STATE_SET_ID_END))
963aea5dde1SSampa Misra         {
964aea5dde1SSampa Misra             entityType = tmpEntityType;
965aea5dde1SSampa Misra             entityInstance = tmpEntityInstance;
966aea5dde1SSampa Misra             stateSetId = tmpStateSetId;
967aea5dde1SSampa Misra             return true;
968aea5dde1SSampa Misra         }
969aea5dde1SSampa Misra         else
970aea5dde1SSampa Misra         {
971aea5dde1SSampa Misra             return false;
972aea5dde1SSampa Misra         }
973aea5dde1SSampa Misra     }
974aea5dde1SSampa Misra     return false;
975aea5dde1SSampa Misra }
976aea5dde1SSampa Misra 
setEventReceiver()97790314a3fSSagar Srinivas void Handler::setEventReceiver()
97890314a3fSSagar Srinivas {
97990314a3fSSagar Srinivas     std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
98090314a3fSSagar Srinivas                                     PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
98190314a3fSSagar Srinivas     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
98290314a3fSSagar Srinivas     auto instanceId = instanceIdDb->next(eid);
98390314a3fSSagar Srinivas     uint8_t eventMessageGlobalEnable =
98490314a3fSSagar Srinivas         PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
98590314a3fSSagar Srinivas     uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
98690314a3fSSagar Srinivas     uint8_t eventReceiverAddressInfo = pldm::responder::pdr::BmcMctpEid;
98790314a3fSSagar Srinivas     uint16_t heartbeatTimer = HEARTBEAT_TIMEOUT;
98890314a3fSSagar Srinivas 
98990314a3fSSagar Srinivas     auto rc = encode_set_event_receiver_req(
99090314a3fSSagar Srinivas         instanceId, eventMessageGlobalEnable, transportProtocolType,
99190314a3fSSagar Srinivas         eventReceiverAddressInfo, heartbeatTimer, request);
99290314a3fSSagar Srinivas     if (rc != PLDM_SUCCESS)
99390314a3fSSagar Srinivas     {
99490314a3fSSagar Srinivas         instanceIdDb->free(eid, instanceId);
99589644441SRiya Dixit         error(
99689644441SRiya Dixit             "Failed to encode set event receiver request, response code '{RC}'",
99789644441SRiya Dixit             "RC", lg2::hex, rc);
99890314a3fSSagar Srinivas         return;
99990314a3fSSagar Srinivas     }
100090314a3fSSagar Srinivas 
100190314a3fSSagar Srinivas     auto processSetEventReceiverResponse =
100290314a3fSSagar Srinivas         [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) {
100390314a3fSSagar Srinivas         if (response == nullptr || !respMsgLen)
100490314a3fSSagar Srinivas         {
100590314a3fSSagar Srinivas             error("Failed to receive response for setEventReceiver command");
100690314a3fSSagar Srinivas             return;
100790314a3fSSagar Srinivas         }
100890314a3fSSagar Srinivas 
100990314a3fSSagar Srinivas         uint8_t completionCode{};
101090314a3fSSagar Srinivas         auto rc = decode_set_event_receiver_resp(response, respMsgLen,
101190314a3fSSagar Srinivas                                                  &completionCode);
101290314a3fSSagar Srinivas         if (rc || completionCode)
101390314a3fSSagar Srinivas         {
101490314a3fSSagar Srinivas             error(
101589644441SRiya Dixit                 "Failed to decode setEventReceiver command, response code '{RC}' and completion code '{CC}'",
1016*1e5c81e0SRiya Dixit                 "RC", rc, "CC", completionCode);
101790314a3fSSagar Srinivas             pldm::utils::reportError(
101892fb0b55SManojkiran Eda                 "xyz.openbmc_project.bmc.pldm.InternalFailure");
101990314a3fSSagar Srinivas         }
102090314a3fSSagar Srinivas     };
102190314a3fSSagar Srinivas     rc = handler->registerRequest(
102290314a3fSSagar Srinivas         eid, instanceId, PLDM_PLATFORM, PLDM_SET_EVENT_RECEIVER,
102390314a3fSSagar Srinivas         std::move(requestMsg), std::move(processSetEventReceiverResponse));
102490314a3fSSagar Srinivas 
102590314a3fSSagar Srinivas     if (rc != PLDM_SUCCESS)
102690314a3fSSagar Srinivas     {
102790314a3fSSagar Srinivas         error("Failed to send the setEventReceiver request");
102890314a3fSSagar Srinivas     }
102990314a3fSSagar Srinivas 
103090314a3fSSagar Srinivas     if (oemPlatformHandler)
103190314a3fSSagar Srinivas     {
103290314a3fSSagar Srinivas         oemPlatformHandler->countSetEventReceiver();
103390314a3fSSagar Srinivas         oemPlatformHandler->checkAndDisableWatchDog();
103490314a3fSSagar Srinivas     }
103590314a3fSSagar Srinivas }
103690314a3fSSagar Srinivas 
1037bc669f1bSDeepak Kodihalli } // namespace platform
1038557dfb00SDeepak Kodihalli } // namespace responder
1039557dfb00SDeepak Kodihalli } // namespace pldm
1040