IPMI Message representation
Message structure would represent the payload inside an IPMI
session packet.The payload would have different payload types
like IPMI,SOL. The Request, response and trailer for the IPMI
LAN Messages.
Change-Id: I45f64e3f1f29a546b29dac3de78fba8d7d0f1db3
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
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
+