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