Update GetSDR to new API
We have to add some more functionality to this command
so updating it first seemed like a good idea.
Tested: Sensor list and fru print still works
Change-Id: Icdb7399e43fd2a0503ae348fd9071df99010d4c0
Signed-off-by: James Feist <james.feist@linux.intel.com>
diff --git a/src/sensorcommands.cpp b/src/sensorcommands.cpp
index 9589d64..02df84c 100644
--- a/src/sensorcommands.cpp
+++ b/src/sensorcommands.cpp
@@ -1058,102 +1058,85 @@
return IPMI_CC_OK;
}
-ipmi_ret_t ipmiStorageGetSDR(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
- ipmi_request_t request, ipmi_response_t response,
- ipmi_data_len_t dataLen, ipmi_context_t context)
+ipmi::RspType<uint16_t, // next record ID
+ std::vector<uint8_t> // payload
+ >
+ ipmiStorageGetSDR(uint16_t reservationID, uint16_t recordID, uint8_t offset,
+ uint8_t bytesToRead)
{
- printCommand(+netfn, +cmd);
-
- if (*dataLen != 6)
- {
- *dataLen = 0;
- return IPMI_CC_REQ_DATA_LEN_INVALID;
- }
- auto requestedSize = *dataLen;
- *dataLen = 0; // default to 0 in case of an error
-
constexpr uint16_t lastRecordIndex = 0xFFFF;
- auto req = static_cast<GetSDRReq *>(request);
// reservation required for partial reads with non zero offset into
// record
- if ((sdrReservationID == 0 || req->reservationID != sdrReservationID) &&
- req->offset)
+ if ((sdrReservationID == 0 || reservationID != sdrReservationID) && offset)
{
- return IPMI_CC_INVALID_RESERVATION_ID;
+ return ipmi::responseInvalidReservationId();
}
if (sensorTree.empty() && !getSensorSubtree(sensorTree))
{
- return IPMI_CC_RESPONSE_ERROR;
+ return ipmi::responseResponseError();
}
size_t fruCount = 0;
ipmi_ret_t ret = ipmi::storage::getFruSdrCount(fruCount);
if (ret != IPMI_CC_OK)
{
- return ret;
+ return ipmi::response(ret);
}
size_t lastRecord = sensorTree.size() + fruCount - 1;
- if (req->recordID == lastRecordIndex)
+ if (recordID == lastRecordIndex)
{
- req->recordID = lastRecord;
+ recordID = lastRecord;
}
- if (req->recordID > lastRecord)
+ if (recordID > lastRecord)
{
- return IPMI_CC_INVALID_FIELD_REQUEST;
+ return ipmi::responseInvalidFieldRequest();
}
- uint16_t nextRecord =
- lastRecord > req->recordID ? req->recordID + 1 : 0XFFFF;
+ uint16_t nextRecordId = lastRecord > recordID ? recordID + 1 : 0XFFFF;
- auto responseClear = static_cast<uint8_t *>(response);
- std::fill(responseClear, responseClear + requestedSize, 0);
-
- auto resp = static_cast<get_sdr::GetSdrResp *>(response);
- resp->next_record_id_lsb = nextRecord & 0xFF;
- resp->next_record_id_msb = nextRecord >> 8;
-
- if (req->recordID >= sensorTree.size())
+ if (recordID >= sensorTree.size())
{
- size_t fruIndex = req->recordID - sensorTree.size();
+ size_t fruIndex = recordID - sensorTree.size();
if (fruIndex >= fruCount)
{
- return IPMI_CC_INVALID_FIELD_REQUEST;
+ return ipmi::responseInvalidFieldRequest();
}
get_sdr::SensorDataFruRecord data;
- if (req->offset > sizeof(data))
+ if (offset > sizeof(data))
{
- return IPMI_CC_INVALID_FIELD_REQUEST;
+ return ipmi::responseInvalidFieldRequest();
}
ret = ipmi::storage::getFruSdrs(fruIndex, data);
if (ret != IPMI_CC_OK)
{
- return ret;
+ return ipmi::response(ret);
}
- data.header.record_id_msb = req->recordID << 8;
- data.header.record_id_lsb = req->recordID & 0xFF;
- if (sizeof(data) < (req->offset + req->bytesToRead))
+ data.header.record_id_msb = recordID << 8;
+ data.header.record_id_lsb = recordID & 0xFF;
+ if (sizeof(data) < (offset + bytesToRead))
{
- req->bytesToRead = sizeof(data) - req->offset;
+ bytesToRead = sizeof(data) - offset;
}
- *dataLen = req->bytesToRead + 2; // next record
- std::memcpy(&resp->record_data, (char *)&data + req->offset,
- req->bytesToRead);
- return IPMI_CC_OK;
+
+ uint8_t *respStart = reinterpret_cast<uint8_t *>(&data) + offset;
+ std::vector<uint8_t> recordData(respStart, respStart + bytesToRead);
+
+ return ipmi::responseSuccess(nextRecordId, recordData);
}
std::string connection;
std::string path;
- uint16_t sensorIndex = req->recordID;
+ uint16_t sensorIndex = recordID;
for (const auto &sensor : sensorTree)
{
if (sensorIndex-- == 0)
{
if (!sensor.second.size())
{
- return IPMI_CC_RESPONSE_ERROR;
+ return ipmi::responseResponseError();
}
connection = sensor.second.begin()->first;
path = sensor.first;
@@ -1164,13 +1147,13 @@
SensorMap sensorMap;
if (!getSensorMap(connection, path, sensorMap))
{
- return IPMI_CC_RESPONSE_ERROR;
+ return ipmi::responseResponseError();
}
- uint8_t sensornumber = (req->recordID & 0xFF);
+ uint8_t sensornumber = (recordID & 0xFF);
get_sdr::SensorDataFullRecord record = {0};
- record.header.record_id_msb = req->recordID << 8;
- record.header.record_id_lsb = req->recordID & 0xFF;
+ record.header.record_id_msb = recordID << 8;
+ record.header.record_id_lsb = recordID & 0xFF;
record.header.sdr_version = ipmiSdrVersion;
record.header.record_type = get_sdr::SENSOR_DATA_FULL_RECORD;
record.header.record_length = sizeof(get_sdr::SensorDataFullRecord) -
@@ -1197,7 +1180,7 @@
auto sensorObject = sensorMap.find("xyz.openbmc_project.Sensor.Value");
if (sensorObject == sensorMap.end())
{
- return IPMI_CC_RESPONSE_ERROR;
+ return ipmi::responseResponseError();
}
auto maxObject = sensorObject->second.find("MaxValue");
@@ -1222,7 +1205,7 @@
if (!getSensorAttributes(max, min, mValue, rExp, bValue, bExp, bSigned))
{
- return IPMI_CC_RESPONSE_ERROR;
+ return ipmi::responseResponseError();
}
// apply M, B, and exponents, M and B are 10 bit values, exponents are 4
@@ -1286,19 +1269,15 @@
std::strncpy(record.body.id_string, name.c_str(),
sizeof(record.body.id_string));
- if (sizeof(get_sdr::SensorDataFullRecord) <
- (req->offset + req->bytesToRead))
+ if (sizeof(get_sdr::SensorDataFullRecord) < (offset + bytesToRead))
{
- req->bytesToRead = sizeof(get_sdr::SensorDataFullRecord) - req->offset;
+ bytesToRead = sizeof(get_sdr::SensorDataFullRecord) - offset;
}
- *dataLen =
- 2 + req->bytesToRead; // bytesToRead + MSB and LSB of next record id
+ uint8_t *respStart = reinterpret_cast<uint8_t *>(&record) + offset;
+ std::vector<uint8_t> recordData(respStart, respStart + bytesToRead);
- std::memcpy(&resp->record_data, (char *)&record + req->offset,
- req->bytesToRead);
-
- return IPMI_CC_OK;
+ return ipmi::responseSuccess(nextRecordId, recordData);
}
/* end storage commands */
@@ -1384,15 +1363,16 @@
nullptr, ipmiStorageReserveSDR, PRIVILEGE_USER);
// <Get Sdr>
- ipmiPrintAndRegister(
- NETFUN_SENSOR,
- static_cast<ipmi_cmd_t>(IPMINetfnSensorCmds::ipmiCmdGetDeviceSDR),
- nullptr, ipmiStorageGetSDR, PRIVILEGE_USER);
+ ipmi::registerHandler(
+ ipmi::prioOemBase, NETFUN_SENSOR,
+ static_cast<ipmi::Cmd>(IPMINetfnSensorCmds::ipmiCmdGetDeviceSDR),
+ ipmi::Privilege::User, ipmiStorageGetSDR);
- ipmiPrintAndRegister(
- NETFUN_STORAGE,
- static_cast<ipmi_cmd_t>(IPMINetfnStorageCmds::ipmiCmdGetSDR), nullptr,
- ipmiStorageGetSDR, PRIVILEGE_USER);
+ ipmi::registerHandler(
+ ipmi::prioOemBase, NETFUN_STORAGE,
+ static_cast<ipmi::Cmd>(IPMINetfnStorageCmds::ipmiCmdGetSDR),
+ ipmi::Privilege::User, ipmiStorageGetSDR);
+
return;
}
} // namespace ipmi