blob: 5fa14c889fbeaaec34830e29efbbf7a3c0b54211 [file] [log] [blame]
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05301#include "config.h"
2
3#include "platform.hpp"
4
5#include "pdr.hpp"
6
7#include <exception>
8#include <phosphor-logging/log.hpp>
9
10namespace pldm
11{
12
13namespace responder
14{
15
16using namespace phosphor::logging;
17
18Response getPDR(const pldm_msg* request, size_t payloadLength)
19{
20 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES, 0);
21 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
22
23 if (payloadLength != PLDM_GET_PDR_REQ_BYTES)
24 {
25 encode_get_pdr_resp(request->hdr.instance_id, PLDM_ERROR_INVALID_LENGTH,
26 0, 0, 0, 0, nullptr, 0, responsePtr);
27 return response;
28 }
29
30 uint32_t recordHandle{};
31 uint32_t dataTransferHandle{};
32 uint8_t transferOpFlag{};
33 uint16_t reqSizeBytes{};
34 uint16_t recordChangeNum{};
35
36 decode_get_pdr_req(request, payloadLength, &recordHandle,
37 &dataTransferHandle, &transferOpFlag, &reqSizeBytes,
38 &recordChangeNum);
39
40 uint32_t nextRecordHandle{};
41 uint16_t respSizeBytes{};
42 uint8_t* recordData = nullptr;
43 try
44 {
45 pdr::Repo& pdrRepo = pdr::get(PDR_JSONS_DIR);
46 nextRecordHandle = pdrRepo.getNextRecordHandle(recordHandle);
47 pdr::Entry e;
48 if (reqSizeBytes)
49 {
50 e = pdrRepo.at(recordHandle);
51 respSizeBytes = e.size();
52 if (respSizeBytes > reqSizeBytes)
53 {
54 respSizeBytes = reqSizeBytes;
55 }
56 recordData = e.data();
57 }
58 response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES +
59 respSizeBytes,
60 0);
61 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
62 encode_get_pdr_resp(request->hdr.instance_id, PLDM_SUCCESS,
63 nextRecordHandle, 0, PLDM_START, respSizeBytes,
64 recordData, 0, responsePtr);
65 }
66 catch (const std::out_of_range& e)
67 {
68 encode_get_pdr_resp(request->hdr.instance_id,
69 PLDM_PLATFORM_INVALID_RECORD_HANDLE,
70 nextRecordHandle, 0, PLDM_START, respSizeBytes,
71 recordData, 0, responsePtr);
72 return response;
73 }
74 catch (const std::exception& e)
75 {
76 log<level::ERR>("Error accessing PDR", entry("HANDLE=%d", recordHandle),
77 entry("ERROR=%s", e.what()));
78 encode_get_pdr_resp(request->hdr.instance_id, PLDM_ERROR,
79 nextRecordHandle, 0, PLDM_START, respSizeBytes,
80 recordData, 0, responsePtr);
81 return response;
82 }
83 return response;
84}
85
86} // namespace responder
87} // namespace pldm