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