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