xref: /openbmc/phosphor-net-ipmid/command/payload_cmds.hpp (revision 33503e2a90d5615a11ec2d27961ffdefc3a5cd10)
1  #pragma once
2  
3  #include "message_handler.hpp"
4  
5  #include <vector>
6  
7  namespace sol
8  {
9  
10  namespace command
11  {
12  
13  constexpr uint8_t IPMI_CC_PAYLOAD_ALREADY_ACTIVE = 0x80;
14  constexpr uint8_t IPMI_CC_PAYLOAD_TYPE_DISABLED = 0x81;
15  constexpr uint8_t IPMI_CC_PAYLOAD_ACTIVATION_LIMIT = 0x82;
16  constexpr uint8_t IPMI_CC_PAYLOAD_WITH_ENCRYPTION = 0x83;
17  constexpr uint8_t IPMI_CC_PAYLOAD_WITHOUT_ENCRYPTION = 0x84;
18  
19  /** @struct ActivatePayloadRequest
20   *
21   *  IPMI payload for Activate Payload command request.
22   */
23  struct ActivatePayloadRequest
24  {
25  #if BYTE_ORDER == LITTLE_ENDIAN
26      uint8_t payloadType:6; //!< Payload type.
27      uint8_t reserved1:2;   //!< Reserved.
28  #endif
29  
30  #if BYTE_ORDER == BIG_ENDIAN
31      uint8_t reserved1:2;   //!< Payload type.
32      uint8_t payloadType:6; //!< Payload type.
33  #endif
34  
35  #if BYTE_ORDER == LITTLE_ENDIAN
36      uint8_t payloadInstance:4; //!< Payload instance.
37      uint8_t reserved2:4;       //!< Reserved.
38  #endif
39  
40  #if BYTE_ORDER == BIG_ENDIAN
41      uint8_t reserved2:4;       //!< Reserved.
42      uint8_t payloadInstance:4; //!< Payload instance.
43  #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  
68      uint8_t reserved5; //!< Reserved.
69      uint8_t reserved6; //!< Reserved.
70      uint8_t reserved7; //!< Reserved.
71  } __attribute__((packed));
72  
73  /** @struct ActivatePayloadResponse
74   *
75   *  IPMI payload for Activate Payload command response.
76   */
77  struct ActivatePayloadResponse
78  {
79      uint8_t completionCode; //!< Completion code.
80      uint8_t reserved1;      //!< Reserved.
81      uint8_t reserved2;      //!< Reserved.
82      uint8_t reserved3;      //!< Reserved.
83  
84      // Test Mode
85  #if BYTE_ORDER == LITTLE_ENDIAN
86      uint8_t testMode:1;  //!< Test mode.
87      uint8_t reserved4:7; //!< Reserved.
88  #endif
89  
90  #if BYTE_ORDER == BIG_ENDIAN
91      uint8_t reserved4:7; //!< Reserved.
92      uint8_t testMode:1;  //!< Test mode.
93  #endif
94  
95      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.
99  } __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   */
112  std::vector<uint8_t> activatePayload(
113      const std::vector<uint8_t>& inPayload,
114      std::shared_ptr<message::Handler>& handler);
115  
116  constexpr uint8_t IPMI_CC_PAYLOAD_DEACTIVATED = 0x80;
117  
118  /** @struct DeactivatePayloadRequest
119   *
120   *  IPMI payload for Deactivate Payload command request.
121   */
122  struct DeactivatePayloadRequest
123  {
124  #if BYTE_ORDER == LITTLE_ENDIAN
125      uint8_t payloadType:6; //!< Payload type.
126      uint8_t reserved1:2;   //!< Reserved.
127  #endif
128  
129  #if BYTE_ORDER == BIG_ENDIAN
130      uint8_t reserved1:2;   //!< Payload type.
131      uint8_t payloadType:6; //!< Reserved.
132  #endif
133  
134  #if BYTE_ORDER == LITTLE_ENDIAN
135      uint8_t payloadInstance:4; //!< Payload instance.
136      uint8_t reserved2:4;       //!< Reserved.
137  #endif
138  
139  #if BYTE_ORDER == BIG_ENDIAN
140      uint8_t reserved2:4;       //!< Reserved.
141      uint8_t payloadInstance:4; //!< Payload instance.
142  #endif
143  
144      /** @brief No auxiliary data for payload type SOL */
145      uint8_t auxData1; //!< Auxiliary data 1
146      uint8_t auxData2; //!< Auxiliary data 2
147      uint8_t auxData3; //!< Auxiliary data 3
148      uint8_t auxData4; //!< Auxiliary data 4
149  } __attribute__((packed));
150  
151  /** @struct DeactivatePayloadResponse
152   *
153   * IPMI payload for Deactivate Payload Command response.
154   */
155  struct DeactivatePayloadResponse
156  {
157      uint8_t completionCode; //!< Completion code
158  } __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   */
176  std::vector<uint8_t> deactivatePayload(
177      const std::vector<uint8_t>& inPayload,
178      std::shared_ptr<message::Handler>& handler);
179  
180  /** @struct GetPayloadStatusRequest
181   *
182   *  IPMI payload for Get Payload Activation Status command request.
183   */
184  struct GetPayloadStatusRequest
185  {
186      uint8_t payloadType; //!< Payload type
187  } __attribute__((packed));
188  
189  /** @struct GetPayloadStatusResponse
190   *
191   *  IPMI payload for Get Payload Activation Status command response.
192   */
193  struct GetPayloadStatusResponse
194  {
195      uint8_t completionCode; //!< Completion code.
196  
197      uint8_t capacity;       //!< Instance capacity.
198  
199      /* @brief Activation Status. */
200  #if BYTE_ORDER == LITTLE_ENDIAN
201      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.
209  #endif
210  
211  #if BYTE_ORDER == BIG_ENDIAN
212      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.
220  #endif
221  
222  #if BYTE_ORDER == LITTLE_ENDIAN
223      uint8_t instance9:1;  //!< If true, Instance 9 is activated.
224      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.
241      uint8_t instance9:1;  //!< If true, Instance 9 is activated.
242  #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   */
255  std::vector<uint8_t> getPayloadStatus(
256      const std::vector<uint8_t>& inPayload,
257      std::shared_ptr<message::Handler>& handler);
258  
259  /** @struct GetPayloadInfoRequest
260   *
261   *  IPMI payload for Get Payload Instance info command request.
262   */
263  struct GetPayloadInfoRequest
264  {
265      uint8_t payloadType;     //!< Payload type
266      uint8_t payloadInstance; //!< Payload instance
267  } __attribute__((packed));
268  
269  /** @struct GetPayloadInfoResponse
270   *
271   *  IPMI payload for Get Payload Instance info command response.
272   */
273  struct 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   */
291  std::vector<uint8_t> getPayloadInfo(const std::vector<uint8_t>& inPayload,
292                                      std::shared_ptr<message::Handler>& handler);
293  
294  } // namespace command
295  
296  } // namespace sol
297