blob: 87787862dc677f42277e42533f21233196d6ab9f [file] [log] [blame]
Tom Joseph5c846a82017-04-03 01:59:39 +05301#pragma once
2
Tom Joseph5c846a82017-04-03 01:59:39 +05303#include "message_handler.hpp"
4
Vernon Mauery9e801a22018-10-12 13:20:49 -07005#include <vector>
6
Tom Joseph5c846a82017-04-03 01:59:39 +05307namespace sol
8{
9
10namespace command
11{
12
13constexpr uint8_t IPMI_CC_PAYLOAD_ALREADY_ACTIVE = 0x80;
14constexpr uint8_t IPMI_CC_PAYLOAD_TYPE_DISABLED = 0x81;
15constexpr uint8_t IPMI_CC_PAYLOAD_ACTIVATION_LIMIT = 0x82;
16constexpr uint8_t IPMI_CC_PAYLOAD_WITH_ENCRYPTION = 0x83;
17constexpr uint8_t IPMI_CC_PAYLOAD_WITHOUT_ENCRYPTION = 0x84;
18
19/** @struct ActivatePayloadRequest
20 *
21 * IPMI payload for Activate Payload command request.
22 */
23struct ActivatePayloadRequest
24{
25#if BYTE_ORDER == LITTLE_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -070026 uint8_t payloadType : 6; //!< Payload type.
27 uint8_t reserved1 : 2; //!< Reserved.
Tom Joseph5c846a82017-04-03 01:59:39 +053028#endif
29
30#if BYTE_ORDER == BIG_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -070031 uint8_t reserved1 : 2; //!< Payload type.
32 uint8_t payloadType : 6; //!< Payload type.
Tom Joseph5c846a82017-04-03 01:59:39 +053033#endif
34
35#if BYTE_ORDER == LITTLE_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -070036 uint8_t payloadInstance : 4; //!< Payload instance.
37 uint8_t reserved2 : 4; //!< Reserved.
Tom Joseph5c846a82017-04-03 01:59:39 +053038#endif
39
40#if BYTE_ORDER == BIG_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -070041 uint8_t reserved2 : 4; //!< Reserved.
42 uint8_t payloadInstance : 4; //!< Payload instance.
Tom Joseph5c846a82017-04-03 01:59:39 +053043#endif
44
45 /** @brief The following Auxiliary Request Data applies only for payload
46 * SOL only.
47 */
48#if BYTE_ORDER == LITTLE_ENDIAN
49 uint8_t reserved4 : 1; //!< Reserved.
50 uint8_t handshake : 1; //!< SOL startup handshake.
51 uint8_t alert : 2; //!< Shared serial alert behavior.
52 uint8_t reserved3 : 1; //!< Reserved.
53 uint8_t testMode : 1; //!< Test mode.
54 uint8_t auth : 1; //!< If true, activate payload with authentication.
55 uint8_t encryption : 1; //!< If true, activate payload with encryption.
56#endif
57
58#if BYTE_ORDER == BIG_ENDIAN
59 uint8_t encryption : 1; //!< If true, activate payload with encryption.
60 uint8_t auth : 1; //!< If true, activate payload with authentication.
61 uint8_t testMode : 1; //!< Test mode.
62 uint8_t reserved3 : 1; //!< Reserved.
63 uint8_t alert : 2; //!< Shared serial alert behavior.
64 uint8_t handshake : 1; //!< SOL startup handshake.
65 uint8_t reserved4 : 1; //!< Reserved.
66#endif
67
Vernon Mauery9e801a22018-10-12 13:20:49 -070068 uint8_t reserved5; //!< Reserved.
69 uint8_t reserved6; //!< Reserved.
70 uint8_t reserved7; //!< Reserved.
Tom Joseph5c846a82017-04-03 01:59:39 +053071} __attribute__((packed));
72
73/** @struct ActivatePayloadResponse
74 *
75 * IPMI payload for Activate Payload command response.
76 */
77struct ActivatePayloadResponse
78{
Vernon Mauery9e801a22018-10-12 13:20:49 -070079 uint8_t completionCode; //!< Completion code.
80 uint8_t reserved1; //!< Reserved.
81 uint8_t reserved2; //!< Reserved.
82 uint8_t reserved3; //!< Reserved.
Tom Joseph5c846a82017-04-03 01:59:39 +053083
84 // Test Mode
85#if BYTE_ORDER == LITTLE_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -070086 uint8_t testMode : 1; //!< Test mode.
87 uint8_t reserved4 : 7; //!< Reserved.
Tom Joseph5c846a82017-04-03 01:59:39 +053088#endif
89
90#if BYTE_ORDER == BIG_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -070091 uint8_t reserved4 : 7; //!< Reserved.
92 uint8_t testMode : 1; //!< Test mode.
Tom Joseph5c846a82017-04-03 01:59:39 +053093#endif
94
Vernon Mauery9e801a22018-10-12 13:20:49 -070095 uint16_t inPayloadSize; //!< Inbound payload size
96 uint16_t outPayloadSize; //!< Outbound payload size.
97 uint16_t portNum; //!< Payload UDP port number.
98 uint16_t vlanNum; //!< Payload VLAN number.
Tom Joseph5c846a82017-04-03 01:59:39 +053099} __attribute__((packed));
100
101/** @brief Activate Payload Command.
102 *
103 * This command is used for activating and deactivating a payload type under a
104 * given IPMI session. The UDP Port number for SOL is the same as the port that
105 * was used to establish the IPMI session.
106 *
107 * @param[in] inPayload - Request data for the command.
108 * @param[in] handler - Reference to the message handler.
109 *
110 * @return Response data for the command
111 */
Vernon Mauery41ff9b52021-06-11 11:37:40 -0700112std::vector<uint8_t>
113 activatePayload(const std::vector<uint8_t>& inPayload,
114 std::shared_ptr<message::Handler>& handler);
Tom Joseph5c846a82017-04-03 01:59:39 +0530115
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530116constexpr uint8_t IPMI_CC_PAYLOAD_DEACTIVATED = 0x80;
117
118/** @struct DeactivatePayloadRequest
119 *
120 * IPMI payload for Deactivate Payload command request.
121 */
122struct DeactivatePayloadRequest
123{
124#if BYTE_ORDER == LITTLE_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -0700125 uint8_t payloadType : 6; //!< Payload type.
126 uint8_t reserved1 : 2; //!< Reserved.
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530127#endif
128
129#if BYTE_ORDER == BIG_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -0700130 uint8_t reserved1 : 2; //!< Payload type.
131 uint8_t payloadType : 6; //!< Reserved.
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530132#endif
133
134#if BYTE_ORDER == LITTLE_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -0700135 uint8_t payloadInstance : 4; //!< Payload instance.
136 uint8_t reserved2 : 4; //!< Reserved.
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530137#endif
138
139#if BYTE_ORDER == BIG_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -0700140 uint8_t reserved2 : 4; //!< Reserved.
141 uint8_t payloadInstance : 4; //!< Payload instance.
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530142#endif
143
144 /** @brief No auxiliary data for payload type SOL */
Vernon Mauery9e801a22018-10-12 13:20:49 -0700145 uint8_t auxData1; //!< Auxiliary data 1
146 uint8_t auxData2; //!< Auxiliary data 2
147 uint8_t auxData3; //!< Auxiliary data 3
Sumanth Bhatb9631f82019-03-07 11:51:53 +0530148 uint8_t auxData4; //!< Auxiliary data 4
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530149} __attribute__((packed));
150
151/** @struct DeactivatePayloadResponse
152 *
153 * IPMI payload for Deactivate Payload Command response.
154 */
155struct DeactivatePayloadResponse
156{
Vernon Mauery9e801a22018-10-12 13:20:49 -0700157 uint8_t completionCode; //!< Completion code
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530158} __attribute__((packed));
159
160/** @brief Deactivate Payload Command.
161 *
162 * This command is used to terminate use of a given payload on an IPMI session.
163 * This type of traffic then becomes freed for activation by another session,
164 * or for possible re-activation under the present session.The Deactivate
165 * Payload command does not cause the session to be terminated. The Close
166 * Session command should be used for that purpose. A remote console
167 * terminating a application does not need to explicitly deactivate payload(s)
168 * prior to session. When a session terminates all payloads that were active
169 * under that session are automatically deactivated by the BMC.
170 *
171 * @param[in] inPayload - Request data for the command.
172 * @param[in] handler - Reference to the message handler.
173 *
174 * @return Response data for the command.
175 */
Vernon Mauery41ff9b52021-06-11 11:37:40 -0700176std::vector<uint8_t>
177 deactivatePayload(const std::vector<uint8_t>& inPayload,
178 std::shared_ptr<message::Handler>& handler);
Tom Josephe2f0a8e2017-04-03 02:01:49 +0530179
Tom Josephe1ae56c2017-04-03 02:03:41 +0530180/** @struct GetPayloadStatusRequest
181 *
182 * IPMI payload for Get Payload Activation Status command request.
183 */
184struct GetPayloadStatusRequest
185{
Vernon Mauery9e801a22018-10-12 13:20:49 -0700186 uint8_t payloadType; //!< Payload type
Tom Josephe1ae56c2017-04-03 02:03:41 +0530187} __attribute__((packed));
188
189/** @struct GetPayloadStatusResponse
190 *
191 * IPMI payload for Get Payload Activation Status command response.
192 */
193struct GetPayloadStatusResponse
194{
195 uint8_t completionCode; //!< Completion code.
196
Vernon Mauery9e801a22018-10-12 13:20:49 -0700197 uint8_t capacity; //!< Instance capacity.
Tom Josephe1ae56c2017-04-03 02:03:41 +0530198
199 /* @brief Activation Status. */
200#if BYTE_ORDER == LITTLE_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -0700201 uint8_t instance1 : 1; //!< If true, Instance 1 is activated.
202 uint8_t instance2 : 1; //!< If true, Instance 2 is activated.
203 uint8_t instance3 : 1; //!< If true, Instance 3 is activated.
204 uint8_t instance4 : 1; //!< If true, Instance 4 is activated.
205 uint8_t instance5 : 1; //!< If true, Instance 5 is activated.
206 uint8_t instance6 : 1; //!< If true, Instance 6 is activated.
207 uint8_t instance7 : 1; //!< If true, Instance 7 is activated.
208 uint8_t instance8 : 1; //!< If true, Instance 8 is activated.
Tom Josephe1ae56c2017-04-03 02:03:41 +0530209#endif
210
211#if BYTE_ORDER == BIG_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -0700212 uint8_t instance8 : 1; //!< If true, Instance 8 is activated.
213 uint8_t instance7 : 1; //!< If true, Instance 7 is activated.
214 uint8_t instance6 : 1; //!< If true, Instance 6 is activated.
215 uint8_t instance5 : 1; //!< If true, Instance 5 is activated.
216 uint8_t instance4 : 1; //!< If true, Instance 4 is activated.
217 uint8_t instance3 : 1; //!< If true, Instance 3 is activated.
218 uint8_t instance2 : 1; //!< If true, Instance 2 is activated.
219 uint8_t instance1 : 1; //!< If true, Instance 1 is activated.
Tom Josephe1ae56c2017-04-03 02:03:41 +0530220#endif
221
222#if BYTE_ORDER == LITTLE_ENDIAN
Vernon Mauery9e801a22018-10-12 13:20:49 -0700223 uint8_t instance9 : 1; //!< If true, Instance 9 is activated.
Tom Josephe1ae56c2017-04-03 02:03:41 +0530224 uint8_t instance10 : 1; //!< If true, Instance 10 is activated.
225 uint8_t instance11 : 1; //!< If true, Instance 11 is activated.
226 uint8_t instance12 : 1; //!< If true, Instance 12 is activated.
227 uint8_t instance13 : 1; //!< If true, Instance 13 is activated.
228 uint8_t instance14 : 1; //!< If true, Instance 14 is activated.
229 uint8_t instance15 : 1; //!< If true, Instance 15 is activated.
230 uint8_t instance16 : 1; //!< If true, Instance 16 is activated.
231#endif
232
233#if BYTE_ORDER == BIG_ENDIAN
234 uint8_t instance16 : 1; //!< If true, Instance 16 is activated.
235 uint8_t instance15 : 1; //!< If true, Instance 15 is activated.
236 uint8_t instance14 : 1; //!< If true, Instance 14 is activated.
237 uint8_t instance13 : 1; //!< If true, Instance 13 is activated.
238 uint8_t instance12 : 1; //!< If true, Instance 12 is activated.
239 uint8_t instance11 : 1; //!< If true, Instance 11 is activated.
240 uint8_t instance10 : 1; //!< If true, Instance 10 is activated.
Vernon Mauery9e801a22018-10-12 13:20:49 -0700241 uint8_t instance9 : 1; //!< If true, Instance 9 is activated.
Tom Josephe1ae56c2017-04-03 02:03:41 +0530242#endif
243} __attribute__((packed));
244
245/** @brief Get Payload Activation Status Command.
246 *
247 * This command returns how many instances of a given payload type are
248 * presently activated, and how many total instances can be activated.
249 *
250 * @param[in] inPayload - Request Data for the command.
251 * @param[in] handler - Reference to the Message Handler.
252 *
253 * @return Response data for the command
254 */
Vernon Mauery41ff9b52021-06-11 11:37:40 -0700255std::vector<uint8_t>
256 getPayloadStatus(const std::vector<uint8_t>& inPayload,
257 std::shared_ptr<message::Handler>& handler);
Tom Josephe1ae56c2017-04-03 02:03:41 +0530258
Tom Joseph80938492018-03-22 10:05:20 +0530259/** @struct GetPayloadInfoRequest
260 *
261 * IPMI payload for Get Payload Instance info command request.
262 */
263struct GetPayloadInfoRequest
264{
Vernon Mauery9e801a22018-10-12 13:20:49 -0700265 uint8_t payloadType; //!< Payload type
266 uint8_t payloadInstance; //!< Payload instance
Tom Joseph80938492018-03-22 10:05:20 +0530267} __attribute__((packed));
268
269/** @struct GetPayloadInfoResponse
270 *
271 * IPMI payload for Get Payload Instance info command response.
272 */
273struct GetPayloadInfoResponse
274{
275 uint8_t completionCode; //!< Completion code.
276 uint32_t sessionID; //!< Session ID
277 uint8_t portNumber; //!< Port number
278 uint8_t reserved[7]; //!< Reserved
279} __attribute__((packed));
280
281/** @brief Get Payload Instance Info Command.
282 *
283 * This command returns information about a specific instance of a payload
284 * type. Session ID is returned by this command
285 *
286 * @param[in] inPayload - Request Data for the command.
287 * @param[in] handler - Reference to the Message Handler.
288 *
289 * @return Response data for the command
290 */
291std::vector<uint8_t> getPayloadInfo(const std::vector<uint8_t>& inPayload,
Vernon Mauery41ff9b52021-06-11 11:37:40 -0700292 std::shared_ptr<message::Handler>& handler);
Tom Joseph80938492018-03-22 10:05:20 +0530293
Tom Joseph5c846a82017-04-03 01:59:39 +0530294} // namespace command
295
296} // namespace sol