1 #pragma once
2 
3 #include <vector>
4 #include "message_handler.hpp"
5 
6 namespace sol
7 {
8 
9 namespace command
10 {
11 
12 constexpr uint8_t IPMI_CC_PAYLOAD_ALREADY_ACTIVE = 0x80;
13 constexpr uint8_t IPMI_CC_PAYLOAD_TYPE_DISABLED = 0x81;
14 constexpr uint8_t IPMI_CC_PAYLOAD_ACTIVATION_LIMIT = 0x82;
15 constexpr uint8_t IPMI_CC_PAYLOAD_WITH_ENCRYPTION = 0x83;
16 constexpr uint8_t IPMI_CC_PAYLOAD_WITHOUT_ENCRYPTION = 0x84;
17 
18 /** @struct ActivatePayloadRequest
19  *
20  *  IPMI payload for Activate Payload command request.
21  */
22 struct ActivatePayloadRequest
23 {
24 #if BYTE_ORDER == LITTLE_ENDIAN
25     uint8_t payloadType : 6;        //!< Payload type.
26     uint8_t reserved1 : 2;          //!< Reserved.
27 #endif
28 
29 #if BYTE_ORDER == BIG_ENDIAN
30     uint8_t reserved1 : 2;          //!< Payload type.
31     uint8_t payloadType : 6;        //!< Payload type.
32 #endif
33 
34 #if BYTE_ORDER == LITTLE_ENDIAN
35     uint8_t payloadInstance : 4;    //!< Payload instance.
36     uint8_t reserved2 : 4;          //!< Reserved.
37 #endif
38 
39 #if BYTE_ORDER == BIG_ENDIAN
40     uint8_t reserved2 : 4;          //!< Reserved.
41     uint8_t payloadInstance : 4;    //!< Payload instance.
42 #endif
43 
44     /** @brief The following Auxiliary Request Data applies only for payload
45      *         SOL only.
46      */
47 #if BYTE_ORDER == LITTLE_ENDIAN
48     uint8_t reserved4 : 1;  //!< Reserved.
49     uint8_t handshake : 1;  //!< SOL startup handshake.
50     uint8_t alert : 2;      //!< Shared serial alert behavior.
51     uint8_t reserved3 : 1;  //!< Reserved.
52     uint8_t testMode : 1;   //!< Test mode.
53     uint8_t auth : 1;       //!< If true, activate payload with authentication.
54     uint8_t encryption : 1; //!< If true, activate payload with encryption.
55 #endif
56 
57 #if BYTE_ORDER == BIG_ENDIAN
58     uint8_t encryption : 1; //!< If true, activate payload with encryption.
59     uint8_t auth : 1;       //!< If true, activate payload with authentication.
60     uint8_t testMode : 1;   //!< Test mode.
61     uint8_t reserved3 : 1;  //!< Reserved.
62     uint8_t alert : 2;      //!< Shared serial alert behavior.
63     uint8_t handshake : 1;  //!< SOL startup handshake.
64     uint8_t reserved4 : 1;  //!< Reserved.
65 #endif
66 
67     uint8_t reserved5;      //!< Reserved.
68     uint8_t reserved6;      //!< Reserved.
69     uint8_t reserved7;      //!< Reserved.
70 } __attribute__((packed));
71 
72 /** @struct ActivatePayloadResponse
73  *
74  *  IPMI payload for Activate Payload command response.
75  */
76 struct ActivatePayloadResponse
77 {
78     uint8_t completionCode;     //!< Completion code.
79     uint8_t reserved1;          //!< Reserved.
80     uint8_t reserved2;          //!< Reserved.
81     uint8_t reserved3;          //!< Reserved.
82 
83     // Test Mode
84 #if BYTE_ORDER == LITTLE_ENDIAN
85     uint8_t testMode : 1;       //!< Test mode.
86     uint8_t reserved4 : 7;      //!< Reserved.
87 #endif
88 
89 #if BYTE_ORDER == BIG_ENDIAN
90     uint8_t reserved4 : 7;      //!< Reserved.
91     uint8_t testMode : 1;       //!< Test mode.
92 #endif
93 
94     uint16_t inPayloadSize;     //!< Inbound payload size
95     uint16_t outPayloadSize;    //!< Outbound payload size.
96     uint16_t portNum;           //!< Payload UDP port number.
97     uint16_t vlanNum;           //!< Payload VLAN number.
98 } __attribute__((packed));
99 
100 /** @brief Activate Payload Command.
101  *
102  *  This command is used for activating and deactivating a payload type under a
103  *  given IPMI session. The UDP Port number for SOL is the same as the port that
104  *  was used to establish the IPMI session.
105  *
106  *  @param[in] inPayload - Request data for the command.
107  *  @param[in] handler - Reference to the message handler.
108  *
109  *  @return Response data for the command
110  */
111 std::vector<uint8_t> activatePayload(const std::vector<uint8_t>& inPayload,
112                                      const message::Handler& handler);
113 
114 constexpr uint8_t IPMI_CC_PAYLOAD_DEACTIVATED = 0x80;
115 
116 /** @struct DeactivatePayloadRequest
117  *
118  *  IPMI payload for Deactivate Payload command request.
119  */
120 struct DeactivatePayloadRequest
121 {
122 #if BYTE_ORDER == LITTLE_ENDIAN
123     uint8_t payloadType : 6;        //!< Payload type.
124     uint8_t reserved1 : 2;          //!< Reserved.
125 #endif
126 
127 #if BYTE_ORDER == BIG_ENDIAN
128     uint8_t reserved1 : 2;          //!< Payload type.
129     uint8_t payloadType : 6;        //!< Reserved.
130 #endif
131 
132 #if BYTE_ORDER == LITTLE_ENDIAN
133     uint8_t payloadInstance : 4;    //!< Payload instance.
134     uint8_t reserved2 : 4;          //!< Reserved.
135 #endif
136 
137 #if BYTE_ORDER == BIG_ENDIAN
138     uint8_t reserved2 : 4;          //!< Reserved.
139     uint8_t payloadInstance : 4;    //!< Payload instance.
140 #endif
141 
142     /** @brief No auxiliary data for payload type SOL */
143     uint8_t auxData1;               //!< Auxiliary data 1
144     uint8_t auxData2;               //!< Auxiliary data 2
145     uint8_t auxData3;               //!< Auxiliary data 3
146 } __attribute__((packed));
147 
148 /** @struct DeactivatePayloadResponse
149  *
150  * IPMI payload for Deactivate Payload Command response.
151  */
152 struct DeactivatePayloadResponse
153 {
154     uint8_t completionCode;         //!< Completion code
155 } __attribute__((packed));
156 
157 /** @brief Deactivate Payload Command.
158  *
159  *  This command is used to terminate use of a given payload on an IPMI session.
160  *  This type of traffic then becomes freed for activation by another session,
161  *  or for possible re-activation under the present session.The Deactivate
162  *  Payload command does not cause the session to be terminated. The Close
163  *  Session command should be used for that purpose. A remote console
164  *  terminating a application does not need to explicitly deactivate payload(s)
165  *  prior to session. When a session terminates all payloads that were active
166  *  under that session are automatically deactivated by the BMC.
167  *
168  * @param[in] inPayload - Request data for the command.
169  * @param[in] handler - Reference to the message handler.
170  *
171  * @return Response data for the command.
172  */
173 std::vector<uint8_t> deactivatePayload(const std::vector<uint8_t>& inPayload,
174                                        const message::Handler& handler);
175 
176 /** @struct GetPayloadStatusRequest
177  *
178  *  IPMI payload for Get Payload Activation Status command request.
179  */
180 struct GetPayloadStatusRequest
181 {
182     uint8_t payloadType;    //!< Payload type
183 } __attribute__((packed));
184 
185 /** @struct GetPayloadStatusResponse
186  *
187  *  IPMI payload for Get Payload Activation Status command response.
188  */
189 struct GetPayloadStatusResponse
190 {
191     uint8_t completionCode; //!< Completion code.
192 
193     uint8_t capacity;       //!< Instance capacity.
194 
195     /* @brief Activation Status. */
196 #if BYTE_ORDER == LITTLE_ENDIAN
197     uint8_t instance1 : 1;  //!< If true, Instance 1 is activated.
198     uint8_t instance2 : 1;  //!< If true, Instance 2 is activated.
199     uint8_t instance3 : 1;  //!< If true, Instance 3 is activated.
200     uint8_t instance4 : 1;  //!< If true, Instance 4 is activated.
201     uint8_t instance5 : 1;  //!< If true, Instance 5 is activated.
202     uint8_t instance6 : 1;  //!< If true, Instance 6 is activated.
203     uint8_t instance7 : 1;  //!< If true, Instance 7 is activated.
204     uint8_t instance8 : 1;  //!< If true, Instance 8 is activated.
205 #endif
206 
207 #if BYTE_ORDER == BIG_ENDIAN
208     uint8_t instance8 : 1;  //!< If true, Instance 8 is activated.
209     uint8_t instance7 : 1;  //!< If true, Instance 7 is activated.
210     uint8_t instance6 : 1;  //!< If true, Instance 6 is activated.
211     uint8_t instance5 : 1;  //!< If true, Instance 5 is activated.
212     uint8_t instance4 : 1;  //!< If true, Instance 4 is activated.
213     uint8_t instance3 : 1;  //!< If true, Instance 3 is activated.
214     uint8_t instance2 : 1;  //!< If true, Instance 2 is activated.
215     uint8_t instance1 : 1;  //!< If true, Instance 1 is activated.
216 #endif
217 
218 #if BYTE_ORDER == LITTLE_ENDIAN
219     uint8_t instance9  : 1; //!< If true, Instance 9 is activated.
220     uint8_t instance10 : 1; //!< If true, Instance 10 is activated.
221     uint8_t instance11 : 1; //!< If true, Instance 11 is activated.
222     uint8_t instance12 : 1; //!< If true, Instance 12 is activated.
223     uint8_t instance13 : 1; //!< If true, Instance 13 is activated.
224     uint8_t instance14 : 1; //!< If true, Instance 14 is activated.
225     uint8_t instance15 : 1; //!< If true, Instance 15 is activated.
226     uint8_t instance16 : 1; //!< If true, Instance 16 is activated.
227 #endif
228 
229 #if BYTE_ORDER == BIG_ENDIAN
230     uint8_t instance16 : 1; //!< If true, Instance 16 is activated.
231     uint8_t instance15 : 1; //!< If true, Instance 15 is activated.
232     uint8_t instance14 : 1; //!< If true, Instance 14 is activated.
233     uint8_t instance13 : 1; //!< If true, Instance 13 is activated.
234     uint8_t instance12 : 1; //!< If true, Instance 12 is activated.
235     uint8_t instance11 : 1; //!< If true, Instance 11 is activated.
236     uint8_t instance10 : 1; //!< If true, Instance 10 is activated.
237     uint8_t instance9  : 1; //!< If true, Instance 9 is activated.
238 #endif
239 } __attribute__((packed));
240 
241 /** @brief Get Payload Activation Status Command.
242  *
243  *  This command returns how many instances of a given payload type are
244  *  presently activated, and how many total instances can be activated.
245  *
246  *  @param[in] inPayload - Request Data for the command.
247  *  @param[in] handler - Reference to the Message Handler.
248  *
249  *  @return Response data for the command
250  */
251 std::vector<uint8_t> getPayloadStatus(const std::vector<uint8_t>& inPayload,
252                                       const message::Handler& handler);
253 
254 } // namespace command
255 
256 } // namespace sol
257