summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--message.hpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/message.hpp b/message.hpp
new file mode 100644
index 0000000..b6b4131
--- /dev/null
+++ b/message.hpp
@@ -0,0 +1,108 @@
+#pragma once
+
+#include <memory>
+#include <vector>
+
+namespace message
+{
+
+enum class PayloadType : uint8_t
+{
+ IPMI = 0x00,
+ OPEN_SESSION_REQUEST = 0x10,
+ OPEN_SESSION_RESPONSE = 0x11,
+ RAKP1 = 0x12,
+ RAKP2 = 0x13,
+ RAKP3 = 0x14,
+ RAKP4 = 0x15,
+ INVALID = 0xFF,
+};
+
+/*
+ * @ struct Message
+ *
+ * IPMI message is data encapsulated in an IPMI Session packet. The IPMI
+ * Session packets are encapsulated in RMCP packets, which are encapsulated in
+ * UDP datagrams. Refer Section 13.5 of IPMI specification(IPMI Messages
+ * Encapsulation Under RMCP). IPMI payload is a special class of data
+ * encapsulated in an IPMI session packet.
+ */
+struct Message
+{
+ static constexpr uint32_t MESSAGE_INVALID_SESSION_ID = 0xBADBADFF;
+
+ Message()
+ : payloadType(PayloadType::INVALID),
+ rcSessionID(Message::MESSAGE_INVALID_SESSION_ID),
+ bmcSessionID(Message::MESSAGE_INVALID_SESSION_ID) {}
+
+ ~Message() = default;
+ Message(const Message&) = default;
+ Message& operator=(const Message&) = default;
+ Message(Message&&) = default;
+ Message& operator=(Message&&) = default;
+
+ bool isPacketEncrypted; // Message's Encryption Status
+ bool isPacketAuthenticated; // Message's Authentication Status
+ PayloadType payloadType; // Type of message payload (IPMI,SOL ..etc)
+ uint32_t rcSessionID; // Remote Client's Session ID
+ uint32_t bmcSessionID; // BMC's session ID
+ uint32_t sessionSeqNum; // Session Sequence Number
+
+ /*
+ * “Payloads” are a capability specified for RMCP+ that enable an IPMI
+ * session to carry types of traffic that are in addition to IPMI Messages.
+ * Payloads can be ‘standard’ or ‘OEM’.Standard payload types include IPMI
+ * Messages, messages for session setup under RMCP+, and the payload for the
+ * “Serial Over LAN” capability introduced in IPMI v2.0.
+ */
+ std::vector<uint8_t> payload;
+};
+
+namespace LAN
+{
+
+namespace header
+{
+
+// IPMI LAN Message Request Header
+struct Request
+{
+ uint8_t rsaddr;
+ uint8_t netfn;
+ uint8_t cs;
+ uint8_t rqaddr;
+ uint8_t rqseq;
+ uint8_t cmd;
+} __attribute__((packed));
+
+// IPMI LAN Message Response Header
+struct Response
+{
+ uint8_t rqaddr;
+ uint8_t netfn;
+ uint8_t cs;
+ uint8_t rsaddr;
+ uint8_t rqseq;
+ uint8_t cmd;
+} __attribute__((packed));
+
+} // namespace header
+
+namespace trailer
+{
+
+// IPMI LAN Message Trailer
+struct Request
+{
+ uint8_t checksum;
+} __attribute__((packed));
+
+using Response = Request;
+
+} // namespace trailer
+
+} // namespace LAN
+
+} // namespace message
+
OpenPOWER on IntegriCloud