blob: fda3e919780cb45ba03693202220d9aff3bea6df [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{
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 Mauery9e801a22018-10-12 13:20:49 -070038 auto& context = std::get<sol::Manager&>(singletonPool)
39 .getContext(handler.sessionID);
Tom Joseph64b3dec2017-04-03 01:53:44 +053040
Vernon Mauery9e801a22018-10-12 13:20:49 -070041 context.processInboundPayload(
42 request->packetSeqNum, request->packetAckSeqNum,
43 request->acceptedCharCount, request->inOperation.ack, charData);
Tom Joseph64b3dec2017-04-03 01:53:44 +053044 }
45 catch (std::exception& e)
46 {
47 log<level::ERR>(e.what());
48 return std::vector<uint8_t>();
49 }
50
51 return std::vector<uint8_t>();
52}
53
Tom Josephe14ac962017-04-03 01:56:04 +053054void activating(uint8_t payloadInstance, uint32_t sessionID)
55{
56 std::vector<uint8_t> outPayload(sizeof(ActivatingRequest));
57
Vernon Mauery9e801a22018-10-12 13:20:49 -070058 auto request = reinterpret_cast<ActivatingRequest*>(outPayload.data());
Tom Josephe14ac962017-04-03 01:56:04 +053059
60 request->sessionState = 0;
61 request->payloadInstance = payloadInstance;
62 request->majorVersion = MAJOR_VERSION;
63 request->minorVersion = MINOR_VERSION;
64
Vernon Mauery9e801a22018-10-12 13:20:49 -070065 auto session =
Vernon Maueryae1fda42018-10-15 12:55:34 -070066 std::get<session::Manager&>(singletonPool).getSession(sessionID);
Tom Josephe14ac962017-04-03 01:56:04 +053067
68 message::Handler msgHandler(session->channelPtr, sessionID);
69
Vernon Mauery9e801a22018-10-12 13:20:49 -070070 msgHandler.sendUnsolicitedIPMIPayload(netfnTransport, solActivatingCmd,
Tom Josephe14ac962017-04-03 01:56:04 +053071 outPayload);
72}
73
Tom Joseph48b99512017-04-28 01:31:08 +053074std::vector<uint8_t> setConfParams(const std::vector<uint8_t>& inPayload,
75 const message::Handler& handler)
76{
77 std::vector<uint8_t> outPayload(sizeof(SetConfParamsResponse));
Vernon Mauery9e801a22018-10-12 13:20:49 -070078 auto request =
79 reinterpret_cast<const SetConfParamsRequest*>(inPayload.data());
80 auto response = reinterpret_cast<SetConfParamsResponse*>(outPayload.data());
Tom Joseph48b99512017-04-28 01:31:08 +053081 response->completionCode = IPMI_CC_OK;
82
83 switch (static_cast<Parameter>(request->paramSelector))
84 {
85 case Parameter::PROGRESS:
86 {
87 uint8_t progress = request->value & progressMask;
88 std::get<sol::Manager&>(singletonPool).progress = progress;
89 break;
90 }
91 case Parameter::ENABLE:
92 {
93 bool enable = request->value & enableMask;
94 std::get<sol::Manager&>(singletonPool).enable = enable;
95 break;
96 }
97 case Parameter::AUTHENTICATION:
98 {
99 if (!request->auth.auth || !request->auth.encrypt)
100 {
101 response->completionCode = ipmiCCWriteReadParameter;
102 }
103 else if (request->auth.privilege <
Vernon Mauery9e801a22018-10-12 13:20:49 -0700104 static_cast<uint8_t>(session::Privilege::USER) ||
Tom Joseph48b99512017-04-28 01:31:08 +0530105 request->auth.privilege >
Vernon Mauery9e801a22018-10-12 13:20:49 -0700106 static_cast<uint8_t>(session::Privilege::OEM))
Tom Joseph48b99512017-04-28 01:31:08 +0530107 {
108 response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
109 }
110 else
111 {
112 std::get<sol::Manager&>(singletonPool).solMinPrivilege =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700113 static_cast<session::Privilege>(request->auth.privilege);
Tom Joseph48b99512017-04-28 01:31:08 +0530114 }
115 break;
116 }
117 case Parameter::ACCUMULATE:
118 {
119 using namespace std::chrono_literals;
120
121 if (request->acc.threshold == 0)
122 {
123 response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
124 break;
125 }
126
127 std::get<sol::Manager&>(singletonPool).accumulateInterval =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700128 request->acc.interval * sol::accIntervalFactor * 1ms;
Tom Joseph48b99512017-04-28 01:31:08 +0530129 std::get<sol::Manager&>(singletonPool).sendThreshold =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700130 request->acc.threshold;
Tom Joseph48b99512017-04-28 01:31:08 +0530131 break;
132 }
133 case Parameter::RETRY:
134 {
135 using namespace std::chrono_literals;
136
137 std::get<sol::Manager&>(singletonPool).retryCount =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700138 request->retry.count;
Tom Joseph48b99512017-04-28 01:31:08 +0530139 std::get<sol::Manager&>(singletonPool).retryInterval =
Vernon Mauery9e801a22018-10-12 13:20:49 -0700140 request->retry.interval * sol::retryIntervalFactor * 1ms;
Tom Joseph48b99512017-04-28 01:31:08 +0530141 break;
142 }
143 case Parameter::PORT:
144 {
145 response->completionCode = ipmiCCWriteReadParameter;
146 break;
147 }
148 case Parameter::NVBITRATE:
149 case Parameter::VBITRATE:
150 case Parameter::CHANNEL:
151 default:
152 response->completionCode = ipmiCCParamNotSupported;
153 }
154
155 return outPayload;
156}
157
Tom Joseph20aef332017-04-28 01:34:10 +0530158std::vector<uint8_t> getConfParams(const std::vector<uint8_t>& inPayload,
159 const message::Handler& handler)
160{
161 std::vector<uint8_t> outPayload(sizeof(GetConfParamsResponse));
Vernon Mauery9e801a22018-10-12 13:20:49 -0700162 auto request =
163 reinterpret_cast<const GetConfParamsRequest*>(inPayload.data());
164 auto response = reinterpret_cast<GetConfParamsResponse*>(outPayload.data());
Tom Joseph20aef332017-04-28 01:34:10 +0530165 response->completionCode = IPMI_CC_OK;
166 response->paramRev = parameterRevision;
167
168 if (request->getParamRev)
169 {
170 return outPayload;
171 }
172
173 switch (static_cast<Parameter>(request->paramSelector))
174 {
175 case Parameter::PROGRESS:
176 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700177 outPayload.push_back(
178 std::get<sol::Manager&>(singletonPool).progress);
Tom Joseph20aef332017-04-28 01:34:10 +0530179 break;
180 }
181 case Parameter::ENABLE:
182 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700183 outPayload.push_back(std::get<sol::Manager&>(singletonPool).enable);
Tom Joseph20aef332017-04-28 01:34:10 +0530184 break;
185 }
186 case Parameter::AUTHENTICATION:
187 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700188 Auth value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530189
190 value.encrypt = std::get<sol::Manager&>(singletonPool).forceEncrypt;
191 value.auth = std::get<sol::Manager&>(singletonPool).forceAuth;
Vernon Mauery9e801a22018-10-12 13:20:49 -0700192 value.privilege = static_cast<uint8_t>(
193 std::get<sol::Manager&>(singletonPool).solMinPrivilege);
194 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530195
196 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
197 break;
198 }
199 case Parameter::ACCUMULATE:
200 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700201 Accumulate value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530202
203 value.interval = std::get<sol::Manager&>(singletonPool)
Vernon Mauery9e801a22018-10-12 13:20:49 -0700204 .accumulateInterval.count() /
205 sol::accIntervalFactor;
206 value.threshold =
207 std::get<sol::Manager&>(singletonPool).sendThreshold;
208 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530209
210 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
211 break;
212 }
213 case Parameter::RETRY:
214 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700215 Retry value{0};
Tom Joseph20aef332017-04-28 01:34:10 +0530216
217 value.count = std::get<sol::Manager&>(singletonPool).retryCount;
Vernon Mauery9e801a22018-10-12 13:20:49 -0700218 value.interval =
219 std::get<sol::Manager&>(singletonPool).retryInterval.count() /
220 sol::retryIntervalFactor;
221 auto buffer = reinterpret_cast<const uint8_t*>(&value);
Tom Joseph20aef332017-04-28 01:34:10 +0530222
223 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload));
224 break;
225 }
226 case Parameter::PORT:
227 {
228 auto port = endian::to_ipmi<uint16_t>(IPMI_STD_PORT);
Vernon Mauery9e801a22018-10-12 13:20:49 -0700229 auto buffer = reinterpret_cast<const uint8_t*>(&port);
Tom Joseph20aef332017-04-28 01:34:10 +0530230
231 std::copy_n(buffer, sizeof(port), std::back_inserter(outPayload));
232 break;
233 }
Tom Joseph6f83cbc2018-03-27 03:01:58 +0530234 case Parameter::CHANNEL:
235 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700236 outPayload.push_back(
237 std::get<sol::Manager&>(singletonPool).channel);
Tom Joseph6f83cbc2018-03-27 03:01:58 +0530238 break;
239 }
Tom Joseph20aef332017-04-28 01:34:10 +0530240 case Parameter::NVBITRATE:
241 case Parameter::VBITRATE:
Tom Joseph20aef332017-04-28 01:34:10 +0530242 default:
243 response->completionCode = ipmiCCParamNotSupported;
244 }
245
246 return outPayload;
247}
248
Tom Joseph64b3dec2017-04-03 01:53:44 +0530249} // namespace command
250
251} // namespace sol