pldm: Refector PDR repo based on the new PDR APIs
The related APIs for PDR operations is implemented in
pldm/libpldm/pdr.h and pldm/libpldm/pdr.c, we need to use this instead
of pdr::Repo(defined in libpldmresponder/pdr.hpp).
pdr::Repo is now a C++ wrapper around the PDR APIs in libpldm.
Tested with unit tests, with JSON files:
https://gist.github.com/lxwinspur/2c3fd68cdb35e06480c4a5f7890e3a06#file-effecter_pdr-json.
$ pldmtool platform GetPDR -d 0
Encode request successfully
Request Message:
08 01 80 02 51 00 00 00 00 00 00 00 00 01 80 00 00 00
Success in creating the socket : RC = 3
Success in connecting to socket : RC = 0
Success in sending message type as pldm to mctp : RC = 0
Write to socket successful : RC = 18
Total length:18
Loopback response message:
08 01 80 02 51 00 00 00 00 00 00 00 00 01 80 00 00 00
On first recv(),response == request : RC = 0
Total length: 46
Shutdown Socket successful : RC = 0
Response Message:
08 01 00 02 51 00 02 00 00 00 00 00 00 00 01 1d 00 01 00 00 00 01 0b 00 00 13 00 00 00 01 00 21 00 00 00 00 00 00 00 00 00 01 c4 00 01 06
Parsed Response Msg:
nextRecordHandle: 2
responseCount: 29
recordHandle: 1
PDRHeaderVersion: 1
PDRType: 11
recordChangeNumber: 0
dataLength: 19
PLDMTerminusHandle: 0
effecterID: 1
entityType: 33
entityInstanceNumber: 0
containerID: 0
effecterSemanticID: 0
effecterInit: 0
effecterDescriptionPDR: false
compositeEffecterCount: 1
stateSetID: 196
possibleStatesSize: 1
possibleStates: 6
Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I0c41f888b2e36a5a49968dff190ad8d53255b9ed
diff --git a/libpldmresponder/platform.cpp b/libpldmresponder/platform.cpp
index 3f93ff4..4d297f0 100644
--- a/libpldmresponder/platform.cpp
+++ b/libpldmresponder/platform.cpp
@@ -36,41 +36,40 @@
return CmdHandler::ccOnlyResponse(request, rc);
}
- uint32_t nextRecordHandle{};
uint16_t respSizeBytes{};
uint8_t* recordData = nullptr;
try
{
- pdr::Repo& pdrRepo = pdr::get(PDR_JSONS_DIR);
- nextRecordHandle = pdrRepo.getNextRecordHandle(recordHandle);
- pdr::Entry e;
+ pdr_utils::RepoInterface& pdrRepo = pdr::getRepo(PDR_JSONS_DIR);
+ pdr_utils::PdrEntry e;
+ auto record = pdr::getRecordByHandle(pdrRepo, recordHandle, e);
+ if (record == NULL)
+ {
+ return CmdHandler::ccOnlyResponse(
+ request, PLDM_PLATFORM_INVALID_RECORD_HANDLE);
+ }
+
if (reqSizeBytes)
{
- e = pdrRepo.at(recordHandle);
- respSizeBytes = e.size();
+ respSizeBytes = e.size;
if (respSizeBytes > reqSizeBytes)
{
respSizeBytes = reqSizeBytes;
}
- recordData = e.data();
+ recordData = e.data;
}
response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES +
respSizeBytes,
0);
responsePtr = reinterpret_cast<pldm_msg*>(response.data());
rc = encode_get_pdr_resp(request->hdr.instance_id, PLDM_SUCCESS,
- nextRecordHandle, 0, PLDM_START, respSizeBytes,
- recordData, 0, responsePtr);
+ e.handle.nextRecordHandle, 0, PLDM_START,
+ respSizeBytes, recordData, 0, responsePtr);
if (rc != PLDM_SUCCESS)
{
return ccOnlyResponse(request, rc);
}
}
- catch (const std::out_of_range& e)
- {
- return CmdHandler::ccOnlyResponse(request,
- PLDM_PLATFORM_INVALID_RECORD_HANDLE);
- }
catch (const std::exception& e)
{
std::cerr << "Error accessing PDR, HANDLE=" << recordHandle