blob: 42ebdb9f2680a856830bc26812cab61b467588d5 [file] [log] [blame]
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05301#pragma once
2
Sampa Misraa2fa0702019-05-31 01:28:55 -05003#include "config.h"
4
Deepak Kodihallid130e1a2020-06-17 05:55:32 -05005#include "common/utils.hpp"
TOM JOSEPHd4d97a52020-03-23 14:36:34 +05306#include "event_parser.hpp"
Tom Joseph33e9c7e2020-06-11 22:09:52 +05307#include "fru.hpp"
George Liucae18662020-05-15 09:32:57 +08008#include "host-bmc/dbus_to_event_handler.hpp"
Deepak Kodihalliac19bd62020-06-16 08:25:23 -05009#include "host-bmc/host_pdr_handler.hpp"
Sampa Misraa2fa0702019-05-31 01:28:55 -050010#include "libpldmresponder/pdr.hpp"
George Liue53193f2020-02-24 09:23:26 +080011#include "libpldmresponder/pdr_utils.hpp"
Sampa Misraaea5dde2020-08-31 08:33:47 -050012#include "oem_handler.hpp"
Deepak Kodihalli1521f6d2020-06-16 08:51:02 -050013#include "pldmd/handler.hpp"
Sampa Misraa2fa0702019-05-31 01:28:55 -050014
George Liuc453e162022-12-21 17:16:23 +080015#include <libpldm/pdr.h>
16#include <libpldm/platform.h>
17#include <libpldm/states.h>
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053018#include <stdint.h>
19
Sampa Misraa2fa0702019-05-31 01:28:55 -050020#include <map>
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053021
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053022namespace pldm
23{
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053024namespace responder
25{
Sampa Misraa2fa0702019-05-31 01:28:55 -050026namespace platform
27{
28
Brad Bishop5079ac42021-08-19 18:35:06 -040029using generatePDR = std::function<void(const pldm::utils::DBusHandler& dBusIntf,
30 const pldm::utils::Json& json,
31 pdr_utils::RepoInterface& repo)>;
George Liua2870722020-02-11 11:09:30 +080032
George Liu1ec85d42020-02-12 16:05:32 +080033using EffecterId = uint16_t;
George Liua2870722020-02-11 11:09:30 +080034using DbusObjMaps =
35 std::map<EffecterId,
36 std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>>;
Tom Joseph56e45c52020-03-16 10:01:45 +053037using DbusPath = std::string;
38using EffecterObjs = std::vector<DbusPath>;
39using EventType = uint8_t;
40using EventHandler = std::function<int(
41 const pldm_msg* request, size_t payloadLength, uint8_t formatVersion,
42 uint8_t tid, size_t eventDataOffset)>;
43using EventHandlers = std::vector<EventHandler>;
44using EventMap = std::map<EventType, EventHandlers>;
George Liuc4ea6a92020-07-14 15:48:44 +080045using AssociatedEntityMap = std::map<DbusPath, pldm_entity>;
Deepak Kodihallic682fe22020-03-04 00:42:54 -060046
Deepak Kodihallibc669f12019-11-28 08:52:07 -060047class Handler : public CmdHandler
Sampa Misraa2fa0702019-05-31 01:28:55 -050048{
Deepak Kodihallibc669f12019-11-28 08:52:07 -060049 public:
Deepak Kodihallib5c227e2020-07-13 06:58:34 -050050 Handler(const pldm::utils::DBusHandler* dBusIntf,
Pavithra Barithaya3aec9972020-12-14 01:55:44 -060051 const std::string& pdrJsonsDir, pldm_pdr* repo,
52 HostPDRHandler* hostPDRHandler,
Brad Bishop5079ac42021-08-19 18:35:06 -040053 pldm::state_sensor::DbusToPLDMEvent* dbusToPLDMEventHandler,
54 fru::Handler* fruHandler,
Sampa Misraaea5dde2020-08-31 08:33:47 -050055 pldm::responder::oem_platform::Handler* oemPlatformHandler,
Sampa Misra5fb37d52021-03-06 07:26:00 -060056 sdeventplus::Event& event, bool buildPDRLazily = false,
Tom Joseph56e45c52020-03-16 10:01:45 +053057 const std::optional<EventMap>& addOnHandlersMap = std::nullopt) :
Pavithra Barithaya51efaf82020-04-02 02:42:27 -050058 pdrRepo(repo),
Pavithra Barithaya3aec9972020-12-14 01:55:44 -060059 hostPDRHandler(hostPDRHandler),
George Liucae18662020-05-15 09:32:57 +080060 dbusToPLDMEventHandler(dbusToPLDMEventHandler), fruHandler(fruHandler),
Sampa Misraaea5dde2020-08-31 08:33:47 -050061 dBusIntf(dBusIntf), oemPlatformHandler(oemPlatformHandler),
Sampa Misra5fb37d52021-03-06 07:26:00 -060062 event(event), pdrJsonsDir(pdrJsonsDir), pdrCreated(false)
Sampa Misraa2fa0702019-05-31 01:28:55 -050063 {
Deepak Kodihallib5c227e2020-07-13 06:58:34 -050064 if (!buildPDRLazily)
65 {
Sampa Misra12afe112020-05-25 11:40:44 -050066 generateTerminusLocatorPDR(pdrRepo);
Deepak Kodihallib5c227e2020-07-13 06:58:34 -050067 generate(*dBusIntf, pdrJsonsDir, pdrRepo);
68 pdrCreated = true;
69 }
Deepak Kodihallic682fe22020-03-04 00:42:54 -060070
Deepak Kodihallibc669f12019-11-28 08:52:07 -060071 handlers.emplace(PLDM_GET_PDR,
72 [this](const pldm_msg* request, size_t payloadLength) {
73 return this->getPDR(request, payloadLength);
74 });
George Liueccb0c52020-01-14 11:09:56 +080075 handlers.emplace(PLDM_SET_NUMERIC_EFFECTER_VALUE,
76 [this](const pldm_msg* request, size_t payloadLength) {
77 return this->setNumericEffecterValue(
78 request, payloadLength);
79 });
Deepak Kodihallibc669f12019-11-28 08:52:07 -060080 handlers.emplace(PLDM_SET_STATE_EFFECTER_STATES,
81 [this](const pldm_msg* request, size_t payloadLength) {
82 return this->setStateEffecterStates(request,
83 payloadLength);
84 });
Tom Joseph56e45c52020-03-16 10:01:45 +053085 handlers.emplace(PLDM_PLATFORM_EVENT_MESSAGE,
86 [this](const pldm_msg* request, size_t payloadLength) {
87 return this->platformEventMessage(request,
88 payloadLength);
89 });
George Liu362c18d2020-05-14 09:46:36 +080090 handlers.emplace(PLDM_GET_STATE_SENSOR_READINGS,
91 [this](const pldm_msg* request, size_t payloadLength) {
92 return this->getStateSensorReadings(request,
93 payloadLength);
94 });
Tom Joseph56e45c52020-03-16 10:01:45 +053095
96 // Default handler for PLDM Events
97 eventHandlers[PLDM_SENSOR_EVENT].emplace_back(
98 [this](const pldm_msg* request, size_t payloadLength,
99 uint8_t formatVersion, uint8_t tid, size_t eventDataOffset) {
100 return this->sensorEvent(request, payloadLength, formatVersion,
101 tid, eventDataOffset);
102 });
Deepak Kodihalli8cb6f662020-04-10 02:55:43 -0500103 eventHandlers[PLDM_PDR_REPOSITORY_CHG_EVENT].emplace_back(
104 [this](const pldm_msg* request, size_t payloadLength,
105 uint8_t formatVersion, uint8_t tid, size_t eventDataOffset) {
106 return this->pldmPDRRepositoryChgEvent(request, payloadLength,
107 formatVersion, tid,
108 eventDataOffset);
109 });
Tom Joseph56e45c52020-03-16 10:01:45 +0530110
111 // Additional OEM event handlers for PLDM events, append it to the
112 // standard handlers
113 if (addOnHandlersMap)
114 {
115 auto addOnHandlers = addOnHandlersMap.value();
116 for (EventMap::iterator iter = addOnHandlers.begin();
117 iter != addOnHandlers.end(); ++iter)
118 {
119 auto search = eventHandlers.find(iter->first);
120 if (search != eventHandlers.end())
121 {
122 search->second.insert(std::end(search->second),
123 std::begin(iter->second),
124 std::end(iter->second));
125 }
126 else
127 {
128 eventHandlers.emplace(iter->first, iter->second);
129 }
130 }
131 }
Sampa Misraa2fa0702019-05-31 01:28:55 -0500132 }
133
George Liu1ec85d42020-02-12 16:05:32 +0800134 pdr_utils::Repo& getRepo()
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600135 {
George Liu1ec85d42020-02-12 16:05:32 +0800136 return this->pdrRepo;
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600137 }
138
George Liu1ec85d42020-02-12 16:05:32 +0800139 /** @brief Add D-Bus mapping and value mapping(stateId to D-Bus) for the
George Liuadbe1722020-05-09 19:20:19 +0800140 * Id. If the same id is added, the previous dbusObjs will
George Liu1ec85d42020-02-12 16:05:32 +0800141 * be "over-written".
142 *
George Liuadbe1722020-05-09 19:20:19 +0800143 * @param[in] Id - effecter/sensor id
George Liu1ec85d42020-02-12 16:05:32 +0800144 * @param[in] dbusObj - list of D-Bus object structure and list of D-Bus
145 * property value to attribute value
George Liuadbe1722020-05-09 19:20:19 +0800146 * @param[in] typeId - the type id of enum
George Liu1ec85d42020-02-12 16:05:32 +0800147 */
George Liua2870722020-02-11 11:09:30 +0800148 void addDbusObjMaps(
George Liuadbe1722020-05-09 19:20:19 +0800149 uint16_t id,
150 std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps> dbusObj,
Brad Bishop5079ac42021-08-19 18:35:06 -0400151 pldm::responder::pdr_utils::TypeId typeId =
152 pldm::responder::pdr_utils::TypeId::PLDM_EFFECTER_ID);
George Liu1ec85d42020-02-12 16:05:32 +0800153
George Liuadbe1722020-05-09 19:20:19 +0800154 /** @brief Retrieve an id -> D-Bus objects mapping
George Liu1ec85d42020-02-12 16:05:32 +0800155 *
George Liuadbe1722020-05-09 19:20:19 +0800156 * @param[in] Id - id
157 * @param[in] typeId - the type id of enum
George Liu1ec85d42020-02-12 16:05:32 +0800158 *
George Liua2870722020-02-11 11:09:30 +0800159 * @return std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps> -
160 * list of D-Bus object structure and list of D-Bus property value
161 * to attribute value
George Liu1ec85d42020-02-12 16:05:32 +0800162 */
George Liua2870722020-02-11 11:09:30 +0800163 const std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>&
Brad Bishop5079ac42021-08-19 18:35:06 -0400164 getDbusObjMaps(
165 uint16_t id,
166 pldm::responder::pdr_utils::TypeId typeId =
167 pldm::responder::pdr_utils::TypeId::PLDM_EFFECTER_ID) const;
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600168
169 uint16_t getNextEffecterId()
170 {
171 return ++nextEffecterId;
172 }
173
George Liuadbe1722020-05-09 19:20:19 +0800174 uint16_t getNextSensorId()
175 {
176 return ++nextSensorId;
177 }
178
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600179 /** @brief Parse PDR JSONs and build PDR repository
180 *
George Liu36e81352020-07-01 14:40:30 +0800181 * @param[in] dBusIntf - The interface object
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600182 * @param[in] dir - directory housing platform specific PDR JSON files
183 * @param[in] repo - instance of concrete implementation of Repo
184 */
George Liu36e81352020-07-01 14:40:30 +0800185 void generate(const pldm::utils::DBusHandler& dBusIntf,
Brad Bishop5079ac42021-08-19 18:35:06 -0400186 const std::string& dir,
187 pldm::responder::pdr_utils::Repo& repo);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600188
189 /** @brief Parse PDR JSONs and build state effecter PDR repository
190 *
191 * @param[in] json - platform specific PDR JSON files
192 * @param[in] repo - instance of state effecter implementation of Repo
193 */
Brad Bishop5079ac42021-08-19 18:35:06 -0400194 void generateStateEffecterRepo(const pldm::utils::Json& json,
195 pldm::responder::pdr_utils::Repo& repo);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600196
Tom Joseph56e45c52020-03-16 10:01:45 +0530197 /** @brief map of PLDM event type to EventHandlers
198 *
199 */
200 EventMap eventHandlers;
201
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600202 /** @brief Handler for GetPDR
203 *
204 * @param[in] request - Request message payload
205 * @param[in] payloadLength - Request payload length
206 * @param[out] Response - Response message written here
207 */
208 Response getPDR(const pldm_msg* request, size_t payloadLength);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500209
George Liueccb0c52020-01-14 11:09:56 +0800210 /** @brief Handler for setNumericEffecterValue
211 *
212 * @param[in] request - Request message
213 * @param[in] payloadLength - Request payload length
214 * @return Response - PLDM Response message
215 */
216 Response setNumericEffecterValue(const pldm_msg* request,
217 size_t payloadLength);
218
George Liu362c18d2020-05-14 09:46:36 +0800219 /** @brief Handler for getStateSensorReadings
220 *
221 * @param[in] request - Request message
222 * @param[in] payloadLength - Request payload length
223 * @return Response - PLDM Response message
224 */
225 Response getStateSensorReadings(const pldm_msg* request,
226 size_t payloadLength);
227
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600228 /** @brief Handler for setStateEffecterStates
229 *
230 * @param[in] request - Request message
231 * @param[in] payloadLength - Request payload length
232 * @return Response - PLDM Response message
233 */
234 Response setStateEffecterStates(const pldm_msg* request,
235 size_t payloadLength);
236
Tom Joseph56e45c52020-03-16 10:01:45 +0530237 /** @brief Handler for PlatformEventMessage
238 *
239 * @param[in] request - Request message
240 * @param[in] payloadLength - Request payload length
241 * @return Response - PLDM Response message
242 */
243 Response platformEventMessage(const pldm_msg* request,
244 size_t payloadLength);
245
246 /** @brief Handler for event class Sensor event
247 *
248 * @param[in] request - Request message
249 * @param[in] payloadLength - Request payload length
250 * @param[in] formatVersion - Version of the event format
251 * @param[in] tid - Terminus ID of the event's originator
252 * @param[in] eventDataOffset - Offset of the event data in the request
253 * message
254 * @return PLDM completion code
255 */
256 int sensorEvent(const pldm_msg* request, size_t payloadLength,
257 uint8_t formatVersion, uint8_t tid, size_t eventDataOffset);
258
Deepak Kodihalli8cb6f662020-04-10 02:55:43 -0500259 /** @brief Handler for pldmPDRRepositoryChgEvent
260 *
261 * @param[in] request - Request message
262 * @param[in] payloadLength - Request payload length
263 * @param[in] formatVersion - Version of the event format
264 * @param[in] tid - Terminus ID of the event's originator
265 * @param[in] eventDataOffset - Offset of the event data in the request
266 * message
267 * @return PLDM completion code
268 */
269 int pldmPDRRepositoryChgEvent(const pldm_msg* request, size_t payloadLength,
270 uint8_t formatVersion, uint8_t tid,
271 size_t eventDataOffset);
272
273 /** @brief Handler for extracting the PDR handles from changeEntries
274 *
275 * @param[in] changeEntryData - ChangeEntry data from changeRecord
276 * @param[in] changeEntryDataSize - total size of changeEntryData
277 * @param[in] numberOfChangeEntries - total number of changeEntries to
278 * extract
279 * @param[out] pdrRecordHandles - std::vector where the extracted PDR
280 * handles are placed
281 * @return PLDM completion code
282 */
283 int getPDRRecordHandles(const ChangeEntry* changeEntryData,
284 size_t changeEntryDataSize,
285 size_t numberOfChangeEntries,
286 PDRRecordHandles& pdrRecordHandles);
287
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600288 /** @brief Function to set the effecter requested by pldm requester
289 * @param[in] dBusIntf - The interface object
290 * @param[in] effecterId - Effecter ID sent by the requester to act on
291 * @param[in] stateField - The state field data for each of the states,
292 * equal to composite effecter count in number
293 * @return - Success or failure in setting the states. Returns failure in
294 * terms of PLDM completion codes if atleast one state fails to be set
295 */
296 template <class DBusInterface>
297 int setStateEffecterStatesHandler(
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600298 const DBusInterface& dBusIntf, uint16_t effecterId,
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600299 const std::vector<set_effecter_state_field>& stateField)
Sampa Misraa2fa0702019-05-31 01:28:55 -0500300 {
George Liue53193f2020-02-24 09:23:26 +0800301 using namespace pldm::responder::pdr;
George Liu1e44c732020-02-28 20:20:06 +0800302 using namespace pldm::utils;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600303 using StateSetNum = uint8_t;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600304
305 state_effecter_possible_states* states = nullptr;
306 pldm_state_effecter_pdr* pdr = nullptr;
307 uint8_t compEffecterCnt = stateField.size();
George Liu1ec85d42020-02-12 16:05:32 +0800308
309 std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)>
310 stateEffecterPdrRepo(pldm_pdr_init(), pldm_pdr_destroy);
Brad Bishop5079ac42021-08-19 18:35:06 -0400311 pldm::responder::pdr_utils::Repo stateEffecterPDRs(
312 stateEffecterPdrRepo.get());
George Liu1ec85d42020-02-12 16:05:32 +0800313 getRepoByType(pdrRepo, stateEffecterPDRs, PLDM_STATE_EFFECTER_PDR);
314 if (stateEffecterPDRs.empty())
315 {
316 std::cerr << "Failed to get record by PDR type\n";
317 return PLDM_PLATFORM_INVALID_EFFECTER_ID;
318 }
319
Brad Bishop5079ac42021-08-19 18:35:06 -0400320 pldm::responder::pdr_utils::PdrEntry pdrEntry{};
George Liu1ec85d42020-02-12 16:05:32 +0800321 auto pdrRecord = stateEffecterPDRs.getFirstRecord(pdrEntry);
George Liue53193f2020-02-24 09:23:26 +0800322 while (pdrRecord)
323 {
324 pdr = reinterpret_cast<pldm_state_effecter_pdr*>(pdrEntry.data);
325 if (pdr->effecter_id != effecterId)
Sampa Misraa2fa0702019-05-31 01:28:55 -0500326 {
George Liue53193f2020-02-24 09:23:26 +0800327 pdr = nullptr;
George Liu1ec85d42020-02-12 16:05:32 +0800328 pdrRecord =
329 stateEffecterPDRs.getNextRecord(pdrRecord, pdrEntry);
George Liue53193f2020-02-24 09:23:26 +0800330 continue;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600331 }
George Liue53193f2020-02-24 09:23:26 +0800332
333 states = reinterpret_cast<state_effecter_possible_states*>(
334 pdr->possible_states);
335 if (compEffecterCnt > pdr->composite_effecter_count)
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600336 {
George Liue53193f2020-02-24 09:23:26 +0800337 std::cerr << "The requester sent wrong composite effecter"
338 << " count for the effecter, EFFECTER_ID="
Manojkiran Eda394fac62021-07-22 15:58:29 +0530339 << (unsigned)effecterId
340 << "COMP_EFF_CNT=" << (unsigned)compEffecterCnt
George Liue53193f2020-02-24 09:23:26 +0800341 << "\n";
342 return PLDM_ERROR_INVALID_DATA;
Sampa Misraa2fa0702019-05-31 01:28:55 -0500343 }
George Liue53193f2020-02-24 09:23:26 +0800344 break;
345 }
346
347 if (!pdr)
348 {
349 return PLDM_PLATFORM_INVALID_EFFECTER_ID;
Sampa Misraa2fa0702019-05-31 01:28:55 -0500350 }
Sampa Misraa2fa0702019-05-31 01:28:55 -0500351
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600352 int rc = PLDM_SUCCESS;
George Liu1ec85d42020-02-12 16:05:32 +0800353 try
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600354 {
George Liu1ec85d42020-02-12 16:05:32 +0800355 const auto& [dbusMappings, dbusValMaps] =
George Liuadbe1722020-05-09 19:20:19 +0800356 effecterDbusObjMaps.at(effecterId);
George Liu1ec85d42020-02-12 16:05:32 +0800357 for (uint8_t currState = 0; currState < compEffecterCnt;
358 ++currState)
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600359 {
George Liu1ec85d42020-02-12 16:05:32 +0800360 std::vector<StateSetNum> allowed{};
361 // computation is based on table 79 from DSP0248 v1.1.1
362 uint8_t bitfieldIndex =
363 stateField[currState].effecter_state / 8;
364 uint8_t bit =
365 stateField[currState].effecter_state - (8 * bitfieldIndex);
366 if (states->possible_states_size < bitfieldIndex ||
367 !(states->states[bitfieldIndex].byte & (1 << bit)))
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600368 {
George Liu1ec85d42020-02-12 16:05:32 +0800369 std::cerr
Manojkiran Eda394fac62021-07-22 15:58:29 +0530370 << "Invalid state set value, EFFECTER_ID="
371 << (unsigned)effecterId << " VALUE="
372 << (unsigned)stateField[currState].effecter_state
373 << " COMPOSITE_EFFECTER_ID=" << (unsigned)currState
George Liu1ec85d42020-02-12 16:05:32 +0800374 << " DBUS_PATH=" << dbusMappings[currState].objectPath
375 << "\n";
376 rc = PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600377 break;
378 }
George Liu1ec85d42020-02-12 16:05:32 +0800379 const DBusMapping& dbusMapping = dbusMappings[currState];
Brad Bishop5079ac42021-08-19 18:35:06 -0400380 const pldm::responder::pdr_utils::StatestoDbusVal&
381 dbusValToMap = dbusValMaps[currState];
George Liu1ec85d42020-02-12 16:05:32 +0800382
383 if (stateField[currState].set_request == PLDM_REQUEST_SET)
384 {
385 try
386 {
387 dBusIntf.setDbusProperty(
388 dbusMapping,
389 dbusValToMap.at(
390 stateField[currState].effecter_state));
391 }
392 catch (const std::exception& e)
393 {
394 std::cerr
395 << "Error setting property, ERROR=" << e.what()
396 << " PROPERTY=" << dbusMapping.propertyName
397 << " INTERFACE="
398 << dbusMapping.interface << " PATH="
399 << dbusMapping.objectPath << "\n";
400 return PLDM_ERROR;
401 }
402 }
403 uint8_t* nextState =
404 reinterpret_cast<uint8_t*>(states) +
405 sizeof(state_effecter_possible_states) -
406 sizeof(states->states) +
407 (states->possible_states_size * sizeof(states->states));
408 states = reinterpret_cast<state_effecter_possible_states*>(
409 nextState);
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600410 }
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600411 }
George Liu1ec85d42020-02-12 16:05:32 +0800412 catch (const std::out_of_range& e)
413 {
414 std::cerr << "the effecterId does not exist. effecter id: "
Manojkiran Eda394fac62021-07-22 15:58:29 +0530415 << (unsigned)effecterId << e.what() << '\n';
George Liu1ec85d42020-02-12 16:05:32 +0800416 }
417
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600418 return rc;
419 }
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600420
Sampa Misra12afe112020-05-25 11:40:44 -0500421 /** @brief Build BMC Terminus Locator PDR
422 *
423 * @param[in] repo - instance of concrete implementation of Repo
424 */
Brad Bishop5079ac42021-08-19 18:35:06 -0400425 void generateTerminusLocatorPDR(pldm::responder::pdr_utils::Repo& repo);
Sampa Misra12afe112020-05-25 11:40:44 -0500426
George Liuc4ea6a92020-07-14 15:48:44 +0800427 /** @brief Get std::map associated with the entity
428 * key: object path
429 * value: pldm_entity
430 *
431 * @return std::map<ObjectPath, pldm_entity>
432 */
433 inline const AssociatedEntityMap& getAssociateEntityMap() const
434 {
435 if (fruHandler == nullptr)
436 {
437 throw InternalFailure();
438 }
439 return fruHandler->getAssociateEntityMap();
440 }
441
Sampa Misra5fb37d52021-03-06 07:26:00 -0600442 /** @brief process the actions that needs to be performed after a GetPDR
443 * call is received
444 * @param[in] source - sdeventplus event source
445 */
446 void _processPostGetPDRActions(sdeventplus::source::EventBase& source);
447
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600448 private:
449 pdr_utils::Repo pdrRepo;
450 uint16_t nextEffecterId{};
George Liuadbe1722020-05-09 19:20:19 +0800451 uint16_t nextSensorId{};
452 DbusObjMaps effecterDbusObjMaps{};
453 DbusObjMaps sensorDbusObjMaps{};
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500454 HostPDRHandler* hostPDRHandler;
Brad Bishop5079ac42021-08-19 18:35:06 -0400455 pldm::state_sensor::DbusToPLDMEvent* dbusToPLDMEventHandler;
Tom Joseph33e9c7e2020-06-11 22:09:52 +0530456 fru::Handler* fruHandler;
Deepak Kodihallib5c227e2020-07-13 06:58:34 -0500457 const pldm::utils::DBusHandler* dBusIntf;
Sampa Misraaea5dde2020-08-31 08:33:47 -0500458 pldm::responder::oem_platform::Handler* oemPlatformHandler;
Sampa Misra5fb37d52021-03-06 07:26:00 -0600459 sdeventplus::Event& event;
Deepak Kodihallib5c227e2020-07-13 06:58:34 -0500460 std::string pdrJsonsDir;
461 bool pdrCreated;
Sampa Misra5fb37d52021-03-06 07:26:00 -0600462 std::unique_ptr<sdeventplus::source::Defer> deferredGetPDREvent;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600463};
464
Sampa Misraaea5dde2020-08-31 08:33:47 -0500465/** @brief Function to check if a sensor falls in OEM range
466 * A sensor is considered to be oem if either of entity
467 * type or state set or both falls in oem range
468 *
469 * @param[in] handler - the interface object
470 * @param[in] sensorId - sensor id
471 * @param[in] sensorRearmCount - sensor rearm count
472 * @param[out] compSensorCnt - composite sensor count
473 * @param[out] entityType - entity type
474 * @param[out] entityInstance - entity instance number
475 * @param[out] stateSetId - state set id
476 *
477 * @return true if the sensor is OEM. All out parameters are invalid
478 * for a non OEM sensor
479 */
480bool isOemStateSensor(Handler& handler, uint16_t sensorId,
481 uint8_t sensorRearmCount, uint8_t& compSensorCnt,
482 uint16_t& entityType, uint16_t& entityInstance,
483 uint16_t& stateSetId);
484
485/** @brief Function to check if an effecter falls in OEM range
486 * An effecter is considered to be oem if either of entity
487 * type or state set or both falls in oem range
488 *
489 * @param[in] handler - the interface object
490 * @param[in] effecterId - effecter id
491 * @param[in] compEffecterCnt - composite effecter count
492 * @param[out] entityType - entity type
493 * @param[out] entityInstance - entity instance number
494 * @param[out] stateSetId - state set id
495 *
496 * @return true if the effecter is OEM. All out parameters are invalid
497 * for a non OEM effecter
498 */
499bool isOemStateEffecter(Handler& handler, uint16_t effecterId,
500 uint8_t compEffecterCnt, uint16_t& entityType,
501 uint16_t& entityInstance, uint16_t& stateSetId);
502
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600503} // namespace platform
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530504} // namespace responder
505} // namespace pldm