blob: 182b73e7c2e8c80f19e8cea95910a2694cb8ad9f [file] [log] [blame]
#pragma once
#include "message_handler.hpp"
#include <vector>
namespace sol
{
namespace command
{
/** @brief SOL Payload Handler
*
* This command is used for activating and deactivating a payload type under a
* given IPMI session. The UDP Port number for SOL is the same as the port that
* was used to establish the IPMI 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> payloadHandler(const std::vector<uint8_t>& inPayload,
const message::Handler& handler);
constexpr uint8_t netfnTransport = 0x0C;
constexpr uint8_t solActivatingCmd = 0x20;
/** @struct ActivatingRequest
*
* IPMI payload for SOL Activating command.
*/
struct ActivatingRequest
{
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t sessionState : 4; //!< SOL session state.
uint8_t reserved : 4; //!< Reserved.
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved : 4; //!< Reserved.
uint8_t sessionState : 4; //!< SOL session state.
#endif
uint8_t payloadInstance; //!< Payload instance.
uint8_t majorVersion; //!< SOL format major version
uint8_t minorVersion; //!< SOL format minor version
} __attribute__((packed));
/** @brief SOL Activating Command.
*
* This command provides a mechanism for the BMC to notify a remote application
* that a SOL payload is activating on another channel.The request message is a
* message that is asynchronously generated by the BMC. The BMC will not wait
* for a response from the remote console before dropping the serial connection
* to proceed with SOL, therefore the remote console does not need to respond
* to this command.
*
* @param[in] payloadInstance - SOL payload instance.
* @param[in] sessionID - IPMI session ID.
*/
void activating(uint8_t payloadInstance, uint32_t sessionID);
/** @enum Parameter
*
* SOL parameters are volatile, they are initialized by the SOL manager.
* They can be read using Get SOL configuration parameters command and updated
* using Set SOL configuration parameters command.
*/
enum class Parameter
{
PROGRESS, //!< Set In Progress.
ENABLE, //!< SOL Enable.
AUTHENTICATION, //!< SOL Authentication.
ACCUMULATE, //!< Character Accumulate Interval & Send Threshold.
RETRY, //!< SOL Retry.
NVBITRATE, //!< SOL non-volatile bit rate.
VBITRATE, //!< SOL volatile bit rate.
CHANNEL, //!< SOL payload channel.
PORT, //!< SOL payload port.
};
constexpr uint8_t progressMask = 0x03;
constexpr uint8_t enableMask = 0x01;
/** @struct Auth
*
* SOL authentication parameter.
*/
struct Auth
{
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t privilege : 4; //!< SOL privilege level.
uint8_t reserved : 2; //!< Reserved.
uint8_t auth : 1; //!< Force SOL payload Authentication.
uint8_t encrypt : 1; //!< Force SOL payload encryption.
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t encrypt : 1; //!< Force SOL payload encryption.
uint8_t auth : 1; //!< Force SOL payload Authentication.
uint8_t reserved : 2; //!< Reserved.
uint8_t privilege : 4; //!< SOL privilege level.
#endif
} __attribute__((packed));
/** @struct Accumulate
*
* Character accumulate interval & Character send threshold.
*/
struct Accumulate
{
uint8_t interval; //!< Character accumulate interval.
uint8_t threshold; //!< Character send threshold.
} __attribute__((packed));
constexpr uint8_t retryCountMask = 0x07;
/** @struct Retry
*
* SOL retry count and interval.
*/
struct Retry
{
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t count : 3; //!< SOL retry count.
uint8_t reserved : 5; //!< Reserved.
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved : 5; //!< Reserved.
uint8_t count : 3; //!< SOL retry count.
#endif
uint8_t interval; //!< SOL retry interval.
} __attribute__((packed));
constexpr uint8_t ipmiCCParamNotSupported = 0x80;
constexpr uint8_t ipmiCCInvalidSetInProgress = 0x81;
constexpr uint8_t ipmiCCWriteReadParameter = 0x82;
constexpr uint8_t ipmiCCReadWriteParameter = 0x83;
constexpr uint8_t parameterRevision = 0x11;
/** @struct SetConfParamsRequest
*
* IPMI payload for Set SOL configuration parameters command request.
*/
struct SetConfParamsRequest
{
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t channelNumber : 4; //!< Channel number.
uint8_t reserved : 4; //!< Reserved.
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t reserved : 4; //!< Reserved.
uint8_t channelNumber : 4; //!< Channel number.
#endif
uint8_t paramSelector; //!< Parameter selector.
union
{
uint8_t value; //!< Represents one byte SOL parameters.
struct Accumulate acc; //!< Character accumulate values.
struct Retry retry; //!< Retry values.
struct Auth auth; //!< Authentication parameters.
};
} __attribute__((packed));
/** @struct SetConfParamsResponse
*
* IPMI payload for Set SOL configuration parameters command response.
*/
struct SetConfParamsResponse
{
uint8_t completionCode; //!< Completion code.
} __attribute__((packed));
/** @brief Set SOL configuration parameters command.
*
* @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> setConfParams(const std::vector<uint8_t>& inPayload,
const message::Handler& handler);
/** @struct GetConfParamsRequest
*
* IPMI payload for Get SOL configuration parameters command request.
*/
struct GetConfParamsRequest
{
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t channelNum : 4; //!< Channel number.
uint8_t reserved : 3; //!< Reserved.
uint8_t getParamRev : 1; //!< Get parameter or Get parameter revision
#endif
#if BYTE_ORDER == BIG_ENDIAN
uint8_t getParamRev : 1; //!< Get parameter or Get parameter revision
uint8_t reserved : 3; //!< Reserved.
uint8_t channelNum : 4; //!< Channel number.
#endif
uint8_t paramSelector; //!< Parameter selector.
uint8_t setSelector; //!< Set selector.
uint8_t blockSelector; //!< Block selector.
} __attribute__((packed));
/** @struct GetConfParamsResponse
*
* IPMI payload for Get SOL configuration parameters command response.
*/
struct GetConfParamsResponse
{
uint8_t completionCode; //!< Completion code.
uint8_t paramRev; //!< Parameter revision.
} __attribute__((packed));
/** @brief Get SOL configuration parameters command.
*
* @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> getConfParams(const std::vector<uint8_t>& inPayload,
const message::Handler& handler);
} // namespace command
} // namespace sol