blob: 2e4ea2363d56def64e729358ff2561b7791aa0fc [file] [log] [blame]
Peter Hanson4a589852017-06-07 17:40:45 -07001#pragma once
2
William A. Kennington III194375f2018-12-14 02:14:33 -08003#include <ipmid/api.h>
Patrick Venturedd0459e2018-09-08 09:27:16 -07004
Patrick Williamsfbc6c9d2023-05-10 07:50:16 -05005#include <ipmid/iana.hpp>
6
Peter Hanson4a589852017-06-07 17:40:45 -07007#include <array>
Patrick Venture082a39c2020-05-07 17:26:47 -07008#include <cstddef>
Peter Hanson4a589852017-06-07 17:40:45 -07009#include <cstdint>
10#include <functional>
11#include <vector>
12
Peter Hanson4a589852017-06-07 17:40:45 -070013namespace oem
14{
Patrick Venture082a39c2020-05-07 17:26:47 -070015constexpr std::size_t groupMagicSize = 3;
Peter Hanson4a589852017-06-07 17:40:45 -070016
Patrick Venture082a39c2020-05-07 17:26:47 -070017using Group = std::array<std::uint8_t, groupMagicSize>;
Peter Hanson4a589852017-06-07 17:40:45 -070018
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.
Patrick Venture082a39c2020-05-07 17:26:47 -070023using 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
Peter Hanson4a589852017-06-07 17:40:45 -070027
28/// Router Interface class.
29/// @brief Abstract Router Interface
30class Router
31{
Patrick Venture0b02be92018-08-31 11:55:55 -070032 public:
Patrick Williamsfbc6c9d2023-05-10 07:50:16 -050033 virtual ~Router() {}
Peter Hanson4a589852017-06-07 17:40:45 -070034
Patrick Venture0b02be92018-08-31 11:55:55 -070035 /// Enable message routing to begin.
36 virtual void activate() = 0;
Peter Hanson4a589852017-06-07 17:40:45 -070037
Patrick Venture0b02be92018-08-31 11:55:55 -070038 /// 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;
Peter Hanson4a589852017-06-07 17:40:45 -070048};
49
50/// Expose mutable Router for configuration & activation.
51///
52/// @returns pointer to OEM Router to use.
53Router* mutableRouter();
54
55/// Convert a group to an OEN.
56///
57/// @param[in] oeg - request buffer for IPMI command.
58/// @return the OEN.
Patrick Venture082a39c2020-05-07 17:26:47 -070059constexpr Number toOemNumber(const std::uint8_t oeg[groupMagicSize])
Peter Hanson4a589852017-06-07 17:40:45 -070060{
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.
68constexpr 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.
77constexpr Group toOemGroup(Number oen)
78{
Patrick Venture082a39c2020-05-07 17:26:47 -070079 return Group{static_cast<std::uint8_t>(oen),
80 static_cast<std::uint8_t>(oen >> 8),
81 static_cast<std::uint8_t>(oen >> 16)};
Peter Hanson4a589852017-06-07 17:40:45 -070082}
83
Patrick Venture0b02be92018-08-31 11:55:55 -070084} // namespace oem