blob: c06e310ce50950e4592e64ff9dc47f037309e371 [file] [log] [blame]
Vernon Mauery9e801a22018-10-12 13:20:49 -07001#include "sol_cmds.hpp"
2
Vernon Mauery2085ae02021-06-10 11:51:00 -07003#include "sessions_manager.hpp"
Tom Joseph64b3dec2017-04-03 01:53:44 +05304#include "sol/sol_context.hpp"
5#include "sol/sol_manager.hpp"
Vernon Mauery9e801a22018-10-12 13:20:49 -07006
7#include <phosphor-logging/log.hpp>
Tom Joseph64b3dec2017-04-03 01:53:44 +05308
9namespace sol
10{
11
12namespace command
13{
14
15using namespace phosphor::logging;
16
Tom Joseph18a45e92017-04-11 11:30:44 +053017std::vector<uint8_t> payloadHandler(const std::vector<uint8_t>& inPayload,
Vernon Mauery41ff9b52021-06-11 11:37:40 -070018 std::shared_ptr<message::Handler>& handler)
Tom Joseph64b3dec2017-04-03 01:53:44 +053019{
Zhikui Ren2b1edef2020-07-24 14:32:13 -070020 // Check inPayload size is at least Payload
21 if (inPayload.size() < sizeof(Payload))
22 {
23 return std::vector<uint8_t>();
24 }
25
Tom Joseph18a45e92017-04-11 11:30:44 +053026 auto request = reinterpret_cast<const Payload*>(inPayload.data());
Tom Joseph64b3dec2017-04-03 01:53:44 +053027 auto solDataSize = inPayload.size() - sizeof(Payload);
28
Vernon Mauery70fd29c2017-11-30 13:11:43 -080029 std::vector<uint8_t> charData(solDataSize);
Vernon Mauery9e801a22018-10-12 13:20:49 -070030 if (solDataSize > 0)
Tom Joseph64b3dec2017-04-03 01:53:44 +053031 {
Vernon Mauery9e801a22018-10-12 13:20:49 -070032 std::copy_n(inPayload.data() + sizeof(Payload), solDataSize,
Tom Joseph64b3dec2017-04-03 01:53:44 +053033 charData.begin());
34 }
35
36 try
37 {
Vernon Mauery41ff9b52021-06-11 11:37:40 -070038 auto& context = sol::Manager::get().getContext(handler->sessionID);
Tom Joseph64b3dec2017-04-03 01:53:44 +053039
Vernon Mauery9e801a22018-10-12 13:20:49 -070040 context.processInboundPayload(
41 request->packetSeqNum, request->packetAckSeqNum,
42 request->acceptedCharCount, request->inOperation.ack, charData);
Tom Joseph64b3dec2017-04-03 01:53:44 +053043 }
Patrick Williams12d199b2021-10-06 12:36:48 -050044 catch (const std::exception& e)
Tom Joseph64b3dec2017-04-03 01:53:44 +053045 {
46 log<level::ERR>(e.what());
47 return std::vector<uint8_t>();
48 }
49
50 return std::vector<uint8_t>();
51}
52
Tom Josephe14ac962017-04-03 01:56:04 +053053void activating(uint8_t payloadInstance, uint32_t sessionID)
54{
55 std::vector<uint8_t> outPayload(sizeof(ActivatingRequest));
56
Vernon Mauery9e801a22018-10-12 13:20:49 -070057 auto request = reinterpret_cast<ActivatingRequest*>(outPayload.data());
Tom Josephe14ac962017-04-03 01:56:04 +053058
59 request->sessionState = 0;
60 request->payloadInstance = payloadInstance;
61 request->majorVersion = MAJOR_VERSION;
62 request->minorVersion = MINOR_VERSION;
63
Vernon Mauery2085ae02021-06-10 11:51:00 -070064 auto session = session::Manager::get().getSession(sessionID);
Tom Josephe14ac962017-04-03 01:56:04 +053065
66 message::Handler msgHandler(session->channelPtr, sessionID);
67
Vernon Mauery9e801a22018-10-12 13:20:49 -070068 msgHandler.sendUnsolicitedIPMIPayload(netfnTransport, solActivatingCmd,
Tom Josephe14ac962017-04-03 01:56:04 +053069 outPayload);
70}
71
Tom Joseph20aef332017-04-28 01:34:10 +053072std::vector<uint8_t> getConfParams(const std::vector<uint8_t>& inPayload,
Vernon Mauery41ff9b52021-06-11 11:37:40 -070073 std::shared_ptr<message::Handler>& handler)
Tom Joseph20aef332017-04-28 01:34:10 +053074{
75 std::vector<uint8_t> outPayload(sizeof(GetConfParamsResponse));
Vernon Mauery9e801a22018-10-12 13:20:49 -070076 auto request =
77 reinterpret_cast<const GetConfParamsRequest*>(inPayload.data());
78 auto response = reinterpret_cast<GetConfParamsResponse*>(outPayload.data());
Tom Joseph20aef332017-04-28 01:34:10 +053079 response->completionCode = IPMI_CC_OK;
80 response->paramRev = parameterRevision;
81
Connie Yin318c0082022-02-18 13:28:26 -050082 // Update latest property values from dbus to sol mananger
83 sol::Manager::get().updateSOLParameter(ipmi::convertCurrentChannelNum(
84 ipmi::currentChNum, getInterfaceIndex()));
Tom Joseph20aef332017-04-28 01:34:10 +053085 if (request->getParamRev)
86 {
87 return outPayload;
88 }
89
90 switch (static_cast<Parameter>(request->paramSelector))
91 {
92 case Parameter::PROGRESS:
93 {
Vernon Mauery2085ae02021-06-10 11:51:00 -070094 outPayload.push_back(sol::Manager::get().progress);
Tom Joseph20aef332017-04-28 01:34:10 +053095 break;
96 }
97 case Parameter::ENABLE:
98 {
Vernon Mauery2085ae02021-06-10 11:51:00 -070099 outPayload.push_back(sol::Manager::get().enable);
Tom Joseph20aef332017-04-28 01:34:10 +0530100 break;
101 }
102 case Parameter::AUTHENTICATION:
103 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700104 Auth value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530105
Vernon Mauery2085ae02021-06-10 11:51:00 -0700106 value.encrypt = sol::Manager::get().forceEncrypt;
107 value.auth = sol::Manager::get().forceAuth;
108 value.privilege =
109 static_cast<uint8_t>(sol::Manager::get().solMinPrivilege);
Vernon Mauery9e801a22018-10-12 13:20:49 -0700110 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530111
112 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
113 break;
114 }
115 case Parameter::ACCUMULATE:
116 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700117 Accumulate value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530118
Vernon Mauery2085ae02021-06-10 11:51:00 -0700119 value.interval = sol::Manager::get().accumulateInterval.count() /
Vernon Mauery9e801a22018-10-12 13:20:49 -0700120 sol::accIntervalFactor;
Vernon Mauery2085ae02021-06-10 11:51:00 -0700121 value.threshold = sol::Manager::get().sendThreshold;
Vernon Mauery9e801a22018-10-12 13:20:49 -0700122 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530123
124 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
125 break;
126 }
127 case Parameter::RETRY:
128 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700129 Retry value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530130
Vernon Mauery2085ae02021-06-10 11:51:00 -0700131 value.count = sol::Manager::get().retryCount;
132 value.interval = sol::Manager::get().retryInterval.count() /
133 sol::retryIntervalFactor;
Vernon Mauery9e801a22018-10-12 13:20:49 -0700134 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530135
136 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
137 break;
138 }
139 case Parameter::PORT:
140 {
141 auto port = endian::to_ipmi<uint16_t>(IPMI_STD_PORT);
Vernon Mauery9e801a22018-10-12 13:20:49 -0700142 auto buffer = reinterpret_cast<const uint8_t*>(&port);
Tom Joseph20aef332017-04-28 01:34:10 +0530143
144 std::copy_n(buffer, sizeof(port), std::back_inserter(outPayload));
145 break;
146 }
Tom Joseph6f83cbc2018-03-27 03:01:58 +0530147 case Parameter::CHANNEL:
148 {
Vernon Mauery2085ae02021-06-10 11:51:00 -0700149 outPayload.push_back(sol::Manager::get().channel);
Tom Joseph6f83cbc2018-03-27 03:01:58 +0530150 break;
151 }
Tom Joseph20aef332017-04-28 01:34:10 +0530152 case Parameter::NVBITRATE:
153 case Parameter::VBITRATE:
Tom Joseph20aef332017-04-28 01:34:10 +0530154 default:
155 response->completionCode = ipmiCCParamNotSupported;
156 }
157
158 return outPayload;
159}
160
Tom Joseph64b3dec2017-04-03 01:53:44 +0530161} // namespace command
162
163} // namespace sol