summaryrefslogtreecommitdiffstats
path: root/ipmi_fru_info_area.cpp
diff options
context:
space:
mode:
authorRatan Gupta <ratagupt@in.ibm.com>2018-01-31 21:26:25 +0530
committerRatan Gupta <ratagupt@in.ibm.com>2018-02-13 10:59:45 +0530
commit2f66f00ed7889499e85eb44a2f73c003d25092bf (patch)
tree9d296dfa232cae2f64a34ccd08c5624c5464f42c /ipmi_fru_info_area.cpp
parent2848d604715df6eb9f7f943b6a5d97ec3d7fddb7 (diff)
downloadphosphor-host-ipmid-2f66f00ed7889499e85eb44a2f73c003d25092bf.tar.gz
phosphor-host-ipmid-2f66f00ed7889499e85eb44a2f73c003d25092bf.zip
FRU: Fix the area offset calculation of Read FRU Data response
Common header contains the offset of areas This commit fixes the offset calculation. Change-Id: Iba002d1832063a329df43834d4e30d359ecaf7b0 Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
Diffstat (limited to 'ipmi_fru_info_area.cpp')
-rw-r--r--ipmi_fru_info_area.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/ipmi_fru_info_area.cpp b/ipmi_fru_info_area.cpp
index 3472f42..24b8f0b 100644
--- a/ipmi_fru_info_area.cpp
+++ b/ipmi_fru_info_area.cpp
@@ -95,7 +95,7 @@ void postFormatProcessing(FruAreaData& data)
data.at(areaSizeOffset) = (data.size() + checksumSize) /
(recordUnitOfMeasurment);
- //Finally add board info checksum
+ //Finally add area checksum
appendDataChecksum(data);
}
@@ -165,7 +165,7 @@ void appendMfgDate(const PropertyMap& propMap, FruAreaData& data)
* @param[in/out] data Common Header section data container
*/
void buildCommonHeaderSection(
- const uint32_t& infoAreaSize, uint32_t& offset, FruAreaData& data)
+ const uint32_t& infoAreaSize, uint16_t& offset, FruAreaData& data)
{
//Check if data for internal use section populated
if (infoAreaSize == 0)
@@ -175,9 +175,14 @@ void buildCommonHeaderSection(
}
else
{
+ // offset should be multiple of 8.
+ auto remainder = offset % recordUnitOfMeasurment;
+ // add the padding bytes in the offset so that offset
+ // will be multiple of 8 byte.
+ offset += (remainder > 0) ? recordUnitOfMeasurment - remainder : 0;
//Place data to define offset to area data section
- data.emplace_back((offset + commonHeaderFormatSize)
- / recordUnitOfMeasurment);
+ data.emplace_back(offset / recordUnitOfMeasurment);
+
offset += infoAreaSize;
}
}
@@ -304,12 +309,11 @@ FruAreaData buildProductInfoArea(const PropertyMap& propMap)
FruAreaData buildFruAreaData(const FruInventoryData& inventory)
{
- FruAreaData combFruArea;
+ FruAreaData combFruArea{};
//Now build common header with data for this FRU Inv Record
//Use this variable to increment size of header as we go along to determine
//offset for the subsequent area offsets
- uint32_t curDataOffset = 0;
-
+ uint16_t curDataOffset = commonHeaderFormatSize;
//First byte is id for version of FRU Info Storage Spec used
combFruArea.emplace_back(specVersion);
@@ -323,6 +327,7 @@ FruAreaData buildFruAreaData(const FruInventoryData& inventory)
{
chassisArea = std::move(buildChassisInfoArea(chassisIt->second));
}
+ // update the offset to chassis data.
buildCommonHeaderSection(chassisArea.size(), curDataOffset, combFruArea);
//4th byte is offset to board data
@@ -332,6 +337,8 @@ FruAreaData buildFruAreaData(const FruInventoryData& inventory)
{
boardArea = std::move(buildBoardInfoArea(boardIt->second));
}
+ // update the offset to the board data.
+ buildCommonHeaderSection(boardArea.size(), curDataOffset, combFruArea);
//5th byte is offset to product data
FruAreaData prodArea;
@@ -340,13 +347,14 @@ FruAreaData buildFruAreaData(const FruInventoryData& inventory)
{
prodArea = std::move(buildProductInfoArea(prodIt->second));
}
+ // update the offset to the product data.
buildCommonHeaderSection(prodArea.size(), curDataOffset, combFruArea);
//6th byte is offset to multirecord data
combFruArea.emplace_back(recordNotPresent);
//7th byte is PAD
- padData(combFruArea);
+ combFruArea.emplace_back(recordNotPresent);
//8th (Final byte of Header Format) is the checksum
appendDataChecksum(combFruArea);
OpenPOWER on IntegriCloud