xref: /openbmc/pldm/libpldmresponder/base.hpp (revision d15fa099)
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