| #pragma once |
| |
| #include <ipmid/api.h> |
| |
| #include <ipmid/iana.hpp> |
| |
| #include <array> |
| #include <cstddef> |
| #include <cstdint> |
| #include <functional> |
| #include <vector> |
| |
| namespace oem |
| { |
| constexpr std::size_t groupMagicSize = 3; |
| |
| using Group = std::array<std::uint8_t, groupMagicSize>; |
| |
| // Handler signature includes ipmi cmd to support wildcard cmd match. |
| // Buffers and lengths exclude the OemGroup bytes in the IPMI message. |
| // dataLen supplies length of reqBuf upon call, and should be set to the |
| // length of replyBuf upon return - conventional in this code base. |
| using Handler = std::function<ipmi_ret_t(ipmi_cmd_t, // cmd byte |
| const std::uint8_t*, // reqBuf |
| std::uint8_t*, // replyBuf |
| std::size_t*)>; // dataLen |
| |
| /// Router Interface class. |
| /// @brief Abstract Router Interface |
| class Router |
| { |
| public: |
| virtual ~Router() {} |
| |
| /// Enable message routing to begin. |
| virtual void activate() = 0; |
| |
| /// Register a handler for given OEMNumber & cmd. |
| /// Use IPMI_CMD_WILDCARD to catch any unregistered cmd |
| /// for the given OEMNumber. |
| /// |
| /// @param[in] oen - the OEM Number. |
| /// @param[in] cmd - the Command. |
| /// @param[in] handler - the handler to call given that OEN and |
| /// command. |
| virtual void registerHandler(Number oen, ipmi_cmd_t cmd, |
| Handler handler) = 0; |
| }; |
| |
| /// Expose mutable Router for configuration & activation. |
| /// |
| /// @returns pointer to OEM Router to use. |
| Router* mutableRouter(); |
| |
| /// Convert a group to an OEN. |
| /// |
| /// @param[in] oeg - request buffer for IPMI command. |
| /// @return the OEN. |
| constexpr Number toOemNumber(const std::uint8_t oeg[groupMagicSize]) |
| { |
| return (oeg[2] << 16) | (oeg[1] << 8) | oeg[0]; |
| } |
| |
| /// Given a Group convert to an OEN. |
| /// |
| /// @param[in] oeg - OEM Group reference. |
| /// @return the OEN. |
| constexpr Number toOemNumber(const Group& oeg) |
| { |
| return (oeg[2] << 16) | (oeg[1] << 8) | oeg[0]; |
| } |
| |
| /// Given an OEN, conver to the OEM Group. |
| /// |
| /// @param[in] oen - the OEM Number. |
| /// @return the OEM Group. |
| constexpr Group toOemGroup(Number oen) |
| { |
| return Group{static_cast<std::uint8_t>(oen), |
| static_cast<std::uint8_t>(oen >> 8), |
| static_cast<std::uint8_t>(oen >> 16)}; |
| } |
| |
| } // namespace oem |