Add support for Set SOL Configuration parameters command.

Change-Id: I82618bc21c426e37f0110b11aeba9855e588bb6c
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/command/sol_cmds.hpp b/command/sol_cmds.hpp
index 2b0a55a..2336f02 100644
--- a/command/sol_cmds.hpp
+++ b/command/sol_cmds.hpp
@@ -61,6 +61,131 @@
  */
 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);
+
 } // namespace command
 
 } // namespace sol