Sensorhandler: move get SDR info & reserve SDR to new API
Rewrite "Get SDR info and Reserve SDR" command to
use the newly introduced IPMI provider API.
Tested:
verified using ipmitool sensor commands.
a. get SDR info
Command: ipmitool raw 0x04 0x20 0x01
Output: 02 01
Command: ipmitool raw 0x04 0x20 0x00
Output: 00 01
b. reserve sdr
Command: ipmitool raw 0x04 0x22
Output: 01 00
Signed-off-by: jayaprakash Mutyala <mutyalax.jayaprakash@intel.com>
Change-Id: Id1d7015cec45c5524210033e4210c710da27e9ae
Signed-off-by: jayaprakash Mutyala <mutyalax.jayaprakash@intel.com>
diff --git a/sensorhandler.cpp b/sensorhandler.cpp
index 4c0fe01..f649ce7 100644
--- a/sensorhandler.cpp
+++ b/sensorhandler.cpp
@@ -552,50 +552,52 @@
return rc;
}
-ipmi_ret_t ipmi_sen_get_sdr_info(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)
+/** @brief implements the get SDR Info command
+ * @param count - Operation
+ *
+ * @returns IPMI completion code plus response data
+ * - sdrCount - sensor/SDR count
+ * - lunsAndDynamicPopulation - static/Dynamic sensor population flag
+ */
+ipmi::RspType<uint8_t, // respcount
+ uint8_t // dynamic population flags
+ >
+ ipmiSensorGetDeviceSdrInfo(std::optional<uint8_t> count)
{
- auto resp = static_cast<get_sdr_info::GetSdrInfoResp*>(response);
- if (request == nullptr ||
- get_sdr_info::request::get_count(request) == false)
+ uint8_t sdrCount;
+ // multiple LUNs not supported.
+ constexpr uint8_t lunsAndDynamicPopulation = 1;
+ constexpr uint8_t getSdrCount = 0x01;
+ constexpr uint8_t getSensorCount = 0x00;
+
+ if (count.value_or(0) == getSdrCount)
{
- // Get Sensor Count
- resp->count = sensors.size() + frus.size() + entities.size();
+ // Get SDR count. This returns the total number of SDRs in the device.
+ sdrCount = sensors.size() + frus.size() + entities.size();
+ }
+ else if (count.value_or(0) == getSensorCount)
+ {
+ // Get Sensor count. This returns the number of sensors
+ sdrCount = sensors.size();
}
else
{
- resp->count = 1;
+ return ipmi::responseInvalidCommandOnLun();
}
- // Multiple LUNs not supported.
- namespace response = get_sdr_info::response;
- response::set_lun_present(0, &(resp->luns_and_dynamic_population));
- response::set_lun_not_present(1, &(resp->luns_and_dynamic_population));
- response::set_lun_not_present(2, &(resp->luns_and_dynamic_population));
- response::set_lun_not_present(3, &(resp->luns_and_dynamic_population));
- response::set_static_population(&(resp->luns_and_dynamic_population));
-
- *data_len = SDR_INFO_RESP_SIZE;
-
- return IPMI_CC_OK;
+ return ipmi::responseSuccess(sdrCount, lunsAndDynamicPopulation);
}
-ipmi_ret_t ipmi_sen_reserve_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)
+/** @brief implements the reserve SDR command
+ * @returns IPMI completion code plus response data
+ * - reservationID - reservation ID
+ */
+ipmi::RspType<uint16_t> ipmiSensorReserveSdr()
{
// A constant reservation ID is okay until we implement add/remove SDR.
- const uint16_t reservation_id = 1;
- *(uint16_t*)response = reservation_id;
- *data_len = sizeof(uint16_t);
+ constexpr uint16_t reservationID = 1;
- printf("Created new IPMI SDR reservation ID %d\n", *(uint16_t*)response);
- return IPMI_CC_OK;
+ return ipmi::responseSuccess(reservationID);
}
void setUnitFieldsForObject(const ipmi::sensor::Info* info,
@@ -1055,12 +1057,14 @@
ipmi_sen_get_sensor_reading, PRIVILEGE_USER);
// <Reserve Device SDR Repository>
- ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_RESERVE_DEVICE_SDR_REPO,
- nullptr, ipmi_sen_reserve_sdr, PRIVILEGE_USER);
+ ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnSensor,
+ ipmi::sensor_event::cmdReserveDeviceSdrRepository,
+ ipmi::Privilege::User, ipmiSensorReserveSdr);
// <Get Device SDR Info>
- ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_GET_DEVICE_SDR_INFO, nullptr,
- ipmi_sen_get_sdr_info, PRIVILEGE_USER);
+ ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnSensor,
+ ipmi::sensor_event::cmdGetDeviceSdrInfo,
+ ipmi::Privilege::User, ipmiSensorGetDeviceSdrInfo);
// <Get Device SDR>
ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_GET_DEVICE_SDR, nullptr,
diff --git a/sensorhandler.hpp b/sensorhandler.hpp
index 64cfa0e..56a7021 100644
--- a/sensorhandler.hpp
+++ b/sensorhandler.hpp
@@ -79,11 +79,7 @@
ipmi_request_t request, ipmi_response_t response,
ipmi_data_len_t data_len, ipmi_context_t context);
-ipmi_ret_t ipmi_sen_reserve_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> ipmiSensorReserveSdr();
static const uint16_t FRU_RECORD_ID_START = 256;
static const uint16_t ENTITY_RECORD_ID_START = 512;
@@ -106,34 +102,6 @@
return (bool)((uint64_t)(req)&1);
}
} // namespace request
-
-namespace response
-{
-#define SDR_INFO_RESP_SIZE 2
-inline void set_lun_present(int lun, uint8_t* resp)
-{
- *resp |= 1 << lun;
-}
-inline void set_lun_not_present(int lun, uint8_t* resp)
-{
- *resp &= ~(1 << lun);
-}
-inline void set_dynamic_population(uint8_t* resp)
-{
- *resp |= 1 << 7;
-}
-inline void set_static_population(uint8_t* resp)
-{
- *resp &= ~(1 << 7);
-}
-} // namespace response
-
-struct GetSdrInfoResp
-{
- uint8_t count;
- uint8_t luns_and_dynamic_population;
-};
-
} // namespace get_sdr_info
/**
diff --git a/storagehandler.cpp b/storagehandler.cpp
index 8bfde05..0932f72 100644
--- a/storagehandler.cpp
+++ b/storagehandler.cpp
@@ -791,8 +791,9 @@
ipmi::Privilege::User, ipmiGetRepositoryInfo);
// <Reserve SDR Repository>
- ipmi_register_callback(NETFUN_STORAGE, IPMI_CMD_RESERVE_SDR, nullptr,
- ipmi_sen_reserve_sdr, PRIVILEGE_USER);
+ ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
+ ipmi::storage::cmdReserveSdrRepository,
+ ipmi::Privilege::User, ipmiSensorReserveSdr);
// <Get SDR>
ipmi_register_callback(NETFUN_STORAGE, IPMI_CMD_GET_SDR, nullptr,