blob: 3906ec14e6a241a4bbd3dbc5542e3e6d1edbb703 [file] [log] [blame]
Deepak Kodihallibc669f12019-11-28 08:52:07 -06001#pragma once
2
John Wang7f02d702019-12-03 13:38:14 +08003#include <cassert>
Deepak Kodihallibc669f12019-11-28 08:52:07 -06004#include <functional>
5#include <map>
John Wang7f02d702019-12-03 13:38:14 +08006#include <vector>
Deepak Kodihallibc669f12019-11-28 08:52:07 -06007
8#include "libpldm/base.h"
9
10namespace pldm
11{
12
13using Command = uint8_t;
14
15namespace responder
16{
17
18using Response = std::vector<uint8_t>;
19class CmdHandler;
20using HandlerFunc =
21 std::function<Response(const pldm_msg* request, size_t reqMsgLen)>;
22
23class CmdHandler
24{
25 public:
26 /** @brief Invoke a PLDM command handler
27 *
28 * @param[in] pldmCommand - PLDM command code
29 * @param[in] request - PLDM request message
30 * @param[in] reqMsgLen - PLDM request message size
31 * @return PLDM response message
32 */
33 Response handle(Command pldmCommand, const pldm_msg* request,
34 size_t reqMsgLen)
35 {
36 return handlers.at(pldmCommand)(request, reqMsgLen);
37 }
38
John Wang7f02d702019-12-03 13:38:14 +080039 /** @brief Create a response message containing only cc
40 *
41 * @param[in] request - PLDM request message
42 * @param[in] cc - Completion Code
43 * @return PLDM response message
44 */
45 static Response ccOnlyResponse(const pldm_msg* request, uint8_t cc)
46 {
47 Response response(sizeof(pldm_msg), 0);
48 auto ptr = reinterpret_cast<pldm_msg*>(response.data());
49 auto rc =
50 encode_cc_only_resp(request->hdr.instance_id, request->hdr.type,
51 request->hdr.command, cc, ptr);
52 assert(rc == PLDM_SUCCESS);
53 return response;
54 }
55
Deepak Kodihallibc669f12019-11-28 08:52:07 -060056 protected:
57 /** @brief map of PLDM command code to handler - to be populated by derived
58 * classes.
59 */
60 std::map<Command, HandlerFunc> handlers;
61};
62
63} // namespace responder
64} // namespace pldm