1557dfb00SDeepak Kodihalli #include "platform.hpp"
2557dfb00SDeepak Kodihalli 
3aea5dde1SSampa Misra #include "libpldm/entity.h"
4aea5dde1SSampa Misra #include "libpldm/state_set.h"
5aea5dde1SSampa Misra 
6b70a1964STom Joseph #include "common/types.hpp"
7d130e1a3SDeepak Kodihalli #include "common/utils.hpp"
8c4959c3cSTom Joseph #include "event_parser.hpp"
912afe110SSampa Misra #include "pdr.hpp"
10456c9a2fSGeorge Liu #include "pdr_numeric_effecter.hpp"
11a2870726SGeorge Liu #include "pdr_state_effecter.hpp"
12adbe1726SGeorge Liu #include "pdr_state_sensor.hpp"
13362c18ddSGeorge Liu #include "pdr_utils.hpp"
14eccb0c56SGeorge Liu #include "platform_numeric_effecter.hpp"
150d7aca8cSGeorge Liu #include "platform_state_effecter.hpp"
16362c18ddSGeorge Liu #include "platform_state_sensor.hpp"
1783409573SGeorge Liu 
18cc5f1586SManojkiran Eda #include <config.h>
19cc5f1586SManojkiran Eda 
205079ac4aSBrad Bishop using namespace pldm::utils;
215079ac4aSBrad Bishop using namespace pldm::responder::pdr;
225079ac4aSBrad Bishop using namespace pldm::responder::pdr_utils;
235079ac4aSBrad Bishop 
24557dfb00SDeepak Kodihalli namespace pldm
25557dfb00SDeepak Kodihalli {
26557dfb00SDeepak Kodihalli namespace responder
27557dfb00SDeepak Kodihalli {
28a2fa0709SSampa Misra namespace platform
29a2fa0709SSampa Misra {
30a2fa0709SSampa Misra 
31c682fe2dSDeepak Kodihalli using InternalFailure =
32c682fe2dSDeepak Kodihalli     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
33c682fe2dSDeepak Kodihalli 
341ec85d4bSGeorge Liu static const Json empty{};
351ec85d4bSGeorge Liu 
36a2870726SGeorge Liu void Handler::addDbusObjMaps(
37adbe1726SGeorge Liu     uint16_t id,
38adbe1726SGeorge Liu     std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps> dbusObj,
39adbe1726SGeorge Liu     TypeId typeId)
401ec85d4bSGeorge Liu {
41adbe1726SGeorge Liu     if (typeId == TypeId::PLDM_SENSOR_ID)
42adbe1726SGeorge Liu     {
43adbe1726SGeorge Liu         sensorDbusObjMaps.emplace(id, dbusObj);
44adbe1726SGeorge Liu     }
45adbe1726SGeorge Liu     else
46adbe1726SGeorge Liu     {
47adbe1726SGeorge Liu         effecterDbusObjMaps.emplace(id, dbusObj);
48adbe1726SGeorge Liu     }
491ec85d4bSGeorge Liu }
501ec85d4bSGeorge Liu 
51a2870726SGeorge Liu const std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>&
52adbe1726SGeorge Liu     Handler::getDbusObjMaps(uint16_t id, TypeId typeId) const
531ec85d4bSGeorge Liu {
54adbe1726SGeorge Liu     if (typeId == TypeId::PLDM_SENSOR_ID)
55adbe1726SGeorge Liu     {
56adbe1726SGeorge Liu         return sensorDbusObjMaps.at(id);
57adbe1726SGeorge Liu     }
58adbe1726SGeorge Liu     else
59adbe1726SGeorge Liu     {
60adbe1726SGeorge Liu         return effecterDbusObjMaps.at(id);
61adbe1726SGeorge Liu     }
621ec85d4bSGeorge Liu }
631ec85d4bSGeorge Liu 
6436e81352SGeorge Liu void Handler::generate(const pldm::utils::DBusHandler& dBusIntf,
6536e81352SGeorge Liu                        const std::string& dir, Repo& repo)
66c682fe2dSDeepak Kodihalli {
67c6e49c4fSDeepak Kodihalli     if (!fs::exists(dir))
68c6e49c4fSDeepak Kodihalli     {
69c6e49c4fSDeepak Kodihalli         return;
70c6e49c4fSDeepak Kodihalli     }
71c6e49c4fSDeepak Kodihalli 
72c682fe2dSDeepak Kodihalli     // A map of PDR type to a lambda that handles creation of that PDR type.
73c682fe2dSDeepak Kodihalli     // The lambda essentially would parse the platform specific PDR JSONs to
74c682fe2dSDeepak Kodihalli     // generate the PDR structures. This function iterates through the map to
75c682fe2dSDeepak Kodihalli     // invoke all lambdas, so that all PDR types can be created.
76a2870726SGeorge Liu 
77a2870726SGeorge Liu     const std::map<Type, generatePDR> generateHandlers = {
78a2870726SGeorge Liu         {PLDM_STATE_EFFECTER_PDR,
7936e81352SGeorge Liu          [this](const DBusHandler& dBusIntf, const auto& json,
8036e81352SGeorge Liu                 RepoInterface& repo) {
8136e81352SGeorge Liu              pdr_state_effecter::generateStateEffecterPDR<
8236e81352SGeorge Liu                  pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this,
83a2870726SGeorge Liu                                                     repo);
84456c9a2fSGeorge Liu          }},
85456c9a2fSGeorge Liu         {PLDM_NUMERIC_EFFECTER_PDR,
8636e81352SGeorge Liu          [this](const DBusHandler& dBusIntf, const auto& json,
8736e81352SGeorge Liu                 RepoInterface& repo) {
8836e81352SGeorge Liu              pdr_numeric_effecter::generateNumericEffecterPDR<
8936e81352SGeorge Liu                  pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this,
9036e81352SGeorge Liu                                                     repo);
91adbe1726SGeorge Liu          }},
92adbe1726SGeorge Liu         {PLDM_STATE_SENSOR_PDR, [this](const DBusHandler& dBusIntf,
93adbe1726SGeorge Liu                                        const auto& json, RepoInterface& repo) {
94adbe1726SGeorge Liu              pdr_state_sensor::generateStateSensorPDR<pldm::utils::DBusHandler,
95adbe1726SGeorge Liu                                                       Handler>(dBusIntf, json,
96adbe1726SGeorge Liu                                                                *this, repo);
97c682fe2dSDeepak Kodihalli          }}};
98c682fe2dSDeepak Kodihalli 
99c682fe2dSDeepak Kodihalli     Type pdrType{};
100c682fe2dSDeepak Kodihalli     for (const auto& dirEntry : fs::directory_iterator(dir))
101c682fe2dSDeepak Kodihalli     {
102c682fe2dSDeepak Kodihalli         try
103c682fe2dSDeepak Kodihalli         {
104c682fe2dSDeepak Kodihalli             auto json = readJson(dirEntry.path().string());
105c682fe2dSDeepak Kodihalli             if (!json.empty())
106c682fe2dSDeepak Kodihalli             {
1071ec85d4bSGeorge Liu                 auto effecterPDRs = json.value("effecterPDRs", empty);
1081ec85d4bSGeorge Liu                 for (const auto& effecter : effecterPDRs)
1091ec85d4bSGeorge Liu                 {
1101ec85d4bSGeorge Liu                     pdrType = effecter.value("pdrType", 0);
11136e81352SGeorge Liu                     generateHandlers.at(pdrType)(dBusIntf, effecter, repo);
1121ec85d4bSGeorge Liu                 }
113adbe1726SGeorge Liu 
114adbe1726SGeorge Liu                 auto sensorPDRs = json.value("sensorPDRs", empty);
115adbe1726SGeorge Liu                 for (const auto& sensor : sensorPDRs)
116adbe1726SGeorge Liu                 {
117adbe1726SGeorge Liu                     pdrType = sensor.value("pdrType", 0);
118adbe1726SGeorge Liu                     generateHandlers.at(pdrType)(dBusIntf, sensor, repo);
119adbe1726SGeorge Liu                 }
120c682fe2dSDeepak Kodihalli             }
121c682fe2dSDeepak Kodihalli         }
122c682fe2dSDeepak Kodihalli         catch (const InternalFailure& e)
123c682fe2dSDeepak Kodihalli         {
124c682fe2dSDeepak Kodihalli             std::cerr << "PDR config directory does not exist or empty, TYPE= "
125c682fe2dSDeepak Kodihalli                       << pdrType << "PATH= " << dirEntry
126c682fe2dSDeepak Kodihalli                       << " ERROR=" << e.what() << "\n";
127c682fe2dSDeepak Kodihalli         }
128c682fe2dSDeepak Kodihalli         catch (const Json::exception& e)
129c682fe2dSDeepak Kodihalli         {
130c682fe2dSDeepak Kodihalli             std::cerr << "Failed parsing PDR JSON file, TYPE= " << pdrType
131c682fe2dSDeepak Kodihalli                       << " ERROR=" << e.what() << "\n";
132c682fe2dSDeepak Kodihalli             pldm::utils::reportError(
133c682fe2dSDeepak Kodihalli                 "xyz.openbmc_project.bmc.pldm.InternalFailure");
134c682fe2dSDeepak Kodihalli         }
135c682fe2dSDeepak Kodihalli         catch (const std::exception& e)
136c682fe2dSDeepak Kodihalli         {
137c682fe2dSDeepak Kodihalli             std::cerr << "Failed parsing PDR JSON file, TYPE= " << pdrType
138c682fe2dSDeepak Kodihalli                       << " ERROR=" << e.what() << "\n";
139c682fe2dSDeepak Kodihalli             pldm::utils::reportError(
140c682fe2dSDeepak Kodihalli                 "xyz.openbmc_project.bmc.pldm.InternalFailure");
141c682fe2dSDeepak Kodihalli         }
142c682fe2dSDeepak Kodihalli     }
143c682fe2dSDeepak Kodihalli }
144557dfb00SDeepak Kodihalli 
145bc669f1bSDeepak Kodihalli Response Handler::getPDR(const pldm_msg* request, size_t payloadLength)
146557dfb00SDeepak Kodihalli {
14799854a70SPavithra Barithaya     if (hostPDRHandler)
14899854a70SPavithra Barithaya     {
14999854a70SPavithra Barithaya         if (hostPDRHandler->isHostUp() && oemPlatformHandler != nullptr)
15099854a70SPavithra Barithaya         {
15199854a70SPavithra Barithaya             auto rc = oemPlatformHandler->checkBMCState();
15299854a70SPavithra Barithaya             if (rc != PLDM_SUCCESS)
15399854a70SPavithra Barithaya             {
15499854a70SPavithra Barithaya                 return ccOnlyResponse(request, PLDM_ERROR_NOT_READY);
15599854a70SPavithra Barithaya             }
15699854a70SPavithra Barithaya         }
15799854a70SPavithra Barithaya     }
15899854a70SPavithra Barithaya 
15999854a70SPavithra Barithaya     // Build FRU table if not built, since entity association PDR's
16099854a70SPavithra Barithaya     // are built when the FRU table is constructed.
16133e9c7eaSTom Joseph     if (fruHandler)
16233e9c7eaSTom Joseph     {
16333e9c7eaSTom Joseph         fruHandler->buildFRUTable();
16433e9c7eaSTom Joseph     }
16533e9c7eaSTom Joseph 
166d680ae03SGeorge Liu     if (!pdrCreated)
167d680ae03SGeorge Liu     {
168d680ae03SGeorge Liu         generateTerminusLocatorPDR(pdrRepo);
169d680ae03SGeorge Liu         generate(*dBusIntf, pdrJsonsDir, pdrRepo);
17078a225a2SSagar Srinivas         if (oemPlatformHandler != nullptr)
17178a225a2SSagar Srinivas         {
17278a225a2SSagar Srinivas             oemPlatformHandler->buildOEMPDR(pdrRepo);
17378a225a2SSagar Srinivas         }
17478a225a2SSagar Srinivas 
175d680ae03SGeorge Liu         pdrCreated = true;
1765eed8e55SGeorge Liu 
1775eed8e55SGeorge Liu         if (dbusToPLDMEventHandler)
1785eed8e55SGeorge Liu         {
1795fb37d57SSampa Misra             deferredGetPDREvent = std::make_unique<sdeventplus::source::Defer>(
1805fb37d57SSampa Misra                 event,
1815fb37d57SSampa Misra                 std::bind(std::mem_fn(&pldm::responder::platform::Handler::
1825fb37d57SSampa Misra                                           _processPostGetPDRActions),
1835fb37d57SSampa Misra                           this, std::placeholders::_1));
1845eed8e55SGeorge Liu         }
185d680ae03SGeorge Liu     }
186d680ae03SGeorge Liu 
187557dfb00SDeepak Kodihalli     Response response(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES, 0);
188557dfb00SDeepak Kodihalli 
189557dfb00SDeepak Kodihalli     if (payloadLength != PLDM_GET_PDR_REQ_BYTES)
190557dfb00SDeepak Kodihalli     {
191fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
192557dfb00SDeepak Kodihalli     }
193557dfb00SDeepak Kodihalli 
194557dfb00SDeepak Kodihalli     uint32_t recordHandle{};
195557dfb00SDeepak Kodihalli     uint32_t dataTransferHandle{};
196557dfb00SDeepak Kodihalli     uint8_t transferOpFlag{};
197557dfb00SDeepak Kodihalli     uint16_t reqSizeBytes{};
198557dfb00SDeepak Kodihalli     uint16_t recordChangeNum{};
199557dfb00SDeepak Kodihalli 
200fb8611dcSGeorge Liu     auto rc = decode_get_pdr_req(request, payloadLength, &recordHandle,
201fb8611dcSGeorge Liu                                  &dataTransferHandle, &transferOpFlag,
202fb8611dcSGeorge Liu                                  &reqSizeBytes, &recordChangeNum);
203fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
204fb8611dcSGeorge Liu     {
205fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
206fb8611dcSGeorge Liu     }
207557dfb00SDeepak Kodihalli 
208557dfb00SDeepak Kodihalli     uint16_t respSizeBytes{};
209557dfb00SDeepak Kodihalli     uint8_t* recordData = nullptr;
210557dfb00SDeepak Kodihalli     try
211557dfb00SDeepak Kodihalli     {
212e53193faSGeorge Liu         pdr_utils::PdrEntry e;
213e53193faSGeorge Liu         auto record = pdr::getRecordByHandle(pdrRepo, recordHandle, e);
214e53193faSGeorge Liu         if (record == NULL)
215e53193faSGeorge Liu         {
216e53193faSGeorge Liu             return CmdHandler::ccOnlyResponse(
217e53193faSGeorge Liu                 request, PLDM_PLATFORM_INVALID_RECORD_HANDLE);
218e53193faSGeorge Liu         }
219e53193faSGeorge Liu 
220557dfb00SDeepak Kodihalli         if (reqSizeBytes)
221557dfb00SDeepak Kodihalli         {
222e53193faSGeorge Liu             respSizeBytes = e.size;
223557dfb00SDeepak Kodihalli             if (respSizeBytes > reqSizeBytes)
224557dfb00SDeepak Kodihalli             {
225557dfb00SDeepak Kodihalli                 respSizeBytes = reqSizeBytes;
226557dfb00SDeepak Kodihalli             }
227e53193faSGeorge Liu             recordData = e.data;
228557dfb00SDeepak Kodihalli         }
229557dfb00SDeepak Kodihalli         response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES +
230557dfb00SDeepak Kodihalli                             respSizeBytes,
231557dfb00SDeepak Kodihalli                         0);
232*31a78447SManojkiran Eda         auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
23322b5a7d7SDeepak Kodihalli         rc = encode_get_pdr_resp(
23422b5a7d7SDeepak Kodihalli             request->hdr.instance_id, PLDM_SUCCESS, e.handle.nextRecordHandle,
23522b5a7d7SDeepak Kodihalli             0, PLDM_START_AND_END, respSizeBytes, recordData, 0, responsePtr);
236fb8611dcSGeorge Liu         if (rc != PLDM_SUCCESS)
237fb8611dcSGeorge Liu         {
238fb8611dcSGeorge Liu             return ccOnlyResponse(request, rc);
239fb8611dcSGeorge Liu         }
240557dfb00SDeepak Kodihalli     }
241557dfb00SDeepak Kodihalli     catch (const std::exception& e)
242557dfb00SDeepak Kodihalli     {
243aa8ae72fSSampa Misra         std::cerr << "Error accessing PDR, HANDLE=" << recordHandle
244aa8ae72fSSampa Misra                   << " ERROR=" << e.what() << "\n";
245fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR);
246557dfb00SDeepak Kodihalli     }
247557dfb00SDeepak Kodihalli     return response;
248557dfb00SDeepak Kodihalli }
249557dfb00SDeepak Kodihalli 
250bc669f1bSDeepak Kodihalli Response Handler::setStateEffecterStates(const pldm_msg* request,
251bc669f1bSDeepak Kodihalli                                          size_t payloadLength)
252a2fa0709SSampa Misra {
253a2fa0709SSampa Misra     Response response(
254a2fa0709SSampa Misra         sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES, 0);
255a2fa0709SSampa Misra     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
256a2fa0709SSampa Misra     uint16_t effecterId;
257a2fa0709SSampa Misra     uint8_t compEffecterCnt;
258a2fa0709SSampa Misra     constexpr auto maxCompositeEffecterCnt = 8;
259a2fa0709SSampa Misra     std::vector<set_effecter_state_field> stateField(maxCompositeEffecterCnt,
260a2fa0709SSampa Misra                                                      {0, 0});
261a2fa0709SSampa Misra 
262a2fa0709SSampa Misra     if ((payloadLength > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) ||
263a2fa0709SSampa Misra         (payloadLength < sizeof(effecterId) + sizeof(compEffecterCnt) +
264a2fa0709SSampa Misra                              sizeof(set_effecter_state_field)))
265a2fa0709SSampa Misra     {
266fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
267a2fa0709SSampa Misra     }
268a2fa0709SSampa Misra 
269a2fa0709SSampa Misra     int rc = decode_set_state_effecter_states_req(request, payloadLength,
270a2fa0709SSampa Misra                                                   &effecterId, &compEffecterCnt,
271a2fa0709SSampa Misra                                                   stateField.data());
272a2fa0709SSampa Misra 
273fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
274a2fa0709SSampa Misra     {
275fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
276fb8611dcSGeorge Liu     }
27783409573SGeorge Liu 
278fb8611dcSGeorge Liu     stateField.resize(compEffecterCnt);
27983409573SGeorge Liu     const pldm::utils::DBusHandler dBusIntf;
280aea5dde1SSampa Misra     uint16_t entityType{};
281aea5dde1SSampa Misra     uint16_t entityInstance{};
282aea5dde1SSampa Misra     uint16_t stateSetId{};
283aea5dde1SSampa Misra 
284aea5dde1SSampa Misra     if (isOemStateEffecter(*this, effecterId, compEffecterCnt, entityType,
285aea5dde1SSampa Misra                            entityInstance, stateSetId) &&
286aea5dde1SSampa Misra         oemPlatformHandler != nullptr)
287aea5dde1SSampa Misra     {
2883a0e3b9bSSampa Misra         rc = oemPlatformHandler->oemSetStateEffecterStatesHandler(
2893fbd39ebSVarsha Kaverappa             entityType, entityInstance, stateSetId, compEffecterCnt, stateField,
2903fbd39ebSVarsha Kaverappa             effecterId);
291aea5dde1SSampa Misra     }
292aea5dde1SSampa Misra     else
293aea5dde1SSampa Misra     {
2940d7aca8cSGeorge Liu         rc = platform_state_effecter::setStateEffecterStatesHandler<
2950d7aca8cSGeorge Liu             pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
2960d7aca8cSGeorge Liu                                                stateField);
297aea5dde1SSampa Misra     }
298fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
299fb8611dcSGeorge Liu     {
300fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
301a2fa0709SSampa Misra     }
302a2fa0709SSampa Misra 
303fb8611dcSGeorge Liu     rc = encode_set_state_effecter_states_resp(request->hdr.instance_id, rc,
304a2fa0709SSampa Misra                                                responsePtr);
305fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
306fb8611dcSGeorge Liu     {
307fb8611dcSGeorge Liu         return ccOnlyResponse(request, rc);
308fb8611dcSGeorge Liu     }
309fb8611dcSGeorge Liu 
310a2fa0709SSampa Misra     return response;
311a2fa0709SSampa Misra }
312a2fa0709SSampa Misra 
31356e45c58STom Joseph Response Handler::platformEventMessage(const pldm_msg* request,
31456e45c58STom Joseph                                        size_t payloadLength)
31556e45c58STom Joseph {
31656e45c58STom Joseph     uint8_t formatVersion{};
31756e45c58STom Joseph     uint8_t tid{};
31856e45c58STom Joseph     uint8_t eventClass{};
31956e45c58STom Joseph     size_t offset{};
32056e45c58STom Joseph 
32156e45c58STom Joseph     auto rc = decode_platform_event_message_req(
32256e45c58STom Joseph         request, payloadLength, &formatVersion, &tid, &eventClass, &offset);
32356e45c58STom Joseph     if (rc != PLDM_SUCCESS)
32456e45c58STom Joseph     {
32556e45c58STom Joseph         return CmdHandler::ccOnlyResponse(request, rc);
32656e45c58STom Joseph     }
32756e45c58STom Joseph 
328a6a8ccd9SSagar Srinivas     if (eventClass == PLDM_HEARTBEAT_TIMER_ELAPSED_EVENT)
329a6a8ccd9SSagar Srinivas     {
330a6a8ccd9SSagar Srinivas         rc = PLDM_SUCCESS;
33179669c94SSagar Srinivas         if (oemPlatformHandler)
33279669c94SSagar Srinivas         {
33379669c94SSagar Srinivas             oemPlatformHandler->resetWatchDogTimer();
33479669c94SSagar Srinivas         }
335a6a8ccd9SSagar Srinivas     }
336a6a8ccd9SSagar Srinivas     else
337a6a8ccd9SSagar Srinivas     {
33856e45c58STom Joseph         try
33956e45c58STom Joseph         {
34056e45c58STom Joseph             const auto& handlers = eventHandlers.at(eventClass);
34156e45c58STom Joseph             for (const auto& handler : handlers)
34256e45c58STom Joseph             {
34356e45c58STom Joseph                 auto rc =
34456e45c58STom Joseph                     handler(request, payloadLength, formatVersion, tid, offset);
34556e45c58STom Joseph                 if (rc != PLDM_SUCCESS)
34656e45c58STom Joseph                 {
34756e45c58STom Joseph                     return CmdHandler::ccOnlyResponse(request, rc);
34856e45c58STom Joseph                 }
34956e45c58STom Joseph             }
35056e45c58STom Joseph         }
35156e45c58STom Joseph         catch (const std::out_of_range& e)
35256e45c58STom Joseph         {
35356e45c58STom Joseph             return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_DATA);
35456e45c58STom Joseph         }
355a6a8ccd9SSagar Srinivas     }
35656e45c58STom Joseph     Response response(
35756e45c58STom Joseph         sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES, 0);
35856e45c58STom Joseph     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
35956e45c58STom Joseph 
36056e45c58STom Joseph     rc = encode_platform_event_message_resp(request->hdr.instance_id, rc,
36156e45c58STom Joseph                                             PLDM_EVENT_NO_LOGGING, responsePtr);
36256e45c58STom Joseph     if (rc != PLDM_SUCCESS)
36356e45c58STom Joseph     {
36456e45c58STom Joseph         return ccOnlyResponse(request, rc);
36556e45c58STom Joseph     }
36656e45c58STom Joseph 
36756e45c58STom Joseph     return response;
36856e45c58STom Joseph }
36956e45c58STom Joseph 
37056e45c58STom Joseph int Handler::sensorEvent(const pldm_msg* request, size_t payloadLength,
371c4959c3cSTom Joseph                          uint8_t /*formatVersion*/, uint8_t tid,
37256e45c58STom Joseph                          size_t eventDataOffset)
37356e45c58STom Joseph {
37456e45c58STom Joseph     uint16_t sensorId{};
37556e45c58STom Joseph     uint8_t eventClass{};
37656e45c58STom Joseph     size_t eventClassDataOffset{};
37756e45c58STom Joseph     auto eventData =
37856e45c58STom Joseph         reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset;
37956e45c58STom Joseph     auto eventDataSize = payloadLength - eventDataOffset;
38056e45c58STom Joseph 
38156e45c58STom Joseph     auto rc = decode_sensor_event_data(eventData, eventDataSize, &sensorId,
38256e45c58STom Joseph                                        &eventClass, &eventClassDataOffset);
38356e45c58STom Joseph     if (rc != PLDM_SUCCESS)
38456e45c58STom Joseph     {
38556e45c58STom Joseph         return rc;
38656e45c58STom Joseph     }
38756e45c58STom Joseph 
38875330f36SZahed Hossain     auto eventClassData = reinterpret_cast<const uint8_t*>(request->payload) +
38975330f36SZahed Hossain                           eventDataOffset + eventClassDataOffset;
39075330f36SZahed Hossain     auto eventClassDataSize =
39175330f36SZahed Hossain         payloadLength - eventDataOffset - eventClassDataOffset;
39275330f36SZahed Hossain 
39356e45c58STom Joseph     if (eventClass == PLDM_STATE_SENSOR_STATE)
39456e45c58STom Joseph     {
39556e45c58STom Joseph         uint8_t sensorOffset{};
39656e45c58STom Joseph         uint8_t eventState{};
39756e45c58STom Joseph         uint8_t previousEventState{};
39856e45c58STom Joseph 
39975330f36SZahed Hossain         rc = decode_state_sensor_data(eventClassData, eventClassDataSize,
40056e45c58STom Joseph                                       &sensorOffset, &eventState,
40156e45c58STom Joseph                                       &previousEventState);
40275330f36SZahed Hossain         if (rc != PLDM_SUCCESS)
40375330f36SZahed Hossain         {
40475330f36SZahed Hossain             return PLDM_ERROR;
40575330f36SZahed Hossain         }
40675330f36SZahed Hossain 
407fe4d88bbSChicago Duan         // Emitting state sensor event signal
408fe4d88bbSChicago Duan         emitStateSensorEventSignal(tid, sensorId, sensorOffset, eventState,
409fe4d88bbSChicago Duan                                    previousEventState);
410fe4d88bbSChicago Duan 
411c4959c3cSTom Joseph         // If there are no HOST PDR's, there is no further action
412c4959c3cSTom Joseph         if (hostPDRHandler == NULL)
413c4959c3cSTom Joseph         {
414c4959c3cSTom Joseph             return PLDM_SUCCESS;
415c4959c3cSTom Joseph         }
416c4959c3cSTom Joseph 
417c4959c3cSTom Joseph         // Handle PLDM events for which PDR is available
418c4959c3cSTom Joseph         SensorEntry sensorEntry{tid, sensorId};
419b70a1964STom Joseph 
420b70a1964STom Joseph         pldm::pdr::EntityInfo entityInfo{};
421b70a1964STom Joseph         pldm::pdr::CompositeSensorStates compositeSensorStates{};
422b70a1964STom Joseph 
423c4959c3cSTom Joseph         try
424c4959c3cSTom Joseph         {
425b70a1964STom Joseph             std::tie(entityInfo, compositeSensorStates) =
426c4959c3cSTom Joseph                 hostPDRHandler->lookupSensorInfo(sensorEntry);
427b70a1964STom Joseph         }
428b70a1964STom Joseph         catch (const std::out_of_range& e)
429b70a1964STom Joseph         {
430b70a1964STom Joseph             // If there is no mapping for tid, sensorId combination, try
431b70a1964STom Joseph             // PLDM_TID_RESERVED, sensorId for terminus that is yet to
432b70a1964STom Joseph             // implement TL PDR.
433b70a1964STom Joseph             try
434b70a1964STom Joseph             {
435b70a1964STom Joseph                 sensorEntry.terminusID = PLDM_TID_RESERVED;
436b70a1964STom Joseph                 std::tie(entityInfo, compositeSensorStates) =
437b70a1964STom Joseph                     hostPDRHandler->lookupSensorInfo(sensorEntry);
438b70a1964STom Joseph             }
439b70a1964STom Joseph             // If there is no mapping for events return PLDM_SUCCESS
440b70a1964STom Joseph             catch (const std::out_of_range& e)
441b70a1964STom Joseph             {
442b70a1964STom Joseph                 return PLDM_SUCCESS;
443b70a1964STom Joseph             }
444b70a1964STom Joseph         }
445b70a1964STom Joseph 
446c4959c3cSTom Joseph         if (sensorOffset >= compositeSensorStates.size())
447c4959c3cSTom Joseph         {
448c4959c3cSTom Joseph             return PLDM_ERROR_INVALID_DATA;
449c4959c3cSTom Joseph         }
450c4959c3cSTom Joseph 
451c4959c3cSTom Joseph         const auto& possibleStates = compositeSensorStates[sensorOffset];
452c4959c3cSTom Joseph         if (possibleStates.find(eventState) == possibleStates.end())
453c4959c3cSTom Joseph         {
454c4959c3cSTom Joseph             return PLDM_ERROR_INVALID_DATA;
455c4959c3cSTom Joseph         }
456c4959c3cSTom Joseph 
457c4959c3cSTom Joseph         const auto& [containerId, entityType, entityInstance] = entityInfo;
458b70a1964STom Joseph         events::StateSensorEntry stateSensorEntry{containerId, entityType,
459b70a1964STom Joseph                                                   entityInstance, sensorOffset};
4603aec997cSPavithra Barithaya         return hostPDRHandler->handleStateSensorEvent(stateSensorEntry,
4613aec997cSPavithra Barithaya                                                       eventState);
462c4959c3cSTom Joseph     }
46356e45c58STom Joseph     else
46456e45c58STom Joseph     {
46556e45c58STom Joseph         return PLDM_ERROR_INVALID_DATA;
46656e45c58STom Joseph     }
46756e45c58STom Joseph 
46856e45c58STom Joseph     return PLDM_SUCCESS;
46956e45c58STom Joseph }
47056e45c58STom Joseph 
4718cb6f665SDeepak Kodihalli int Handler::pldmPDRRepositoryChgEvent(const pldm_msg* request,
4728cb6f665SDeepak Kodihalli                                        size_t payloadLength,
4738cb6f665SDeepak Kodihalli                                        uint8_t /*formatVersion*/,
4748cb6f665SDeepak Kodihalli                                        uint8_t /*tid*/, size_t eventDataOffset)
4758cb6f665SDeepak Kodihalli {
4768cb6f665SDeepak Kodihalli     uint8_t eventDataFormat{};
4778cb6f665SDeepak Kodihalli     uint8_t numberOfChangeRecords{};
4788cb6f665SDeepak Kodihalli     size_t dataOffset{};
4798cb6f665SDeepak Kodihalli 
4808cb6f665SDeepak Kodihalli     auto eventData =
4818cb6f665SDeepak Kodihalli         reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset;
4828cb6f665SDeepak Kodihalli     auto eventDataSize = payloadLength - eventDataOffset;
4838cb6f665SDeepak Kodihalli 
4848cb6f665SDeepak Kodihalli     auto rc = decode_pldm_pdr_repository_chg_event_data(
4858cb6f665SDeepak Kodihalli         eventData, eventDataSize, &eventDataFormat, &numberOfChangeRecords,
4868cb6f665SDeepak Kodihalli         &dataOffset);
4878cb6f665SDeepak Kodihalli     if (rc != PLDM_SUCCESS)
4888cb6f665SDeepak Kodihalli     {
4898cb6f665SDeepak Kodihalli         return rc;
4908cb6f665SDeepak Kodihalli     }
4918cb6f665SDeepak Kodihalli 
4928cb6f665SDeepak Kodihalli     PDRRecordHandles pdrRecordHandles;
4937246e0cdSDeepak Kodihalli 
4947246e0cdSDeepak Kodihalli     if (eventDataFormat == FORMAT_IS_PDR_TYPES)
4957246e0cdSDeepak Kodihalli     {
4967246e0cdSDeepak Kodihalli         return PLDM_ERROR_INVALID_DATA;
4977246e0cdSDeepak Kodihalli     }
4987246e0cdSDeepak Kodihalli 
4998cb6f665SDeepak Kodihalli     if (eventDataFormat == FORMAT_IS_PDR_HANDLES)
5008cb6f665SDeepak Kodihalli     {
5018cb6f665SDeepak Kodihalli         uint8_t eventDataOperation{};
5028cb6f665SDeepak Kodihalli         uint8_t numberOfChangeEntries{};
5038cb6f665SDeepak Kodihalli 
5048cb6f665SDeepak Kodihalli         auto changeRecordData = eventData + dataOffset;
5058cb6f665SDeepak Kodihalli         auto changeRecordDataSize = eventDataSize - dataOffset;
5068cb6f665SDeepak Kodihalli 
5078cb6f665SDeepak Kodihalli         while (changeRecordDataSize)
5088cb6f665SDeepak Kodihalli         {
5098cb6f665SDeepak Kodihalli             rc = decode_pldm_pdr_repository_change_record_data(
5108cb6f665SDeepak Kodihalli                 changeRecordData, changeRecordDataSize, &eventDataOperation,
5118cb6f665SDeepak Kodihalli                 &numberOfChangeEntries, &dataOffset);
5128cb6f665SDeepak Kodihalli 
5138cb6f665SDeepak Kodihalli             if (rc != PLDM_SUCCESS)
5148cb6f665SDeepak Kodihalli             {
5158cb6f665SDeepak Kodihalli                 return rc;
5168cb6f665SDeepak Kodihalli             }
5178cb6f665SDeepak Kodihalli 
5188cb6f665SDeepak Kodihalli             if (eventDataOperation == PLDM_RECORDS_ADDED)
5198cb6f665SDeepak Kodihalli             {
5208cb6f665SDeepak Kodihalli                 rc = getPDRRecordHandles(
5218cb6f665SDeepak Kodihalli                     reinterpret_cast<const ChangeEntry*>(changeRecordData +
5228cb6f665SDeepak Kodihalli                                                          dataOffset),
5238cb6f665SDeepak Kodihalli                     changeRecordDataSize - dataOffset,
5248cb6f665SDeepak Kodihalli                     static_cast<size_t>(numberOfChangeEntries),
5258cb6f665SDeepak Kodihalli                     pdrRecordHandles);
5268cb6f665SDeepak Kodihalli 
5278cb6f665SDeepak Kodihalli                 if (rc != PLDM_SUCCESS)
5288cb6f665SDeepak Kodihalli                 {
5298cb6f665SDeepak Kodihalli                     return rc;
5308cb6f665SDeepak Kodihalli                 }
5318cb6f665SDeepak Kodihalli             }
5328cb6f665SDeepak Kodihalli 
533841ee3d5SPavithra Barithaya             if (eventDataOperation == PLDM_RECORDS_MODIFIED)
534841ee3d5SPavithra Barithaya             {
535841ee3d5SPavithra Barithaya                 return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
536841ee3d5SPavithra Barithaya             }
537841ee3d5SPavithra Barithaya 
5388cb6f665SDeepak Kodihalli             changeRecordData +=
5398cb6f665SDeepak Kodihalli                 dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry));
5408cb6f665SDeepak Kodihalli             changeRecordDataSize -=
5418cb6f665SDeepak Kodihalli                 dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry));
5428cb6f665SDeepak Kodihalli         }
5437246e0cdSDeepak Kodihalli     }
5447246e0cdSDeepak Kodihalli     if (hostPDRHandler)
5458cb6f665SDeepak Kodihalli     {
5468cb6f665SDeepak Kodihalli         hostPDRHandler->fetchPDR(std::move(pdrRecordHandles));
5478cb6f665SDeepak Kodihalli     }
5488cb6f665SDeepak Kodihalli 
5498cb6f665SDeepak Kodihalli     return PLDM_SUCCESS;
5508cb6f665SDeepak Kodihalli }
5518cb6f665SDeepak Kodihalli 
5528cb6f665SDeepak Kodihalli int Handler::getPDRRecordHandles(const ChangeEntry* changeEntryData,
5538cb6f665SDeepak Kodihalli                                  size_t changeEntryDataSize,
5548cb6f665SDeepak Kodihalli                                  size_t numberOfChangeEntries,
5558cb6f665SDeepak Kodihalli                                  PDRRecordHandles& pdrRecordHandles)
5568cb6f665SDeepak Kodihalli {
5578cb6f665SDeepak Kodihalli     if (numberOfChangeEntries > (changeEntryDataSize / sizeof(ChangeEntry)))
5588cb6f665SDeepak Kodihalli     {
5598cb6f665SDeepak Kodihalli         return PLDM_ERROR_INVALID_DATA;
5608cb6f665SDeepak Kodihalli     }
5618cb6f665SDeepak Kodihalli     for (size_t i = 0; i < numberOfChangeEntries; i++)
5628cb6f665SDeepak Kodihalli     {
5638cb6f665SDeepak Kodihalli         pdrRecordHandles.push_back(changeEntryData[i]);
5648cb6f665SDeepak Kodihalli     }
5658cb6f665SDeepak Kodihalli     return PLDM_SUCCESS;
5668cb6f665SDeepak Kodihalli }
5678cb6f665SDeepak Kodihalli 
568eccb0c56SGeorge Liu Response Handler::setNumericEffecterValue(const pldm_msg* request,
569eccb0c56SGeorge Liu                                           size_t payloadLength)
570eccb0c56SGeorge Liu {
571eccb0c56SGeorge Liu     Response response(sizeof(pldm_msg_hdr) +
572eccb0c56SGeorge Liu                       PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
573eccb0c56SGeorge Liu     uint16_t effecterId{};
574eccb0c56SGeorge Liu     uint8_t effecterDataSize{};
575eccb0c56SGeorge Liu     uint8_t effecterValue[4] = {};
576eccb0c56SGeorge Liu 
577eccb0c56SGeorge Liu     if ((payloadLength > sizeof(effecterId) + sizeof(effecterDataSize) +
578eccb0c56SGeorge Liu                              sizeof(union_effecter_data_size)) ||
579eccb0c56SGeorge Liu         (payloadLength < sizeof(effecterId) + sizeof(effecterDataSize) + 1))
580eccb0c56SGeorge Liu     {
581eccb0c56SGeorge Liu         return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
582eccb0c56SGeorge Liu     }
583eccb0c56SGeorge Liu 
584eccb0c56SGeorge Liu     int rc = decode_set_numeric_effecter_value_req(
585eccb0c56SGeorge Liu         request, payloadLength, &effecterId, &effecterDataSize,
586eccb0c56SGeorge Liu         reinterpret_cast<uint8_t*>(&effecterValue));
587eccb0c56SGeorge Liu 
588eccb0c56SGeorge Liu     if (rc == PLDM_SUCCESS)
589eccb0c56SGeorge Liu     {
590eccb0c56SGeorge Liu         const pldm::utils::DBusHandler dBusIntf;
591eccb0c56SGeorge Liu         rc = platform_numeric_effecter::setNumericEffecterValueHandler<
592eccb0c56SGeorge Liu             pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
593eccb0c56SGeorge Liu                                                effecterDataSize, effecterValue,
594eccb0c56SGeorge Liu                                                sizeof(effecterValue));
595eccb0c56SGeorge Liu     }
596eccb0c56SGeorge Liu 
597eccb0c56SGeorge Liu     return ccOnlyResponse(request, rc);
598eccb0c56SGeorge Liu }
599eccb0c56SGeorge Liu 
60012afe110SSampa Misra void Handler::generateTerminusLocatorPDR(Repo& repo)
60112afe110SSampa Misra {
60212afe110SSampa Misra     std::vector<uint8_t> pdrBuffer(sizeof(pldm_terminus_locator_pdr));
60312afe110SSampa Misra 
60412afe110SSampa Misra     auto pdr = reinterpret_cast<pldm_terminus_locator_pdr*>(pdrBuffer.data());
60512afe110SSampa Misra 
60612afe110SSampa Misra     pdr->hdr.record_handle = 0;
60712afe110SSampa Misra     pdr->hdr.version = 1;
60812afe110SSampa Misra     pdr->hdr.type = PLDM_TERMINUS_LOCATOR_PDR;
60912afe110SSampa Misra     pdr->hdr.record_change_num = 0;
61012afe110SSampa Misra     pdr->hdr.length = sizeof(pldm_terminus_locator_pdr) - sizeof(pldm_pdr_hdr);
611cc5f1586SManojkiran Eda     pdr->terminus_handle = TERMINUS_HANDLE;
61212afe110SSampa Misra     pdr->validity = PLDM_TL_PDR_VALID;
613cc5f1586SManojkiran Eda     pdr->tid = TERMINUS_ID;
61412afe110SSampa Misra     pdr->container_id = 0x0;
61512afe110SSampa Misra     pdr->terminus_locator_type = PLDM_TERMINUS_LOCATOR_TYPE_MCTP_EID;
61612afe110SSampa Misra     pdr->terminus_locator_value_size =
61712afe110SSampa Misra         sizeof(pldm_terminus_locator_type_mctp_eid);
61812afe110SSampa Misra     auto locatorValue = reinterpret_cast<pldm_terminus_locator_type_mctp_eid*>(
61912afe110SSampa Misra         pdr->terminus_locator_value);
62012afe110SSampa Misra     locatorValue->eid = BmcMctpEid;
62112afe110SSampa Misra 
62212afe110SSampa Misra     PdrEntry pdrEntry{};
62312afe110SSampa Misra     pdrEntry.data = pdrBuffer.data();
62412afe110SSampa Misra     pdrEntry.size = pdrBuffer.size();
62512afe110SSampa Misra     repo.addRecord(pdrEntry);
62612afe110SSampa Misra }
627362c18ddSGeorge Liu 
628362c18ddSGeorge Liu Response Handler::getStateSensorReadings(const pldm_msg* request,
629362c18ddSGeorge Liu                                          size_t payloadLength)
630362c18ddSGeorge Liu {
631362c18ddSGeorge Liu     uint16_t sensorId{};
632362c18ddSGeorge Liu     bitfield8_t sensorRearm{};
633362c18ddSGeorge Liu     uint8_t reserved{};
634362c18ddSGeorge Liu 
635362c18ddSGeorge Liu     if (payloadLength != PLDM_GET_SENSOR_READING_REQ_BYTES)
636362c18ddSGeorge Liu     {
637362c18ddSGeorge Liu         return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
638362c18ddSGeorge Liu     }
639362c18ddSGeorge Liu 
640362c18ddSGeorge Liu     int rc = decode_get_state_sensor_readings_req(
641362c18ddSGeorge Liu         request, payloadLength, &sensorId, &sensorRearm, &reserved);
642362c18ddSGeorge Liu 
643362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
644362c18ddSGeorge Liu     {
645362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
646362c18ddSGeorge Liu     }
647362c18ddSGeorge Liu 
648362c18ddSGeorge Liu     // 0x01 to 0x08
649c1230ca1SGeorge Liu     uint8_t sensorRearmCount = std::popcount(sensorRearm.byte);
650aea5dde1SSampa Misra     std::vector<get_sensor_state_field> stateField(sensorRearmCount);
651362c18ddSGeorge Liu     uint8_t comSensorCnt{};
652362c18ddSGeorge Liu     const pldm::utils::DBusHandler dBusIntf;
653aea5dde1SSampa Misra 
654aea5dde1SSampa Misra     uint16_t entityType{};
655aea5dde1SSampa Misra     uint16_t entityInstance{};
656aea5dde1SSampa Misra     uint16_t stateSetId{};
657aea5dde1SSampa Misra 
658aea5dde1SSampa Misra     if (isOemStateSensor(*this, sensorId, sensorRearmCount, comSensorCnt,
659aea5dde1SSampa Misra                          entityType, entityInstance, stateSetId) &&
660aea5dde1SSampa Misra         oemPlatformHandler != nullptr)
661aea5dde1SSampa Misra     {
662aea5dde1SSampa Misra         rc = oemPlatformHandler->getOemStateSensorReadingsHandler(
663aea5dde1SSampa Misra             entityType, entityInstance, stateSetId, comSensorCnt, stateField);
664aea5dde1SSampa Misra     }
665aea5dde1SSampa Misra     else
666aea5dde1SSampa Misra     {
667362c18ddSGeorge Liu         rc = platform_state_sensor::getStateSensorReadingsHandler<
668aea5dde1SSampa Misra             pldm::utils::DBusHandler, Handler>(dBusIntf, *this, sensorId,
669aea5dde1SSampa Misra                                                sensorRearmCount, comSensorCnt,
670aea5dde1SSampa Misra                                                stateField);
671aea5dde1SSampa Misra     }
672362c18ddSGeorge Liu 
673362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
674362c18ddSGeorge Liu     {
675362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
676362c18ddSGeorge Liu     }
677362c18ddSGeorge Liu 
678362c18ddSGeorge Liu     Response response(sizeof(pldm_msg_hdr) +
679362c18ddSGeorge Liu                       PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
680362c18ddSGeorge Liu                       sizeof(get_sensor_state_field) * comSensorCnt);
681362c18ddSGeorge Liu     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
682362c18ddSGeorge Liu     rc = encode_get_state_sensor_readings_resp(request->hdr.instance_id, rc,
683362c18ddSGeorge Liu                                                comSensorCnt, stateField.data(),
684362c18ddSGeorge Liu                                                responsePtr);
685362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
686362c18ddSGeorge Liu     {
687362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
688362c18ddSGeorge Liu     }
689362c18ddSGeorge Liu 
690362c18ddSGeorge Liu     return response;
691362c18ddSGeorge Liu }
692362c18ddSGeorge Liu 
69399854a70SPavithra Barithaya void Handler::_processPostGetPDRActions(sdeventplus::source::EventBase&
69499854a70SPavithra Barithaya                                         /*source */)
6955fb37d57SSampa Misra {
6965fb37d57SSampa Misra     deferredGetPDREvent.reset();
6975fb37d57SSampa Misra     dbusToPLDMEventHandler->listenSensorEvent(pdrRepo, sensorDbusObjMaps);
6985fb37d57SSampa Misra }
6995fb37d57SSampa Misra 
700aea5dde1SSampa Misra bool isOemStateSensor(Handler& handler, uint16_t sensorId,
701aea5dde1SSampa Misra                       uint8_t sensorRearmCount, uint8_t& compSensorCnt,
702aea5dde1SSampa Misra                       uint16_t& entityType, uint16_t& entityInstance,
703aea5dde1SSampa Misra                       uint16_t& stateSetId)
704aea5dde1SSampa Misra {
705aea5dde1SSampa Misra     pldm_state_sensor_pdr* pdr = nullptr;
706aea5dde1SSampa Misra 
707aea5dde1SSampa Misra     std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateSensorPdrRepo(
708aea5dde1SSampa Misra         pldm_pdr_init(), pldm_pdr_destroy);
709aea5dde1SSampa Misra     Repo stateSensorPDRs(stateSensorPdrRepo.get());
710aea5dde1SSampa Misra     getRepoByType(handler.getRepo(), stateSensorPDRs, PLDM_STATE_SENSOR_PDR);
711aea5dde1SSampa Misra     if (stateSensorPDRs.empty())
712aea5dde1SSampa Misra     {
713aea5dde1SSampa Misra         std::cerr << "Failed to get record by PDR type\n";
714aea5dde1SSampa Misra         return false;
715aea5dde1SSampa Misra     }
716aea5dde1SSampa Misra 
717aea5dde1SSampa Misra     PdrEntry pdrEntry{};
718aea5dde1SSampa Misra     auto pdrRecord = stateSensorPDRs.getFirstRecord(pdrEntry);
719aea5dde1SSampa Misra     while (pdrRecord)
720aea5dde1SSampa Misra     {
721aea5dde1SSampa Misra         pdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdrEntry.data);
722aea5dde1SSampa Misra         assert(pdr != NULL);
723aea5dde1SSampa Misra         if (pdr->sensor_id != sensorId)
724aea5dde1SSampa Misra         {
725aea5dde1SSampa Misra             pdr = nullptr;
726aea5dde1SSampa Misra             pdrRecord = stateSensorPDRs.getNextRecord(pdrRecord, pdrEntry);
727aea5dde1SSampa Misra             continue;
728aea5dde1SSampa Misra         }
729aea5dde1SSampa Misra         auto tmpEntityType = pdr->entity_type;
730aea5dde1SSampa Misra         auto tmpEntityInstance = pdr->entity_instance;
731aea5dde1SSampa Misra         auto tmpCompSensorCnt = pdr->composite_sensor_count;
732aea5dde1SSampa Misra         auto tmpPossibleStates =
733aea5dde1SSampa Misra             reinterpret_cast<state_sensor_possible_states*>(
734aea5dde1SSampa Misra                 pdr->possible_states);
735aea5dde1SSampa Misra         auto tmpStateSetId = tmpPossibleStates->state_set_id;
736aea5dde1SSampa Misra 
737aea5dde1SSampa Misra         if (sensorRearmCount > tmpCompSensorCnt)
738aea5dde1SSampa Misra         {
739aea5dde1SSampa Misra             std::cerr << "The requester sent wrong sensorRearm"
740aea5dde1SSampa Misra                       << " count for the sensor, SENSOR_ID=" << sensorId
741aea5dde1SSampa Misra                       << "SENSOR_REARM_COUNT=" << (uint16_t)sensorRearmCount
742aea5dde1SSampa Misra                       << "\n";
743aea5dde1SSampa Misra             break;
744aea5dde1SSampa Misra         }
745aea5dde1SSampa Misra 
746aea5dde1SSampa Misra         if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START &&
747aea5dde1SSampa Misra              tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) ||
748aea5dde1SSampa Misra             (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START &&
749aea5dde1SSampa Misra              tmpStateSetId < PLDM_OEM_STATE_SET_ID_END))
750aea5dde1SSampa Misra         {
751aea5dde1SSampa Misra             entityType = tmpEntityType;
752aea5dde1SSampa Misra             entityInstance = tmpEntityInstance;
753aea5dde1SSampa Misra             stateSetId = tmpStateSetId;
754aea5dde1SSampa Misra             compSensorCnt = tmpCompSensorCnt;
755aea5dde1SSampa Misra             return true;
756aea5dde1SSampa Misra         }
757aea5dde1SSampa Misra         else
758aea5dde1SSampa Misra         {
759aea5dde1SSampa Misra             return false;
760aea5dde1SSampa Misra         }
761aea5dde1SSampa Misra     }
762aea5dde1SSampa Misra     return false;
763aea5dde1SSampa Misra }
764aea5dde1SSampa Misra 
765aea5dde1SSampa Misra bool isOemStateEffecter(Handler& handler, uint16_t effecterId,
766aea5dde1SSampa Misra                         uint8_t compEffecterCnt, uint16_t& entityType,
767aea5dde1SSampa Misra                         uint16_t& entityInstance, uint16_t& stateSetId)
768aea5dde1SSampa Misra {
769aea5dde1SSampa Misra     pldm_state_effecter_pdr* pdr = nullptr;
770aea5dde1SSampa Misra 
771aea5dde1SSampa Misra     std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateEffecterPdrRepo(
772aea5dde1SSampa Misra         pldm_pdr_init(), pldm_pdr_destroy);
773aea5dde1SSampa Misra     Repo stateEffecterPDRs(stateEffecterPdrRepo.get());
774aea5dde1SSampa Misra     getRepoByType(handler.getRepo(), stateEffecterPDRs,
775aea5dde1SSampa Misra                   PLDM_STATE_EFFECTER_PDR);
776aea5dde1SSampa Misra     if (stateEffecterPDRs.empty())
777aea5dde1SSampa Misra     {
778aea5dde1SSampa Misra         std::cerr << "Failed to get record by PDR type\n";
779aea5dde1SSampa Misra         return false;
780aea5dde1SSampa Misra     }
781aea5dde1SSampa Misra 
782aea5dde1SSampa Misra     PdrEntry pdrEntry{};
783aea5dde1SSampa Misra     auto pdrRecord = stateEffecterPDRs.getFirstRecord(pdrEntry);
784aea5dde1SSampa Misra     while (pdrRecord)
785aea5dde1SSampa Misra     {
786aea5dde1SSampa Misra         pdr = reinterpret_cast<pldm_state_effecter_pdr*>(pdrEntry.data);
787aea5dde1SSampa Misra         assert(pdr != NULL);
788aea5dde1SSampa Misra         if (pdr->effecter_id != effecterId)
789aea5dde1SSampa Misra         {
790aea5dde1SSampa Misra             pdr = nullptr;
791aea5dde1SSampa Misra             pdrRecord = stateEffecterPDRs.getNextRecord(pdrRecord, pdrEntry);
792aea5dde1SSampa Misra             continue;
793aea5dde1SSampa Misra         }
794aea5dde1SSampa Misra 
795aea5dde1SSampa Misra         auto tmpEntityType = pdr->entity_type;
796aea5dde1SSampa Misra         auto tmpEntityInstance = pdr->entity_instance;
797aea5dde1SSampa Misra         auto tmpPossibleStates =
798aea5dde1SSampa Misra             reinterpret_cast<state_effecter_possible_states*>(
799aea5dde1SSampa Misra                 pdr->possible_states);
800aea5dde1SSampa Misra         auto tmpStateSetId = tmpPossibleStates->state_set_id;
801aea5dde1SSampa Misra 
802aea5dde1SSampa Misra         if (compEffecterCnt > pdr->composite_effecter_count)
803aea5dde1SSampa Misra         {
804aea5dde1SSampa Misra             std::cerr << "The requester sent wrong composite effecter"
805aea5dde1SSampa Misra                       << " count for the effecter, EFFECTER_ID=" << effecterId
806aea5dde1SSampa Misra                       << "COMP_EFF_CNT=" << (uint16_t)compEffecterCnt << "\n";
807aea5dde1SSampa Misra             return false;
808aea5dde1SSampa Misra         }
809aea5dde1SSampa Misra 
810aea5dde1SSampa Misra         if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START &&
811aea5dde1SSampa Misra              tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) ||
812aea5dde1SSampa Misra             (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START &&
813aea5dde1SSampa Misra              tmpStateSetId < PLDM_OEM_STATE_SET_ID_END))
814aea5dde1SSampa Misra         {
815aea5dde1SSampa Misra             entityType = tmpEntityType;
816aea5dde1SSampa Misra             entityInstance = tmpEntityInstance;
817aea5dde1SSampa Misra             stateSetId = tmpStateSetId;
818aea5dde1SSampa Misra             return true;
819aea5dde1SSampa Misra         }
820aea5dde1SSampa Misra         else
821aea5dde1SSampa Misra         {
822aea5dde1SSampa Misra             return false;
823aea5dde1SSampa Misra         }
824aea5dde1SSampa Misra     }
825aea5dde1SSampa Misra     return false;
826aea5dde1SSampa Misra }
827aea5dde1SSampa Misra 
828bc669f1bSDeepak Kodihalli } // namespace platform
829557dfb00SDeepak Kodihalli } // namespace responder
830557dfb00SDeepak Kodihalli } // namespace pldm
831