1557dfb00SDeepak Kodihalli 
2557dfb00SDeepak Kodihalli #include "platform.hpp"
3557dfb00SDeepak Kodihalli 
4aea5dde1SSampa Misra #include "libpldm/entity.h"
5aea5dde1SSampa Misra #include "libpldm/state_set.h"
6aea5dde1SSampa Misra 
7b70a1964STom Joseph #include "common/types.hpp"
8d130e1a3SDeepak Kodihalli #include "common/utils.hpp"
9c4959c3cSTom Joseph #include "event_parser.hpp"
1012afe110SSampa Misra #include "pdr.hpp"
11456c9a2fSGeorge Liu #include "pdr_numeric_effecter.hpp"
12a2870726SGeorge Liu #include "pdr_state_effecter.hpp"
13adbe1726SGeorge Liu #include "pdr_state_sensor.hpp"
14362c18ddSGeorge Liu #include "pdr_utils.hpp"
15eccb0c56SGeorge Liu #include "platform_numeric_effecter.hpp"
160d7aca8cSGeorge Liu #include "platform_state_effecter.hpp"
17362c18ddSGeorge Liu #include "platform_state_sensor.hpp"
1883409573SGeorge Liu 
195079ac4aSBrad Bishop using namespace pldm::utils;
205079ac4aSBrad Bishop using namespace pldm::responder::pdr;
215079ac4aSBrad Bishop using namespace pldm::responder::pdr_utils;
225079ac4aSBrad Bishop 
23557dfb00SDeepak Kodihalli namespace pldm
24557dfb00SDeepak Kodihalli {
25557dfb00SDeepak Kodihalli namespace responder
26557dfb00SDeepak Kodihalli {
27a2fa0709SSampa Misra namespace platform
28a2fa0709SSampa Misra {
29a2fa0709SSampa Misra 
30c682fe2dSDeepak Kodihalli using InternalFailure =
31c682fe2dSDeepak Kodihalli     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
32c682fe2dSDeepak Kodihalli 
331ec85d4bSGeorge Liu static const Json empty{};
341ec85d4bSGeorge Liu 
35a2870726SGeorge Liu void Handler::addDbusObjMaps(
36adbe1726SGeorge Liu     uint16_t id,
37adbe1726SGeorge Liu     std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps> dbusObj,
38adbe1726SGeorge Liu     TypeId typeId)
391ec85d4bSGeorge Liu {
40adbe1726SGeorge Liu     if (typeId == TypeId::PLDM_SENSOR_ID)
41adbe1726SGeorge Liu     {
42adbe1726SGeorge Liu         sensorDbusObjMaps.emplace(id, dbusObj);
43adbe1726SGeorge Liu     }
44adbe1726SGeorge Liu     else
45adbe1726SGeorge Liu     {
46adbe1726SGeorge Liu         effecterDbusObjMaps.emplace(id, dbusObj);
47adbe1726SGeorge Liu     }
481ec85d4bSGeorge Liu }
491ec85d4bSGeorge Liu 
50a2870726SGeorge Liu const std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>&
51adbe1726SGeorge Liu     Handler::getDbusObjMaps(uint16_t id, TypeId typeId) const
521ec85d4bSGeorge Liu {
53adbe1726SGeorge Liu     if (typeId == TypeId::PLDM_SENSOR_ID)
54adbe1726SGeorge Liu     {
55adbe1726SGeorge Liu         return sensorDbusObjMaps.at(id);
56adbe1726SGeorge Liu     }
57adbe1726SGeorge Liu     else
58adbe1726SGeorge Liu     {
59adbe1726SGeorge Liu         return effecterDbusObjMaps.at(id);
60adbe1726SGeorge Liu     }
611ec85d4bSGeorge Liu }
621ec85d4bSGeorge Liu 
6336e81352SGeorge Liu void Handler::generate(const pldm::utils::DBusHandler& dBusIntf,
6436e81352SGeorge Liu                        const std::string& dir, Repo& repo)
65c682fe2dSDeepak Kodihalli {
66c6e49c4fSDeepak Kodihalli     if (!fs::exists(dir))
67c6e49c4fSDeepak Kodihalli     {
68c6e49c4fSDeepak Kodihalli         return;
69c6e49c4fSDeepak Kodihalli     }
70c6e49c4fSDeepak Kodihalli 
71c682fe2dSDeepak Kodihalli     // A map of PDR type to a lambda that handles creation of that PDR type.
72c682fe2dSDeepak Kodihalli     // The lambda essentially would parse the platform specific PDR JSONs to
73c682fe2dSDeepak Kodihalli     // generate the PDR structures. This function iterates through the map to
74c682fe2dSDeepak Kodihalli     // invoke all lambdas, so that all PDR types can be created.
75a2870726SGeorge Liu 
76a2870726SGeorge Liu     const std::map<Type, generatePDR> generateHandlers = {
77a2870726SGeorge Liu         {PLDM_STATE_EFFECTER_PDR,
7836e81352SGeorge Liu          [this](const DBusHandler& dBusIntf, const auto& json,
7936e81352SGeorge Liu                 RepoInterface& repo) {
8036e81352SGeorge Liu              pdr_state_effecter::generateStateEffecterPDR<
8136e81352SGeorge Liu                  pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this,
82a2870726SGeorge Liu                                                     repo);
83456c9a2fSGeorge Liu          }},
84456c9a2fSGeorge Liu         {PLDM_NUMERIC_EFFECTER_PDR,
8536e81352SGeorge Liu          [this](const DBusHandler& dBusIntf, const auto& json,
8636e81352SGeorge Liu                 RepoInterface& repo) {
8736e81352SGeorge Liu              pdr_numeric_effecter::generateNumericEffecterPDR<
8836e81352SGeorge Liu                  pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this,
8936e81352SGeorge Liu                                                     repo);
90adbe1726SGeorge Liu          }},
91adbe1726SGeorge Liu         {PLDM_STATE_SENSOR_PDR, [this](const DBusHandler& dBusIntf,
92adbe1726SGeorge Liu                                        const auto& json, RepoInterface& repo) {
93adbe1726SGeorge Liu              pdr_state_sensor::generateStateSensorPDR<pldm::utils::DBusHandler,
94adbe1726SGeorge Liu                                                       Handler>(dBusIntf, json,
95adbe1726SGeorge Liu                                                                *this, repo);
96c682fe2dSDeepak Kodihalli          }}};
97c682fe2dSDeepak Kodihalli 
98c682fe2dSDeepak Kodihalli     Type pdrType{};
99c682fe2dSDeepak Kodihalli     for (const auto& dirEntry : fs::directory_iterator(dir))
100c682fe2dSDeepak Kodihalli     {
101c682fe2dSDeepak Kodihalli         try
102c682fe2dSDeepak Kodihalli         {
103c682fe2dSDeepak Kodihalli             auto json = readJson(dirEntry.path().string());
104c682fe2dSDeepak Kodihalli             if (!json.empty())
105c682fe2dSDeepak Kodihalli             {
1061ec85d4bSGeorge Liu                 auto effecterPDRs = json.value("effecterPDRs", empty);
1071ec85d4bSGeorge Liu                 for (const auto& effecter : effecterPDRs)
1081ec85d4bSGeorge Liu                 {
1091ec85d4bSGeorge Liu                     pdrType = effecter.value("pdrType", 0);
11036e81352SGeorge Liu                     generateHandlers.at(pdrType)(dBusIntf, effecter, repo);
1111ec85d4bSGeorge Liu                 }
112adbe1726SGeorge Liu 
113adbe1726SGeorge Liu                 auto sensorPDRs = json.value("sensorPDRs", empty);
114adbe1726SGeorge Liu                 for (const auto& sensor : sensorPDRs)
115adbe1726SGeorge Liu                 {
116adbe1726SGeorge Liu                     pdrType = sensor.value("pdrType", 0);
117adbe1726SGeorge Liu                     generateHandlers.at(pdrType)(dBusIntf, sensor, repo);
118adbe1726SGeorge Liu                 }
119c682fe2dSDeepak Kodihalli             }
120c682fe2dSDeepak Kodihalli         }
121c682fe2dSDeepak Kodihalli         catch (const InternalFailure& e)
122c682fe2dSDeepak Kodihalli         {
123c682fe2dSDeepak Kodihalli             std::cerr << "PDR config directory does not exist or empty, TYPE= "
124c682fe2dSDeepak Kodihalli                       << pdrType << "PATH= " << dirEntry
125c682fe2dSDeepak Kodihalli                       << " ERROR=" << e.what() << "\n";
126c682fe2dSDeepak Kodihalli         }
127c682fe2dSDeepak Kodihalli         catch (const Json::exception& e)
128c682fe2dSDeepak Kodihalli         {
129c682fe2dSDeepak Kodihalli             std::cerr << "Failed parsing PDR JSON file, TYPE= " << pdrType
130c682fe2dSDeepak Kodihalli                       << " ERROR=" << e.what() << "\n";
131c682fe2dSDeepak Kodihalli             pldm::utils::reportError(
132c682fe2dSDeepak Kodihalli                 "xyz.openbmc_project.bmc.pldm.InternalFailure");
133c682fe2dSDeepak Kodihalli         }
134c682fe2dSDeepak Kodihalli         catch (const std::exception& e)
135c682fe2dSDeepak Kodihalli         {
136c682fe2dSDeepak Kodihalli             std::cerr << "Failed parsing PDR JSON file, TYPE= " << pdrType
137c682fe2dSDeepak Kodihalli                       << " ERROR=" << e.what() << "\n";
138c682fe2dSDeepak Kodihalli             pldm::utils::reportError(
139c682fe2dSDeepak Kodihalli                 "xyz.openbmc_project.bmc.pldm.InternalFailure");
140c682fe2dSDeepak Kodihalli         }
141c682fe2dSDeepak Kodihalli     }
142c682fe2dSDeepak Kodihalli }
143557dfb00SDeepak Kodihalli 
144bc669f1bSDeepak Kodihalli Response Handler::getPDR(const pldm_msg* request, size_t payloadLength)
145557dfb00SDeepak Kodihalli {
14633e9c7eaSTom Joseph     // Build FRU table if not built, since entity association PDR's are built
14733e9c7eaSTom Joseph     // when the FRU table is constructed.
14833e9c7eaSTom Joseph     if (fruHandler)
14933e9c7eaSTom Joseph     {
15033e9c7eaSTom Joseph         fruHandler->buildFRUTable();
15133e9c7eaSTom Joseph     }
15233e9c7eaSTom Joseph 
153d680ae03SGeorge Liu     if (!pdrCreated)
154d680ae03SGeorge Liu     {
155d680ae03SGeorge Liu         generateTerminusLocatorPDR(pdrRepo);
156d680ae03SGeorge Liu         generate(*dBusIntf, pdrJsonsDir, pdrRepo);
15778a225a2SSagar Srinivas         if (oemPlatformHandler != nullptr)
15878a225a2SSagar Srinivas         {
15978a225a2SSagar Srinivas             oemPlatformHandler->buildOEMPDR(pdrRepo);
16078a225a2SSagar Srinivas         }
16178a225a2SSagar Srinivas 
162d680ae03SGeorge Liu         pdrCreated = true;
1635eed8e55SGeorge Liu 
1645eed8e55SGeorge Liu         if (dbusToPLDMEventHandler)
1655eed8e55SGeorge Liu         {
1665fb37d57SSampa Misra             deferredGetPDREvent = std::make_unique<sdeventplus::source::Defer>(
1675fb37d57SSampa Misra                 event,
1685fb37d57SSampa Misra                 std::bind(std::mem_fn(&pldm::responder::platform::Handler::
1695fb37d57SSampa Misra                                           _processPostGetPDRActions),
1705fb37d57SSampa Misra                           this, std::placeholders::_1));
1715eed8e55SGeorge Liu         }
172d680ae03SGeorge Liu     }
173d680ae03SGeorge Liu 
174557dfb00SDeepak Kodihalli     Response response(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES, 0);
175557dfb00SDeepak Kodihalli     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
176557dfb00SDeepak Kodihalli 
177557dfb00SDeepak Kodihalli     if (payloadLength != PLDM_GET_PDR_REQ_BYTES)
178557dfb00SDeepak Kodihalli     {
179fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
180557dfb00SDeepak Kodihalli     }
181557dfb00SDeepak Kodihalli 
182557dfb00SDeepak Kodihalli     uint32_t recordHandle{};
183557dfb00SDeepak Kodihalli     uint32_t dataTransferHandle{};
184557dfb00SDeepak Kodihalli     uint8_t transferOpFlag{};
185557dfb00SDeepak Kodihalli     uint16_t reqSizeBytes{};
186557dfb00SDeepak Kodihalli     uint16_t recordChangeNum{};
187557dfb00SDeepak Kodihalli 
188fb8611dcSGeorge Liu     auto rc = decode_get_pdr_req(request, payloadLength, &recordHandle,
189fb8611dcSGeorge Liu                                  &dataTransferHandle, &transferOpFlag,
190fb8611dcSGeorge Liu                                  &reqSizeBytes, &recordChangeNum);
191fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
192fb8611dcSGeorge Liu     {
193fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
194fb8611dcSGeorge Liu     }
195557dfb00SDeepak Kodihalli 
196557dfb00SDeepak Kodihalli     uint16_t respSizeBytes{};
197557dfb00SDeepak Kodihalli     uint8_t* recordData = nullptr;
198557dfb00SDeepak Kodihalli     try
199557dfb00SDeepak Kodihalli     {
200e53193faSGeorge Liu         pdr_utils::PdrEntry e;
201e53193faSGeorge Liu         auto record = pdr::getRecordByHandle(pdrRepo, recordHandle, e);
202e53193faSGeorge Liu         if (record == NULL)
203e53193faSGeorge Liu         {
204e53193faSGeorge Liu             return CmdHandler::ccOnlyResponse(
205e53193faSGeorge Liu                 request, PLDM_PLATFORM_INVALID_RECORD_HANDLE);
206e53193faSGeorge Liu         }
207e53193faSGeorge Liu 
208557dfb00SDeepak Kodihalli         if (reqSizeBytes)
209557dfb00SDeepak Kodihalli         {
210e53193faSGeorge Liu             respSizeBytes = e.size;
211557dfb00SDeepak Kodihalli             if (respSizeBytes > reqSizeBytes)
212557dfb00SDeepak Kodihalli             {
213557dfb00SDeepak Kodihalli                 respSizeBytes = reqSizeBytes;
214557dfb00SDeepak Kodihalli             }
215e53193faSGeorge Liu             recordData = e.data;
216557dfb00SDeepak Kodihalli         }
217557dfb00SDeepak Kodihalli         response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES +
218557dfb00SDeepak Kodihalli                             respSizeBytes,
219557dfb00SDeepak Kodihalli                         0);
220557dfb00SDeepak Kodihalli         responsePtr = reinterpret_cast<pldm_msg*>(response.data());
22122b5a7d7SDeepak Kodihalli         rc = encode_get_pdr_resp(
22222b5a7d7SDeepak Kodihalli             request->hdr.instance_id, PLDM_SUCCESS, e.handle.nextRecordHandle,
22322b5a7d7SDeepak Kodihalli             0, PLDM_START_AND_END, respSizeBytes, recordData, 0, responsePtr);
224fb8611dcSGeorge Liu         if (rc != PLDM_SUCCESS)
225fb8611dcSGeorge Liu         {
226fb8611dcSGeorge Liu             return ccOnlyResponse(request, rc);
227fb8611dcSGeorge Liu         }
228557dfb00SDeepak Kodihalli     }
229557dfb00SDeepak Kodihalli     catch (const std::exception& e)
230557dfb00SDeepak Kodihalli     {
231aa8ae72fSSampa Misra         std::cerr << "Error accessing PDR, HANDLE=" << recordHandle
232aa8ae72fSSampa Misra                   << " ERROR=" << e.what() << "\n";
233fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR);
234557dfb00SDeepak Kodihalli     }
235557dfb00SDeepak Kodihalli     return response;
236557dfb00SDeepak Kodihalli }
237557dfb00SDeepak Kodihalli 
238bc669f1bSDeepak Kodihalli Response Handler::setStateEffecterStates(const pldm_msg* request,
239bc669f1bSDeepak Kodihalli                                          size_t payloadLength)
240a2fa0709SSampa Misra {
241a2fa0709SSampa Misra     Response response(
242a2fa0709SSampa Misra         sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES, 0);
243a2fa0709SSampa Misra     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
244a2fa0709SSampa Misra     uint16_t effecterId;
245a2fa0709SSampa Misra     uint8_t compEffecterCnt;
246a2fa0709SSampa Misra     constexpr auto maxCompositeEffecterCnt = 8;
247a2fa0709SSampa Misra     std::vector<set_effecter_state_field> stateField(maxCompositeEffecterCnt,
248a2fa0709SSampa Misra                                                      {0, 0});
249a2fa0709SSampa Misra 
250a2fa0709SSampa Misra     if ((payloadLength > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) ||
251a2fa0709SSampa Misra         (payloadLength < sizeof(effecterId) + sizeof(compEffecterCnt) +
252a2fa0709SSampa Misra                              sizeof(set_effecter_state_field)))
253a2fa0709SSampa Misra     {
254fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
255a2fa0709SSampa Misra     }
256a2fa0709SSampa Misra 
257a2fa0709SSampa Misra     int rc = decode_set_state_effecter_states_req(request, payloadLength,
258a2fa0709SSampa Misra                                                   &effecterId, &compEffecterCnt,
259a2fa0709SSampa Misra                                                   stateField.data());
260a2fa0709SSampa Misra 
261fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
262a2fa0709SSampa Misra     {
263fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
264fb8611dcSGeorge Liu     }
26583409573SGeorge Liu 
266fb8611dcSGeorge Liu     stateField.resize(compEffecterCnt);
26783409573SGeorge Liu     const pldm::utils::DBusHandler dBusIntf;
268aea5dde1SSampa Misra     uint16_t entityType{};
269aea5dde1SSampa Misra     uint16_t entityInstance{};
270aea5dde1SSampa Misra     uint16_t stateSetId{};
271aea5dde1SSampa Misra 
272aea5dde1SSampa Misra     if (isOemStateEffecter(*this, effecterId, compEffecterCnt, entityType,
273aea5dde1SSampa Misra                            entityInstance, stateSetId) &&
274aea5dde1SSampa Misra         oemPlatformHandler != nullptr)
275aea5dde1SSampa Misra     {
2763a0e3b9bSSampa Misra         rc = oemPlatformHandler->oemSetStateEffecterStatesHandler(
2773fbd39ebSVarsha Kaverappa             entityType, entityInstance, stateSetId, compEffecterCnt, stateField,
2783fbd39ebSVarsha Kaverappa             effecterId);
279aea5dde1SSampa Misra     }
280aea5dde1SSampa Misra     else
281aea5dde1SSampa Misra     {
2820d7aca8cSGeorge Liu         rc = platform_state_effecter::setStateEffecterStatesHandler<
2830d7aca8cSGeorge Liu             pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
2840d7aca8cSGeorge Liu                                                stateField);
285aea5dde1SSampa Misra     }
286fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
287fb8611dcSGeorge Liu     {
288fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
289a2fa0709SSampa Misra     }
290a2fa0709SSampa Misra 
291fb8611dcSGeorge Liu     rc = encode_set_state_effecter_states_resp(request->hdr.instance_id, rc,
292a2fa0709SSampa Misra                                                responsePtr);
293fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
294fb8611dcSGeorge Liu     {
295fb8611dcSGeorge Liu         return ccOnlyResponse(request, rc);
296fb8611dcSGeorge Liu     }
297fb8611dcSGeorge Liu 
298a2fa0709SSampa Misra     return response;
299a2fa0709SSampa Misra }
300a2fa0709SSampa Misra 
30156e45c58STom Joseph Response Handler::platformEventMessage(const pldm_msg* request,
30256e45c58STom Joseph                                        size_t payloadLength)
30356e45c58STom Joseph {
30456e45c58STom Joseph     uint8_t formatVersion{};
30556e45c58STom Joseph     uint8_t tid{};
30656e45c58STom Joseph     uint8_t eventClass{};
30756e45c58STom Joseph     size_t offset{};
30856e45c58STom Joseph 
30956e45c58STom Joseph     auto rc = decode_platform_event_message_req(
31056e45c58STom Joseph         request, payloadLength, &formatVersion, &tid, &eventClass, &offset);
31156e45c58STom Joseph     if (rc != PLDM_SUCCESS)
31256e45c58STom Joseph     {
31356e45c58STom Joseph         return CmdHandler::ccOnlyResponse(request, rc);
31456e45c58STom Joseph     }
31556e45c58STom Joseph 
31656e45c58STom Joseph     try
31756e45c58STom Joseph     {
31856e45c58STom Joseph         const auto& handlers = eventHandlers.at(eventClass);
31956e45c58STom Joseph         for (const auto& handler : handlers)
32056e45c58STom Joseph         {
32156e45c58STom Joseph             auto rc =
32256e45c58STom Joseph                 handler(request, payloadLength, formatVersion, tid, offset);
32356e45c58STom Joseph             if (rc != PLDM_SUCCESS)
32456e45c58STom Joseph             {
32556e45c58STom Joseph                 return CmdHandler::ccOnlyResponse(request, rc);
32656e45c58STom Joseph             }
32756e45c58STom Joseph         }
32856e45c58STom Joseph     }
32956e45c58STom Joseph     catch (const std::out_of_range& e)
33056e45c58STom Joseph     {
33156e45c58STom Joseph         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_DATA);
33256e45c58STom Joseph     }
33356e45c58STom Joseph 
33456e45c58STom Joseph     Response response(
33556e45c58STom Joseph         sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES, 0);
33656e45c58STom Joseph     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
33756e45c58STom Joseph 
33856e45c58STom Joseph     rc = encode_platform_event_message_resp(request->hdr.instance_id, rc,
33956e45c58STom Joseph                                             PLDM_EVENT_NO_LOGGING, responsePtr);
34056e45c58STom Joseph     if (rc != PLDM_SUCCESS)
34156e45c58STom Joseph     {
34256e45c58STom Joseph         return ccOnlyResponse(request, rc);
34356e45c58STom Joseph     }
34456e45c58STom Joseph 
34556e45c58STom Joseph     return response;
34656e45c58STom Joseph }
34756e45c58STom Joseph 
34856e45c58STom Joseph int Handler::sensorEvent(const pldm_msg* request, size_t payloadLength,
349c4959c3cSTom Joseph                          uint8_t /*formatVersion*/, uint8_t tid,
35056e45c58STom Joseph                          size_t eventDataOffset)
35156e45c58STom Joseph {
35256e45c58STom Joseph     uint16_t sensorId{};
35356e45c58STom Joseph     uint8_t eventClass{};
35456e45c58STom Joseph     size_t eventClassDataOffset{};
35556e45c58STom Joseph     auto eventData =
35656e45c58STom Joseph         reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset;
35756e45c58STom Joseph     auto eventDataSize = payloadLength - eventDataOffset;
35856e45c58STom Joseph 
35956e45c58STom Joseph     auto rc = decode_sensor_event_data(eventData, eventDataSize, &sensorId,
36056e45c58STom Joseph                                        &eventClass, &eventClassDataOffset);
36156e45c58STom Joseph     if (rc != PLDM_SUCCESS)
36256e45c58STom Joseph     {
36356e45c58STom Joseph         return rc;
36456e45c58STom Joseph     }
36556e45c58STom Joseph 
36675330f36SZahed Hossain     auto eventClassData = reinterpret_cast<const uint8_t*>(request->payload) +
36775330f36SZahed Hossain                           eventDataOffset + eventClassDataOffset;
36875330f36SZahed Hossain     auto eventClassDataSize =
36975330f36SZahed Hossain         payloadLength - eventDataOffset - eventClassDataOffset;
37075330f36SZahed Hossain 
37156e45c58STom Joseph     if (eventClass == PLDM_STATE_SENSOR_STATE)
37256e45c58STom Joseph     {
37356e45c58STom Joseph         uint8_t sensorOffset{};
37456e45c58STom Joseph         uint8_t eventState{};
37556e45c58STom Joseph         uint8_t previousEventState{};
37656e45c58STom Joseph 
37775330f36SZahed Hossain         rc = decode_state_sensor_data(eventClassData, eventClassDataSize,
37856e45c58STom Joseph                                       &sensorOffset, &eventState,
37956e45c58STom Joseph                                       &previousEventState);
38075330f36SZahed Hossain         if (rc != PLDM_SUCCESS)
38175330f36SZahed Hossain         {
38275330f36SZahed Hossain             return PLDM_ERROR;
38375330f36SZahed Hossain         }
38475330f36SZahed Hossain 
385fe4d88bbSChicago Duan         // Emitting state sensor event signal
386fe4d88bbSChicago Duan         emitStateSensorEventSignal(tid, sensorId, sensorOffset, eventState,
387fe4d88bbSChicago Duan                                    previousEventState);
388fe4d88bbSChicago Duan 
389c4959c3cSTom Joseph         // If there are no HOST PDR's, there is no further action
390c4959c3cSTom Joseph         if (hostPDRHandler == NULL)
391c4959c3cSTom Joseph         {
392c4959c3cSTom Joseph             return PLDM_SUCCESS;
393c4959c3cSTom Joseph         }
394c4959c3cSTom Joseph 
395c4959c3cSTom Joseph         // Handle PLDM events for which PDR is available
396c4959c3cSTom Joseph         SensorEntry sensorEntry{tid, sensorId};
397b70a1964STom Joseph 
398b70a1964STom Joseph         pldm::pdr::EntityInfo entityInfo{};
399b70a1964STom Joseph         pldm::pdr::CompositeSensorStates compositeSensorStates{};
400b70a1964STom Joseph 
401c4959c3cSTom Joseph         try
402c4959c3cSTom Joseph         {
403b70a1964STom Joseph             std::tie(entityInfo, compositeSensorStates) =
404c4959c3cSTom Joseph                 hostPDRHandler->lookupSensorInfo(sensorEntry);
405b70a1964STom Joseph         }
406b70a1964STom Joseph         catch (const std::out_of_range& e)
407b70a1964STom Joseph         {
408b70a1964STom Joseph             // If there is no mapping for tid, sensorId combination, try
409b70a1964STom Joseph             // PLDM_TID_RESERVED, sensorId for terminus that is yet to
410b70a1964STom Joseph             // implement TL PDR.
411b70a1964STom Joseph             try
412b70a1964STom Joseph             {
413b70a1964STom Joseph                 sensorEntry.terminusID = PLDM_TID_RESERVED;
414b70a1964STom Joseph                 std::tie(entityInfo, compositeSensorStates) =
415b70a1964STom Joseph                     hostPDRHandler->lookupSensorInfo(sensorEntry);
416b70a1964STom Joseph             }
417b70a1964STom Joseph             // If there is no mapping for events return PLDM_SUCCESS
418b70a1964STom Joseph             catch (const std::out_of_range& e)
419b70a1964STom Joseph             {
420b70a1964STom Joseph                 return PLDM_SUCCESS;
421b70a1964STom Joseph             }
422b70a1964STom Joseph         }
423b70a1964STom Joseph 
424c4959c3cSTom Joseph         if (sensorOffset >= compositeSensorStates.size())
425c4959c3cSTom Joseph         {
426c4959c3cSTom Joseph             return PLDM_ERROR_INVALID_DATA;
427c4959c3cSTom Joseph         }
428c4959c3cSTom Joseph 
429c4959c3cSTom Joseph         const auto& possibleStates = compositeSensorStates[sensorOffset];
430c4959c3cSTom Joseph         if (possibleStates.find(eventState) == possibleStates.end())
431c4959c3cSTom Joseph         {
432c4959c3cSTom Joseph             return PLDM_ERROR_INVALID_DATA;
433c4959c3cSTom Joseph         }
434c4959c3cSTom Joseph 
435c4959c3cSTom Joseph         const auto& [containerId, entityType, entityInstance] = entityInfo;
436b70a1964STom Joseph         events::StateSensorEntry stateSensorEntry{containerId, entityType,
437b70a1964STom Joseph                                                   entityInstance, sensorOffset};
4383aec997cSPavithra Barithaya         return hostPDRHandler->handleStateSensorEvent(stateSensorEntry,
4393aec997cSPavithra Barithaya                                                       eventState);
440c4959c3cSTom Joseph     }
44156e45c58STom Joseph     else
44256e45c58STom Joseph     {
44356e45c58STom Joseph         return PLDM_ERROR_INVALID_DATA;
44456e45c58STom Joseph     }
44556e45c58STom Joseph 
44656e45c58STom Joseph     return PLDM_SUCCESS;
44756e45c58STom Joseph }
44856e45c58STom Joseph 
4498cb6f665SDeepak Kodihalli int Handler::pldmPDRRepositoryChgEvent(const pldm_msg* request,
4508cb6f665SDeepak Kodihalli                                        size_t payloadLength,
4518cb6f665SDeepak Kodihalli                                        uint8_t /*formatVersion*/,
4528cb6f665SDeepak Kodihalli                                        uint8_t /*tid*/, size_t eventDataOffset)
4538cb6f665SDeepak Kodihalli {
4548cb6f665SDeepak Kodihalli     uint8_t eventDataFormat{};
4558cb6f665SDeepak Kodihalli     uint8_t numberOfChangeRecords{};
4568cb6f665SDeepak Kodihalli     size_t dataOffset{};
4578cb6f665SDeepak Kodihalli 
4588cb6f665SDeepak Kodihalli     auto eventData =
4598cb6f665SDeepak Kodihalli         reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset;
4608cb6f665SDeepak Kodihalli     auto eventDataSize = payloadLength - eventDataOffset;
4618cb6f665SDeepak Kodihalli 
4628cb6f665SDeepak Kodihalli     auto rc = decode_pldm_pdr_repository_chg_event_data(
4638cb6f665SDeepak Kodihalli         eventData, eventDataSize, &eventDataFormat, &numberOfChangeRecords,
4648cb6f665SDeepak Kodihalli         &dataOffset);
4658cb6f665SDeepak Kodihalli     if (rc != PLDM_SUCCESS)
4668cb6f665SDeepak Kodihalli     {
4678cb6f665SDeepak Kodihalli         return rc;
4688cb6f665SDeepak Kodihalli     }
4698cb6f665SDeepak Kodihalli 
4708cb6f665SDeepak Kodihalli     PDRRecordHandles pdrRecordHandles;
4717246e0cdSDeepak Kodihalli 
4727246e0cdSDeepak Kodihalli     if (eventDataFormat == FORMAT_IS_PDR_TYPES)
4737246e0cdSDeepak Kodihalli     {
4747246e0cdSDeepak Kodihalli         return PLDM_ERROR_INVALID_DATA;
4757246e0cdSDeepak Kodihalli     }
4767246e0cdSDeepak Kodihalli 
4778cb6f665SDeepak Kodihalli     if (eventDataFormat == FORMAT_IS_PDR_HANDLES)
4788cb6f665SDeepak Kodihalli     {
4798cb6f665SDeepak Kodihalli         uint8_t eventDataOperation{};
4808cb6f665SDeepak Kodihalli         uint8_t numberOfChangeEntries{};
4818cb6f665SDeepak Kodihalli 
4828cb6f665SDeepak Kodihalli         auto changeRecordData = eventData + dataOffset;
4838cb6f665SDeepak Kodihalli         auto changeRecordDataSize = eventDataSize - dataOffset;
4848cb6f665SDeepak Kodihalli 
4858cb6f665SDeepak Kodihalli         while (changeRecordDataSize)
4868cb6f665SDeepak Kodihalli         {
4878cb6f665SDeepak Kodihalli             rc = decode_pldm_pdr_repository_change_record_data(
4888cb6f665SDeepak Kodihalli                 changeRecordData, changeRecordDataSize, &eventDataOperation,
4898cb6f665SDeepak Kodihalli                 &numberOfChangeEntries, &dataOffset);
4908cb6f665SDeepak Kodihalli 
4918cb6f665SDeepak Kodihalli             if (rc != PLDM_SUCCESS)
4928cb6f665SDeepak Kodihalli             {
4938cb6f665SDeepak Kodihalli                 return rc;
4948cb6f665SDeepak Kodihalli             }
4958cb6f665SDeepak Kodihalli 
4968cb6f665SDeepak Kodihalli             if (eventDataOperation == PLDM_RECORDS_ADDED)
4978cb6f665SDeepak Kodihalli             {
4988cb6f665SDeepak Kodihalli                 rc = getPDRRecordHandles(
4998cb6f665SDeepak Kodihalli                     reinterpret_cast<const ChangeEntry*>(changeRecordData +
5008cb6f665SDeepak Kodihalli                                                          dataOffset),
5018cb6f665SDeepak Kodihalli                     changeRecordDataSize - dataOffset,
5028cb6f665SDeepak Kodihalli                     static_cast<size_t>(numberOfChangeEntries),
5038cb6f665SDeepak Kodihalli                     pdrRecordHandles);
5048cb6f665SDeepak Kodihalli 
5058cb6f665SDeepak Kodihalli                 if (rc != PLDM_SUCCESS)
5068cb6f665SDeepak Kodihalli                 {
5078cb6f665SDeepak Kodihalli                     return rc;
5088cb6f665SDeepak Kodihalli                 }
5098cb6f665SDeepak Kodihalli             }
5108cb6f665SDeepak Kodihalli 
511*841ee3d5SPavithra Barithaya             if (eventDataOperation == PLDM_RECORDS_MODIFIED)
512*841ee3d5SPavithra Barithaya             {
513*841ee3d5SPavithra Barithaya                 return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
514*841ee3d5SPavithra Barithaya             }
515*841ee3d5SPavithra Barithaya 
5168cb6f665SDeepak Kodihalli             changeRecordData +=
5178cb6f665SDeepak Kodihalli                 dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry));
5188cb6f665SDeepak Kodihalli             changeRecordDataSize -=
5198cb6f665SDeepak Kodihalli                 dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry));
5208cb6f665SDeepak Kodihalli         }
5217246e0cdSDeepak Kodihalli     }
5227246e0cdSDeepak Kodihalli     if (hostPDRHandler)
5238cb6f665SDeepak Kodihalli     {
5248cb6f665SDeepak Kodihalli         hostPDRHandler->fetchPDR(std::move(pdrRecordHandles));
5258cb6f665SDeepak Kodihalli     }
5268cb6f665SDeepak Kodihalli 
5278cb6f665SDeepak Kodihalli     return PLDM_SUCCESS;
5288cb6f665SDeepak Kodihalli }
5298cb6f665SDeepak Kodihalli 
5308cb6f665SDeepak Kodihalli int Handler::getPDRRecordHandles(const ChangeEntry* changeEntryData,
5318cb6f665SDeepak Kodihalli                                  size_t changeEntryDataSize,
5328cb6f665SDeepak Kodihalli                                  size_t numberOfChangeEntries,
5338cb6f665SDeepak Kodihalli                                  PDRRecordHandles& pdrRecordHandles)
5348cb6f665SDeepak Kodihalli {
5358cb6f665SDeepak Kodihalli     if (numberOfChangeEntries > (changeEntryDataSize / sizeof(ChangeEntry)))
5368cb6f665SDeepak Kodihalli     {
5378cb6f665SDeepak Kodihalli         return PLDM_ERROR_INVALID_DATA;
5388cb6f665SDeepak Kodihalli     }
5398cb6f665SDeepak Kodihalli     for (size_t i = 0; i < numberOfChangeEntries; i++)
5408cb6f665SDeepak Kodihalli     {
5418cb6f665SDeepak Kodihalli         pdrRecordHandles.push_back(changeEntryData[i]);
5428cb6f665SDeepak Kodihalli     }
5438cb6f665SDeepak Kodihalli     return PLDM_SUCCESS;
5448cb6f665SDeepak Kodihalli }
5458cb6f665SDeepak Kodihalli 
546eccb0c56SGeorge Liu Response Handler::setNumericEffecterValue(const pldm_msg* request,
547eccb0c56SGeorge Liu                                           size_t payloadLength)
548eccb0c56SGeorge Liu {
549eccb0c56SGeorge Liu     Response response(sizeof(pldm_msg_hdr) +
550eccb0c56SGeorge Liu                       PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
551eccb0c56SGeorge Liu     uint16_t effecterId{};
552eccb0c56SGeorge Liu     uint8_t effecterDataSize{};
553eccb0c56SGeorge Liu     uint8_t effecterValue[4] = {};
554eccb0c56SGeorge Liu 
555eccb0c56SGeorge Liu     if ((payloadLength > sizeof(effecterId) + sizeof(effecterDataSize) +
556eccb0c56SGeorge Liu                              sizeof(union_effecter_data_size)) ||
557eccb0c56SGeorge Liu         (payloadLength < sizeof(effecterId) + sizeof(effecterDataSize) + 1))
558eccb0c56SGeorge Liu     {
559eccb0c56SGeorge Liu         return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
560eccb0c56SGeorge Liu     }
561eccb0c56SGeorge Liu 
562eccb0c56SGeorge Liu     int rc = decode_set_numeric_effecter_value_req(
563eccb0c56SGeorge Liu         request, payloadLength, &effecterId, &effecterDataSize,
564eccb0c56SGeorge Liu         reinterpret_cast<uint8_t*>(&effecterValue));
565eccb0c56SGeorge Liu 
566eccb0c56SGeorge Liu     if (rc == PLDM_SUCCESS)
567eccb0c56SGeorge Liu     {
568eccb0c56SGeorge Liu         const pldm::utils::DBusHandler dBusIntf;
569eccb0c56SGeorge Liu         rc = platform_numeric_effecter::setNumericEffecterValueHandler<
570eccb0c56SGeorge Liu             pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
571eccb0c56SGeorge Liu                                                effecterDataSize, effecterValue,
572eccb0c56SGeorge Liu                                                sizeof(effecterValue));
573eccb0c56SGeorge Liu     }
574eccb0c56SGeorge Liu 
575eccb0c56SGeorge Liu     return ccOnlyResponse(request, rc);
576eccb0c56SGeorge Liu }
577eccb0c56SGeorge Liu 
57812afe110SSampa Misra void Handler::generateTerminusLocatorPDR(Repo& repo)
57912afe110SSampa Misra {
58012afe110SSampa Misra     std::vector<uint8_t> pdrBuffer(sizeof(pldm_terminus_locator_pdr));
58112afe110SSampa Misra 
58212afe110SSampa Misra     auto pdr = reinterpret_cast<pldm_terminus_locator_pdr*>(pdrBuffer.data());
58312afe110SSampa Misra 
58412afe110SSampa Misra     pdr->hdr.record_handle = 0;
58512afe110SSampa Misra     pdr->hdr.version = 1;
58612afe110SSampa Misra     pdr->hdr.type = PLDM_TERMINUS_LOCATOR_PDR;
58712afe110SSampa Misra     pdr->hdr.record_change_num = 0;
58812afe110SSampa Misra     pdr->hdr.length = sizeof(pldm_terminus_locator_pdr) - sizeof(pldm_pdr_hdr);
58912afe110SSampa Misra     pdr->terminus_handle = BmcPldmTerminusHandle;
59012afe110SSampa Misra     pdr->validity = PLDM_TL_PDR_VALID;
59112afe110SSampa Misra     pdr->tid = BmcTerminusId;
59212afe110SSampa Misra     pdr->container_id = 0x0;
59312afe110SSampa Misra     pdr->terminus_locator_type = PLDM_TERMINUS_LOCATOR_TYPE_MCTP_EID;
59412afe110SSampa Misra     pdr->terminus_locator_value_size =
59512afe110SSampa Misra         sizeof(pldm_terminus_locator_type_mctp_eid);
59612afe110SSampa Misra     auto locatorValue = reinterpret_cast<pldm_terminus_locator_type_mctp_eid*>(
59712afe110SSampa Misra         pdr->terminus_locator_value);
59812afe110SSampa Misra     locatorValue->eid = BmcMctpEid;
59912afe110SSampa Misra 
60012afe110SSampa Misra     PdrEntry pdrEntry{};
60112afe110SSampa Misra     pdrEntry.data = pdrBuffer.data();
60212afe110SSampa Misra     pdrEntry.size = pdrBuffer.size();
60312afe110SSampa Misra     repo.addRecord(pdrEntry);
60412afe110SSampa Misra }
605362c18ddSGeorge Liu 
606362c18ddSGeorge Liu Response Handler::getStateSensorReadings(const pldm_msg* request,
607362c18ddSGeorge Liu                                          size_t payloadLength)
608362c18ddSGeorge Liu {
609362c18ddSGeorge Liu     uint16_t sensorId{};
610362c18ddSGeorge Liu     bitfield8_t sensorRearm{};
611362c18ddSGeorge Liu     uint8_t reserved{};
612362c18ddSGeorge Liu 
613362c18ddSGeorge Liu     if (payloadLength != PLDM_GET_SENSOR_READING_REQ_BYTES)
614362c18ddSGeorge Liu     {
615362c18ddSGeorge Liu         return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
616362c18ddSGeorge Liu     }
617362c18ddSGeorge Liu 
618362c18ddSGeorge Liu     int rc = decode_get_state_sensor_readings_req(
619362c18ddSGeorge Liu         request, payloadLength, &sensorId, &sensorRearm, &reserved);
620362c18ddSGeorge Liu 
621362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
622362c18ddSGeorge Liu     {
623362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
624362c18ddSGeorge Liu     }
625362c18ddSGeorge Liu 
626362c18ddSGeorge Liu     // 0x01 to 0x08
627c1230ca1SGeorge Liu     uint8_t sensorRearmCount = std::popcount(sensorRearm.byte);
628aea5dde1SSampa Misra     std::vector<get_sensor_state_field> stateField(sensorRearmCount);
629362c18ddSGeorge Liu     uint8_t comSensorCnt{};
630362c18ddSGeorge Liu     const pldm::utils::DBusHandler dBusIntf;
631aea5dde1SSampa Misra 
632aea5dde1SSampa Misra     uint16_t entityType{};
633aea5dde1SSampa Misra     uint16_t entityInstance{};
634aea5dde1SSampa Misra     uint16_t stateSetId{};
635aea5dde1SSampa Misra 
636aea5dde1SSampa Misra     if (isOemStateSensor(*this, sensorId, sensorRearmCount, comSensorCnt,
637aea5dde1SSampa Misra                          entityType, entityInstance, stateSetId) &&
638aea5dde1SSampa Misra         oemPlatformHandler != nullptr)
639aea5dde1SSampa Misra     {
640aea5dde1SSampa Misra         rc = oemPlatformHandler->getOemStateSensorReadingsHandler(
641aea5dde1SSampa Misra             entityType, entityInstance, stateSetId, comSensorCnt, stateField);
642aea5dde1SSampa Misra     }
643aea5dde1SSampa Misra     else
644aea5dde1SSampa Misra     {
645362c18ddSGeorge Liu         rc = platform_state_sensor::getStateSensorReadingsHandler<
646aea5dde1SSampa Misra             pldm::utils::DBusHandler, Handler>(dBusIntf, *this, sensorId,
647aea5dde1SSampa Misra                                                sensorRearmCount, comSensorCnt,
648aea5dde1SSampa Misra                                                stateField);
649aea5dde1SSampa Misra     }
650362c18ddSGeorge Liu 
651362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
652362c18ddSGeorge Liu     {
653362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
654362c18ddSGeorge Liu     }
655362c18ddSGeorge Liu 
656362c18ddSGeorge Liu     Response response(sizeof(pldm_msg_hdr) +
657362c18ddSGeorge Liu                       PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
658362c18ddSGeorge Liu                       sizeof(get_sensor_state_field) * comSensorCnt);
659362c18ddSGeorge Liu     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
660362c18ddSGeorge Liu     rc = encode_get_state_sensor_readings_resp(request->hdr.instance_id, rc,
661362c18ddSGeorge Liu                                                comSensorCnt, stateField.data(),
662362c18ddSGeorge Liu                                                responsePtr);
663362c18ddSGeorge Liu     if (rc != PLDM_SUCCESS)
664362c18ddSGeorge Liu     {
665362c18ddSGeorge Liu         return ccOnlyResponse(request, rc);
666362c18ddSGeorge Liu     }
667362c18ddSGeorge Liu 
668362c18ddSGeorge Liu     return response;
669362c18ddSGeorge Liu }
670362c18ddSGeorge Liu 
6715fb37d57SSampa Misra void Handler::_processPostGetPDRActions(
6725fb37d57SSampa Misra     sdeventplus::source::EventBase& /*source */)
6735fb37d57SSampa Misra {
6745fb37d57SSampa Misra     deferredGetPDREvent.reset();
6755fb37d57SSampa Misra     dbusToPLDMEventHandler->listenSensorEvent(pdrRepo, sensorDbusObjMaps);
6765fb37d57SSampa Misra }
6775fb37d57SSampa Misra 
678aea5dde1SSampa Misra bool isOemStateSensor(Handler& handler, uint16_t sensorId,
679aea5dde1SSampa Misra                       uint8_t sensorRearmCount, uint8_t& compSensorCnt,
680aea5dde1SSampa Misra                       uint16_t& entityType, uint16_t& entityInstance,
681aea5dde1SSampa Misra                       uint16_t& stateSetId)
682aea5dde1SSampa Misra {
683aea5dde1SSampa Misra     pldm_state_sensor_pdr* pdr = nullptr;
684aea5dde1SSampa Misra 
685aea5dde1SSampa Misra     std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateSensorPdrRepo(
686aea5dde1SSampa Misra         pldm_pdr_init(), pldm_pdr_destroy);
687aea5dde1SSampa Misra     Repo stateSensorPDRs(stateSensorPdrRepo.get());
688aea5dde1SSampa Misra     getRepoByType(handler.getRepo(), stateSensorPDRs, PLDM_STATE_SENSOR_PDR);
689aea5dde1SSampa Misra     if (stateSensorPDRs.empty())
690aea5dde1SSampa Misra     {
691aea5dde1SSampa Misra         std::cerr << "Failed to get record by PDR type\n";
692aea5dde1SSampa Misra         return false;
693aea5dde1SSampa Misra     }
694aea5dde1SSampa Misra 
695aea5dde1SSampa Misra     PdrEntry pdrEntry{};
696aea5dde1SSampa Misra     auto pdrRecord = stateSensorPDRs.getFirstRecord(pdrEntry);
697aea5dde1SSampa Misra     while (pdrRecord)
698aea5dde1SSampa Misra     {
699aea5dde1SSampa Misra         pdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdrEntry.data);
700aea5dde1SSampa Misra         assert(pdr != NULL);
701aea5dde1SSampa Misra         if (pdr->sensor_id != sensorId)
702aea5dde1SSampa Misra         {
703aea5dde1SSampa Misra             pdr = nullptr;
704aea5dde1SSampa Misra             pdrRecord = stateSensorPDRs.getNextRecord(pdrRecord, pdrEntry);
705aea5dde1SSampa Misra             continue;
706aea5dde1SSampa Misra         }
707aea5dde1SSampa Misra         auto tmpEntityType = pdr->entity_type;
708aea5dde1SSampa Misra         auto tmpEntityInstance = pdr->entity_instance;
709aea5dde1SSampa Misra         auto tmpCompSensorCnt = pdr->composite_sensor_count;
710aea5dde1SSampa Misra         auto tmpPossibleStates =
711aea5dde1SSampa Misra             reinterpret_cast<state_sensor_possible_states*>(
712aea5dde1SSampa Misra                 pdr->possible_states);
713aea5dde1SSampa Misra         auto tmpStateSetId = tmpPossibleStates->state_set_id;
714aea5dde1SSampa Misra 
715aea5dde1SSampa Misra         if (sensorRearmCount > tmpCompSensorCnt)
716aea5dde1SSampa Misra         {
717aea5dde1SSampa Misra             std::cerr << "The requester sent wrong sensorRearm"
718aea5dde1SSampa Misra                       << " count for the sensor, SENSOR_ID=" << sensorId
719aea5dde1SSampa Misra                       << "SENSOR_REARM_COUNT=" << (uint16_t)sensorRearmCount
720aea5dde1SSampa Misra                       << "\n";
721aea5dde1SSampa Misra             break;
722aea5dde1SSampa Misra         }
723aea5dde1SSampa Misra 
724aea5dde1SSampa Misra         if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START &&
725aea5dde1SSampa Misra              tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) ||
726aea5dde1SSampa Misra             (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START &&
727aea5dde1SSampa Misra              tmpStateSetId < PLDM_OEM_STATE_SET_ID_END))
728aea5dde1SSampa Misra         {
729aea5dde1SSampa Misra             entityType = tmpEntityType;
730aea5dde1SSampa Misra             entityInstance = tmpEntityInstance;
731aea5dde1SSampa Misra             stateSetId = tmpStateSetId;
732aea5dde1SSampa Misra             compSensorCnt = tmpCompSensorCnt;
733aea5dde1SSampa Misra             return true;
734aea5dde1SSampa Misra         }
735aea5dde1SSampa Misra         else
736aea5dde1SSampa Misra         {
737aea5dde1SSampa Misra             return false;
738aea5dde1SSampa Misra         }
739aea5dde1SSampa Misra     }
740aea5dde1SSampa Misra     return false;
741aea5dde1SSampa Misra }
742aea5dde1SSampa Misra 
743aea5dde1SSampa Misra bool isOemStateEffecter(Handler& handler, uint16_t effecterId,
744aea5dde1SSampa Misra                         uint8_t compEffecterCnt, uint16_t& entityType,
745aea5dde1SSampa Misra                         uint16_t& entityInstance, uint16_t& stateSetId)
746aea5dde1SSampa Misra {
747aea5dde1SSampa Misra     pldm_state_effecter_pdr* pdr = nullptr;
748aea5dde1SSampa Misra 
749aea5dde1SSampa Misra     std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateEffecterPdrRepo(
750aea5dde1SSampa Misra         pldm_pdr_init(), pldm_pdr_destroy);
751aea5dde1SSampa Misra     Repo stateEffecterPDRs(stateEffecterPdrRepo.get());
752aea5dde1SSampa Misra     getRepoByType(handler.getRepo(), stateEffecterPDRs,
753aea5dde1SSampa Misra                   PLDM_STATE_EFFECTER_PDR);
754aea5dde1SSampa Misra     if (stateEffecterPDRs.empty())
755aea5dde1SSampa Misra     {
756aea5dde1SSampa Misra         std::cerr << "Failed to get record by PDR type\n";
757aea5dde1SSampa Misra         return false;
758aea5dde1SSampa Misra     }
759aea5dde1SSampa Misra 
760aea5dde1SSampa Misra     PdrEntry pdrEntry{};
761aea5dde1SSampa Misra     auto pdrRecord = stateEffecterPDRs.getFirstRecord(pdrEntry);
762aea5dde1SSampa Misra     while (pdrRecord)
763aea5dde1SSampa Misra     {
764aea5dde1SSampa Misra         pdr = reinterpret_cast<pldm_state_effecter_pdr*>(pdrEntry.data);
765aea5dde1SSampa Misra         assert(pdr != NULL);
766aea5dde1SSampa Misra         if (pdr->effecter_id != effecterId)
767aea5dde1SSampa Misra         {
768aea5dde1SSampa Misra             pdr = nullptr;
769aea5dde1SSampa Misra             pdrRecord = stateEffecterPDRs.getNextRecord(pdrRecord, pdrEntry);
770aea5dde1SSampa Misra             continue;
771aea5dde1SSampa Misra         }
772aea5dde1SSampa Misra 
773aea5dde1SSampa Misra         auto tmpEntityType = pdr->entity_type;
774aea5dde1SSampa Misra         auto tmpEntityInstance = pdr->entity_instance;
775aea5dde1SSampa Misra         auto tmpPossibleStates =
776aea5dde1SSampa Misra             reinterpret_cast<state_effecter_possible_states*>(
777aea5dde1SSampa Misra                 pdr->possible_states);
778aea5dde1SSampa Misra         auto tmpStateSetId = tmpPossibleStates->state_set_id;
779aea5dde1SSampa Misra 
780aea5dde1SSampa Misra         if (compEffecterCnt > pdr->composite_effecter_count)
781aea5dde1SSampa Misra         {
782aea5dde1SSampa Misra             std::cerr << "The requester sent wrong composite effecter"
783aea5dde1SSampa Misra                       << " count for the effecter, EFFECTER_ID=" << effecterId
784aea5dde1SSampa Misra                       << "COMP_EFF_CNT=" << (uint16_t)compEffecterCnt << "\n";
785aea5dde1SSampa Misra             return false;
786aea5dde1SSampa Misra         }
787aea5dde1SSampa Misra 
788aea5dde1SSampa Misra         if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START &&
789aea5dde1SSampa Misra              tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) ||
790aea5dde1SSampa Misra             (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START &&
791aea5dde1SSampa Misra              tmpStateSetId < PLDM_OEM_STATE_SET_ID_END))
792aea5dde1SSampa Misra         {
793aea5dde1SSampa Misra             entityType = tmpEntityType;
794aea5dde1SSampa Misra             entityInstance = tmpEntityInstance;
795aea5dde1SSampa Misra             stateSetId = tmpStateSetId;
796aea5dde1SSampa Misra             return true;
797aea5dde1SSampa Misra         }
798aea5dde1SSampa Misra         else
799aea5dde1SSampa Misra         {
800aea5dde1SSampa Misra             return false;
801aea5dde1SSampa Misra         }
802aea5dde1SSampa Misra     }
803aea5dde1SSampa Misra     return false;
804aea5dde1SSampa Misra }
805aea5dde1SSampa Misra 
806bc669f1bSDeepak Kodihalli } // namespace platform
807557dfb00SDeepak Kodihalli } // namespace responder
808557dfb00SDeepak Kodihalli } // namespace pldm
809