fix sdr count when number > 255
- After PR-60906, it will count the fru data and type 12 sensors.
But when SDR count > 255, there are some problems.
- If the lun of cmd isn't 0, the start position of recordID need to be
updated.
- Using if condition to add type 12 sensors. Because if sensor number
+ fru device is 254, it will overflow after adding 2 type 12 sensors.
- The type of sdrCount is uint8, which means the maximum value is 255,
so it needs to break while loop if the count reaches 255.
refs:
https://gerrit.openbmc.org/c/openbmc/phosphor-host-ipmid/+/60906
TEST:
root@bmc:~# ipmitool sdr elist | wc -l
281 => 0x119
root@bmc:~# ipmitool sdr elist all | wc -l
295 => 0x127
Before:
root@bmc:~# ipmitool raw -l 0 0x04 0x20 0x00
ff 83 c8 56 a2 63
root@bmc:~# ipmitool raw -l 0 0x04 0x20 0x01 ERROR
27 83 c8 56 a2 63
=> count overflow
root@bmc:~# ipmitool raw -l 1 0x04 0x20 0x00
1a 83 c8 56 a2 63
root@bmc:~# ipmitool raw -l 1 0x04 0x20 0x01 ERROR
1c 83 c8 56 a2 63
=> doesn't count the fru data
After:
root@bmc:~# ipmitool raw -l 0 0x04 0x20 0x00
ff 83 3e 2c a3 63
root@bmc:~# ipmitool raw -l 0 0x04 0x20 0x01
ff 83 3e 2c a3 63
root@bmc:~# ipmitool raw -l 1 0x04 0x20 0x00
1a 83 3e 2c a3 63
root@bmc:~# ipmitool raw -l 1 0x04 0x20 0x01
28 83 3e 2c a3 63
If count < 255,
root@bmc:~# ipmitool sdr elist | wc -l
151
root@bmc:~# ipmitool sdr elist all | wc -l
165
root@bmc:~# ipmitool raw -l 0 0x04 0x20 0x00
97 81 f0 2b a2 63
root@bmc:~# ipmitool raw -l 0 0x04 0x20 0x01
a5 81 f0 2b a2 63
Signed-off-by: Harvey Wu <Harvey.Wu@quantatw.com>
Change-Id: Ic4645c82d85e154bea5dc7fdd6b54d1331e58c36
diff --git a/dbus-sdr/sensorcommands.cpp b/dbus-sdr/sensorcommands.cpp
index c57a1a2..ad81fd8 100644
--- a/dbus-sdr/sensorcommands.cpp
+++ b/dbus-sdr/sensorcommands.cpp
@@ -2190,6 +2190,15 @@
{
auto& ipmiDecoratorPaths = getIpmiDecoratorPaths(ctx);
+ if (ctx->lun == 1)
+ {
+ recordID += maxSensorsPerLUN;
+ }
+ else if (ctx->lun == 3)
+ {
+ recordID += maxSensorsPerLUN * 2;
+ }
+
// Count the number of Type 1 SDR entries assigned to the LUN
while (!getSensorDataRecord(
ctx, ipmiDecoratorPaths.value_or(std::unordered_set<std::string>()),
@@ -2223,12 +2232,19 @@
sdrCount++;
}
}
- else if (hdr->record_type == get_sdr::SENSOR_DATA_FRU_RECORD)
+ else if (hdr->record_type == get_sdr::SENSOR_DATA_FRU_RECORD ||
+ hdr->record_type == get_sdr::SENSOR_DATA_MGMT_CTRL_LOCATOR)
{
sdrCount++;
}
+
+ // Because response count data is 1 byte, so sdrCount need to avoid
+ // overflow.
+ if (sdrCount == maxSensorsPerLUN)
+ {
+ break;
+ }
}
- sdrCount += ipmi::storage::type12Count;
}
else if (count.value_or(0) == getSensorCount)
{
diff --git a/sensorhandler.hpp b/sensorhandler.hpp
index 43ed82f..357ade4 100644
--- a/sensorhandler.hpp
+++ b/sensorhandler.hpp
@@ -191,8 +191,9 @@
SENSOR_DATA_FULL_RECORD = 0x1,
SENSOR_DATA_COMPACT_RECORD = 0x2,
SENSOR_DATA_EVENT_RECORD = 0x3,
- SENSOR_DATA_FRU_RECORD = 0x11,
SENSOR_DATA_ENTITY_RECORD = 0x8,
+ SENSOR_DATA_FRU_RECORD = 0x11,
+ SENSOR_DATA_MGMT_CTRL_LOCATOR = 0x12,
};
// Record key