diff options
-rw-r--r-- | message.hpp | 108 |
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 + |