blob: b6b4131345116c1a114f00efe2e92e68c39e8ed1 [file] [log] [blame]
Tom Joseph9b672192016-08-08 08:34:08 -05001#pragma once
2
3#include <memory>
4#include <vector>
5
6namespace message
7{
8
9enum class PayloadType : uint8_t
10{
11 IPMI = 0x00,
12 OPEN_SESSION_REQUEST = 0x10,
13 OPEN_SESSION_RESPONSE = 0x11,
14 RAKP1 = 0x12,
15 RAKP2 = 0x13,
16 RAKP3 = 0x14,
17 RAKP4 = 0x15,
18 INVALID = 0xFF,
19};
20
21/*
22 * @ struct Message
23 *
24 * IPMI message is data encapsulated in an IPMI Session packet. The IPMI
25 * Session packets are encapsulated in RMCP packets, which are encapsulated in
26 * UDP datagrams. Refer Section 13.5 of IPMI specification(IPMI Messages
27 * Encapsulation Under RMCP). IPMI payload is a special class of data
28 * encapsulated in an IPMI session packet.
29 */
30struct Message
31{
32 static constexpr uint32_t MESSAGE_INVALID_SESSION_ID = 0xBADBADFF;
33
34 Message()
35 : payloadType(PayloadType::INVALID),
36 rcSessionID(Message::MESSAGE_INVALID_SESSION_ID),
37 bmcSessionID(Message::MESSAGE_INVALID_SESSION_ID) {}
38
39 ~Message() = default;
40 Message(const Message&) = default;
41 Message& operator=(const Message&) = default;
42 Message(Message&&) = default;
43 Message& operator=(Message&&) = default;
44
45 bool isPacketEncrypted; // Message's Encryption Status
46 bool isPacketAuthenticated; // Message's Authentication Status
47 PayloadType payloadType; // Type of message payload (IPMI,SOL ..etc)
48 uint32_t rcSessionID; // Remote Client's Session ID
49 uint32_t bmcSessionID; // BMC's session ID
50 uint32_t sessionSeqNum; // Session Sequence Number
51
52 /*
53 * “Payloads” are a capability specified for RMCP+ that enable an IPMI
54 * session to carry types of traffic that are in addition to IPMI Messages.
55 * Payloads can be ‘standard’ or ‘OEM’.Standard payload types include IPMI
56 * Messages, messages for session setup under RMCP+, and the payload for the
57 * “Serial Over LAN” capability introduced in IPMI v2.0.
58 */
59 std::vector<uint8_t> payload;
60};
61
62namespace LAN
63{
64
65namespace header
66{
67
68// IPMI LAN Message Request Header
69struct Request
70{
71 uint8_t rsaddr;
72 uint8_t netfn;
73 uint8_t cs;
74 uint8_t rqaddr;
75 uint8_t rqseq;
76 uint8_t cmd;
77} __attribute__((packed));
78
79// IPMI LAN Message Response Header
80struct Response
81{
82 uint8_t rqaddr;
83 uint8_t netfn;
84 uint8_t cs;
85 uint8_t rsaddr;
86 uint8_t rqseq;
87 uint8_t cmd;
88} __attribute__((packed));
89
90} // namespace header
91
92namespace trailer
93{
94
95// IPMI LAN Message Trailer
96struct Request
97{
98 uint8_t checksum;
99} __attribute__((packed));
100
101using Response = Request;
102
103} // namespace trailer
104
105} // namespace LAN
106
107} // namespace message
108