blob: fb6f19e65a4cb5c14d471ad12c68f04d83d3ce50 [file] [log] [blame]
Vernon Mauery9e801a22018-10-12 13:20:49 -07001#include "sol_cmds.hpp"
2
Tom Joseph64b3dec2017-04-03 01:53:44 +05303#include "main.hpp"
4#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,
Tom Joseph64b3dec2017-04-03 01:53:44 +053018 const message::Handler& handler)
19{
Tom Joseph18a45e92017-04-11 11:30:44 +053020 auto request = reinterpret_cast<const Payload*>(inPayload.data());
Tom Joseph64b3dec2017-04-03 01:53:44 +053021 auto solDataSize = inPayload.size() - sizeof(Payload);
22
Vernon Mauery70fd29c2017-11-30 13:11:43 -080023 std::vector<uint8_t> charData(solDataSize);
Vernon Mauery9e801a22018-10-12 13:20:49 -070024 if (solDataSize > 0)
Tom Joseph64b3dec2017-04-03 01:53:44 +053025 {
Vernon Mauery9e801a22018-10-12 13:20:49 -070026 std::copy_n(inPayload.data() + sizeof(Payload), solDataSize,
Tom Joseph64b3dec2017-04-03 01:53:44 +053027 charData.begin());
28 }
29
30 try
31 {
Vernon Mauery9e801a22018-10-12 13:20:49 -070032 auto& context = std::get<sol::Manager&>(singletonPool)
33 .getContext(handler.sessionID);
Tom Joseph64b3dec2017-04-03 01:53:44 +053034
Vernon Mauery9e801a22018-10-12 13:20:49 -070035 context.processInboundPayload(
36 request->packetSeqNum, request->packetAckSeqNum,
37 request->acceptedCharCount, request->inOperation.ack, charData);
Tom Joseph64b3dec2017-04-03 01:53:44 +053038 }
39 catch (std::exception& e)
40 {
41 log<level::ERR>(e.what());
42 return std::vector<uint8_t>();
43 }
44
45 return std::vector<uint8_t>();
46}
47
Tom Josephe14ac962017-04-03 01:56:04 +053048void activating(uint8_t payloadInstance, uint32_t sessionID)
49{
50 std::vector<uint8_t> outPayload(sizeof(ActivatingRequest));
51
Vernon Mauery9e801a22018-10-12 13:20:49 -070052 auto request = reinterpret_cast<ActivatingRequest*>(outPayload.data());
Tom Josephe14ac962017-04-03 01:56:04 +053053
54 request->sessionState = 0;
55 request->payloadInstance = payloadInstance;
56 request->majorVersion = MAJOR_VERSION;
57 request->minorVersion = MINOR_VERSION;
58
Vernon Mauery9e801a22018-10-12 13:20:49 -070059 auto session =
60 (std::get<session::Manager&>(singletonPool).getSession(sessionID))
61 .lock();
Tom Josephe14ac962017-04-03 01:56:04 +053062
63 message::Handler msgHandler(session->channelPtr, sessionID);
64
Vernon Mauery9e801a22018-10-12 13:20:49 -070065 msgHandler.sendUnsolicitedIPMIPayload(netfnTransport, solActivatingCmd,
Tom Josephe14ac962017-04-03 01:56:04 +053066 outPayload);
67}
68
Tom Joseph48b99512017-04-28 01:31:08 +053069std::vector<uint8_t> setConfParams(const std::vector<uint8_t>& inPayload,
70 const message::Handler& handler)
71{
72 std::vector<uint8_t> outPayload(sizeof(SetConfParamsResponse));
Vernon Mauery9e801a22018-10-12 13:20:49 -070073 auto request =
74 reinterpret_cast<const SetConfParamsRequest*>(inPayload.data());
75 auto response = reinterpret_cast<SetConfParamsResponse*>(outPayload.data());
Tom Joseph48b99512017-04-28 01:31:08 +053076 response->completionCode = IPMI_CC_OK;
77
78 switch (static_cast<Parameter>(request->paramSelector))
79 {
80 case Parameter::PROGRESS:
81 {
82 uint8_t progress = request->value & progressMask;
83 std::get<sol::Manager&>(singletonPool).progress = progress;
84 break;
85 }
86 case Parameter::ENABLE:
87 {
88 bool enable = request->value & enableMask;
89 std::get<sol::Manager&>(singletonPool).enable = enable;
90 break;
91 }
92 case Parameter::AUTHENTICATION:
93 {
94 if (!request->auth.auth || !request->auth.encrypt)
95 {
96 response->completionCode = ipmiCCWriteReadParameter;
97 }
98 else if (request->auth.privilege <
Vernon Mauery9e801a22018-10-12 13:20:49 -070099 static_cast<uint8_t>(session::Privilege::USER) ||
Tom Joseph48b99512017-04-28 01:31:08 +0530100 request->auth.privilege >
Vernon Mauery9e801a22018-10-12 13:20:49 -0700101 static_cast<uint8_t>(session::Privilege::OEM))
Tom Joseph48b99512017-04-28 01:31:08 +0530102 {
103 response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
104 }
105 else
106 {
107 std::get<sol::Manager&>(singletonPool).solMinPrivilege =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700108 static_cast<session::Privilege>(request->auth.privilege);
Tom Joseph48b99512017-04-28 01:31:08 +0530109 }
110 break;
111 }
112 case Parameter::ACCUMULATE:
113 {
114 using namespace std::chrono_literals;
115
116 if (request->acc.threshold == 0)
117 {
118 response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
119 break;
120 }
121
122 std::get<sol::Manager&>(singletonPool).accumulateInterval =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700123 request->acc.interval * sol::accIntervalFactor * 1ms;
Tom Joseph48b99512017-04-28 01:31:08 +0530124 std::get<sol::Manager&>(singletonPool).sendThreshold =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700125 request->acc.threshold;
Tom Joseph48b99512017-04-28 01:31:08 +0530126 break;
127 }
128 case Parameter::RETRY:
129 {
130 using namespace std::chrono_literals;
131
132 std::get<sol::Manager&>(singletonPool).retryCount =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700133 request->retry.count;
Tom Joseph48b99512017-04-28 01:31:08 +0530134 std::get<sol::Manager&>(singletonPool).retryInterval =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700135 request->retry.interval * sol::retryIntervalFactor * 1ms;
Tom Joseph48b99512017-04-28 01:31:08 +0530136 break;
137 }
138 case Parameter::PORT:
139 {
140 response->completionCode = ipmiCCWriteReadParameter;
141 break;
142 }
143 case Parameter::NVBITRATE:
144 case Parameter::VBITRATE:
145 case Parameter::CHANNEL:
146 default:
147 response->completionCode = ipmiCCParamNotSupported;
148 }
149
150 return outPayload;
151}
152
Tom Joseph20aef332017-04-28 01:34:10 +0530153std::vector<uint8_t> getConfParams(const std::vector<uint8_t>& inPayload,
154 const message::Handler& handler)
155{
156 std::vector<uint8_t> outPayload(sizeof(GetConfParamsResponse));
Vernon Mauery9e801a22018-10-12 13:20:49 -0700157 auto request =
158 reinterpret_cast<const GetConfParamsRequest*>(inPayload.data());
159 auto response = reinterpret_cast<GetConfParamsResponse*>(outPayload.data());
Tom Joseph20aef332017-04-28 01:34:10 +0530160 response->completionCode = IPMI_CC_OK;
161 response->paramRev = parameterRevision;
162
163 if (request->getParamRev)
164 {
165 return outPayload;
166 }
167
168 switch (static_cast<Parameter>(request->paramSelector))
169 {
170 case Parameter::PROGRESS:
171 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700172 outPayload.push_back(
173 std::get<sol::Manager&>(singletonPool).progress);
Tom Joseph20aef332017-04-28 01:34:10 +0530174 break;
175 }
176 case Parameter::ENABLE:
177 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700178 outPayload.push_back(std::get<sol::Manager&>(singletonPool).enable);
Tom Joseph20aef332017-04-28 01:34:10 +0530179 break;
180 }
181 case Parameter::AUTHENTICATION:
182 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700183 Auth value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530184
185 value.encrypt = std::get<sol::Manager&>(singletonPool).forceEncrypt;
186 value.auth = std::get<sol::Manager&>(singletonPool).forceAuth;
Vernon Mauery9e801a22018-10-12 13:20:49 -0700187 value.privilege = static_cast<uint8_t>(
188 std::get<sol::Manager&>(singletonPool).solMinPrivilege);
189 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530190
191 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
192 break;
193 }
194 case Parameter::ACCUMULATE:
195 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700196 Accumulate value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530197
198 value.interval = std::get<sol::Manager&>(singletonPool)
Vernon Mauery9e801a22018-10-12 13:20:49 -0700199 .accumulateInterval.count() /
200 sol::accIntervalFactor;
201 value.threshold =
202 std::get<sol::Manager&>(singletonPool).sendThreshold;
203 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530204
205 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
206 break;
207 }
208 case Parameter::RETRY:
209 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700210 Retry value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530211
212 value.count = std::get<sol::Manager&>(singletonPool).retryCount;
Vernon Mauery9e801a22018-10-12 13:20:49 -0700213 value.interval =
214 std::get<sol::Manager&>(singletonPool).retryInterval.count() /
215 sol::retryIntervalFactor;
216 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530217
218 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
219 break;
220 }
221 case Parameter::PORT:
222 {
223 auto port = endian::to_ipmi<uint16_t>(IPMI_STD_PORT);
Vernon Mauery9e801a22018-10-12 13:20:49 -0700224 auto buffer = reinterpret_cast<const uint8_t*>(&port);
Tom Joseph20aef332017-04-28 01:34:10 +0530225
226 std::copy_n(buffer, sizeof(port), std::back_inserter(outPayload));
227 break;
228 }
Tom Joseph6f83cbc2018-03-27 03:01:58 +0530229 case Parameter::CHANNEL:
230 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700231 outPayload.push_back(
232 std::get<sol::Manager&>(singletonPool).channel);
Tom Joseph6f83cbc2018-03-27 03:01:58 +0530233 break;
234 }
Tom Joseph20aef332017-04-28 01:34:10 +0530235 case Parameter::NVBITRATE:
236 case Parameter::VBITRATE:
Tom Joseph20aef332017-04-28 01:34:10 +0530237 default:
238 response->completionCode = ipmiCCParamNotSupported;
239 }
240
241 return outPayload;
242}
243
Tom Joseph64b3dec2017-04-03 01:53:44 +0530244} // namespace command
245
246} // namespace sol