| #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 |