xref: /openbmc/pldm/pldmd/handler.hpp (revision a13bf143)
1 #pragma once
2 
3 #include <libpldm/base.h>
4 
5 #include <cassert>
6 #include <functional>
7 #include <map>
8 #include <vector>
9 
10 namespace pldm
11 {
12 
13 using Command = uint8_t;
14 
15 namespace responder
16 {
17 
18 using Response = std::vector<uint8_t>;
19 class CmdHandler;
20 using HandlerFunc = std::function<Response(
21     pldm_tid_t tid, const pldm_msg* request, size_t reqMsgLen)>;
22 
23 class CmdHandler
24 {
25   public:
26     virtual ~CmdHandler() = default;
27 
28     /** @brief Invoke a PLDM command handler
29      *
30      *  @param[in] tid - PLDM request TID
31      *  @param[in] pldmCommand - PLDM command code
32      *  @param[in] request - PLDM request message
33      *  @param[in] reqMsgLen - PLDM request message size
34      *  @return PLDM response message
35      */
36     Response handle(pldm_tid_t tid, Command pldmCommand,
37                     const pldm_msg* request, size_t reqMsgLen)
38     {
39         return handlers.at(pldmCommand)(tid, request, reqMsgLen);
40     }
41 
42     /** @brief Create a response message containing only cc
43      *
44      *  @param[in] request - PLDM request message
45      *  @param[in] cc - Completion Code
46      *  @return PLDM response message
47      */
48     static Response ccOnlyResponse(const pldm_msg* request, uint8_t cc)
49     {
50         Response response(sizeof(pldm_msg), 0);
51         auto ptr = reinterpret_cast<pldm_msg*>(response.data());
52         auto rc = encode_cc_only_resp(request->hdr.instance_id,
53                                       request->hdr.type, request->hdr.command,
54                                       cc, ptr);
55         assert(rc == PLDM_SUCCESS);
56         return response;
57     }
58 
59   protected:
60     /** @brief map of PLDM command code to handler - to be populated by derived
61      *         classes.
62      */
63     std::map<Command, HandlerFunc> handlers;
64 };
65 
66 } // namespace responder
67 } // namespace pldm
68