1 #pragma once 2 3 #include "config.h" 4 5 #include "libpldmresponder/platform.hpp" 6 #include "pldmd/handler.hpp" 7 #include "requester/handler.hpp" 8 9 #include <libpldm/base.h> 10 #include <stdint.h> 11 12 #include <sdeventplus/source/event.hpp> 13 14 #include <vector> 15 16 using namespace pldm::responder; 17 18 namespace pldm 19 { 20 namespace responder 21 { 22 namespace base 23 { 24 class Handler : public CmdHandler 25 { 26 public: 27 Handler(uint8_t eid, pldm::InstanceIdDb& instanceIdDb, 28 sdeventplus::Event& event, 29 pldm::responder::oem_platform::Handler* oemPlatformHandler, 30 pldm::requester::Handler<pldm::requester::Request>* handler) : 31 eid(eid), 32 instanceIdDb(instanceIdDb), event(event), 33 oemPlatformHandler(oemPlatformHandler), handler(handler) 34 { 35 handlers.emplace(PLDM_GET_PLDM_TYPES, 36 [this](const pldm_msg* request, size_t payloadLength) { 37 return this->getPLDMTypes(request, payloadLength); 38 }); 39 handlers.emplace(PLDM_GET_PLDM_COMMANDS, 40 [this](const pldm_msg* request, size_t payloadLength) { 41 return this->getPLDMCommands(request, payloadLength); 42 }); 43 handlers.emplace(PLDM_GET_PLDM_VERSION, 44 [this](const pldm_msg* request, size_t payloadLength) { 45 return this->getPLDMVersion(request, payloadLength); 46 }); 47 handlers.emplace(PLDM_GET_TID, 48 [this](const pldm_msg* request, size_t payloadLength) { 49 return this->getTID(request, payloadLength); 50 }); 51 } 52 53 /** @brief Handler for getPLDMTypes 54 * 55 * @param[in] request - Request message payload 56 * @param[in] payload_length - Request message payload length 57 * @param[return] Response - PLDM Response message 58 */ 59 Response getPLDMTypes(const pldm_msg* request, size_t payloadLength); 60 61 /** @brief Handler for getPLDMCommands 62 * 63 * @param[in] request - Request message payload 64 * @param[in] payload_length - Request message payload length 65 * @param[return] Response - PLDM Response message 66 */ 67 Response getPLDMCommands(const pldm_msg* request, size_t payloadLength); 68 69 /** @brief Handler for getPLDMCommands 70 * 71 * @param[in] request - Request message payload 72 * @param[in] payload_length - Request message payload length 73 * @param[return] Response - PLDM Response message 74 */ 75 Response getPLDMVersion(const pldm_msg* request, size_t payloadLength); 76 77 /** @brief _processSetEventReceiver does the actual work that needs 78 * to be carried out for setEventReceiver command. This is deferred 79 * after sending response for getTID command to the host 80 * 81 * @param[in] source - sdeventplus event source 82 */ 83 void processSetEventReceiver(sdeventplus::source::EventBase& source); 84 85 /** @brief Handler for getTID 86 * 87 * @param[in] request - Request message payload 88 * @param[in] payload_length - Request message payload length 89 * @param[return] Response - PLDM Response message 90 */ 91 Response getTID(const pldm_msg* request, size_t payloadLength); 92 93 private: 94 /** @brief MCTP EID of host firmware */ 95 uint8_t eid; 96 97 /** @brief An instance ID database for allocating instance IDs. */ 98 InstanceIdDb& instanceIdDb; 99 100 /** @brief reference of main event loop of pldmd, primarily used to schedule 101 * work 102 */ 103 sdeventplus::Event& event; 104 105 /** @brief OEM platform handler */ 106 pldm::responder::oem_platform::Handler* oemPlatformHandler; 107 108 /** @brief PLDM request handler */ 109 pldm::requester::Handler<pldm::requester::Request>* handler; 110 111 /** @brief sdeventplus event source */ 112 std::unique_ptr<sdeventplus::source::Defer> survEvent; 113 }; 114 115 } // namespace base 116 } // namespace responder 117 } // namespace pldm 118