xref: /openbmc/pldm/pldmd/invoker.hpp (revision d2e48991)
11521f6d1SDeepak Kodihalli #pragma once
21521f6d1SDeepak Kodihalli 
31521f6d1SDeepak Kodihalli #include "handler.hpp"
41521f6d1SDeepak Kodihalli 
5c453e164SGeorge Liu #include <libpldm/base.h>
6c453e164SGeorge Liu 
71521f6d1SDeepak Kodihalli #include <map>
81521f6d1SDeepak Kodihalli #include <memory>
91521f6d1SDeepak Kodihalli 
101521f6d1SDeepak Kodihalli namespace pldm
111521f6d1SDeepak Kodihalli {
121521f6d1SDeepak Kodihalli 
131521f6d1SDeepak Kodihalli using Type = uint8_t;
141521f6d1SDeepak Kodihalli 
151521f6d1SDeepak Kodihalli namespace responder
161521f6d1SDeepak Kodihalli {
171521f6d1SDeepak Kodihalli 
181521f6d1SDeepak Kodihalli class Invoker
191521f6d1SDeepak Kodihalli {
201521f6d1SDeepak Kodihalli   public:
211521f6d1SDeepak Kodihalli     /** @brief Register a handler for a PLDM Type
221521f6d1SDeepak Kodihalli      *
231521f6d1SDeepak Kodihalli      *  @param[in] pldmType - PLDM type code
241521f6d1SDeepak Kodihalli      *  @param[in] handler - PLDM Type handler
251521f6d1SDeepak Kodihalli      */
registerHandler(Type pldmType,std::unique_ptr<CmdHandler> handler)261521f6d1SDeepak Kodihalli     void registerHandler(Type pldmType, std::unique_ptr<CmdHandler> handler)
271521f6d1SDeepak Kodihalli     {
281521f6d1SDeepak Kodihalli         handlers.emplace(pldmType, std::move(handler));
291521f6d1SDeepak Kodihalli     }
301521f6d1SDeepak Kodihalli 
311521f6d1SDeepak Kodihalli     /** @brief Invoke a PLDM command handler
321521f6d1SDeepak Kodihalli      *
33*d2e48991SDelphine CC Chiu      *  @param[in] tid - PLDM request TID
341521f6d1SDeepak Kodihalli      *  @param[in] pldmType - PLDM type code
351521f6d1SDeepak Kodihalli      *  @param[in] pldmCommand - PLDM command code
361521f6d1SDeepak Kodihalli      *  @param[in] request - PLDM request message
371521f6d1SDeepak Kodihalli      *  @param[in] reqMsgLen - PLDM request message size
381521f6d1SDeepak Kodihalli      *  @return PLDM response message
391521f6d1SDeepak Kodihalli      */
handle(pldm_tid_t tid,Type pldmType,Command pldmCommand,const pldm_msg * request,size_t reqMsgLen)40*d2e48991SDelphine CC Chiu     Response handle(pldm_tid_t tid, Type pldmType, Command pldmCommand,
41*d2e48991SDelphine CC Chiu                     const pldm_msg* request, size_t reqMsgLen)
421521f6d1SDeepak Kodihalli     {
43*d2e48991SDelphine CC Chiu         return handlers.at(pldmType)->handle(tid, pldmCommand, request,
44*d2e48991SDelphine CC Chiu                                              reqMsgLen);
451521f6d1SDeepak Kodihalli     }
461521f6d1SDeepak Kodihalli 
471521f6d1SDeepak Kodihalli   private:
481521f6d1SDeepak Kodihalli     std::map<Type, std::unique_ptr<CmdHandler>> handlers;
491521f6d1SDeepak Kodihalli };
501521f6d1SDeepak Kodihalli 
511521f6d1SDeepak Kodihalli } // namespace responder
521521f6d1SDeepak Kodihalli } // namespace pldm
53