blob: e119dbc7821d8f4966720518008c045eef606f0c [file] [log] [blame]
#pragma once
#include "message_handler.hpp"
#include <vector>
namespace command
{
/**
* @struct OpenSessionRequest
*
* IPMI Payload for RMCP+ Open Session Request
*/
struct OpenSessionRequest
{
uint8_t messageTag; // Message tag from request buffer
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t maxPrivLevel : 4; // Requested maximum privilege level
uint8_t reserved1 : 4; // Reserved for future definition
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved1 : 4; // Reserved for future definition
uint8_t maxPrivLevel : 4; // Requested maximum privilege level
#endif
uint16_t reserved2;
uint32_t remoteConsoleSessionID;
uint8_t authPayload;
uint16_t reserved3;
uint8_t authPayloadLen;
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t authAlgo : 6;
uint8_t reserved4 : 2;
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved4 : 2;
uint8_t authAlgo : 6;
#endif
uint8_t reserved5;
uint16_t reserved6;
uint8_t intPayload;
uint16_t reserved7;
uint8_t intPayloadLen;
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t intAlgo : 6;
uint8_t reserved8 : 2;
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved8 : 2;
uint8_t intAlgo : 6;
#endif
uint8_t reserved9;
uint16_t reserved10;
uint8_t confPayload;
uint16_t reserved11;
uint8_t confPayloadLen;
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t confAlgo : 6;
uint8_t reserved12 : 2;
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved12 : 2;
uint8_t confAlgo : 6;
#endif
uint8_t reserved13;
uint16_t reserved14;
} __attribute__((packed));
/**
* @struct OpenSessionResponse
*
* IPMI Payload for RMCP+ Open Session Response
*/
struct OpenSessionResponse
{
uint8_t messageTag;
uint8_t status_code;
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t maxPrivLevel : 4;
uint8_t reserved1 : 4;
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved1 : 4;
uint8_t maxPrivLevel : 4;
#endif
uint8_t reserved2;
uint32_t remoteConsoleSessionID;
uint32_t managedSystemSessionID;
uint8_t authPayload;
uint16_t reserved3;
uint8_t authPayloadLen;
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t authAlgo : 6;
uint8_t reserved4 : 2;
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved4 : 2;
uint8_t authAlgo : 6;
#endif
uint8_t reserved5;
uint16_t reserved6;
uint8_t intPayload;
uint16_t reserved7;
uint8_t intPayloadLen;
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t intAlgo : 6;
uint8_t reserved8 : 2;
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved8 : 2;
uint8_t intAlgo : 6;
#endif
uint8_t reserved9;
uint16_t reserved10;
uint8_t confPayload;
uint16_t reserved11;
uint8_t confPayloadLen;
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t confAlgo : 6;
uint8_t reserved12 : 2;
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved12 : 2;
uint8_t confAlgo : 6;
#endif
uint8_t reserved13;
uint16_t reserved14;
} __attribute__((packed));
/**
* @brief RMCP+ Open Session Request, RMCP+ Open Session Response
*
* The RMCP+ Open Session request and response messages are used to enable a
* remote console to discover what Cipher Suite(s) can be used for establishing
* a session at a requested maximum privilege level. These messages are also
* used for transferring the sessions IDs that the remote console and BMC wish
* to for the session once it’s been activated, and to track each party during
* the exchange of messages used for establishing the session.
*
* @param[in] inPayload - Request Data for the command
* @param[in] handler - Reference to the Message Handler
*
* @return Response data for the command
*/
std::vector<uint8_t> openSession(const std::vector<uint8_t>& inPayload,
std::shared_ptr<message::Handler>& handler);
} // namespace command