#pragma once #include "libpldmresponder/platform.hpp" #include "pldmd/handler.hpp" #include "requester/handler.hpp" #include #include #include #include using namespace pldm::dbus_api; using namespace pldm::responder; namespace pldm { namespace responder { namespace base { class Handler : public CmdHandler { public: Handler(uint8_t eid, Requester& requester, sdeventplus::Event& event, pldm::responder::oem_platform::Handler* oemPlatformHandler, pldm::requester::Handler* handler) : eid(eid), requester(requester), event(event), oemPlatformHandler(oemPlatformHandler), handler(handler) { handlers.emplace(PLDM_GET_PLDM_TYPES, [this](const pldm_msg* request, size_t payloadLength) { return this->getPLDMTypes(request, payloadLength); }); handlers.emplace(PLDM_GET_PLDM_COMMANDS, [this](const pldm_msg* request, size_t payloadLength) { return this->getPLDMCommands(request, payloadLength); }); handlers.emplace(PLDM_GET_PLDM_VERSION, [this](const pldm_msg* request, size_t payloadLength) { return this->getPLDMVersion(request, payloadLength); }); handlers.emplace(PLDM_GET_TID, [this](const pldm_msg* request, size_t payloadLength) { return this->getTID(request, payloadLength); }); } /** @brief Handler for getPLDMTypes * * @param[in] request - Request message payload * @param[in] payload_length - Request message payload length * @param[return] Response - PLDM Response message */ Response getPLDMTypes(const pldm_msg* request, size_t payloadLength); /** @brief Handler for getPLDMCommands * * @param[in] request - Request message payload * @param[in] payload_length - Request message payload length * @param[return] Response - PLDM Response message */ Response getPLDMCommands(const pldm_msg* request, size_t payloadLength); /** @brief Handler for getPLDMCommands * * @param[in] request - Request message payload * @param[in] payload_length - Request message payload length * @param[return] Response - PLDM Response message */ Response getPLDMVersion(const pldm_msg* request, size_t payloadLength); /** @brief _processSetEventReceiver does the actual work that needs * to be carried out for setEventReceiver command. This is deferred * after sending response for getTID command to the host * * @param[in] source - sdeventplus event source */ void processSetEventReceiver(sdeventplus::source::EventBase& source); /** @brief Handler for getTID * * @param[in] request - Request message payload * @param[in] payload_length - Request message payload length * @param[return] Response - PLDM Response message */ Response getTID(const pldm_msg* request, size_t payloadLength); private: /** @brief MCTP EID of host firmware */ uint8_t eid; /** @brief reference to Requester object, primarily used to access API to * obtain PLDM instance id. */ Requester& requester; /** @brief reference of main event loop of pldmd, primarily used to schedule * work */ sdeventplus::Event& event; /** @brief OEM platform handler */ pldm::responder::oem_platform::Handler* oemPlatformHandler; /** @brief PLDM request handler */ pldm::requester::Handler* handler; /** @brief sdeventplus event source */ std::unique_ptr survEvent; }; } // namespace base } // namespace responder } // namespace pldm