sel entry: Use registerHandler instead of ipmi_register_callback
Since ipmi_register_callback declared in api.h has been gradually
deprecated, this submission is to use registerHandler instead of
ipmi_register_callback.
Change-Id: I706897d656dccc779fe5b0763c1f6c8feb21e89b
Signed-off-by: George Liu <liuxiwei@ieisystem.com>
diff --git a/selutility.hpp b/selutility.hpp
index c6ba6b0..ace17d8 100644
--- a/selutility.hpp
+++ b/selutility.hpp
@@ -57,18 +57,6 @@
static constexpr bool getSelAllocationInfo = false;
} // namespace operationSupport
-/** @struct GetSELEntryRequest
- *
- * IPMI payload for Get SEL Entry command request.
- */
-struct GetSELEntryRequest
-{
- uint16_t reservationID; //!< Reservation ID.
- uint16_t selRecordID; //!< SEL Record ID.
- uint8_t offset; //!< Offset into record.
- uint8_t readLength; //!< Bytes to read.
-} __attribute__((packed));
-
constexpr size_t SELRecordLength = 16;
/** @struct SELEventRecord
diff --git a/storagehandler.cpp b/storagehandler.cpp
index 43cc142..c9cf08d 100644
--- a/storagehandler.cpp
+++ b/storagehandler.cpp
@@ -282,25 +282,17 @@
ipmi::sel::operationSupport::overflow);
}
-ipmi::Cc getSELEntry(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request,
- ipmi_response_t response, ipmi_data_len_t data_len,
- ipmi_context_t)
+ipmi::RspType<uint16_t, // Next Record ID
+ std::vector<uint8_t> // SEL data
+ >
+ getSELEntry(uint16_t reservationID, uint16_t selRecordID, uint8_t offset,
+ uint8_t readLength)
{
- if (*data_len != sizeof(ipmi::sel::GetSELEntryRequest))
+ if (reservationID != 0)
{
- *data_len = 0;
- return ipmi::ccReqDataLenInvalid;
- }
-
- auto requestData =
- reinterpret_cast<const ipmi::sel::GetSELEntryRequest*>(request);
-
- if (requestData->reservationID != 0)
- {
- if (!checkSELReservation(requestData->reservationID))
+ if (!checkSELReservation(reservationID))
{
- *data_len = 0;
- return ipmi::ccInvalidReservationId;
+ return ipmi::responseInvalidReservationId();
}
}
@@ -312,18 +304,17 @@
if (selCacheMap.empty())
{
- *data_len = 0;
- return ipmi::ccSensorInvalid;
+ return ipmi::responseSensorInvalid();
}
SELCacheMap::const_iterator iter;
// Check for the requested SEL Entry.
- if (requestData->selRecordID == ipmi::sel::firstEntry)
+ if (selRecordID == ipmi::sel::firstEntry)
{
iter = selCacheMap.begin();
}
- else if (requestData->selRecordID == ipmi::sel::lastEntry)
+ else if (selRecordID == ipmi::sel::lastEntry)
{
if (selCacheMap.size() > 1)
{
@@ -338,11 +329,10 @@
}
else
{
- iter = selCacheMap.find(requestData->selRecordID);
+ iter = selCacheMap.find(selRecordID);
if (iter == selCacheMap.end())
{
- *data_len = 0;
- return ipmi::ccSensorInvalid;
+ return ipmi::responseSensorInvalid();
}
}
@@ -358,35 +348,32 @@
record.nextRecordID = iter->first;
}
- if (requestData->readLength == ipmi::sel::entireRecord)
+ uint16_t nextRecordID = record.nextRecordID;
+ std::vector<uint8_t> buffer;
+ if (readLength == ipmi::sel::entireRecord)
{
- std::memcpy(response, &record, sizeof(record));
- *data_len = sizeof(record);
+ buffer.resize(sizeof(record));
+ std::memcpy(buffer.data(), &record.event, sizeof(record.event));
}
else
{
- if (requestData->offset >= ipmi::sel::selRecordSize ||
- requestData->readLength > ipmi::sel::selRecordSize)
+ if (offset >= ipmi::sel::selRecordSize ||
+ readLength > ipmi::sel::selRecordSize)
{
- *data_len = 0;
- return ipmi::ccInvalidFieldRequest;
+ return ipmi::responseInvalidFieldRequest();
}
- auto diff = ipmi::sel::selRecordSize - requestData->offset;
- auto readLength =
- std::min(diff, static_cast<int>(requestData->readLength));
+ auto diff = ipmi::sel::selRecordSize - offset;
+ auto minReadLength = std::min(diff, static_cast<int>(readLength));
- uint16_t nextRecordID = record.nextRecordID;
- std::memcpy(response, &nextRecordID, sizeof(nextRecordID));
-
+ buffer.resize(minReadLength);
const ipmi::sel::SELEventRecordFormat* evt = &record.event;
- std::memcpy(static_cast<uint8_t*>(response) + sizeof(nextRecordID),
- reinterpret_cast<const uint8_t*>(evt) + requestData->offset,
- readLength);
- *data_len = sizeof(nextRecordID) + readLength;
+ std::memcpy(buffer.data(),
+ reinterpret_cast<const uint8_t*>(evt) + offset,
+ minReadLength);
}
- return ipmi::ccSuccess;
+ return ipmi::responseSuccess(nextRecordID, buffer);
}
/** @brief implements the delete SEL entry command
@@ -893,8 +880,9 @@
ipmiStorageGetSelTimeUtcOffset);
// <Get SEL Entry>
- ipmi_register_callback(ipmi::netFnStorage, ipmi::storage::cmdGetSelEntry,
- nullptr, getSELEntry, PRIVILEGE_USER);
+ ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
+ ipmi::storage::cmdGetSelEntry, ipmi::Privilege::User,
+ getSELEntry);
// <Delete SEL Entry>
ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,