blob: 1f5201dac04fee6465181f2e95ba721ba2b9b2e6 [file] [log] [blame]
Vernon Mauerya3702c12019-05-22 13:20:59 -07001/*
2// Copyright (c) 2018 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16
17#include <errno.h>
18#include <fcntl.h>
Vernon Mauerya3702c12019-05-22 13:20:59 -070019#include <limits.h>
20#include <sys/stat.h>
21#include <sys/types.h>
22#include <unistd.h>
23
24#include <commandutils.hpp>
25#include <cstdint>
26#include <fstream>
jayaprakash Mutyala853d8292019-05-31 18:17:42 +000027#include <ipmid/api.hpp>
Vernon Mauerya3702c12019-05-22 13:20:59 -070028#include <ipmid/utils.hpp>
Vernon Mauery98bbf692019-09-16 11:14:59 -070029#include <oemcommands.hpp>
Vernon Mauerya3702c12019-05-22 13:20:59 -070030#include <phosphor-logging/log.hpp>
Vernon Mauerya3702c12019-05-22 13:20:59 -070031#include <sdbusplus/message/types.hpp>
32#include <smbiosmdrv2handler.hpp>
33#include <string>
34#include <vector>
35#include <xyz/openbmc_project/Common/error.hpp>
Vernon Mauerya3702c12019-05-22 13:20:59 -070036
37std::unique_ptr<MDRV2> mdrv2 = nullptr;
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +000038static constexpr const uint8_t ccOemInvalidChecksum = 0x85;
jayaprakash Mutyala40fec612019-06-19 11:53:03 +000039static constexpr size_t dataInfoSize = 16;
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +000040static constexpr const uint8_t ccStorageLeak = 0xC4;
Vernon Mauerya3702c12019-05-22 13:20:59 -070041
Vernon Mauerya3702c12019-05-22 13:20:59 -070042static void register_netfn_smbiosmdrv2_functions() __attribute__((constructor));
Vernon Mauerya3702c12019-05-22 13:20:59 -070043
44int MDRV2::agentLookup(const uint16_t &agentId)
45{
46 int agentIndex = -1;
47
48 if (lastAgentId == agentId)
49 {
50 return lastAgentIndex;
51 }
52
53 if (agentId == smbiosAgentId)
54 {
55 return firstAgentIndex;
56 }
57
58 return agentIndex;
59}
60
61int MDRV2::sdplusMdrv2GetProperty(const std::string &name,
62 sdbusplus::message::variant<uint8_t> &value,
63 const std::string &service)
64{
Vernon Mauery15419dd2019-05-24 09:40:30 -070065 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
Vernon Mauerya3702c12019-05-22 13:20:59 -070066 sdbusplus::message::message method =
Vernon Mauery15419dd2019-05-24 09:40:30 -070067 bus->new_method_call(service.c_str(), mdrv2Path, dbusProperties, "Get");
Vernon Mauerya3702c12019-05-22 13:20:59 -070068 method.append(mdrv2Interface, name);
69
Vernon Mauery15419dd2019-05-24 09:40:30 -070070 sdbusplus::message::message reply = bus->call(method);
Vernon Mauerya3702c12019-05-22 13:20:59 -070071
72 try
73 {
Vernon Mauery15419dd2019-05-24 09:40:30 -070074 sdbusplus::message::message reply = bus->call(method);
Vernon Mauerya3702c12019-05-22 13:20:59 -070075 reply.read(value);
76 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -070077 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -070078 {
79 phosphor::logging::log<phosphor::logging::level::ERR>(
Vernon Maueryc7d517e2019-06-18 14:27:00 -070080 "Error get property, sdbusplus call failed",
81 phosphor::logging::entry("ERROR=%s", e.what()));
Vernon Mauerya3702c12019-05-22 13:20:59 -070082 return -1;
83 }
84
85 return 0;
86}
87
88int MDRV2::syncDirCommonData(uint8_t idIndex, uint32_t size,
89 const std::string &service)
90{
91 std::vector<uint32_t> commonData;
Vernon Mauery15419dd2019-05-24 09:40:30 -070092 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
Vernon Mauerya3702c12019-05-22 13:20:59 -070093 sdbusplus::message::message method =
Vernon Mauery15419dd2019-05-24 09:40:30 -070094 bus->new_method_call(service.c_str(), mdrv2Path, mdrv2Interface,
95 "SynchronizeDirectoryCommonData");
Vernon Mauerya3702c12019-05-22 13:20:59 -070096 method.append(idIndex, size);
97
98 try
99 {
Vernon Mauery15419dd2019-05-24 09:40:30 -0700100 sdbusplus::message::message reply = bus->call(method);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700101 reply.read(commonData);
102 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700103 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700104 {
105 phosphor::logging::log<phosphor::logging::level::ERR>(
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700106 "Error sync dir common data with service",
107 phosphor::logging::entry("ERROR=%s", e.what()));
Vernon Mauerya3702c12019-05-22 13:20:59 -0700108 return -1;
109 }
110
111 if (commonData.size() < syncDirCommonSize)
112 {
113 phosphor::logging::log<phosphor::logging::level::ERR>(
114 "Error sync dir common data - data length invalid");
115 return -1;
116 }
117 smbiosDir.dir[idIndex].common.dataSetSize = commonData.at(0);
118 smbiosDir.dir[idIndex].common.dataVersion = commonData.at(1);
119 smbiosDir.dir[idIndex].common.timestamp = commonData.at(2);
120
121 return 0;
122}
123
124int MDRV2::findDataId(const uint8_t *dataInfo, const size_t &len,
125 const std::string &service)
126{
127 int idIndex = -1;
128
129 if (dataInfo == nullptr)
130 {
131 phosphor::logging::log<phosphor::logging::level::ERR>(
132 "Error dataInfo, input is null point");
133 return -1;
134 }
135
Vernon Mauery15419dd2019-05-24 09:40:30 -0700136 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
137 sdbusplus::message::message method = bus->new_method_call(
Vernon Mauerya3702c12019-05-22 13:20:59 -0700138 service.c_str(), mdrv2Path, mdrv2Interface, "FindIdIndex");
139 std::vector<uint8_t> info;
140 info.resize(len);
141 std::copy(dataInfo, dataInfo + len, info.data());
142 method.append(info);
143
144 try
145 {
Vernon Mauery15419dd2019-05-24 09:40:30 -0700146 sdbusplus::message::message reply = bus->call(method);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700147 reply.read(idIndex);
148 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700149 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700150 {
151 phosphor::logging::log<phosphor::logging::level::ERR>(
152 "Error find id index",
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700153 phosphor::logging::entry("ERROR=%s", e.what()),
Vernon Mauerya3702c12019-05-22 13:20:59 -0700154 phosphor::logging::entry("SERVICE=%s", service.c_str()),
155 phosphor::logging::entry("PATH=%s", mdrv2Path));
156 return -1;
157 }
158
159 return idIndex;
160}
161
162uint16_t MDRV2::getSessionHandle(Mdr2DirStruct *dir)
163{
164 if (dir == NULL)
165 {
166 phosphor::logging::log<phosphor::logging::level::ERR>(
167 "Empty dir point");
168 return 0;
169 }
170 dir->sessionHandle++;
171 if (dir->sessionHandle == 0)
172 {
173 dir->sessionHandle = 1;
174 }
175
176 return dir->sessionHandle;
177}
178
179int MDRV2::findLockHandle(const uint16_t &lockHandle)
180{
181 int idIndex = -1;
182
183 for (int index = 0; index < smbiosDir.dirEntries; index++)
184 {
185 if (lockHandle == smbiosDir.dir[index].lockHandle)
186 {
187 return index;
188 }
189 }
190
191 return idIndex;
192}
193
194bool MDRV2::smbiosIsUpdating(uint8_t index)
195{
196 if (index > maxDirEntries)
197 {
198 return false;
199 }
200 if (smbiosDir.dir[index].stage == MDR2SMBIOSStatusEnum::mdr2Updating)
201 {
202 return true;
203 }
204
205 return false;
206}
207
208uint32_t MDRV2::calcChecksum32(uint8_t *buf, uint32_t len)
209{
210 uint32_t sum = 0;
211
212 if (buf == nullptr)
213 {
214 return invalidChecksum;
215 }
216
217 for (uint32_t index = 0; index < len; index++)
218 {
219 sum += buf[index];
220 }
221
222 return sum;
223}
224
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000225/** @brief implements mdr2 agent status command
226 * @param agentId
227 * @param dirVersion
228 *
229 * @returns IPMI completion code plus response data
230 * - mdrVersion
231 * - agentVersion
232 * - dirVersion
233 * - dirEntries
234 * - dataRequest
235 */
236ipmi::RspType<uint8_t, uint8_t, uint8_t, uint8_t, uint8_t>
237 mdr2AgentStatus(uint16_t agentId, uint8_t dirVersion)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700238{
Vernon Mauerya3702c12019-05-22 13:20:59 -0700239 if (mdrv2 == nullptr)
240 {
241 mdrv2 = std::make_unique<MDRV2>();
242 }
243
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000244 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700245 if (agentIndex == -1)
246 {
247 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000248 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
249 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700250 }
251
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000252 constexpr uint8_t mdrVersion = mdr2Version;
253 constexpr uint8_t agentVersion = smbiosAgentVersion;
254 uint8_t dirVersionResp = mdrv2->smbiosDir.dirVersion;
255 uint8_t dirEntries = mdrv2->smbiosDir.dirEntries;
256 uint8_t dataRequest;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700257
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000258 if (mdrv2->smbiosDir.remoteDirVersion != dirVersion)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700259 {
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000260 mdrv2->smbiosDir.remoteDirVersion = dirVersion;
261 dataRequest =
Vernon Mauerya3702c12019-05-22 13:20:59 -0700262 static_cast<uint8_t>(DirDataRequestEnum::dirDataRequested);
263 }
264 else
265 {
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000266 dataRequest =
Vernon Mauerya3702c12019-05-22 13:20:59 -0700267 static_cast<uint8_t>(DirDataRequestEnum::dirDataNotRequested);
268 }
269
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000270 return ipmi::responseSuccess(mdrVersion, agentVersion, dirVersionResp,
271 dirEntries, dataRequest);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700272}
273
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000274/** @brief implements mdr2 get directory command
275 * @param agentId
276 * @param dirIndex
277 * @returns IPMI completion code plus response data
278 * - dataOut
279 */
280ipmi::RspType<std::vector<uint8_t>> mdr2GetDir(uint16_t agentId,
281 uint8_t dirIndex)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700282{
Vernon Mauery15419dd2019-05-24 09:40:30 -0700283 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
284 std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700285
286 if (mdrv2 == nullptr)
287 {
288 mdrv2 = std::make_unique<MDRV2>();
289 }
290
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000291 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700292 if (agentIndex == -1)
293 {
294 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000295 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
296 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700297 }
298
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000299 std::variant<uint8_t> value = 0;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700300 if (0 != mdrv2->sdplusMdrv2GetProperty("DirectoryEntries", value, service))
301 {
302 phosphor::logging::log<phosphor::logging::level::ERR>(
303 "Error getting DirEnries");
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000304 return ipmi::responseUnspecifiedError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700305 }
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000306 if (dirIndex > std::get<uint8_t>(value))
Vernon Mauerya3702c12019-05-22 13:20:59 -0700307 {
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000308 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700309 }
310
Vernon Mauery15419dd2019-05-24 09:40:30 -0700311 sdbusplus::message::message method = bus->new_method_call(
Vernon Mauerya3702c12019-05-22 13:20:59 -0700312 service.c_str(), mdrv2Path, mdrv2Interface, "GetDirectoryInformation");
313
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000314 method.append(dirIndex);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700315
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000316 std::vector<uint8_t> dataOut;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700317 try
318 {
Vernon Mauery15419dd2019-05-24 09:40:30 -0700319 sdbusplus::message::message reply = bus->call(method);
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000320 reply.read(dataOut);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700321 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700322 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700323 {
324 phosphor::logging::log<phosphor::logging::level::ERR>(
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700325 "Error get dir", phosphor::logging::entry("ERROR=%s", e.what()),
Vernon Mauerya3702c12019-05-22 13:20:59 -0700326 phosphor::logging::entry("SERVICE=%s", service.c_str()),
327 phosphor::logging::entry("PATH=%s", mdrv2Path));
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000328 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700329 }
330
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000331 constexpr size_t getDirRespSize = 6;
332 if (dataOut.size() < getDirRespSize)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700333 {
334 phosphor::logging::log<phosphor::logging::level::ERR>(
335 "Error get dir, response length invalid");
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000336 return ipmi::responseUnspecifiedError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700337 }
338
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000339 if (dataOut.size() > MAX_IPMI_BUFFER) // length + completion code should no
340 // more than MAX_IPMI_BUFFER
Vernon Mauerya3702c12019-05-22 13:20:59 -0700341 {
342 phosphor::logging::log<phosphor::logging::level::ERR>(
343 "Data length send from service is invalid");
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000344 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700345 }
346
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +0000347 return ipmi::responseSuccess(dataOut);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700348}
349
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000350ipmi::RspType<bool> mdr2SendDir(uint16_t agentId, uint8_t dirVersion,
351 uint8_t dirIndex, uint8_t returnedEntries,
352 uint8_t remainingEntries,
353 std::array<uint8_t, 16> dataInfo, uint32_t size,
354 uint32_t dataSetSize, uint32_t dataVersion,
355 uint32_t timestamp)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700356{
Vernon Mauery15419dd2019-05-24 09:40:30 -0700357 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
358 std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700359
360 if (mdrv2 == nullptr)
361 {
362 mdrv2 = std::make_unique<MDRV2>();
363 }
364
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000365 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700366 if (agentIndex == -1)
367 {
368 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000369 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
370 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700371 }
372
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000373 if ((dirIndex + returnedEntries) > maxDirEntries)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700374 {
375 phosphor::logging::log<phosphor::logging::level::ERR>(
376 "Too many directory entries");
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000377 return ipmi::response(ccStorageLeak);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700378 }
379
Vernon Mauery15419dd2019-05-24 09:40:30 -0700380 sdbusplus::message::message method = bus->new_method_call(
Vernon Mauerya3702c12019-05-22 13:20:59 -0700381 service.c_str(), mdrv2Path, mdrv2Interface, "SendDirectoryInformation");
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000382 method.append(dirVersion, dirIndex, returnedEntries, remainingEntries,
383 dataInfo, size, dataSetSize, dataVersion, timestamp);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700384
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000385 bool terminate = false;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700386 try
387 {
Vernon Mauery15419dd2019-05-24 09:40:30 -0700388 sdbusplus::message::message reply = bus->call(method);
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000389 reply.read(terminate);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700390 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700391 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700392 {
393 phosphor::logging::log<phosphor::logging::level::ERR>(
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700394 "Error send dir", phosphor::logging::entry("ERROR=%s", e.what()),
Vernon Mauerya3702c12019-05-22 13:20:59 -0700395 phosphor::logging::entry("SERVICE=%s", service.c_str()),
396 phosphor::logging::entry("PATH=%s", mdrv2Path));
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000397 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700398 }
399
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +0000400 return ipmi::responseSuccess(terminate);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700401}
402
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000403/** @brief implements mdr2 get data info command
404 * @param agentId
405 * @param dataInfo
406 *
407 * @returns IPMI completion code plus response data
408 * - response - mdrVersion, data info, validFlag,
409 * dataLength, dataVersion, timeStamp
410 */
411ipmi::RspType<std::vector<uint8_t>>
412 mdr2GetDataInfo(uint16_t agentId, std::vector<uint8_t> dataInfo)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700413{
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000414 constexpr size_t getDataInfoReqSize = 16;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700415
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000416 if (dataInfo.size() < getDataInfoReqSize)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700417 {
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000418 return ipmi::responseReqDataLenInvalid();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700419 }
420
Vernon Mauery15419dd2019-05-24 09:40:30 -0700421 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
422 std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700423
424 if (mdrv2 == nullptr)
425 {
426 mdrv2 = std::make_unique<MDRV2>();
427 }
428
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000429 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700430 if (agentIndex == -1)
431 {
432 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000433 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
434 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700435 }
436
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000437 int idIndex = mdrv2->findDataId(dataInfo.data(), dataInfo.size(), service);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700438
439 if ((idIndex < 0) || (idIndex >= maxDirEntries))
440 {
441 phosphor::logging::log<phosphor::logging::level::ERR>(
442 "Invalid Data ID", phosphor::logging::entry("IDINDEX=%x", idIndex));
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000443 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700444 }
445
Vernon Mauery15419dd2019-05-24 09:40:30 -0700446 sdbusplus::message::message method = bus->new_method_call(
Vernon Mauerya3702c12019-05-22 13:20:59 -0700447 service.c_str(), mdrv2Path, mdrv2Interface, "GetDataInformation");
448
449 method.append(idIndex);
450
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000451 std::vector<uint8_t> res;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700452 try
453 {
Vernon Mauery15419dd2019-05-24 09:40:30 -0700454 sdbusplus::message::message reply = bus->call(method);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700455 reply.read(res);
456 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700457 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700458 {
459 phosphor::logging::log<phosphor::logging::level::ERR>(
460 "Error get data info",
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700461 phosphor::logging::entry("ERROR=%s", e.what()),
Vernon Mauerya3702c12019-05-22 13:20:59 -0700462 phosphor::logging::entry("SERVICE=%s", service.c_str()),
463 phosphor::logging::entry("PATH=%s", mdrv2Path));
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000464 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700465 }
466
467 if (res.size() != sizeof(MDRiiGetDataInfoResponse))
468 {
469 phosphor::logging::log<phosphor::logging::level::ERR>(
470 "Get data info response length not invalid");
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000471 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700472 }
Vernon Mauerya3702c12019-05-22 13:20:59 -0700473
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000474 return ipmi::responseSuccess(res);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700475}
476
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000477/** @brief implements mdr2 data info offer command
478 * @param agentId - Offer a agent ID to get the "Data Set ID"
479 *
480 * @returns IPMI completion code plus response data
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000481 * - dataOut - data Set Id
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000482 */
483ipmi::RspType<std::vector<uint8_t>> mdr2DataInfoOffer(uint16_t agentId)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700484{
Vernon Mauery15419dd2019-05-24 09:40:30 -0700485 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
486 std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700487
488 if (mdrv2 == nullptr)
489 {
490 mdrv2 = std::make_unique<MDRV2>();
491 }
492
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000493 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700494 if (agentIndex == -1)
495 {
496 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000497 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
498 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700499 }
500
Vernon Mauery15419dd2019-05-24 09:40:30 -0700501 sdbusplus::message::message method = bus->new_method_call(
Vernon Mauerya3702c12019-05-22 13:20:59 -0700502 service.c_str(), mdrv2Path, mdrv2Interface, "GetDataOffer");
503
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000504 std::vector<uint8_t> dataOut;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700505 try
506 {
Vernon Mauery15419dd2019-05-24 09:40:30 -0700507 sdbusplus::message::message reply = bus->call(method);
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000508 reply.read(dataOut);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700509 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700510 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700511 {
512 phosphor::logging::log<phosphor::logging::level::ERR>(
513 "Error send data info offer",
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700514 phosphor::logging::entry("ERROR=%s", e.what()),
Vernon Mauerya3702c12019-05-22 13:20:59 -0700515 phosphor::logging::entry("SERVICE=%s", service.c_str()),
516 phosphor::logging::entry("PATH=%s", mdrv2Path));
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000517 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700518 }
519
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000520 constexpr size_t respInfoSize = 16;
521 if (dataOut.size() != respInfoSize)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700522 {
523 phosphor::logging::log<phosphor::logging::level::ERR>(
524 "Error send data info offer, return length invalid");
jayaprakash Mutyala853d8292019-05-31 18:17:42 +0000525 return ipmi::responseUnspecifiedError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700526 }
527
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000528 return ipmi::responseSuccess(dataOut);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700529}
530
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000531/** @brief implements mdr2 send data info command
532 * @param agentId
533 * @param dataInfo
534 * @param validFlag
535 * @param dataLength
536 * @param dataVersion
537 * @param timeStamp
538 *
539 * @returns IPMI completion code plus response data
540 * - bool
541 */
542ipmi::RspType<bool> mdr2SendDataInfo(uint16_t agentId,
543 std::array<uint8_t, dataInfoSize> dataInfo,
544 uint8_t validFlag, uint32_t dataLength,
545 uint32_t dataVersion, uint32_t timeStamp)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700546{
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000547 if (dataLength > smbiosTableStorageSize)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700548 {
549 phosphor::logging::log<phosphor::logging::level::ERR>(
550 "Requested data length is out of SMBIOS Table storage size.");
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000551 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700552 }
553
Vernon Mauery15419dd2019-05-24 09:40:30 -0700554 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
555 std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700556
557 if (mdrv2 == nullptr)
558 {
559 mdrv2 = std::make_unique<MDRV2>();
560 }
561
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000562 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700563 if (agentIndex == -1)
564 {
565 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000566 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
567 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700568 }
569
Patrick Venture6d765602019-09-25 17:11:07 -0700570 int idIndex = mdrv2->findDataId(dataInfo.data(), dataInfo.size(), service);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700571
572 if ((idIndex < 0) || (idIndex >= maxDirEntries))
573 {
574 phosphor::logging::log<phosphor::logging::level::ERR>(
575 "Invalid Data ID", phosphor::logging::entry("IDINDEX=%x", idIndex));
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000576 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700577 }
578
Vernon Mauery15419dd2019-05-24 09:40:30 -0700579 sdbusplus::message::message method = bus->new_method_call(
Vernon Mauerya3702c12019-05-22 13:20:59 -0700580 service.c_str(), mdrv2Path, mdrv2Interface, "SendDataInformation");
581
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000582 method.append((uint8_t)idIndex, validFlag, dataLength, dataVersion,
583 timeStamp);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700584
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000585 bool entryChanged = true;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700586 try
587 {
Vernon Mauery15419dd2019-05-24 09:40:30 -0700588 sdbusplus::message::message reply = bus->call(method);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700589 reply.read(entryChanged);
590 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700591 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700592 {
593 phosphor::logging::log<phosphor::logging::level::ERR>(
594 "Error send data info",
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700595 phosphor::logging::entry("ERROR=%s", e.what()),
Vernon Mauerya3702c12019-05-22 13:20:59 -0700596 phosphor::logging::entry("SERVICE=%s", service.c_str()),
597 phosphor::logging::entry("PATH=%s", mdrv2Path));
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000598 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700599 }
600
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +0000601 return ipmi::responseSuccess(entryChanged);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700602}
603
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000604/**
605@brief This command is MDR related get data block command.
606
607@param - agentId
608@param - lockHandle
609@param - xferOffset
610@param - xferLength
611
612@return on success
613 - xferLength
614 - checksum
615 - data
616**/
617ipmi::RspType<uint32_t, // xferLength
618 uint32_t, // Checksum
619 std::vector<uint8_t> // data
620 >
621 mdr2GetDataBlock(uint16_t agentId, uint16_t lockHandle, uint32_t xferOffset,
622 uint32_t xferLength)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700623{
Vernon Mauerya3702c12019-05-22 13:20:59 -0700624 std::tuple<uint8_t, uint32_t, uint32_t, std::vector<uint8_t>> res;
625 std::vector<uint8_t> resData;
626 uint8_t status = 1;
627
Vernon Mauerya3702c12019-05-22 13:20:59 -0700628 if (mdrv2 == nullptr)
629 {
630 mdrv2 = std::make_unique<MDRV2>();
631 }
632
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000633 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700634 if (agentIndex == -1)
635 {
636 phosphor::logging::log<phosphor::logging::level::ERR>(
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000637 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
638 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700639 }
640
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000641 int idIndex = mdrv2->findLockHandle(lockHandle);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700642
643 if ((idIndex < 0) || (idIndex >= maxDirEntries))
644 {
645 phosphor::logging::log<phosphor::logging::level::ERR>(
646 "Invalid Data ID", phosphor::logging::entry("IDINDEX=%x", idIndex));
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000647 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700648 }
649
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000650 if (xferOffset >= mdrv2->smbiosDir.dir[idIndex].common.size)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700651 {
652 phosphor::logging::log<phosphor::logging::level::ERR>(
653 "Offset is outside of range.");
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000654 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700655 }
656
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000657 size_t outSize = (xferLength > mdrv2->smbiosDir.dir[idIndex].xferSize)
658 ? mdrv2->smbiosDir.dir[idIndex].xferSize
659 : xferLength;
660 if (outSize > UINT_MAX - xferOffset)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700661 {
662 phosphor::logging::log<phosphor::logging::level::ERR>(
663 "Out size and offset are out of range");
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000664 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700665 }
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000666 if ((xferOffset + outSize) > mdrv2->smbiosDir.dir[idIndex].common.size)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700667 {
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000668 outSize = mdrv2->smbiosDir.dir[idIndex].common.size - xferOffset;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700669 }
670
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000671 uint32_t respXferLength = outSize;
672
673 if (respXferLength > xferLength)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700674 {
675 phosphor::logging::log<phosphor::logging::level::ERR>(
676 "Get data block unexpected error.");
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000677 return ipmi::responseUnspecifiedError();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700678 }
679
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000680 if ((xferOffset + outSize) >
Vernon Mauerya3702c12019-05-22 13:20:59 -0700681 UINT_MAX -
682 reinterpret_cast<size_t>(mdrv2->smbiosDir.dir[idIndex].dataStorage))
683 {
684 phosphor::logging::log<phosphor::logging::level::ERR>(
685 "Input data to calculate checksum is out of range");
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000686 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700687 }
688
689 uint32_t u32Checksum = mdrv2->calcChecksum32(
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000690 mdrv2->smbiosDir.dir[idIndex].dataStorage + xferOffset, outSize);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700691 if (u32Checksum == invalidChecksum)
692 {
693 phosphor::logging::log<phosphor::logging::level::ERR>(
694 "Get data block failed - invalid checksum");
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000695 return ipmi::response(ccOemInvalidChecksum);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700696 }
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000697 std::vector<uint8_t> data(outSize);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700698
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000699 std::copy(&mdrv2->smbiosDir.dir[idIndex].dataStorage[xferOffset],
700 &mdrv2->smbiosDir.dir[idIndex].dataStorage[xferOffset + outSize],
701 data.begin());
Vernon Mauerya3702c12019-05-22 13:20:59 -0700702
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000703 return ipmi::responseSuccess(respXferLength, u32Checksum, data);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700704}
705
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000706/** @brief implements mdr2 send data block command
707 * @param agentId
708 * @param lockHandle
709 * @param xferOffset
710 * @param xferLength
711 * @param checksum
712 *
713 * @returns IPMI completion code
714 */
715ipmi::RspType<> mdr2SendDataBlock(uint16_t agentId, uint16_t lockHandle,
716 uint32_t xferOffset, uint32_t xferLength,
717 uint32_t checksum)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700718{
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +0000719
Vernon Mauerya3702c12019-05-22 13:20:59 -0700720 if (mdrv2 == nullptr)
721 {
722 mdrv2 = std::make_unique<MDRV2>();
723 }
724
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000725 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700726 if (agentIndex == -1)
727 {
728 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000729 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
730 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700731 }
732
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000733 int idIndex = mdrv2->findLockHandle(lockHandle);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700734
735 if ((idIndex < 0) || (idIndex >= maxDirEntries))
736 {
737 phosphor::logging::log<phosphor::logging::level::ERR>(
738 "Invalid Data ID", phosphor::logging::entry("IDINDEX=%x", idIndex));
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000739 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700740 }
741
742 if (mdrv2->smbiosIsUpdating(idIndex))
743 {
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000744 if (xferOffset > UINT_MAX - xferLength)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700745 {
746 phosphor::logging::log<phosphor::logging::level::ERR>(
747 "Offset and length are out of range");
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000748 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700749 }
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000750 if (((xferOffset + xferLength) >
Vernon Mauerya3702c12019-05-22 13:20:59 -0700751 mdrv2->smbiosDir.dir[idIndex].maxDataSize) ||
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000752 ((xferOffset + xferLength) >
Vernon Mauerya3702c12019-05-22 13:20:59 -0700753 mdrv2->smbiosDir.dir[idIndex].common.dataSetSize))
754 {
755 phosphor::logging::log<phosphor::logging::level::ERR>(
756 "Send data block Invalid offset/length");
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000757 return ipmi::responseReqDataLenExceeded();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700758 }
759 if (reinterpret_cast<size_t>(
760 mdrv2->smbiosDir.dir[idIndex].dataStorage) >
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000761 UINT_MAX - xferOffset)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700762 {
763 phosphor::logging::log<phosphor::logging::level::ERR>(
764 "Offset is out of range");
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000765 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700766 }
767 uint8_t *destAddr =
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000768 mdrv2->smbiosDir.dir[idIndex].dataStorage + xferOffset;
Vernon Mauerya3702c12019-05-22 13:20:59 -0700769 uint8_t *sourceAddr = reinterpret_cast<uint8_t *>(mdrv2->area->vPtr);
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000770 uint32_t calcChecksum = mdrv2->calcChecksum32(sourceAddr, xferLength);
771 if (calcChecksum != checksum)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700772 {
773 phosphor::logging::log<phosphor::logging::level::ERR>(
774 "Send data block Invalid checksum");
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000775 return ipmi::response(ccOemInvalidChecksum);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700776 }
777 else
778 {
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000779 if (reinterpret_cast<size_t>(sourceAddr) > UINT_MAX - xferLength)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700780 {
781 phosphor::logging::log<phosphor::logging::level::ERR>(
782 "Length is out of range");
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000783 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700784 }
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000785 std::copy(sourceAddr, sourceAddr + xferLength, destAddr);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700786 }
787 }
788 else
789 {
790 phosphor::logging::log<phosphor::logging::level::ERR>(
791 "Send data block failed, other data is updating");
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000792 return ipmi::responseDestinationUnavailable();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700793 }
794
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +0000795 return ipmi::responseSuccess();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700796}
797
798bool MDRV2::storeDatatoFlash(MDRSMBIOSHeader *mdrHdr, uint8_t *data)
799{
800 std::ofstream smbiosFile(mdrType2File,
801 std::ios_base::binary | std::ios_base::trunc);
802 if (!smbiosFile.good())
803 {
804 phosphor::logging::log<phosphor::logging::level::ERR>(
805 "Write data from flash error - Open MDRV2 table file failure");
806 return false;
807 }
808
809 try
810 {
811 smbiosFile.write(reinterpret_cast<char *>(mdrHdr),
812 sizeof(MDRSMBIOSHeader));
813 smbiosFile.write(reinterpret_cast<char *>(data), mdrHdr->dataSize);
814 }
815 catch (std::ofstream::failure &e)
816 {
817 phosphor::logging::log<phosphor::logging::level::ERR>(
Vernon Maueryc7d517e2019-06-18 14:27:00 -0700818 "Write data from flash error - write data error",
819 phosphor::logging::entry("ERROR=%s", e.what()));
Vernon Mauerya3702c12019-05-22 13:20:59 -0700820 return false;
821 }
822
823 return true;
824}
825
826void SharedMemoryArea::Initialize(uint32_t addr, uint32_t areaSize)
827{
828 int memDriver = 0;
829
830 // open mem driver for the system memory access
831 memDriver = open("/dev/vgasharedmem", O_RDONLY);
832 if (memDriver < 0)
833 {
834 phosphor::logging::log<phosphor::logging::level::ERR>(
835 "Cannot access mem driver");
836 throw std::system_error(EIO, std::generic_category());
837 }
838
839 // map the system memory
840 vPtr = mmap(NULL, // where to map to: don't mind
841 areaSize, // how many bytes ?
842 PROT_READ, // want to read and write
843 MAP_SHARED, // no copy on write
844 memDriver, // handle to /dev/mem
845 (physicalAddr & pageMask)); // hopefully the Text-buffer :-)
846
847 close(memDriver);
848 if (vPtr == MAP_FAILED)
849 {
850 phosphor::logging::log<phosphor::logging::level::ERR>(
851 "Failed to map share memory");
852 throw std::system_error(EIO, std::generic_category());
853 }
854 size = areaSize;
855 physicalAddr = addr;
856}
857
858bool MDRV2::smbiosUnlock(uint8_t index)
859{
860 bool ret;
861 switch (smbiosDir.dir[index].stage)
862 {
863 case MDR2SMBIOSStatusEnum::mdr2Updating:
864 smbiosDir.dir[index].stage = MDR2SMBIOSStatusEnum::mdr2Updated;
865 smbiosDir.dir[index].lock = MDR2DirLockEnum::mdr2DirUnlock;
866
867 timer->stop();
868 smbiosDir.dir[index].lockHandle = 0;
869 ret = true;
870 break;
871
872 case MDR2SMBIOSStatusEnum::mdr2Updated:
873 case MDR2SMBIOSStatusEnum::mdr2Loaded:
874 smbiosDir.dir[index].lock = MDR2DirLockEnum::mdr2DirUnlock;
875
876 timer->stop();
877
878 smbiosDir.dir[index].lockHandle = 0;
879 ret = true;
880 break;
881
882 default:
883 break;
884 }
885
886 return ret;
887}
888
889bool MDRV2::smbiosTryLock(uint8_t flag, uint8_t index, uint16_t *session,
890 uint16_t timeout)
891{
892 bool ret = false;
893 uint32_t u32Status = 0;
894
895 if (timeout == 0)
896 {
897 timeout = defaultTimeout;
898 }
899 std::chrono::microseconds usec(timeout * sysClock);
900
901 switch (smbiosDir.dir[index].stage)
902 {
903 case MDR2SMBIOSStatusEnum::mdr2Updating:
904 if (smbiosDir.dir[index].lock != MDR2DirLockEnum::mdr2DirLock)
905 {
906 smbiosDir.dir[index].lock = MDR2DirLockEnum::mdr2DirLock;
907 timer->start(usec);
908 lockIndex = index;
909
910 *session = getSessionHandle(&smbiosDir);
911 smbiosDir.dir[index].lockHandle = *session;
912 ret = true;
913 }
914 break;
915 case MDR2SMBIOSStatusEnum::mdr2Init:
916 if (flag)
917 {
918 smbiosDir.dir[index].stage = MDR2SMBIOSStatusEnum::mdr2Updating;
919 smbiosDir.dir[index].lock = MDR2DirLockEnum::mdr2DirUnlock;
920 timer->start(usec);
921 lockIndex = index;
922
923 *session = getSessionHandle(&smbiosDir);
924 smbiosDir.dir[index].lockHandle = *session;
925 ret = true;
926 }
927 break;
928
929 case MDR2SMBIOSStatusEnum::mdr2Updated:
930 case MDR2SMBIOSStatusEnum::mdr2Loaded:
931 if (smbiosDir.dir[index].lock != MDR2DirLockEnum::mdr2DirLock)
932 {
933 if (flag)
934 {
935 smbiosDir.dir[index].stage =
936 MDR2SMBIOSStatusEnum::mdr2Updating;
937 smbiosDir.dir[index].lock = MDR2DirLockEnum::mdr2DirUnlock;
938 }
939 else
940 {
941 smbiosDir.dir[index].lock = MDR2DirLockEnum::mdr2DirLock;
942 }
943
944 timer->start(usec);
945 lockIndex = index;
946
947 *session = getSessionHandle(&smbiosDir);
948 smbiosDir.dir[index].lockHandle = *session;
949 ret = true;
950 }
951 break;
952
953 default:
954 break;
955 }
956 return ret;
957}
958
959void MDRV2::timeoutHandler()
960{
961 smbiosUnlock(lockIndex);
962 mdrv2->area.reset(nullptr);
963}
964
jayaprakash Mutyala40fec612019-06-19 11:53:03 +0000965/** @brief implements mdr2 lock data command
966 * @param agentId
967 * @param dataInfo
968 * @param timeout
969 *
970 * @returns IPMI completion code plus response data
971 * - mdr2Version
972 * - session
973 * - dataLength
974 * - xferAddress
975 * - xferLength
976 */
977ipmi::RspType<uint8_t, // mdr2Version
978 uint16_t, // session
979 uint32_t, // dataLength
980 uint32_t, // xferAddress
981 uint32_t // xferLength
982 >
983 mdr2LockData(uint16_t agentId, std::array<uint8_t, dataInfoSize> dataInfo,
984 uint16_t timeout)
Vernon Mauerya3702c12019-05-22 13:20:59 -0700985{
Vernon Mauerya3702c12019-05-22 13:20:59 -0700986 if (mdrv2 == nullptr)
987 {
988 mdrv2 = std::make_unique<MDRV2>();
989 }
990
jayaprakash Mutyala40fec612019-06-19 11:53:03 +0000991 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -0700992 if (agentIndex == -1)
993 {
994 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyala40fec612019-06-19 11:53:03 +0000995 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
996 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -0700997 }
998
Vernon Mauery15419dd2019-05-24 09:40:30 -0700999 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
1000 std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001001
Patrick Venture6d765602019-09-25 17:11:07 -07001002 int idIndex = mdrv2->findDataId(dataInfo.data(), dataInfo.size(), service);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001003
1004 if ((idIndex < 0) || (idIndex >= maxDirEntries))
1005 {
1006 phosphor::logging::log<phosphor::logging::level::ERR>(
1007 "Invalid Data ID", phosphor::logging::entry("IDINDEX=%x", idIndex));
jayaprakash Mutyala40fec612019-06-19 11:53:03 +00001008 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001009 }
1010
jayaprakash Mutyala40fec612019-06-19 11:53:03 +00001011 uint16_t session = 0;
1012 if (!mdrv2->smbiosTryLock(0, idIndex, &session, timeout))
Vernon Mauerya3702c12019-05-22 13:20:59 -07001013 {
1014 phosphor::logging::log<phosphor::logging::level::ERR>(
1015 "Lock Data failed - cannot lock idIndex");
jayaprakash Mutyala40fec612019-06-19 11:53:03 +00001016 return ipmi::responseCommandNotAvailable();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001017 }
1018
jayaprakash Mutyala40fec612019-06-19 11:53:03 +00001019 uint32_t dataLength = mdrv2->smbiosDir.dir[idIndex].common.size;
1020 uint32_t xferAddress = mdrv2->smbiosDir.dir[idIndex].xferBuff;
1021 uint32_t xferLength = mdrv2->smbiosDir.dir[idIndex].xferSize;
Vernon Mauerya3702c12019-05-22 13:20:59 -07001022
jayaprakash Mutyala40fec612019-06-19 11:53:03 +00001023 return ipmi::responseSuccess(mdr2Version, session, dataLength, xferAddress,
1024 xferLength);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001025}
1026
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001027/** @brief implements mdr2 unlock data command
1028 * @param agentId
1029 * @param lockHandle
1030 *
1031 * @returns IPMI completion code
1032 */
1033ipmi::RspType<> mdr2UnlockData(uint16_t agentId, uint16_t lockHandle)
Vernon Mauerya3702c12019-05-22 13:20:59 -07001034{
1035 phosphor::logging::log<phosphor::logging::level::ERR>("unlock data");
Vernon Mauerya3702c12019-05-22 13:20:59 -07001036
Vernon Mauerya3702c12019-05-22 13:20:59 -07001037 if (mdrv2 == nullptr)
1038 {
1039 mdrv2 = std::make_unique<MDRV2>();
1040 }
1041
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001042 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001043 if (agentIndex == -1)
1044 {
1045 phosphor::logging::log<phosphor::logging::level::ERR>(
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001046 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
1047 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001048 }
1049
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001050 int idIndex = mdrv2->findLockHandle(lockHandle);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001051
1052 if ((idIndex < 0) || (idIndex >= maxDirEntries))
1053 {
1054 phosphor::logging::log<phosphor::logging::level::ERR>(
1055 "Invalid Data ID", phosphor::logging::entry("IDINDEX=%x", idIndex));
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001056 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001057 }
1058
1059 if (!mdrv2->smbiosUnlock(idIndex))
1060 {
1061 phosphor::logging::log<phosphor::logging::level::ERR>(
1062 "Unlock Data failed - cannot unlock idIndex");
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001063 return ipmi::responseCommandNotAvailable();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001064 }
1065
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001066 return ipmi::responseSuccess();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001067}
1068
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001069/**
1070@brief This command is executed after POST BIOS to get the session info.
1071
1072@param - agentId, dataInfo, dataLength, xferAddress, xferLength, timeout.
1073
1074@return xferStartAck and session on success.
1075**/
1076ipmi::RspType<uint8_t, uint16_t>
1077 cmd_mdr2_data_start(uint16_t agentId, std::array<uint8_t, 16> dataInfo,
1078 uint32_t dataLength, uint32_t xferAddress,
1079 uint32_t xferLength, uint16_t timeout)
Vernon Mauerya3702c12019-05-22 13:20:59 -07001080{
Vernon Mauerya3702c12019-05-22 13:20:59 -07001081 uint16_t session = 0;
1082
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001083 if (dataLength > smbiosTableStorageSize)
Vernon Mauerya3702c12019-05-22 13:20:59 -07001084 {
1085 phosphor::logging::log<phosphor::logging::level::ERR>(
1086 "Requested data length is out of SMBIOS Table storage size.");
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001087 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001088 }
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001089 if ((xferLength + xferAddress) > mdriiSMSize)
Vernon Mauerya3702c12019-05-22 13:20:59 -07001090 {
1091 phosphor::logging::log<phosphor::logging::level::ERR>(
1092 "Invalid data address and size");
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001093 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001094 }
1095
Vernon Mauery15419dd2019-05-24 09:40:30 -07001096 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
1097 std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001098
1099 if (mdrv2 == nullptr)
1100 {
1101 mdrv2 = std::make_unique<MDRV2>();
1102 }
1103
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001104 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001105 if (agentIndex == -1)
1106 {
1107 phosphor::logging::log<phosphor::logging::level::ERR>(
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001108 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
1109 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001110 }
1111
Patrick Venture6d765602019-09-25 17:11:07 -07001112 int idIndex = mdrv2->findDataId(dataInfo.data(), dataInfo.size(), service);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001113
1114 if ((idIndex < 0) || (idIndex >= maxDirEntries))
1115 {
1116 phosphor::logging::log<phosphor::logging::level::ERR>(
1117 "Invalid Data ID", phosphor::logging::entry("IDINDEX=%x", idIndex));
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001118 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001119 }
1120
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001121 if (mdrv2->smbiosTryLock(1, idIndex, &session, timeout))
Vernon Mauerya3702c12019-05-22 13:20:59 -07001122 {
1123 try
1124 {
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001125 mdrv2->area =
1126 std::make_unique<SharedMemoryArea>(xferAddress, xferLength);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001127 }
1128 catch (const std::system_error &e)
1129 {
1130 mdrv2->smbiosUnlock(idIndex);
1131 phosphor::logging::log<phosphor::logging::level::ERR>(
Vernon Maueryc7d517e2019-06-18 14:27:00 -07001132 "Unable to access share memory",
1133 phosphor::logging::entry("ERROR=%s", e.what()));
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001134 return ipmi::responseUnspecifiedError();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001135 }
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001136 mdrv2->smbiosDir.dir[idIndex].common.size = dataLength;
Vernon Mauerya3702c12019-05-22 13:20:59 -07001137 mdrv2->smbiosDir.dir[idIndex].lockHandle = session;
1138 if (-1 ==
1139 mdrv2->syncDirCommonData(
1140 idIndex, mdrv2->smbiosDir.dir[idIndex].common.size, service))
1141 {
1142 phosphor::logging::log<phosphor::logging::level::ERR>(
1143 "Unable to sync data to service");
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001144 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001145 }
1146 }
1147 else
1148 {
1149 phosphor::logging::log<phosphor::logging::level::ERR>(
1150 "Canot lock smbios");
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001151 return ipmi::responseUnspecifiedError();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001152 }
1153
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001154 static constexpr uint8_t xferStartAck = 1;
Vernon Mauerya3702c12019-05-22 13:20:59 -07001155
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001156 return ipmi::responseSuccess(xferStartAck, session);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001157}
1158
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001159/**
1160@brief This command is executed to close the session.
1161
1162@param - agentId, lockHandle.
1163
1164@return completion code on success.
1165**/
1166ipmi::RspType<> cmd_mdr2_data_done(uint16_t agentId, uint16_t lockHandle)
Vernon Mauerya3702c12019-05-22 13:20:59 -07001167{
Vernon Mauerya3702c12019-05-22 13:20:59 -07001168
1169 if (mdrv2 == nullptr)
1170 {
1171 mdrv2 = std::make_unique<MDRV2>();
1172 }
1173
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001174 int agentIndex = mdrv2->agentLookup(agentId);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001175 if (agentIndex == -1)
1176 {
1177 phosphor::logging::log<phosphor::logging::level::ERR>(
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001178 "Unknown agent id", phosphor::logging::entry("ID=%x", agentId));
1179 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001180 }
1181
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001182 int idIndex = mdrv2->findLockHandle(lockHandle);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001183
1184 if ((idIndex < 0) || (idIndex >= maxDirEntries))
1185 {
1186 phosphor::logging::log<phosphor::logging::level::ERR>(
1187 "Invalid Data ID", phosphor::logging::entry("IDINDEX=%x", idIndex));
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001188 return ipmi::responseParmOutOfRange();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001189 }
1190
1191 if (!mdrv2->smbiosUnlock(idIndex))
1192 {
1193 phosphor::logging::log<phosphor::logging::level::ERR>(
1194 "Send data done failed - cannot unlock idIndex");
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001195 return ipmi::responseDestinationUnavailable();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001196 }
1197
1198 mdrv2->area.reset(nullptr);
1199 MDRSMBIOSHeader mdr2Smbios;
1200 mdr2Smbios.mdrType = mdrTypeII;
1201 mdr2Smbios.dirVer = mdrv2->smbiosDir.dir[0].common.dataVersion;
1202 mdr2Smbios.timestamp = mdrv2->smbiosDir.dir[0].common.timestamp;
1203 mdr2Smbios.dataSize = mdrv2->smbiosDir.dir[0].common.size;
1204
1205 if (access(smbiosPath, 0) == -1)
1206 {
1207 int flag = mkdir(smbiosPath, S_IRWXU);
1208 if (flag != 0)
1209 {
1210 phosphor::logging::log<phosphor::logging::level::ERR>(
1211 "create folder failed for writting smbios file");
1212 }
1213 }
1214 if (!mdrv2->storeDatatoFlash(
1215 &mdr2Smbios, mdrv2->smbiosDir.dir[smbiosDirIndex].dataStorage))
1216 {
1217 phosphor::logging::log<phosphor::logging::level::ERR>(
1218 "MDR2 Store data to flash failed");
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001219 return ipmi::responseDestinationUnavailable();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001220 }
Vernon Mauerya3702c12019-05-22 13:20:59 -07001221 bool status = false;
Vernon Mauery15419dd2019-05-24 09:40:30 -07001222 std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
1223 std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
1224 sdbusplus::message::message method = bus->new_method_call(
Vernon Mauerya3702c12019-05-22 13:20:59 -07001225 service.c_str(), mdrv2Path, mdrv2Interface, "AgentSynchronizeData");
1226
1227 try
1228 {
Vernon Mauery15419dd2019-05-24 09:40:30 -07001229 sdbusplus::message::message reply = bus->call(method);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001230 reply.read(status);
1231 }
Vernon Maueryc7d517e2019-06-18 14:27:00 -07001232 catch (sdbusplus::exception_t &e)
Vernon Mauerya3702c12019-05-22 13:20:59 -07001233 {
1234 phosphor::logging::log<phosphor::logging::level::ERR>(
1235 "Error Sync data with service",
Vernon Maueryc7d517e2019-06-18 14:27:00 -07001236 phosphor::logging::entry("ERROR=%s", e.what()),
Vernon Mauerya3702c12019-05-22 13:20:59 -07001237 phosphor::logging::entry("SERVICE=%s", service.c_str()),
1238 phosphor::logging::entry("PATH=%s", mdrv2Path));
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001239 return ipmi::responseResponseError();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001240 }
1241
1242 if (!status)
1243 {
1244 phosphor::logging::log<phosphor::logging::level::ERR>(
1245 "Sync data with service failure");
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001246 return ipmi::responseUnspecifiedError();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001247 }
1248
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001249 return ipmi::responseSuccess();
Vernon Mauerya3702c12019-05-22 13:20:59 -07001250}
1251
1252static void register_netfn_smbiosmdrv2_functions(void)
1253{
1254 // MDR V2 Command
1255 // <Get MDRII Status Command>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001256 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1257 ipmi::intel::app::cmdMdrIIAgentStatus,
jayaprakash Mutyala853d8292019-05-31 18:17:42 +00001258 ipmi::Privilege::Operator, mdr2AgentStatus);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001259
1260 // <Get MDRII Directory Command>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001261 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1262 ipmi::intel::app::cmdMdrIIGetDir,
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001263 ipmi::Privilege::Operator, mdr2GetDir);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001264
1265 // <Send MDRII Directory Command>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001266 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1267 ipmi::intel::app::cmdMdrIISendDir,
jayaprakash Mutyala7cb59cc2019-06-19 19:17:43 +00001268 ipmi::Privilege::Operator, mdr2SendDir);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001269
1270 // <Get MDRII Data Info Command>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001271 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1272 ipmi::intel::app::cmdMdrIIGetDataInfo,
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +00001273 ipmi::Privilege::Operator, mdr2GetDataInfo);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001274
1275 // <Send MDRII Info Offer>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001276 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1277 ipmi::intel::app::cmdMdrIISendDataInfoOffer,
1278 ipmi::Privilege::Operator, mdr2DataInfoOffer);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001279
1280 // <Send MDRII Data Info>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001281 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1282 ipmi::intel::app::cmdMdrIISendDataInfo,
jayaprakash Mutyalaf5d49d62019-06-18 12:28:01 +00001283 ipmi::Privilege::Operator, mdr2SendDataInfo);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001284
1285 // <Get MDRII Data Block Command>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001286 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1287 ipmi::intel::app::cmdMdrIIGetDataBlock,
Deepak Kumar Sahuf4f5c162019-06-11 17:45:05 +00001288 ipmi::Privilege::Operator, mdr2GetDataBlock);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001289
1290 // <Send MDRII Data Block>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001291 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1292 ipmi::intel::app::cmdMdrIISendDataBlock,
jayaprakash Mutyala3104b3f2019-06-10 19:23:07 +00001293 ipmi::Privilege::Operator, mdr2SendDataBlock);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001294
1295 // <Lock MDRII Data Command>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001296 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1297 ipmi::intel::app::cmdMdrIILockData,
jayaprakash Mutyala40fec612019-06-19 11:53:03 +00001298 ipmi::Privilege::Operator, mdr2LockData);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001299
1300 // <Unlock MDRII Data Command>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001301 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1302 ipmi::intel::app::cmdMdrIIUnlockData,
jayaprakash Mutyaladad548b2019-06-12 15:29:39 +00001303 ipmi::Privilege::Operator, mdr2UnlockData);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001304
1305 // <Send MDRII Data Start>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001306 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1307 ipmi::intel::app::cmdMdrIIDataStart,
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001308 ipmi::Privilege::Operator, cmd_mdr2_data_start);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001309
1310 // <Send MDRII Data Done>
Vernon Mauery98bbf692019-09-16 11:14:59 -07001311 ipmi::registerHandler(ipmi::prioOemBase, ipmi::intel::netFnApp,
1312 ipmi::intel::app::cmdMdrIIDataDone,
Deepak Kumar Sahu529d4152019-05-31 18:23:14 +00001313 ipmi::Privilege::Operator, cmd_mdr2_data_done);
Vernon Mauerya3702c12019-05-22 13:20:59 -07001314}