xref: /openbmc/phosphor-net-ipmid/message.hpp (revision 1e5a76a0)
1 #pragma once
2 
3 #include <memory>
4 #include <vector>
5 
6 namespace message
7 {
8 
9 enum 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  */
30 struct 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 
62 namespace LAN
63 {
64 
65 namespace header
66 {
67 
68 // IPMI LAN Message Request Header
69 struct 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
80 struct 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 
92 namespace trailer
93 {
94 
95 // IPMI LAN Message Trailer
96 struct Request
97 {
98     uint8_t checksum;
99 } __attribute__((packed));
100 
101 using Response = Request;
102 
103 } // namespace trailer
104 
105 } // namespace LAN
106 
107 } // namespace message
108 
109