Add responder for Platform Event Message
Provide infrastructure to hook handler for each PLDM event type.
Change-Id: I67480bb923f5eca311b2b0e597a146e020a5baf7
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/libpldmresponder/platform.hpp b/libpldmresponder/platform.hpp
index 75a1ad3..a435dca 100644
--- a/libpldmresponder/platform.hpp
+++ b/libpldmresponder/platform.hpp
@@ -31,11 +31,21 @@
using DbusObjMaps =
std::map<EffecterId,
std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>>;
+using DbusPath = std::string;
+using EffecterObjs = std::vector<DbusPath>;
+using EventType = uint8_t;
+using EventHandler = std::function<int(
+ const pldm_msg* request, size_t payloadLength, uint8_t formatVersion,
+ uint8_t tid, size_t eventDataOffset)>;
+using EventHandlers = std::vector<EventHandler>;
+using EventMap = std::map<EventType, EventHandlers>;
class Handler : public CmdHandler
{
public:
- Handler(const std::string& dir, pldm_pdr* repo) : pdrRepo(repo)
+ Handler(const std::string& dir, pldm_pdr* repo,
+ const std::optional<EventMap>& addOnHandlersMap = std::nullopt) :
+ pdrRepo(repo)
{
generate(dir, pdrRepo);
@@ -48,6 +58,41 @@
return this->setStateEffecterStates(request,
payloadLength);
});
+ handlers.emplace(PLDM_PLATFORM_EVENT_MESSAGE,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->platformEventMessage(request,
+ payloadLength);
+ });
+
+ // Default handler for PLDM Events
+ eventHandlers[PLDM_SENSOR_EVENT].emplace_back(
+ [this](const pldm_msg* request, size_t payloadLength,
+ uint8_t formatVersion, uint8_t tid, size_t eventDataOffset) {
+ return this->sensorEvent(request, payloadLength, formatVersion,
+ tid, eventDataOffset);
+ });
+
+ // Additional OEM event handlers for PLDM events, append it to the
+ // standard handlers
+ if (addOnHandlersMap)
+ {
+ auto addOnHandlers = addOnHandlersMap.value();
+ for (EventMap::iterator iter = addOnHandlers.begin();
+ iter != addOnHandlers.end(); ++iter)
+ {
+ auto search = eventHandlers.find(iter->first);
+ if (search != eventHandlers.end())
+ {
+ search->second.insert(std::end(search->second),
+ std::begin(iter->second),
+ std::end(iter->second));
+ }
+ else
+ {
+ eventHandlers.emplace(iter->first, iter->second);
+ }
+ }
+ }
}
pdr_utils::Repo& getRepo()
@@ -97,6 +142,11 @@
*/
void generateStateEffecterRepo(const Json& json, Repo& repo);
+ /** @brief map of PLDM event type to EventHandlers
+ *
+ */
+ EventMap eventHandlers;
+
/** @brief Handler for GetPDR
*
* @param[in] request - Request message payload
@@ -114,6 +164,28 @@
Response setStateEffecterStates(const pldm_msg* request,
size_t payloadLength);
+ /** @brief Handler for PlatformEventMessage
+ *
+ * @param[in] request - Request message
+ * @param[in] payloadLength - Request payload length
+ * @return Response - PLDM Response message
+ */
+ Response platformEventMessage(const pldm_msg* request,
+ size_t payloadLength);
+
+ /** @brief Handler for event class Sensor event
+ *
+ * @param[in] request - Request message
+ * @param[in] payloadLength - Request payload length
+ * @param[in] formatVersion - Version of the event format
+ * @param[in] tid - Terminus ID of the event's originator
+ * @param[in] eventDataOffset - Offset of the event data in the request
+ * message
+ * @return PLDM completion code
+ */
+ int sensorEvent(const pldm_msg* request, size_t payloadLength,
+ uint8_t formatVersion, uint8_t tid, size_t eventDataOffset);
+
/** @brief Function to set the effecter requested by pldm requester
* @param[in] dBusIntf - The interface object
* @param[in] effecterId - Effecter ID sent by the requester to act on