1557dfb00SDeepak Kodihalli 
2557dfb00SDeepak Kodihalli #include "platform.hpp"
3557dfb00SDeepak Kodihalli 
483409573SGeorge Liu #include "utils.hpp"
583409573SGeorge Liu 
6557dfb00SDeepak Kodihalli namespace pldm
7557dfb00SDeepak Kodihalli {
8557dfb00SDeepak Kodihalli namespace responder
9557dfb00SDeepak Kodihalli {
10a2fa0709SSampa Misra namespace platform
11a2fa0709SSampa Misra {
12a2fa0709SSampa Misra 
13a2fa0709SSampa Misra using namespace pldm::responder::effecter::dbus_mapping;
14557dfb00SDeepak Kodihalli 
15bc669f1bSDeepak Kodihalli Response Handler::getPDR(const pldm_msg* request, size_t payloadLength)
16557dfb00SDeepak Kodihalli {
17557dfb00SDeepak Kodihalli     Response response(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES, 0);
18557dfb00SDeepak Kodihalli     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
19557dfb00SDeepak Kodihalli 
20557dfb00SDeepak Kodihalli     if (payloadLength != PLDM_GET_PDR_REQ_BYTES)
21557dfb00SDeepak Kodihalli     {
22*fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
23557dfb00SDeepak Kodihalli     }
24557dfb00SDeepak Kodihalli 
25557dfb00SDeepak Kodihalli     uint32_t recordHandle{};
26557dfb00SDeepak Kodihalli     uint32_t dataTransferHandle{};
27557dfb00SDeepak Kodihalli     uint8_t transferOpFlag{};
28557dfb00SDeepak Kodihalli     uint16_t reqSizeBytes{};
29557dfb00SDeepak Kodihalli     uint16_t recordChangeNum{};
30557dfb00SDeepak Kodihalli 
31*fb8611dcSGeorge Liu     auto rc = decode_get_pdr_req(request, payloadLength, &recordHandle,
32*fb8611dcSGeorge Liu                                  &dataTransferHandle, &transferOpFlag,
33*fb8611dcSGeorge Liu                                  &reqSizeBytes, &recordChangeNum);
34*fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
35*fb8611dcSGeorge Liu     {
36*fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
37*fb8611dcSGeorge Liu     }
38557dfb00SDeepak Kodihalli 
39557dfb00SDeepak Kodihalli     uint32_t nextRecordHandle{};
40557dfb00SDeepak Kodihalli     uint16_t respSizeBytes{};
41557dfb00SDeepak Kodihalli     uint8_t* recordData = nullptr;
42557dfb00SDeepak Kodihalli     try
43557dfb00SDeepak Kodihalli     {
44557dfb00SDeepak Kodihalli         pdr::Repo& pdrRepo = pdr::get(PDR_JSONS_DIR);
45557dfb00SDeepak Kodihalli         nextRecordHandle = pdrRepo.getNextRecordHandle(recordHandle);
46557dfb00SDeepak Kodihalli         pdr::Entry e;
47557dfb00SDeepak Kodihalli         if (reqSizeBytes)
48557dfb00SDeepak Kodihalli         {
49557dfb00SDeepak Kodihalli             e = pdrRepo.at(recordHandle);
50557dfb00SDeepak Kodihalli             respSizeBytes = e.size();
51557dfb00SDeepak Kodihalli             if (respSizeBytes > reqSizeBytes)
52557dfb00SDeepak Kodihalli             {
53557dfb00SDeepak Kodihalli                 respSizeBytes = reqSizeBytes;
54557dfb00SDeepak Kodihalli             }
55557dfb00SDeepak Kodihalli             recordData = e.data();
56557dfb00SDeepak Kodihalli         }
57557dfb00SDeepak Kodihalli         response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES +
58557dfb00SDeepak Kodihalli                             respSizeBytes,
59557dfb00SDeepak Kodihalli                         0);
60557dfb00SDeepak Kodihalli         responsePtr = reinterpret_cast<pldm_msg*>(response.data());
61*fb8611dcSGeorge Liu         rc = encode_get_pdr_resp(request->hdr.instance_id, PLDM_SUCCESS,
62557dfb00SDeepak Kodihalli                                  nextRecordHandle, 0, PLDM_START, respSizeBytes,
63557dfb00SDeepak Kodihalli                                  recordData, 0, responsePtr);
64*fb8611dcSGeorge Liu         if (rc != PLDM_SUCCESS)
65*fb8611dcSGeorge Liu         {
66*fb8611dcSGeorge Liu             return ccOnlyResponse(request, rc);
67*fb8611dcSGeorge Liu         }
68557dfb00SDeepak Kodihalli     }
69557dfb00SDeepak Kodihalli     catch (const std::out_of_range& e)
70557dfb00SDeepak Kodihalli     {
71*fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request,
72*fb8611dcSGeorge Liu                                           PLDM_PLATFORM_INVALID_RECORD_HANDLE);
73557dfb00SDeepak Kodihalli     }
74557dfb00SDeepak Kodihalli     catch (const std::exception& e)
75557dfb00SDeepak Kodihalli     {
76aa8ae72fSSampa Misra         std::cerr << "Error accessing PDR, HANDLE=" << recordHandle
77aa8ae72fSSampa Misra                   << " ERROR=" << e.what() << "\n";
78*fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR);
79557dfb00SDeepak Kodihalli     }
80557dfb00SDeepak Kodihalli     return response;
81557dfb00SDeepak Kodihalli }
82557dfb00SDeepak Kodihalli 
83bc669f1bSDeepak Kodihalli Response Handler::setStateEffecterStates(const pldm_msg* request,
84bc669f1bSDeepak Kodihalli                                          size_t payloadLength)
85a2fa0709SSampa Misra {
86a2fa0709SSampa Misra     Response response(
87a2fa0709SSampa Misra         sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES, 0);
88a2fa0709SSampa Misra     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
89a2fa0709SSampa Misra     uint16_t effecterId;
90a2fa0709SSampa Misra     uint8_t compEffecterCnt;
91a2fa0709SSampa Misra     constexpr auto maxCompositeEffecterCnt = 8;
92a2fa0709SSampa Misra     std::vector<set_effecter_state_field> stateField(maxCompositeEffecterCnt,
93a2fa0709SSampa Misra                                                      {0, 0});
94a2fa0709SSampa Misra 
95a2fa0709SSampa Misra     if ((payloadLength > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) ||
96a2fa0709SSampa Misra         (payloadLength < sizeof(effecterId) + sizeof(compEffecterCnt) +
97a2fa0709SSampa Misra                              sizeof(set_effecter_state_field)))
98a2fa0709SSampa Misra     {
99*fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
100a2fa0709SSampa Misra     }
101a2fa0709SSampa Misra 
102a2fa0709SSampa Misra     int rc = decode_set_state_effecter_states_req(request, payloadLength,
103a2fa0709SSampa Misra                                                   &effecterId, &compEffecterCnt,
104a2fa0709SSampa Misra                                                   stateField.data());
105a2fa0709SSampa Misra 
106*fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
107a2fa0709SSampa Misra     {
108*fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
109*fb8611dcSGeorge Liu     }
11083409573SGeorge Liu 
111*fb8611dcSGeorge Liu     stateField.resize(compEffecterCnt);
11283409573SGeorge Liu     const pldm::utils::DBusHandler dBusIntf;
11383409573SGeorge Liu     rc = setStateEffecterStatesHandler<pldm::utils::DBusHandler>(
11483409573SGeorge Liu         dBusIntf, effecterId, stateField);
115*fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
116*fb8611dcSGeorge Liu     {
117*fb8611dcSGeorge Liu         return CmdHandler::ccOnlyResponse(request, rc);
118a2fa0709SSampa Misra     }
119a2fa0709SSampa Misra 
120*fb8611dcSGeorge Liu     rc = encode_set_state_effecter_states_resp(request->hdr.instance_id, rc,
121a2fa0709SSampa Misra                                                responsePtr);
122*fb8611dcSGeorge Liu     if (rc != PLDM_SUCCESS)
123*fb8611dcSGeorge Liu     {
124*fb8611dcSGeorge Liu         return ccOnlyResponse(request, rc);
125*fb8611dcSGeorge Liu     }
126*fb8611dcSGeorge Liu 
127a2fa0709SSampa Misra     return response;
128a2fa0709SSampa Misra }
129a2fa0709SSampa Misra 
130bc669f1bSDeepak Kodihalli } // namespace platform
131557dfb00SDeepak Kodihalli } // namespace responder
132557dfb00SDeepak Kodihalli } // namespace pldm
133