blob: 7fb7957464665032d80cf8b0a1eca31d09c6b6a0 [file] [log] [blame]
#include "registration.hpp"
#include <map>
#include <phosphor-logging/log.hpp>
using namespace phosphor::logging;
namespace pldm
{
namespace responder
{
namespace internal
{
using Command = uint8_t;
using CommandHandler = std::map<Command, Handler>;
using Type = uint8_t;
std::map<Type, CommandHandler> typeHandlers;
} // namespace internal
void registerHandler(uint8_t pldmType, uint8_t pldmCommand, Handler&& handler)
{
using namespace internal;
CommandHandler& ch = typeHandlers[pldmType];
ch.emplace(pldmCommand, std::move(handler));
}
Response invokeHandler(uint8_t pldmType, uint8_t pldmCommand,
const pldm_msg* request, size_t payloadLength)
{
using namespace internal;
Response response;
if (!(typeHandlers.end() == typeHandlers.find(pldmType)))
{
if (!((typeHandlers.at(pldmType)).end() ==
(typeHandlers.at(pldmType)).find(pldmCommand)))
{
response = typeHandlers.at(pldmType).at(pldmCommand)(request,
payloadLength);
if (response.empty())
{
log<level::ERR>("Encountered invalid response");
}
}
else
{
log<level::ERR>("Unsupported PLDM command",
entry("TYPE=0x%02x", pldmType),
entry("COMMAND=0x%02x", pldmCommand));
}
}
else
{
log<level::ERR>("Unsupported PLDM TYPE",
entry("TYPE=0x%02x", pldmType));
}
return response;
}
} // namespace responder
} // namespace pldm