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.cpp b/command/sol_cmds.cpp
index 344b6d8..f18bc8b 100644
--- a/command/sol_cmds.cpp
+++ b/command/sol_cmds.cpp
@@ -68,6 +68,91 @@
                                           outPayload);
 }
 
+std::vector<uint8_t> setConfParams(const std::vector<uint8_t>& inPayload,
+                                   const message::Handler& handler)
+{
+    std::vector<uint8_t> outPayload(sizeof(SetConfParamsResponse));
+    auto request = reinterpret_cast<const SetConfParamsRequest*>
+                   (inPayload.data());
+    auto response = reinterpret_cast<SetConfParamsResponse*>
+                    (outPayload.data());
+    response->completionCode = IPMI_CC_OK;
+
+    switch (static_cast<Parameter>(request->paramSelector))
+    {
+        case Parameter::PROGRESS:
+        {
+            uint8_t progress = request->value & progressMask;
+            std::get<sol::Manager&>(singletonPool).progress = progress;
+            break;
+        }
+        case Parameter::ENABLE:
+        {
+            bool enable = request->value & enableMask;
+            std::get<sol::Manager&>(singletonPool).enable = enable;
+            break;
+        }
+        case Parameter::AUTHENTICATION:
+        {
+            if (!request->auth.auth || !request->auth.encrypt)
+            {
+                response->completionCode = ipmiCCWriteReadParameter;
+            }
+            else if (request->auth.privilege <
+                     static_cast<uint8_t>(session::Privilege::USER) ||
+                     request->auth.privilege >
+                     static_cast<uint8_t>(session::Privilege::OEM))
+            {
+                response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
+            }
+            else
+            {
+                std::get<sol::Manager&>(singletonPool).solMinPrivilege =
+                       static_cast<session::Privilege>(request->auth.privilege);
+            }
+            break;
+        }
+        case Parameter::ACCUMULATE:
+        {
+            using namespace std::chrono_literals;
+
+            if (request->acc.threshold == 0)
+            {
+                response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
+                break;
+            }
+
+            std::get<sol::Manager&>(singletonPool).accumulateInterval =
+                    request->acc.interval * sol::accIntervalFactor * 1ms;
+            std::get<sol::Manager&>(singletonPool).sendThreshold =
+                    request->acc.threshold;
+            break;
+        }
+        case Parameter::RETRY:
+        {
+            using namespace std::chrono_literals;
+
+            std::get<sol::Manager&>(singletonPool).retryCount =
+                    request->retry.count;
+            std::get<sol::Manager&>(singletonPool).retryInterval =
+                    request->retry.interval * sol::retryIntervalFactor * 1ms;
+            break;
+        }
+        case Parameter::PORT:
+        {
+            response->completionCode = ipmiCCWriteReadParameter;
+            break;
+        }
+        case Parameter::NVBITRATE:
+        case Parameter::VBITRATE:
+        case Parameter::CHANNEL:
+        default:
+            response->completionCode = ipmiCCParamNotSupported;
+    }
+
+    return outPayload;
+}
+
 } // namespace command
 
 } // namespace sol