xref: /openbmc/pldm/libpldmresponder/base.hpp (revision 915baa3a)
1 #pragma once
2 
3 #include "libpldm/base.h"
4 
5 #include "libpldmresponder/platform.hpp"
6 #include "pldmd/handler.hpp"
7 #include "requester/handler.hpp"
8 
9 #include <stdint.h>
10 
11 #include <sdeventplus/source/event.hpp>
12 
13 #include <vector>
14 
15 using namespace pldm::dbus_api;
16 using namespace pldm::responder;
17 
18 namespace pldm
19 {
20 namespace responder
21 {
22 namespace base
23 {
24 
25 class Handler : public CmdHandler
26 {
27   public:
28     Handler(uint8_t eid, Requester& requester, sdeventplus::Event& event,
29             pldm::responder::oem_platform::Handler* oemPlatformHandler,
30             pldm::requester::Handler<pldm::requester::Request>* handler) :
31         eid(eid),
32         requester(requester), 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, [this](const pldm_msg* request,
40                                                         size_t payloadLength) {
41             return this->getPLDMCommands(request, payloadLength);
42         });
43         handlers.emplace(PLDM_GET_PLDM_VERSION, [this](const pldm_msg* request,
44                                                        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 reference to Requester object, primarily used to access API to
98      *  obtain PLDM instance id.
99      */
100     Requester& requester;
101 
102     /** @brief reference of main event loop of pldmd, primarily used to schedule
103      *  work
104      */
105     sdeventplus::Event& event;
106 
107     /** @brief OEM platform handler */
108     pldm::responder::oem_platform::Handler* oemPlatformHandler;
109 
110     /** @brief PLDM request handler */
111     pldm::requester::Handler<pldm::requester::Request>* handler;
112 
113     /** @brief sdeventplus event source */
114     std::unique_ptr<sdeventplus::source::Defer> survEvent;
115 };
116 
117 } // namespace base
118 } // namespace responder
119 } // namespace pldm
120