#include "sol_cmds.hpp" #include "sessions_manager.hpp" #include "sol/sol_context.hpp" #include "sol/sol_manager.hpp" #include namespace sol { namespace command { using namespace phosphor::logging; std::vector payloadHandler(const std::vector& inPayload, std::shared_ptr& handler) { // Check inPayload size is at least Payload if (inPayload.size() < sizeof(Payload)) { return std::vector(); } auto request = reinterpret_cast(inPayload.data()); auto solDataSize = inPayload.size() - sizeof(Payload); std::vector charData(solDataSize); if (solDataSize > 0) { std::copy_n(inPayload.data() + sizeof(Payload), solDataSize, charData.begin()); } try { auto& context = sol::Manager::get().getContext(handler->sessionID); context.processInboundPayload( request->packetSeqNum, request->packetAckSeqNum, request->acceptedCharCount, request->inOperation.ack, charData); } catch (const std::exception& e) { log(e.what()); return std::vector(); } return std::vector(); } void activating(uint8_t payloadInstance, uint32_t sessionID) { std::vector outPayload(sizeof(ActivatingRequest)); auto request = reinterpret_cast(outPayload.data()); request->sessionState = 0; request->payloadInstance = payloadInstance; request->majorVersion = MAJOR_VERSION; request->minorVersion = MINOR_VERSION; auto session = session::Manager::get().getSession(sessionID); message::Handler msgHandler(session->channelPtr, sessionID); msgHandler.sendUnsolicitedIPMIPayload(netfnTransport, solActivatingCmd, outPayload); } std::vector getConfParams(const std::vector& inPayload, std::shared_ptr& handler) { std::vector outPayload(sizeof(GetConfParamsResponse)); auto request = reinterpret_cast(inPayload.data()); auto response = reinterpret_cast(outPayload.data()); response->completionCode = IPMI_CC_OK; response->paramRev = parameterRevision; if (request->getParamRev) { return outPayload; } switch (static_cast(request->paramSelector)) { case Parameter::PROGRESS: { outPayload.push_back(sol::Manager::get().progress); break; } case Parameter::ENABLE: { outPayload.push_back(sol::Manager::get().enable); break; } case Parameter::AUTHENTICATION: { Auth value{0}; value.encrypt = sol::Manager::get().forceEncrypt; value.auth = sol::Manager::get().forceAuth; value.privilege = static_cast(sol::Manager::get().solMinPrivilege); auto buffer = reinterpret_cast(&value); std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload)); break; } case Parameter::ACCUMULATE: { Accumulate value{0}; value.interval = sol::Manager::get().accumulateInterval.count() / sol::accIntervalFactor; value.threshold = sol::Manager::get().sendThreshold; auto buffer = reinterpret_cast(&value); std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload)); break; } case Parameter::RETRY: { Retry value{0}; value.count = sol::Manager::get().retryCount; value.interval = sol::Manager::get().retryInterval.count() / sol::retryIntervalFactor; auto buffer = reinterpret_cast(&value); std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload)); break; } case Parameter::PORT: { auto port = endian::to_ipmi(IPMI_STD_PORT); auto buffer = reinterpret_cast(&port); std::copy_n(buffer, sizeof(port), std::back_inserter(outPayload)); break; } case Parameter::CHANNEL: { outPayload.push_back(sol::Manager::get().channel); break; } case Parameter::NVBITRATE: case Parameter::VBITRATE: default: response->completionCode = ipmiCCParamNotSupported; } return outPayload; } } // namespace command } // namespace sol