1 #pragma once 2 3 #include <ipmid/api.h> 4 5 #include <ipmid/iana.hpp> 6 7 #include <array> 8 #include <cstddef> 9 #include <cstdint> 10 #include <functional> 11 #include <vector> 12 13 namespace oem 14 { 15 constexpr std::size_t groupMagicSize = 3; 16 17 using Group = std::array<std::uint8_t, groupMagicSize>; 18 19 // Handler signature includes ipmi cmd to support wildcard cmd match. 20 // Buffers and lengths exclude the OemGroup bytes in the IPMI message. 21 // dataLen supplies length of reqBuf upon call, and should be set to the 22 // length of replyBuf upon return - conventional in this code base. 23 using Handler = std::function<ipmi_ret_t(ipmi_cmd_t, // cmd byte 24 const std::uint8_t*, // reqBuf 25 std::uint8_t*, // replyBuf 26 std::size_t*)>; // dataLen 27 28 /// Router Interface class. 29 /// @brief Abstract Router Interface 30 class Router 31 { 32 public: 33 virtual ~Router() {} 34 35 /// Enable message routing to begin. 36 virtual void activate() = 0; 37 38 /// Register a handler for given OEMNumber & cmd. 39 /// Use IPMI_CMD_WILDCARD to catch any unregistered cmd 40 /// for the given OEMNumber. 41 /// 42 /// @param[in] oen - the OEM Number. 43 /// @param[in] cmd - the Command. 44 /// @param[in] handler - the handler to call given that OEN and 45 /// command. 46 virtual void registerHandler(Number oen, ipmi_cmd_t cmd, 47 Handler handler) = 0; 48 }; 49 50 /// Expose mutable Router for configuration & activation. 51 /// 52 /// @returns pointer to OEM Router to use. 53 Router* mutableRouter(); 54 55 /// Convert a group to an OEN. 56 /// 57 /// @param[in] oeg - request buffer for IPMI command. 58 /// @return the OEN. 59 constexpr Number toOemNumber(const std::uint8_t oeg[groupMagicSize]) 60 { 61 return (oeg[2] << 16) | (oeg[1] << 8) | oeg[0]; 62 } 63 64 /// Given a Group convert to an OEN. 65 /// 66 /// @param[in] oeg - OEM Group reference. 67 /// @return the OEN. 68 constexpr Number toOemNumber(const Group& oeg) 69 { 70 return (oeg[2] << 16) | (oeg[1] << 8) | oeg[0]; 71 } 72 73 /// Given an OEN, conver to the OEM Group. 74 /// 75 /// @param[in] oen - the OEM Number. 76 /// @return the OEM Group. 77 constexpr Group toOemGroup(Number oen) 78 { 79 return Group{static_cast<std::uint8_t>(oen), 80 static_cast<std::uint8_t>(oen >> 8), 81 static_cast<std::uint8_t>(oen >> 16)}; 82 } 83 84 } // namespace oem 85