diff options
-rw-r--r-- | sensorhandler.cpp | 35 | ||||
-rw-r--r-- | sensorhandler.h | 49 |
2 files changed, 82 insertions, 2 deletions
diff --git a/sensorhandler.cpp b/sensorhandler.cpp index 71376d2..c1657da 100644 --- a/sensorhandler.cpp +++ b/sensorhandler.cpp @@ -664,6 +664,37 @@ ipmi_ret_t ipmi_sen_wildcard(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 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) +{ + auto resp = static_cast<get_sdr_info::GetSdrInfoResp*>(response); + if (request == nullptr || + get_sdr_info::request::get_count(request) == false) + { + // Get Sensor Count + resp->count = sensors.size(); + } + else + { + resp->count = 1; + } + + // 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; +} + void register_netfn_sen_functions() { @@ -687,5 +718,9 @@ void register_netfn_sen_functions() ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_GET_SENSOR_READING, NULL, ipmi_sen_get_sensor_reading, PRIVILEGE_USER); + // <Get SDR Info> + printf("Registering NetFn:[0x%X], Cmd:[0x%x]\n",NETFUN_SENSOR, IPMI_CMD_GET_SDR_INFO); + ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_GET_SDR_INFO, NULL, + ipmi_sen_get_sdr_info, PRIVILEGE_USER); return; } diff --git a/sensorhandler.h b/sensorhandler.h index cedb2e4..ef30779 100644 --- a/sensorhandler.h +++ b/sensorhandler.h @@ -6,9 +6,10 @@ // IPMI commands for net functions. enum ipmi_netfn_sen_cmds { + IPMI_CMD_GET_SDR_INFO = 0x20, IPMI_CMD_GET_SENSOR_READING = 0x2D, - IPMI_CMD_GET_SENSOR_TYPE = 0x2F, - IPMI_CMD_SET_SENSOR = 0x30, + IPMI_CMD_GET_SENSOR_TYPE = 0x2F, + IPMI_CMD_SET_SENSOR = 0x30, }; // Discrete sensor types. @@ -53,4 +54,48 @@ struct SetSensorReadingReq uint8_t eventData3; } __attribute__((packed)); +/** + * Get SDR Info + */ + +namespace get_sdr_info +{ +namespace request +{ +// Note: for some reason the ipmi_request_t appears to be the +// raw value for this call. +inline bool get_count(void* req) +{ + 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 #endif |