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:
~Router()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.
toOemNumber(const std::uint8_t oeg[groupMagicSize])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.
toOemNumber(const Group & oeg)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.
toOemGroup(Number oen)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