sdr: 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: I0adfcd6c0e41daafe2d81918a527925997f96585
Signed-off-by: George Liu <liuxiwei@ieisystem.com>
diff --git a/dbus-sdr/sensorcommands.cpp b/dbus-sdr/sensorcommands.cpp
index 06d039a..c6a167f 100644
--- a/dbus-sdr/sensorcommands.cpp
+++ b/dbus-sdr/sensorcommands.cpp
@@ -695,8 +695,7 @@
{
return GENERAL_ERROR;
}
- data.header.record_id_msb = recordID >> 8;
- data.header.record_id_lsb = recordID & 0xFF;
+ data.header.recordId = recordID;
recordData.insert(recordData.end(), reinterpret_cast<uint8_t*>(&data),
reinterpret_cast<uint8_t*>(&data) + sizeof(data));
}
@@ -1778,12 +1777,10 @@
void constructSensorSdrHeaderKey(uint16_t sensorNum, uint16_t recordID,
get_sdr::SensorDataFullRecord& record)
{
- get_sdr::header::set_record_id(
- recordID, reinterpret_cast<get_sdr::SensorDataRecordHeader*>(&record));
-
uint8_t sensornumber = static_cast<uint8_t>(sensorNum);
uint8_t lun = static_cast<uint8_t>(sensorNum >> 8);
+ record.header.recordId = recordID;
record.header.sdr_version = ipmiSdrVersion;
record.header.record_type = get_sdr::SENSOR_DATA_FULL_RECORD;
record.header.record_length = sizeof(get_sdr::SensorDataFullRecord) -
@@ -2043,9 +2040,7 @@
uint8_t sensornumber = static_cast<uint8_t>(sensorNum);
uint8_t lun = static_cast<uint8_t>(sensorNum >> 8);
- get_sdr::header::set_record_id(
- recordID, reinterpret_cast<get_sdr::SensorDataRecordHeader*>(&record));
-
+ record.header.recordId = recordID;
record.header.sdr_version = ipmiSdrVersion;
record.header.record_type = get_sdr::SENSOR_DATA_EVENT_RECORD;
record.header.record_length = sizeof(get_sdr::SensorDataEventRecord) -
diff --git a/dbus-sdr/storagecommands.cpp b/dbus-sdr/storagecommands.cpp
index f0c43c3..e0e47e1 100644
--- a/dbus-sdr/storagecommands.cpp
+++ b/dbus-sdr/storagecommands.cpp
@@ -709,8 +709,7 @@
}
size_t sizeDiff = maxFruSdrNameSize - name.size();
- resp.header.record_id_lsb = 0x0; // calling code is to implement these
- resp.header.record_id_msb = 0x0;
+ resp.header.recordId = 0x0; // calling code is to implement these
resp.header.sdr_version = ipmiSdrVersion;
resp.header.record_type = get_sdr::SENSOR_DATA_FRU_RECORD;
resp.header.record_length = sizeof(resp.body) + sizeof(resp.key) - sizeDiff;
@@ -1199,8 +1198,8 @@
get_sdr::SensorDataEntityRecord data{};
/* Header */
- get_sdr::header::set_record_id(recordId, &(data.header));
// Based on IPMI Spec v2.0 rev 1.1
+ data.header.recordId = recordId;
data.header.sdr_version = SDR_VERSION;
data.header.record_type = 0x08;
data.header.record_length = sizeof(data.key) + sizeof(data.body);
diff --git a/include/dbus-sdr/storagecommands.hpp b/include/dbus-sdr/storagecommands.hpp
index 7a1fc92..bc9a275 100644
--- a/include/dbus-sdr/storagecommands.hpp
+++ b/include/dbus-sdr/storagecommands.hpp
@@ -104,7 +104,7 @@
deviceCapabilities(capabilities), reserved{}, entityID(eid),
entityInstance(entityInst), oem(mfrDefined)
{
- get_sdr::header::set_record_id(recordID, &header);
+ header.recordId = recordID;
header.sdr_version = ipmiSdrVersion;
header.record_type = 0x12;
size_t nameLen = std::min(sensorname.size(), sizeof(name));
diff --git a/sensorhandler.cpp b/sensorhandler.cpp
index a175f20..e641a93 100644
--- a/sensorhandler.cpp
+++ b/sensorhandler.cpp
@@ -1128,8 +1128,7 @@
}
ipmi::Cc populate_record_from_dbus(get_sdr::SensorDataFullRecordBody* body,
- const ipmi::sensor::Info* info,
- ipmi_data_len_t)
+ const ipmi::sensor::Info* info)
{
/* Functional sensor case */
if (isAnalogSensor(info->propertyInterfaces.begin()->first))
@@ -1166,27 +1165,24 @@
return ipmi::ccSuccess;
};
-ipmi::Cc ipmi_fru_get_sdr(ipmi_request_t request, ipmi_response_t response,
- ipmi_data_len_t data_len)
+ipmi::RspType<uint16_t, // nextRecordId
+ std::vector<uint8_t> // recordData
+ >
+ ipmiFruGetSdr(uint16_t recordID, uint8_t offset, uint8_t bytesToRead)
{
- auto req = reinterpret_cast<get_sdr::GetSdrReq*>(request);
- auto resp = reinterpret_cast<get_sdr::GetSdrResp*>(response);
- get_sdr::SensorDataFruRecord record{};
- auto dataLength = 0;
-
auto fru = frus.begin();
uint8_t fruID{};
- auto recordID = get_sdr::request::get_record_id(req);
fruID = recordID - FRU_RECORD_ID_START;
fru = frus.find(fruID);
if (fru == frus.end())
{
- return ipmi::ccSensorInvalid;
+ return ipmi::responseSensorInvalid();
}
+ get_sdr::SensorDataFruRecord record{};
/* Header */
- get_sdr::header::set_record_id(recordID, &(record.header));
+ record.header.recordId = recordID;
record.header.sdr_version = SDR_VERSION; // Based on IPMI Spec v2.0 rev 1.1
record.header.record_type = get_sdr::SENSOR_DATA_FRU_RECORD;
record.header.record_length = sizeof(record.key) + sizeof(record.body);
@@ -1217,6 +1213,7 @@
get_sdr::body::set_device_id_strlen(deviceID.length(), &(record.body));
}
+ uint16_t nextRecordId{};
strncpy(record.body.deviceID, deviceID.c_str(),
get_sdr::body::get_device_id_strlen(&(record.body)));
@@ -1227,60 +1224,53 @@
const auto& entityRecords =
ipmi::sensor::EntityInfoMapContainer::getContainer()
->getIpmiEntityRecords();
- auto next_record_id =
+ nextRecordId =
(entityRecords.size())
? entityRecords.begin()->first + ENTITY_RECORD_ID_START
: END_OF_RECORD;
- get_sdr::response::set_next_record_id(next_record_id, resp);
}
else
{
- get_sdr::response::set_next_record_id(
- (FRU_RECORD_ID_START + fru->first), resp);
+ nextRecordId = FRU_RECORD_ID_START + fru->first;
}
// Check for invalid offset size
- if (req->offset > sizeof(record))
+ if (offset > sizeof(record))
{
- return ipmi::ccParmOutOfRange;
+ return ipmi::responseParmOutOfRange();
}
- dataLength = std::min(static_cast<size_t>(req->bytes_to_read),
- sizeof(record) - req->offset);
+ size_t dataLen =
+ std::min(static_cast<size_t>(bytesToRead), sizeof(record) - offset);
- std::memcpy(resp->record_data,
- reinterpret_cast<uint8_t*>(&record) + req->offset, dataLength);
+ std::vector<uint8_t> recordData(dataLen);
+ std::memcpy(recordData.data(),
+ reinterpret_cast<const uint8_t*>(&record) + offset, dataLen);
- *data_len = dataLength;
- *data_len += 2; // additional 2 bytes for next record ID
-
- return ipmi::ccSuccess;
+ return ipmi::responseSuccess(nextRecordId, recordData);
}
-ipmi::Cc ipmi_entity_get_sdr(ipmi_request_t request, ipmi_response_t response,
- ipmi_data_len_t data_len)
+ipmi::RspType<uint16_t, // nextRecordId
+ std::vector<uint8_t> // recordData
+ >
+ ipmiEntityGetSdr(uint16_t recordID, uint8_t offset, uint8_t bytesToRead)
{
- auto req = reinterpret_cast<get_sdr::GetSdrReq*>(request);
- auto resp = reinterpret_cast<get_sdr::GetSdrResp*>(response);
- get_sdr::SensorDataEntityRecord record{};
- auto dataLength = 0;
-
const auto& entityRecords =
ipmi::sensor::EntityInfoMapContainer::getContainer()
->getIpmiEntityRecords();
auto entity = entityRecords.begin();
uint8_t entityRecordID;
- auto recordID = get_sdr::request::get_record_id(req);
entityRecordID = recordID - ENTITY_RECORD_ID_START;
entity = entityRecords.find(entityRecordID);
if (entity == entityRecords.end())
{
- return ipmi::ccSensorInvalid;
+ return ipmi::responseSensorInvalid();
}
+ get_sdr::SensorDataEntityRecord record{};
/* Header */
- get_sdr::header::set_record_id(recordID, &(record.header));
+ record.header.recordId = recordID;
record.header.sdr_version = SDR_VERSION; // Based on IPMI Spec v2.0 rev 1.1
record.header.record_type = get_sdr::SENSOR_DATA_ENTITY_RECORD;
record.header.record_length = sizeof(record.key) + sizeof(record.body);
@@ -1301,47 +1291,41 @@
record.body.entityId4 = entity->second.containedEntities[3].first;
record.body.entityInstance4 = entity->second.containedEntities[3].second;
+ uint16_t nextRecordId{};
if (++entity == entityRecords.end())
{
- get_sdr::response::set_next_record_id(END_OF_RECORD,
- resp); // last record
+ nextRecordId = END_OF_RECORD;
}
else
{
- get_sdr::response::set_next_record_id(
- (ENTITY_RECORD_ID_START + entity->first), resp);
+ nextRecordId = entity->first + ENTITY_RECORD_ID_START;
}
// Check for invalid offset size
- if (req->offset > sizeof(record))
+ if (offset > sizeof(record))
{
- return ipmi::ccParmOutOfRange;
+ return ipmi::responseParmOutOfRange();
}
- dataLength = std::min(static_cast<size_t>(req->bytes_to_read),
- sizeof(record) - req->offset);
+ size_t dataLen =
+ std::min(static_cast<size_t>(bytesToRead), sizeof(record) - offset);
- std::memcpy(resp->record_data,
- reinterpret_cast<uint8_t*>(&record) + req->offset, dataLength);
+ std::vector<uint8_t> recordData(dataLen);
+ std::memcpy(recordData.data(),
+ reinterpret_cast<const uint8_t*>(&record) + offset, dataLen);
- *data_len = dataLength;
- *data_len += 2; // additional 2 bytes for next record ID
-
- return ipmi::ccSuccess;
+ return ipmi::responseSuccess(nextRecordId, recordData);
}
-ipmi::Cc ipmi_sen_get_sdr(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, // nextRecordId
+ std::vector<uint8_t> // recordData
+ >
+ ipmiSensorGetSdr(uint16_t /* reservationId */, uint16_t recordID,
+ uint8_t offset, uint8_t bytesToRead)
{
- ipmi::Cc ret = ipmi::ccSuccess;
- get_sdr::GetSdrReq* req = (get_sdr::GetSdrReq*)request;
- get_sdr::GetSdrResp* resp = (get_sdr::GetSdrResp*)response;
-
// Note: we use an iterator so we can provide the next ID at the end of
// the call.
auto sensor = ipmi::sensor::sensors.begin();
- auto recordID = get_sdr::request::get_record_id(req);
// At the beginning of a scan, the host side will send us id=0.
if (recordID != 0)
@@ -1353,19 +1337,19 @@
// record, FRU record and Enttiy Association record.
if (recordID >= ENTITY_RECORD_ID_START)
{
- return ipmi_entity_get_sdr(request, response, data_len);
+ return ipmiEntityGetSdr(recordID, offset, bytesToRead);
}
else if (recordID >= FRU_RECORD_ID_START &&
recordID < ENTITY_RECORD_ID_START)
{
- return ipmi_fru_get_sdr(request, response, data_len);
+ return ipmiFruGetSdr(recordID, offset, bytesToRead);
}
else
{
sensor = ipmi::sensor::sensors.find(recordID);
if (sensor == ipmi::sensor::sensors.end())
{
- return ipmi::ccSensorInvalid;
+ return ipmi::responseSensorInvalid();
}
}
}
@@ -1377,7 +1361,7 @@
{
/* Header */
get_sdr::SensorDataFullRecord record = {};
- get_sdr::header::set_record_id(sensor_id, &(record.header));
+ record.header.recordId = sensor_id;
record.header.sdr_version = 0x51; // Based on IPMI Spec v2.0 rev 1.1
record.header.record_type = get_sdr::SENSOR_DATA_FULL_RECORD;
record.header.record_length = sizeof(record.key) + sizeof(record.body);
@@ -1398,46 +1382,38 @@
}
// Set the type-specific details given the DBus interface
- populate_record_from_dbus(&(record.body), &(sensor->second), data_len);
+ populate_record_from_dbus(&(record.body), &(sensor->second));
sdrCacheMap[sensor_id] = std::move(record);
}
+ uint16_t nextRecordId{};
const auto& record = sdrCacheMap[sensor_id];
if (++sensor == ipmi::sensor::sensors.end())
{
// we have reached till end of sensor, so assign the next record id
// to 256(Max Sensor ID = 255) + FRU ID(may start with 0).
- auto next_record_id = (frus.size())
- ? frus.begin()->first + FRU_RECORD_ID_START
- : END_OF_RECORD;
-
- get_sdr::response::set_next_record_id(next_record_id, resp);
+ nextRecordId = (frus.size()) ? frus.begin()->first + FRU_RECORD_ID_START
+ : END_OF_RECORD;
}
else
{
- get_sdr::response::set_next_record_id(sensor->first, resp);
+ nextRecordId = sensor->first;
}
- if (req->offset > sizeof(record))
+ if (offset > sizeof(record))
{
- return ipmi::ccParmOutOfRange;
+ return ipmi::responseParmOutOfRange();
}
- // data_len will ultimately be the size of the record, plus
- // the size of the next record ID:
- *data_len = std::min(static_cast<size_t>(req->bytes_to_read),
- sizeof(record) - req->offset);
+ size_t dataLen =
+ std::min(static_cast<size_t>(bytesToRead), sizeof(record) - offset);
- std::memcpy(resp->record_data,
- reinterpret_cast<const uint8_t*>(&record) + req->offset,
- *data_len);
+ std::vector<uint8_t> recordData(dataLen);
+ std::memcpy(recordData.data(),
+ reinterpret_cast<const uint8_t*>(&record) + offset, dataLen);
- // data_len should include the LSB and MSB:
- *data_len += sizeof(resp->next_record_id_lsb) +
- sizeof(resp->next_record_id_msb);
-
- return ret;
+ return ipmi::responseSuccess(nextRecordId, recordData);
}
static bool isFromSystemChannel()
@@ -1571,9 +1547,9 @@
ipmi::Privilege::User, ipmiSenSetSensorThresholds);
// <Get Device SDR>
- ipmi_register_callback(ipmi::netFnSensor,
- ipmi::sensor_event::cmdGetDeviceSdr, nullptr,
- ipmi_sen_get_sdr, PRIVILEGE_USER);
+ ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnSensor,
+ ipmi::sensor_event::cmdGetDeviceSdr,
+ ipmi::Privilege::User, ipmiSensorGetSdr);
#endif
diff --git a/sensorhandler.hpp b/sensorhandler.hpp
index 4881741..b67dfa6 100644
--- a/sensorhandler.hpp
+++ b/sensorhandler.hpp
@@ -74,9 +74,8 @@
int set_sensor_dbus_state_y(uint8_t, const char*, const uint8_t);
int find_openbmc_path(uint8_t, dbus_interface_t*);
-ipmi::Cc ipmi_sen_get_sdr(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
- ipmi_request_t request, ipmi_response_t response,
- ipmi_data_len_t data_len, ipmi_context_t context);
+ipmi::RspType<uint16_t, std::vector<uint8_t>> ipmiSensorGetSdr(
+ uint16_t, uint16_t, uint8_t, uint8_t);
ipmi::RspType<uint16_t> ipmiSensorReserveSdr();
@@ -92,71 +91,15 @@
namespace get_sdr
{
-struct GetSdrReq
-{
- uint8_t reservation_id_lsb;
- uint8_t reservation_id_msb;
- uint8_t record_id_lsb;
- uint8_t record_id_msb;
- uint8_t offset;
- uint8_t bytes_to_read;
-} __attribute__((packed));
-
-namespace request
-{
-
-inline uint16_t get_reservation_id(GetSdrReq* req)
-{
- return (req->reservation_id_lsb + (req->reservation_id_msb << 8));
-};
-
-inline uint16_t get_record_id(GetSdrReq* req)
-{
- return (req->record_id_lsb + (req->record_id_msb << 8));
-};
-
-} // namespace request
-
-// Response
-struct GetSdrResp
-{
- uint8_t next_record_id_lsb;
- uint8_t next_record_id_msb;
- uint8_t record_data[64];
-} __attribute__((packed));
-
-namespace response
-{
-
-inline void set_next_record_id(uint16_t next, GetSdrResp* resp)
-{
- resp->next_record_id_lsb = next & 0xff;
- resp->next_record_id_msb = (next >> 8) & 0xff;
-};
-
-} // namespace response
-
// Record header
struct SensorDataRecordHeader
{
- uint8_t record_id_lsb;
- uint8_t record_id_msb;
+ uint16_t recordId;
uint8_t sdr_version;
uint8_t record_type;
uint8_t record_length; // Length not counting the header
} __attribute__((packed));
-namespace header
-{
-
-inline void set_record_id(int id, SensorDataRecordHeader* hdr)
-{
- hdr->record_id_lsb = (id & 0xFF);
- hdr->record_id_msb = (id >> 8) & 0xFF;
-};
-
-} // namespace header
-
enum SensorDataRecordType
{
SENSOR_DATA_FULL_RECORD = 0x1,
diff --git a/storagehandler.cpp b/storagehandler.cpp
index c9cf08d..73ca05b 100644
--- a/storagehandler.cpp
+++ b/storagehandler.cpp
@@ -922,8 +922,9 @@
ipmi::Privilege::User, ipmiSensorReserveSdr);
// <Get SDR>
- ipmi_register_callback(ipmi::netFnStorage, ipmi::storage::cmdGetSdr,
- nullptr, ipmi_sen_get_sdr, PRIVILEGE_USER);
+ ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
+ ipmi::storage::cmdGetSdr, ipmi::Privilege::User,
+ ipmiSensorGetSdr);
#endif