1557dfb00SDeepak Kodihalli 2557dfb00SDeepak Kodihalli #include "platform.hpp" 3557dfb00SDeepak Kodihalli 4aea5dde1SSampa Misra #include "libpldm/entity.h" 5aea5dde1SSampa Misra #include "libpldm/state_set.h" 6aea5dde1SSampa Misra 7b70a1964STom Joseph #include "common/types.hpp" 8d130e1a3SDeepak Kodihalli #include "common/utils.hpp" 9c4959c3cSTom Joseph #include "event_parser.hpp" 1012afe110SSampa Misra #include "pdr.hpp" 11456c9a2fSGeorge Liu #include "pdr_numeric_effecter.hpp" 12a2870726SGeorge Liu #include "pdr_state_effecter.hpp" 13adbe1726SGeorge Liu #include "pdr_state_sensor.hpp" 14362c18ddSGeorge Liu #include "pdr_utils.hpp" 15eccb0c56SGeorge Liu #include "platform_numeric_effecter.hpp" 160d7aca8cSGeorge Liu #include "platform_state_effecter.hpp" 17362c18ddSGeorge Liu #include "platform_state_sensor.hpp" 1883409573SGeorge Liu 195079ac4aSBrad Bishop using namespace pldm::utils; 205079ac4aSBrad Bishop using namespace pldm::responder::pdr; 215079ac4aSBrad Bishop using namespace pldm::responder::pdr_utils; 225079ac4aSBrad Bishop 23557dfb00SDeepak Kodihalli namespace pldm 24557dfb00SDeepak Kodihalli { 25557dfb00SDeepak Kodihalli namespace responder 26557dfb00SDeepak Kodihalli { 27a2fa0709SSampa Misra namespace platform 28a2fa0709SSampa Misra { 29a2fa0709SSampa Misra 30c682fe2dSDeepak Kodihalli using InternalFailure = 31c682fe2dSDeepak Kodihalli sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 32c682fe2dSDeepak Kodihalli 331ec85d4bSGeorge Liu static const Json empty{}; 341ec85d4bSGeorge Liu 35a2870726SGeorge Liu void Handler::addDbusObjMaps( 36adbe1726SGeorge Liu uint16_t id, 37adbe1726SGeorge Liu std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps> dbusObj, 38adbe1726SGeorge Liu TypeId typeId) 391ec85d4bSGeorge Liu { 40adbe1726SGeorge Liu if (typeId == TypeId::PLDM_SENSOR_ID) 41adbe1726SGeorge Liu { 42adbe1726SGeorge Liu sensorDbusObjMaps.emplace(id, dbusObj); 43adbe1726SGeorge Liu } 44adbe1726SGeorge Liu else 45adbe1726SGeorge Liu { 46adbe1726SGeorge Liu effecterDbusObjMaps.emplace(id, dbusObj); 47adbe1726SGeorge Liu } 481ec85d4bSGeorge Liu } 491ec85d4bSGeorge Liu 50a2870726SGeorge Liu const std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>& 51adbe1726SGeorge Liu Handler::getDbusObjMaps(uint16_t id, TypeId typeId) const 521ec85d4bSGeorge Liu { 53adbe1726SGeorge Liu if (typeId == TypeId::PLDM_SENSOR_ID) 54adbe1726SGeorge Liu { 55adbe1726SGeorge Liu return sensorDbusObjMaps.at(id); 56adbe1726SGeorge Liu } 57adbe1726SGeorge Liu else 58adbe1726SGeorge Liu { 59adbe1726SGeorge Liu return effecterDbusObjMaps.at(id); 60adbe1726SGeorge Liu } 611ec85d4bSGeorge Liu } 621ec85d4bSGeorge Liu 6336e81352SGeorge Liu void Handler::generate(const pldm::utils::DBusHandler& dBusIntf, 6436e81352SGeorge Liu const std::string& dir, Repo& repo) 65c682fe2dSDeepak Kodihalli { 66c6e49c4fSDeepak Kodihalli if (!fs::exists(dir)) 67c6e49c4fSDeepak Kodihalli { 68c6e49c4fSDeepak Kodihalli return; 69c6e49c4fSDeepak Kodihalli } 70c6e49c4fSDeepak Kodihalli 71c682fe2dSDeepak Kodihalli // A map of PDR type to a lambda that handles creation of that PDR type. 72c682fe2dSDeepak Kodihalli // The lambda essentially would parse the platform specific PDR JSONs to 73c682fe2dSDeepak Kodihalli // generate the PDR structures. This function iterates through the map to 74c682fe2dSDeepak Kodihalli // invoke all lambdas, so that all PDR types can be created. 75a2870726SGeorge Liu 76a2870726SGeorge Liu const std::map<Type, generatePDR> generateHandlers = { 77a2870726SGeorge Liu {PLDM_STATE_EFFECTER_PDR, 7836e81352SGeorge Liu [this](const DBusHandler& dBusIntf, const auto& json, 7936e81352SGeorge Liu RepoInterface& repo) { 8036e81352SGeorge Liu pdr_state_effecter::generateStateEffecterPDR< 8136e81352SGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this, 82a2870726SGeorge Liu repo); 83456c9a2fSGeorge Liu }}, 84456c9a2fSGeorge Liu {PLDM_NUMERIC_EFFECTER_PDR, 8536e81352SGeorge Liu [this](const DBusHandler& dBusIntf, const auto& json, 8636e81352SGeorge Liu RepoInterface& repo) { 8736e81352SGeorge Liu pdr_numeric_effecter::generateNumericEffecterPDR< 8836e81352SGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, json, *this, 8936e81352SGeorge Liu repo); 90adbe1726SGeorge Liu }}, 91adbe1726SGeorge Liu {PLDM_STATE_SENSOR_PDR, [this](const DBusHandler& dBusIntf, 92adbe1726SGeorge Liu const auto& json, RepoInterface& repo) { 93adbe1726SGeorge Liu pdr_state_sensor::generateStateSensorPDR<pldm::utils::DBusHandler, 94adbe1726SGeorge Liu Handler>(dBusIntf, json, 95adbe1726SGeorge Liu *this, repo); 96c682fe2dSDeepak Kodihalli }}}; 97c682fe2dSDeepak Kodihalli 98c682fe2dSDeepak Kodihalli Type pdrType{}; 99c682fe2dSDeepak Kodihalli for (const auto& dirEntry : fs::directory_iterator(dir)) 100c682fe2dSDeepak Kodihalli { 101c682fe2dSDeepak Kodihalli try 102c682fe2dSDeepak Kodihalli { 103c682fe2dSDeepak Kodihalli auto json = readJson(dirEntry.path().string()); 104c682fe2dSDeepak Kodihalli if (!json.empty()) 105c682fe2dSDeepak Kodihalli { 1061ec85d4bSGeorge Liu auto effecterPDRs = json.value("effecterPDRs", empty); 1071ec85d4bSGeorge Liu for (const auto& effecter : effecterPDRs) 1081ec85d4bSGeorge Liu { 1091ec85d4bSGeorge Liu pdrType = effecter.value("pdrType", 0); 11036e81352SGeorge Liu generateHandlers.at(pdrType)(dBusIntf, effecter, repo); 1111ec85d4bSGeorge Liu } 112adbe1726SGeorge Liu 113adbe1726SGeorge Liu auto sensorPDRs = json.value("sensorPDRs", empty); 114adbe1726SGeorge Liu for (const auto& sensor : sensorPDRs) 115adbe1726SGeorge Liu { 116adbe1726SGeorge Liu pdrType = sensor.value("pdrType", 0); 117adbe1726SGeorge Liu generateHandlers.at(pdrType)(dBusIntf, sensor, repo); 118adbe1726SGeorge Liu } 119c682fe2dSDeepak Kodihalli } 120c682fe2dSDeepak Kodihalli } 121c682fe2dSDeepak Kodihalli catch (const InternalFailure& e) 122c682fe2dSDeepak Kodihalli { 123c682fe2dSDeepak Kodihalli std::cerr << "PDR config directory does not exist or empty, TYPE= " 124c682fe2dSDeepak Kodihalli << pdrType << "PATH= " << dirEntry 125c682fe2dSDeepak Kodihalli << " ERROR=" << e.what() << "\n"; 126c682fe2dSDeepak Kodihalli } 127c682fe2dSDeepak Kodihalli catch (const Json::exception& e) 128c682fe2dSDeepak Kodihalli { 129c682fe2dSDeepak Kodihalli std::cerr << "Failed parsing PDR JSON file, TYPE= " << pdrType 130c682fe2dSDeepak Kodihalli << " ERROR=" << e.what() << "\n"; 131c682fe2dSDeepak Kodihalli pldm::utils::reportError( 132c682fe2dSDeepak Kodihalli "xyz.openbmc_project.bmc.pldm.InternalFailure"); 133c682fe2dSDeepak Kodihalli } 134c682fe2dSDeepak Kodihalli catch (const std::exception& e) 135c682fe2dSDeepak Kodihalli { 136c682fe2dSDeepak Kodihalli std::cerr << "Failed parsing PDR JSON file, TYPE= " << pdrType 137c682fe2dSDeepak Kodihalli << " ERROR=" << e.what() << "\n"; 138c682fe2dSDeepak Kodihalli pldm::utils::reportError( 139c682fe2dSDeepak Kodihalli "xyz.openbmc_project.bmc.pldm.InternalFailure"); 140c682fe2dSDeepak Kodihalli } 141c682fe2dSDeepak Kodihalli } 142c682fe2dSDeepak Kodihalli } 143557dfb00SDeepak Kodihalli 144bc669f1bSDeepak Kodihalli Response Handler::getPDR(const pldm_msg* request, size_t payloadLength) 145557dfb00SDeepak Kodihalli { 14633e9c7eaSTom Joseph // Build FRU table if not built, since entity association PDR's are built 14733e9c7eaSTom Joseph // when the FRU table is constructed. 14833e9c7eaSTom Joseph if (fruHandler) 14933e9c7eaSTom Joseph { 15033e9c7eaSTom Joseph fruHandler->buildFRUTable(); 15133e9c7eaSTom Joseph } 15233e9c7eaSTom Joseph 153d680ae03SGeorge Liu if (!pdrCreated) 154d680ae03SGeorge Liu { 155d680ae03SGeorge Liu generateTerminusLocatorPDR(pdrRepo); 156d680ae03SGeorge Liu generate(*dBusIntf, pdrJsonsDir, pdrRepo); 15778a225a2SSagar Srinivas if (oemPlatformHandler != nullptr) 15878a225a2SSagar Srinivas { 15978a225a2SSagar Srinivas oemPlatformHandler->buildOEMPDR(pdrRepo); 16078a225a2SSagar Srinivas } 16178a225a2SSagar Srinivas 162d680ae03SGeorge Liu pdrCreated = true; 1635eed8e55SGeorge Liu 1645eed8e55SGeorge Liu if (dbusToPLDMEventHandler) 1655eed8e55SGeorge Liu { 1665fb37d57SSampa Misra deferredGetPDREvent = std::make_unique<sdeventplus::source::Defer>( 1675fb37d57SSampa Misra event, 1685fb37d57SSampa Misra std::bind(std::mem_fn(&pldm::responder::platform::Handler:: 1695fb37d57SSampa Misra _processPostGetPDRActions), 1705fb37d57SSampa Misra this, std::placeholders::_1)); 1715eed8e55SGeorge Liu } 172d680ae03SGeorge Liu } 173d680ae03SGeorge Liu 174557dfb00SDeepak Kodihalli Response response(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES, 0); 175557dfb00SDeepak Kodihalli auto responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 176557dfb00SDeepak Kodihalli 177557dfb00SDeepak Kodihalli if (payloadLength != PLDM_GET_PDR_REQ_BYTES) 178557dfb00SDeepak Kodihalli { 179fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH); 180557dfb00SDeepak Kodihalli } 181557dfb00SDeepak Kodihalli 182557dfb00SDeepak Kodihalli uint32_t recordHandle{}; 183557dfb00SDeepak Kodihalli uint32_t dataTransferHandle{}; 184557dfb00SDeepak Kodihalli uint8_t transferOpFlag{}; 185557dfb00SDeepak Kodihalli uint16_t reqSizeBytes{}; 186557dfb00SDeepak Kodihalli uint16_t recordChangeNum{}; 187557dfb00SDeepak Kodihalli 188fb8611dcSGeorge Liu auto rc = decode_get_pdr_req(request, payloadLength, &recordHandle, 189fb8611dcSGeorge Liu &dataTransferHandle, &transferOpFlag, 190fb8611dcSGeorge Liu &reqSizeBytes, &recordChangeNum); 191fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 192fb8611dcSGeorge Liu { 193fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc); 194fb8611dcSGeorge Liu } 195557dfb00SDeepak Kodihalli 196557dfb00SDeepak Kodihalli uint16_t respSizeBytes{}; 197557dfb00SDeepak Kodihalli uint8_t* recordData = nullptr; 198557dfb00SDeepak Kodihalli try 199557dfb00SDeepak Kodihalli { 200e53193faSGeorge Liu pdr_utils::PdrEntry e; 201e53193faSGeorge Liu auto record = pdr::getRecordByHandle(pdrRepo, recordHandle, e); 202e53193faSGeorge Liu if (record == NULL) 203e53193faSGeorge Liu { 204e53193faSGeorge Liu return CmdHandler::ccOnlyResponse( 205e53193faSGeorge Liu request, PLDM_PLATFORM_INVALID_RECORD_HANDLE); 206e53193faSGeorge Liu } 207e53193faSGeorge Liu 208557dfb00SDeepak Kodihalli if (reqSizeBytes) 209557dfb00SDeepak Kodihalli { 210e53193faSGeorge Liu respSizeBytes = e.size; 211557dfb00SDeepak Kodihalli if (respSizeBytes > reqSizeBytes) 212557dfb00SDeepak Kodihalli { 213557dfb00SDeepak Kodihalli respSizeBytes = reqSizeBytes; 214557dfb00SDeepak Kodihalli } 215e53193faSGeorge Liu recordData = e.data; 216557dfb00SDeepak Kodihalli } 217557dfb00SDeepak Kodihalli response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES + 218557dfb00SDeepak Kodihalli respSizeBytes, 219557dfb00SDeepak Kodihalli 0); 220557dfb00SDeepak Kodihalli responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 22122b5a7d7SDeepak Kodihalli rc = encode_get_pdr_resp( 22222b5a7d7SDeepak Kodihalli request->hdr.instance_id, PLDM_SUCCESS, e.handle.nextRecordHandle, 22322b5a7d7SDeepak Kodihalli 0, PLDM_START_AND_END, respSizeBytes, recordData, 0, responsePtr); 224fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 225fb8611dcSGeorge Liu { 226fb8611dcSGeorge Liu return ccOnlyResponse(request, rc); 227fb8611dcSGeorge Liu } 228557dfb00SDeepak Kodihalli } 229557dfb00SDeepak Kodihalli catch (const std::exception& e) 230557dfb00SDeepak Kodihalli { 231aa8ae72fSSampa Misra std::cerr << "Error accessing PDR, HANDLE=" << recordHandle 232aa8ae72fSSampa Misra << " ERROR=" << e.what() << "\n"; 233fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR); 234557dfb00SDeepak Kodihalli } 235557dfb00SDeepak Kodihalli return response; 236557dfb00SDeepak Kodihalli } 237557dfb00SDeepak Kodihalli 238bc669f1bSDeepak Kodihalli Response Handler::setStateEffecterStates(const pldm_msg* request, 239bc669f1bSDeepak Kodihalli size_t payloadLength) 240a2fa0709SSampa Misra { 241a2fa0709SSampa Misra Response response( 242a2fa0709SSampa Misra sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES, 0); 243a2fa0709SSampa Misra auto responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 244a2fa0709SSampa Misra uint16_t effecterId; 245a2fa0709SSampa Misra uint8_t compEffecterCnt; 246a2fa0709SSampa Misra constexpr auto maxCompositeEffecterCnt = 8; 247a2fa0709SSampa Misra std::vector<set_effecter_state_field> stateField(maxCompositeEffecterCnt, 248a2fa0709SSampa Misra {0, 0}); 249a2fa0709SSampa Misra 250a2fa0709SSampa Misra if ((payloadLength > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) || 251a2fa0709SSampa Misra (payloadLength < sizeof(effecterId) + sizeof(compEffecterCnt) + 252a2fa0709SSampa Misra sizeof(set_effecter_state_field))) 253a2fa0709SSampa Misra { 254fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH); 255a2fa0709SSampa Misra } 256a2fa0709SSampa Misra 257a2fa0709SSampa Misra int rc = decode_set_state_effecter_states_req(request, payloadLength, 258a2fa0709SSampa Misra &effecterId, &compEffecterCnt, 259a2fa0709SSampa Misra stateField.data()); 260a2fa0709SSampa Misra 261fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 262a2fa0709SSampa Misra { 263fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc); 264fb8611dcSGeorge Liu } 26583409573SGeorge Liu 266fb8611dcSGeorge Liu stateField.resize(compEffecterCnt); 26783409573SGeorge Liu const pldm::utils::DBusHandler dBusIntf; 268aea5dde1SSampa Misra uint16_t entityType{}; 269aea5dde1SSampa Misra uint16_t entityInstance{}; 270aea5dde1SSampa Misra uint16_t stateSetId{}; 271aea5dde1SSampa Misra 272aea5dde1SSampa Misra if (isOemStateEffecter(*this, effecterId, compEffecterCnt, entityType, 273aea5dde1SSampa Misra entityInstance, stateSetId) && 274aea5dde1SSampa Misra oemPlatformHandler != nullptr) 275aea5dde1SSampa Misra { 2763a0e3b9bSSampa Misra rc = oemPlatformHandler->oemSetStateEffecterStatesHandler( 2773fbd39ebSVarsha Kaverappa entityType, entityInstance, stateSetId, compEffecterCnt, stateField, 2783fbd39ebSVarsha Kaverappa effecterId); 279aea5dde1SSampa Misra } 280aea5dde1SSampa Misra else 281aea5dde1SSampa Misra { 2820d7aca8cSGeorge Liu rc = platform_state_effecter::setStateEffecterStatesHandler< 2830d7aca8cSGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId, 2840d7aca8cSGeorge Liu stateField); 285aea5dde1SSampa Misra } 286fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 287fb8611dcSGeorge Liu { 288fb8611dcSGeorge Liu return CmdHandler::ccOnlyResponse(request, rc); 289a2fa0709SSampa Misra } 290a2fa0709SSampa Misra 291fb8611dcSGeorge Liu rc = encode_set_state_effecter_states_resp(request->hdr.instance_id, rc, 292a2fa0709SSampa Misra responsePtr); 293fb8611dcSGeorge Liu if (rc != PLDM_SUCCESS) 294fb8611dcSGeorge Liu { 295fb8611dcSGeorge Liu return ccOnlyResponse(request, rc); 296fb8611dcSGeorge Liu } 297fb8611dcSGeorge Liu 298a2fa0709SSampa Misra return response; 299a2fa0709SSampa Misra } 300a2fa0709SSampa Misra 30156e45c58STom Joseph Response Handler::platformEventMessage(const pldm_msg* request, 30256e45c58STom Joseph size_t payloadLength) 30356e45c58STom Joseph { 30456e45c58STom Joseph uint8_t formatVersion{}; 30556e45c58STom Joseph uint8_t tid{}; 30656e45c58STom Joseph uint8_t eventClass{}; 30756e45c58STom Joseph size_t offset{}; 30856e45c58STom Joseph 30956e45c58STom Joseph auto rc = decode_platform_event_message_req( 31056e45c58STom Joseph request, payloadLength, &formatVersion, &tid, &eventClass, &offset); 31156e45c58STom Joseph if (rc != PLDM_SUCCESS) 31256e45c58STom Joseph { 31356e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, rc); 31456e45c58STom Joseph } 31556e45c58STom Joseph 31656e45c58STom Joseph try 31756e45c58STom Joseph { 31856e45c58STom Joseph const auto& handlers = eventHandlers.at(eventClass); 31956e45c58STom Joseph for (const auto& handler : handlers) 32056e45c58STom Joseph { 32156e45c58STom Joseph auto rc = 32256e45c58STom Joseph handler(request, payloadLength, formatVersion, tid, offset); 32356e45c58STom Joseph if (rc != PLDM_SUCCESS) 32456e45c58STom Joseph { 32556e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, rc); 32656e45c58STom Joseph } 32756e45c58STom Joseph } 32856e45c58STom Joseph } 32956e45c58STom Joseph catch (const std::out_of_range& e) 33056e45c58STom Joseph { 33156e45c58STom Joseph return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_DATA); 33256e45c58STom Joseph } 33356e45c58STom Joseph 33456e45c58STom Joseph Response response( 33556e45c58STom Joseph sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES, 0); 33656e45c58STom Joseph auto responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 33756e45c58STom Joseph 33856e45c58STom Joseph rc = encode_platform_event_message_resp(request->hdr.instance_id, rc, 33956e45c58STom Joseph PLDM_EVENT_NO_LOGGING, responsePtr); 34056e45c58STom Joseph if (rc != PLDM_SUCCESS) 34156e45c58STom Joseph { 34256e45c58STom Joseph return ccOnlyResponse(request, rc); 34356e45c58STom Joseph } 34456e45c58STom Joseph 34556e45c58STom Joseph return response; 34656e45c58STom Joseph } 34756e45c58STom Joseph 34856e45c58STom Joseph int Handler::sensorEvent(const pldm_msg* request, size_t payloadLength, 349c4959c3cSTom Joseph uint8_t /*formatVersion*/, uint8_t tid, 35056e45c58STom Joseph size_t eventDataOffset) 35156e45c58STom Joseph { 35256e45c58STom Joseph uint16_t sensorId{}; 35356e45c58STom Joseph uint8_t eventClass{}; 35456e45c58STom Joseph size_t eventClassDataOffset{}; 35556e45c58STom Joseph auto eventData = 35656e45c58STom Joseph reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset; 35756e45c58STom Joseph auto eventDataSize = payloadLength - eventDataOffset; 35856e45c58STom Joseph 35956e45c58STom Joseph auto rc = decode_sensor_event_data(eventData, eventDataSize, &sensorId, 36056e45c58STom Joseph &eventClass, &eventClassDataOffset); 36156e45c58STom Joseph if (rc != PLDM_SUCCESS) 36256e45c58STom Joseph { 36356e45c58STom Joseph return rc; 36456e45c58STom Joseph } 36556e45c58STom Joseph 36675330f36SZahed Hossain auto eventClassData = reinterpret_cast<const uint8_t*>(request->payload) + 36775330f36SZahed Hossain eventDataOffset + eventClassDataOffset; 36875330f36SZahed Hossain auto eventClassDataSize = 36975330f36SZahed Hossain payloadLength - eventDataOffset - eventClassDataOffset; 37075330f36SZahed Hossain 37156e45c58STom Joseph if (eventClass == PLDM_STATE_SENSOR_STATE) 37256e45c58STom Joseph { 37356e45c58STom Joseph uint8_t sensorOffset{}; 37456e45c58STom Joseph uint8_t eventState{}; 37556e45c58STom Joseph uint8_t previousEventState{}; 37656e45c58STom Joseph 37775330f36SZahed Hossain rc = decode_state_sensor_data(eventClassData, eventClassDataSize, 37856e45c58STom Joseph &sensorOffset, &eventState, 37956e45c58STom Joseph &previousEventState); 38075330f36SZahed Hossain if (rc != PLDM_SUCCESS) 38175330f36SZahed Hossain { 38275330f36SZahed Hossain return PLDM_ERROR; 38375330f36SZahed Hossain } 38475330f36SZahed Hossain 385fe4d88bbSChicago Duan // Emitting state sensor event signal 386fe4d88bbSChicago Duan emitStateSensorEventSignal(tid, sensorId, sensorOffset, eventState, 387fe4d88bbSChicago Duan previousEventState); 388fe4d88bbSChicago Duan 389c4959c3cSTom Joseph // If there are no HOST PDR's, there is no further action 390c4959c3cSTom Joseph if (hostPDRHandler == NULL) 391c4959c3cSTom Joseph { 392c4959c3cSTom Joseph return PLDM_SUCCESS; 393c4959c3cSTom Joseph } 394c4959c3cSTom Joseph 395c4959c3cSTom Joseph // Handle PLDM events for which PDR is available 396c4959c3cSTom Joseph SensorEntry sensorEntry{tid, sensorId}; 397b70a1964STom Joseph 398b70a1964STom Joseph pldm::pdr::EntityInfo entityInfo{}; 399b70a1964STom Joseph pldm::pdr::CompositeSensorStates compositeSensorStates{}; 400b70a1964STom Joseph 401c4959c3cSTom Joseph try 402c4959c3cSTom Joseph { 403b70a1964STom Joseph std::tie(entityInfo, compositeSensorStates) = 404c4959c3cSTom Joseph hostPDRHandler->lookupSensorInfo(sensorEntry); 405b70a1964STom Joseph } 406b70a1964STom Joseph catch (const std::out_of_range& e) 407b70a1964STom Joseph { 408b70a1964STom Joseph // If there is no mapping for tid, sensorId combination, try 409b70a1964STom Joseph // PLDM_TID_RESERVED, sensorId for terminus that is yet to 410b70a1964STom Joseph // implement TL PDR. 411b70a1964STom Joseph try 412b70a1964STom Joseph { 413b70a1964STom Joseph sensorEntry.terminusID = PLDM_TID_RESERVED; 414b70a1964STom Joseph std::tie(entityInfo, compositeSensorStates) = 415b70a1964STom Joseph hostPDRHandler->lookupSensorInfo(sensorEntry); 416b70a1964STom Joseph } 417b70a1964STom Joseph // If there is no mapping for events return PLDM_SUCCESS 418b70a1964STom Joseph catch (const std::out_of_range& e) 419b70a1964STom Joseph { 420b70a1964STom Joseph return PLDM_SUCCESS; 421b70a1964STom Joseph } 422b70a1964STom Joseph } 423b70a1964STom Joseph 424c4959c3cSTom Joseph if (sensorOffset >= compositeSensorStates.size()) 425c4959c3cSTom Joseph { 426c4959c3cSTom Joseph return PLDM_ERROR_INVALID_DATA; 427c4959c3cSTom Joseph } 428c4959c3cSTom Joseph 429c4959c3cSTom Joseph const auto& possibleStates = compositeSensorStates[sensorOffset]; 430c4959c3cSTom Joseph if (possibleStates.find(eventState) == possibleStates.end()) 431c4959c3cSTom Joseph { 432c4959c3cSTom Joseph return PLDM_ERROR_INVALID_DATA; 433c4959c3cSTom Joseph } 434c4959c3cSTom Joseph 435c4959c3cSTom Joseph const auto& [containerId, entityType, entityInstance] = entityInfo; 436b70a1964STom Joseph events::StateSensorEntry stateSensorEntry{containerId, entityType, 437b70a1964STom Joseph entityInstance, sensorOffset}; 4383aec997cSPavithra Barithaya return hostPDRHandler->handleStateSensorEvent(stateSensorEntry, 4393aec997cSPavithra Barithaya eventState); 440c4959c3cSTom Joseph } 44156e45c58STom Joseph else 44256e45c58STom Joseph { 44356e45c58STom Joseph return PLDM_ERROR_INVALID_DATA; 44456e45c58STom Joseph } 44556e45c58STom Joseph 44656e45c58STom Joseph return PLDM_SUCCESS; 44756e45c58STom Joseph } 44856e45c58STom Joseph 4498cb6f665SDeepak Kodihalli int Handler::pldmPDRRepositoryChgEvent(const pldm_msg* request, 4508cb6f665SDeepak Kodihalli size_t payloadLength, 4518cb6f665SDeepak Kodihalli uint8_t /*formatVersion*/, 4528cb6f665SDeepak Kodihalli uint8_t /*tid*/, size_t eventDataOffset) 4538cb6f665SDeepak Kodihalli { 4548cb6f665SDeepak Kodihalli uint8_t eventDataFormat{}; 4558cb6f665SDeepak Kodihalli uint8_t numberOfChangeRecords{}; 4568cb6f665SDeepak Kodihalli size_t dataOffset{}; 4578cb6f665SDeepak Kodihalli 4588cb6f665SDeepak Kodihalli auto eventData = 4598cb6f665SDeepak Kodihalli reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset; 4608cb6f665SDeepak Kodihalli auto eventDataSize = payloadLength - eventDataOffset; 4618cb6f665SDeepak Kodihalli 4628cb6f665SDeepak Kodihalli auto rc = decode_pldm_pdr_repository_chg_event_data( 4638cb6f665SDeepak Kodihalli eventData, eventDataSize, &eventDataFormat, &numberOfChangeRecords, 4648cb6f665SDeepak Kodihalli &dataOffset); 4658cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS) 4668cb6f665SDeepak Kodihalli { 4678cb6f665SDeepak Kodihalli return rc; 4688cb6f665SDeepak Kodihalli } 4698cb6f665SDeepak Kodihalli 4708cb6f665SDeepak Kodihalli PDRRecordHandles pdrRecordHandles; 4717246e0cdSDeepak Kodihalli 4727246e0cdSDeepak Kodihalli if (eventDataFormat == FORMAT_IS_PDR_TYPES) 4737246e0cdSDeepak Kodihalli { 4747246e0cdSDeepak Kodihalli return PLDM_ERROR_INVALID_DATA; 4757246e0cdSDeepak Kodihalli } 4767246e0cdSDeepak Kodihalli 4778cb6f665SDeepak Kodihalli if (eventDataFormat == FORMAT_IS_PDR_HANDLES) 4788cb6f665SDeepak Kodihalli { 4798cb6f665SDeepak Kodihalli uint8_t eventDataOperation{}; 4808cb6f665SDeepak Kodihalli uint8_t numberOfChangeEntries{}; 4818cb6f665SDeepak Kodihalli 4828cb6f665SDeepak Kodihalli auto changeRecordData = eventData + dataOffset; 4838cb6f665SDeepak Kodihalli auto changeRecordDataSize = eventDataSize - dataOffset; 4848cb6f665SDeepak Kodihalli 4858cb6f665SDeepak Kodihalli while (changeRecordDataSize) 4868cb6f665SDeepak Kodihalli { 4878cb6f665SDeepak Kodihalli rc = decode_pldm_pdr_repository_change_record_data( 4888cb6f665SDeepak Kodihalli changeRecordData, changeRecordDataSize, &eventDataOperation, 4898cb6f665SDeepak Kodihalli &numberOfChangeEntries, &dataOffset); 4908cb6f665SDeepak Kodihalli 4918cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS) 4928cb6f665SDeepak Kodihalli { 4938cb6f665SDeepak Kodihalli return rc; 4948cb6f665SDeepak Kodihalli } 4958cb6f665SDeepak Kodihalli 4968cb6f665SDeepak Kodihalli if (eventDataOperation == PLDM_RECORDS_ADDED) 4978cb6f665SDeepak Kodihalli { 4988cb6f665SDeepak Kodihalli rc = getPDRRecordHandles( 4998cb6f665SDeepak Kodihalli reinterpret_cast<const ChangeEntry*>(changeRecordData + 5008cb6f665SDeepak Kodihalli dataOffset), 5018cb6f665SDeepak Kodihalli changeRecordDataSize - dataOffset, 5028cb6f665SDeepak Kodihalli static_cast<size_t>(numberOfChangeEntries), 5038cb6f665SDeepak Kodihalli pdrRecordHandles); 5048cb6f665SDeepak Kodihalli 5058cb6f665SDeepak Kodihalli if (rc != PLDM_SUCCESS) 5068cb6f665SDeepak Kodihalli { 5078cb6f665SDeepak Kodihalli return rc; 5088cb6f665SDeepak Kodihalli } 5098cb6f665SDeepak Kodihalli } 5108cb6f665SDeepak Kodihalli 511*841ee3d5SPavithra Barithaya if (eventDataOperation == PLDM_RECORDS_MODIFIED) 512*841ee3d5SPavithra Barithaya { 513*841ee3d5SPavithra Barithaya return PLDM_ERROR_UNSUPPORTED_PLDM_CMD; 514*841ee3d5SPavithra Barithaya } 515*841ee3d5SPavithra Barithaya 5168cb6f665SDeepak Kodihalli changeRecordData += 5178cb6f665SDeepak Kodihalli dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry)); 5188cb6f665SDeepak Kodihalli changeRecordDataSize -= 5198cb6f665SDeepak Kodihalli dataOffset + (numberOfChangeEntries * sizeof(ChangeEntry)); 5208cb6f665SDeepak Kodihalli } 5217246e0cdSDeepak Kodihalli } 5227246e0cdSDeepak Kodihalli if (hostPDRHandler) 5238cb6f665SDeepak Kodihalli { 5248cb6f665SDeepak Kodihalli hostPDRHandler->fetchPDR(std::move(pdrRecordHandles)); 5258cb6f665SDeepak Kodihalli } 5268cb6f665SDeepak Kodihalli 5278cb6f665SDeepak Kodihalli return PLDM_SUCCESS; 5288cb6f665SDeepak Kodihalli } 5298cb6f665SDeepak Kodihalli 5308cb6f665SDeepak Kodihalli int Handler::getPDRRecordHandles(const ChangeEntry* changeEntryData, 5318cb6f665SDeepak Kodihalli size_t changeEntryDataSize, 5328cb6f665SDeepak Kodihalli size_t numberOfChangeEntries, 5338cb6f665SDeepak Kodihalli PDRRecordHandles& pdrRecordHandles) 5348cb6f665SDeepak Kodihalli { 5358cb6f665SDeepak Kodihalli if (numberOfChangeEntries > (changeEntryDataSize / sizeof(ChangeEntry))) 5368cb6f665SDeepak Kodihalli { 5378cb6f665SDeepak Kodihalli return PLDM_ERROR_INVALID_DATA; 5388cb6f665SDeepak Kodihalli } 5398cb6f665SDeepak Kodihalli for (size_t i = 0; i < numberOfChangeEntries; i++) 5408cb6f665SDeepak Kodihalli { 5418cb6f665SDeepak Kodihalli pdrRecordHandles.push_back(changeEntryData[i]); 5428cb6f665SDeepak Kodihalli } 5438cb6f665SDeepak Kodihalli return PLDM_SUCCESS; 5448cb6f665SDeepak Kodihalli } 5458cb6f665SDeepak Kodihalli 546eccb0c56SGeorge Liu Response Handler::setNumericEffecterValue(const pldm_msg* request, 547eccb0c56SGeorge Liu size_t payloadLength) 548eccb0c56SGeorge Liu { 549eccb0c56SGeorge Liu Response response(sizeof(pldm_msg_hdr) + 550eccb0c56SGeorge Liu PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES); 551eccb0c56SGeorge Liu uint16_t effecterId{}; 552eccb0c56SGeorge Liu uint8_t effecterDataSize{}; 553eccb0c56SGeorge Liu uint8_t effecterValue[4] = {}; 554eccb0c56SGeorge Liu 555eccb0c56SGeorge Liu if ((payloadLength > sizeof(effecterId) + sizeof(effecterDataSize) + 556eccb0c56SGeorge Liu sizeof(union_effecter_data_size)) || 557eccb0c56SGeorge Liu (payloadLength < sizeof(effecterId) + sizeof(effecterDataSize) + 1)) 558eccb0c56SGeorge Liu { 559eccb0c56SGeorge Liu return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH); 560eccb0c56SGeorge Liu } 561eccb0c56SGeorge Liu 562eccb0c56SGeorge Liu int rc = decode_set_numeric_effecter_value_req( 563eccb0c56SGeorge Liu request, payloadLength, &effecterId, &effecterDataSize, 564eccb0c56SGeorge Liu reinterpret_cast<uint8_t*>(&effecterValue)); 565eccb0c56SGeorge Liu 566eccb0c56SGeorge Liu if (rc == PLDM_SUCCESS) 567eccb0c56SGeorge Liu { 568eccb0c56SGeorge Liu const pldm::utils::DBusHandler dBusIntf; 569eccb0c56SGeorge Liu rc = platform_numeric_effecter::setNumericEffecterValueHandler< 570eccb0c56SGeorge Liu pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId, 571eccb0c56SGeorge Liu effecterDataSize, effecterValue, 572eccb0c56SGeorge Liu sizeof(effecterValue)); 573eccb0c56SGeorge Liu } 574eccb0c56SGeorge Liu 575eccb0c56SGeorge Liu return ccOnlyResponse(request, rc); 576eccb0c56SGeorge Liu } 577eccb0c56SGeorge Liu 57812afe110SSampa Misra void Handler::generateTerminusLocatorPDR(Repo& repo) 57912afe110SSampa Misra { 58012afe110SSampa Misra std::vector<uint8_t> pdrBuffer(sizeof(pldm_terminus_locator_pdr)); 58112afe110SSampa Misra 58212afe110SSampa Misra auto pdr = reinterpret_cast<pldm_terminus_locator_pdr*>(pdrBuffer.data()); 58312afe110SSampa Misra 58412afe110SSampa Misra pdr->hdr.record_handle = 0; 58512afe110SSampa Misra pdr->hdr.version = 1; 58612afe110SSampa Misra pdr->hdr.type = PLDM_TERMINUS_LOCATOR_PDR; 58712afe110SSampa Misra pdr->hdr.record_change_num = 0; 58812afe110SSampa Misra pdr->hdr.length = sizeof(pldm_terminus_locator_pdr) - sizeof(pldm_pdr_hdr); 58912afe110SSampa Misra pdr->terminus_handle = BmcPldmTerminusHandle; 59012afe110SSampa Misra pdr->validity = PLDM_TL_PDR_VALID; 59112afe110SSampa Misra pdr->tid = BmcTerminusId; 59212afe110SSampa Misra pdr->container_id = 0x0; 59312afe110SSampa Misra pdr->terminus_locator_type = PLDM_TERMINUS_LOCATOR_TYPE_MCTP_EID; 59412afe110SSampa Misra pdr->terminus_locator_value_size = 59512afe110SSampa Misra sizeof(pldm_terminus_locator_type_mctp_eid); 59612afe110SSampa Misra auto locatorValue = reinterpret_cast<pldm_terminus_locator_type_mctp_eid*>( 59712afe110SSampa Misra pdr->terminus_locator_value); 59812afe110SSampa Misra locatorValue->eid = BmcMctpEid; 59912afe110SSampa Misra 60012afe110SSampa Misra PdrEntry pdrEntry{}; 60112afe110SSampa Misra pdrEntry.data = pdrBuffer.data(); 60212afe110SSampa Misra pdrEntry.size = pdrBuffer.size(); 60312afe110SSampa Misra repo.addRecord(pdrEntry); 60412afe110SSampa Misra } 605362c18ddSGeorge Liu 606362c18ddSGeorge Liu Response Handler::getStateSensorReadings(const pldm_msg* request, 607362c18ddSGeorge Liu size_t payloadLength) 608362c18ddSGeorge Liu { 609362c18ddSGeorge Liu uint16_t sensorId{}; 610362c18ddSGeorge Liu bitfield8_t sensorRearm{}; 611362c18ddSGeorge Liu uint8_t reserved{}; 612362c18ddSGeorge Liu 613362c18ddSGeorge Liu if (payloadLength != PLDM_GET_SENSOR_READING_REQ_BYTES) 614362c18ddSGeorge Liu { 615362c18ddSGeorge Liu return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH); 616362c18ddSGeorge Liu } 617362c18ddSGeorge Liu 618362c18ddSGeorge Liu int rc = decode_get_state_sensor_readings_req( 619362c18ddSGeorge Liu request, payloadLength, &sensorId, &sensorRearm, &reserved); 620362c18ddSGeorge Liu 621362c18ddSGeorge Liu if (rc != PLDM_SUCCESS) 622362c18ddSGeorge Liu { 623362c18ddSGeorge Liu return ccOnlyResponse(request, rc); 624362c18ddSGeorge Liu } 625362c18ddSGeorge Liu 626362c18ddSGeorge Liu // 0x01 to 0x08 627c1230ca1SGeorge Liu uint8_t sensorRearmCount = std::popcount(sensorRearm.byte); 628aea5dde1SSampa Misra std::vector<get_sensor_state_field> stateField(sensorRearmCount); 629362c18ddSGeorge Liu uint8_t comSensorCnt{}; 630362c18ddSGeorge Liu const pldm::utils::DBusHandler dBusIntf; 631aea5dde1SSampa Misra 632aea5dde1SSampa Misra uint16_t entityType{}; 633aea5dde1SSampa Misra uint16_t entityInstance{}; 634aea5dde1SSampa Misra uint16_t stateSetId{}; 635aea5dde1SSampa Misra 636aea5dde1SSampa Misra if (isOemStateSensor(*this, sensorId, sensorRearmCount, comSensorCnt, 637aea5dde1SSampa Misra entityType, entityInstance, stateSetId) && 638aea5dde1SSampa Misra oemPlatformHandler != nullptr) 639aea5dde1SSampa Misra { 640aea5dde1SSampa Misra rc = oemPlatformHandler->getOemStateSensorReadingsHandler( 641aea5dde1SSampa Misra entityType, entityInstance, stateSetId, comSensorCnt, stateField); 642aea5dde1SSampa Misra } 643aea5dde1SSampa Misra else 644aea5dde1SSampa Misra { 645362c18ddSGeorge Liu rc = platform_state_sensor::getStateSensorReadingsHandler< 646aea5dde1SSampa Misra pldm::utils::DBusHandler, Handler>(dBusIntf, *this, sensorId, 647aea5dde1SSampa Misra sensorRearmCount, comSensorCnt, 648aea5dde1SSampa Misra stateField); 649aea5dde1SSampa Misra } 650362c18ddSGeorge Liu 651362c18ddSGeorge Liu if (rc != PLDM_SUCCESS) 652362c18ddSGeorge Liu { 653362c18ddSGeorge Liu return ccOnlyResponse(request, rc); 654362c18ddSGeorge Liu } 655362c18ddSGeorge Liu 656362c18ddSGeorge Liu Response response(sizeof(pldm_msg_hdr) + 657362c18ddSGeorge Liu PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES + 658362c18ddSGeorge Liu sizeof(get_sensor_state_field) * comSensorCnt); 659362c18ddSGeorge Liu auto responsePtr = reinterpret_cast<pldm_msg*>(response.data()); 660362c18ddSGeorge Liu rc = encode_get_state_sensor_readings_resp(request->hdr.instance_id, rc, 661362c18ddSGeorge Liu comSensorCnt, stateField.data(), 662362c18ddSGeorge Liu responsePtr); 663362c18ddSGeorge Liu if (rc != PLDM_SUCCESS) 664362c18ddSGeorge Liu { 665362c18ddSGeorge Liu return ccOnlyResponse(request, rc); 666362c18ddSGeorge Liu } 667362c18ddSGeorge Liu 668362c18ddSGeorge Liu return response; 669362c18ddSGeorge Liu } 670362c18ddSGeorge Liu 6715fb37d57SSampa Misra void Handler::_processPostGetPDRActions( 6725fb37d57SSampa Misra sdeventplus::source::EventBase& /*source */) 6735fb37d57SSampa Misra { 6745fb37d57SSampa Misra deferredGetPDREvent.reset(); 6755fb37d57SSampa Misra dbusToPLDMEventHandler->listenSensorEvent(pdrRepo, sensorDbusObjMaps); 6765fb37d57SSampa Misra } 6775fb37d57SSampa Misra 678aea5dde1SSampa Misra bool isOemStateSensor(Handler& handler, uint16_t sensorId, 679aea5dde1SSampa Misra uint8_t sensorRearmCount, uint8_t& compSensorCnt, 680aea5dde1SSampa Misra uint16_t& entityType, uint16_t& entityInstance, 681aea5dde1SSampa Misra uint16_t& stateSetId) 682aea5dde1SSampa Misra { 683aea5dde1SSampa Misra pldm_state_sensor_pdr* pdr = nullptr; 684aea5dde1SSampa Misra 685aea5dde1SSampa Misra std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateSensorPdrRepo( 686aea5dde1SSampa Misra pldm_pdr_init(), pldm_pdr_destroy); 687aea5dde1SSampa Misra Repo stateSensorPDRs(stateSensorPdrRepo.get()); 688aea5dde1SSampa Misra getRepoByType(handler.getRepo(), stateSensorPDRs, PLDM_STATE_SENSOR_PDR); 689aea5dde1SSampa Misra if (stateSensorPDRs.empty()) 690aea5dde1SSampa Misra { 691aea5dde1SSampa Misra std::cerr << "Failed to get record by PDR type\n"; 692aea5dde1SSampa Misra return false; 693aea5dde1SSampa Misra } 694aea5dde1SSampa Misra 695aea5dde1SSampa Misra PdrEntry pdrEntry{}; 696aea5dde1SSampa Misra auto pdrRecord = stateSensorPDRs.getFirstRecord(pdrEntry); 697aea5dde1SSampa Misra while (pdrRecord) 698aea5dde1SSampa Misra { 699aea5dde1SSampa Misra pdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdrEntry.data); 700aea5dde1SSampa Misra assert(pdr != NULL); 701aea5dde1SSampa Misra if (pdr->sensor_id != sensorId) 702aea5dde1SSampa Misra { 703aea5dde1SSampa Misra pdr = nullptr; 704aea5dde1SSampa Misra pdrRecord = stateSensorPDRs.getNextRecord(pdrRecord, pdrEntry); 705aea5dde1SSampa Misra continue; 706aea5dde1SSampa Misra } 707aea5dde1SSampa Misra auto tmpEntityType = pdr->entity_type; 708aea5dde1SSampa Misra auto tmpEntityInstance = pdr->entity_instance; 709aea5dde1SSampa Misra auto tmpCompSensorCnt = pdr->composite_sensor_count; 710aea5dde1SSampa Misra auto tmpPossibleStates = 711aea5dde1SSampa Misra reinterpret_cast<state_sensor_possible_states*>( 712aea5dde1SSampa Misra pdr->possible_states); 713aea5dde1SSampa Misra auto tmpStateSetId = tmpPossibleStates->state_set_id; 714aea5dde1SSampa Misra 715aea5dde1SSampa Misra if (sensorRearmCount > tmpCompSensorCnt) 716aea5dde1SSampa Misra { 717aea5dde1SSampa Misra std::cerr << "The requester sent wrong sensorRearm" 718aea5dde1SSampa Misra << " count for the sensor, SENSOR_ID=" << sensorId 719aea5dde1SSampa Misra << "SENSOR_REARM_COUNT=" << (uint16_t)sensorRearmCount 720aea5dde1SSampa Misra << "\n"; 721aea5dde1SSampa Misra break; 722aea5dde1SSampa Misra } 723aea5dde1SSampa Misra 724aea5dde1SSampa Misra if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START && 725aea5dde1SSampa Misra tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) || 726aea5dde1SSampa Misra (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START && 727aea5dde1SSampa Misra tmpStateSetId < PLDM_OEM_STATE_SET_ID_END)) 728aea5dde1SSampa Misra { 729aea5dde1SSampa Misra entityType = tmpEntityType; 730aea5dde1SSampa Misra entityInstance = tmpEntityInstance; 731aea5dde1SSampa Misra stateSetId = tmpStateSetId; 732aea5dde1SSampa Misra compSensorCnt = tmpCompSensorCnt; 733aea5dde1SSampa Misra return true; 734aea5dde1SSampa Misra } 735aea5dde1SSampa Misra else 736aea5dde1SSampa Misra { 737aea5dde1SSampa Misra return false; 738aea5dde1SSampa Misra } 739aea5dde1SSampa Misra } 740aea5dde1SSampa Misra return false; 741aea5dde1SSampa Misra } 742aea5dde1SSampa Misra 743aea5dde1SSampa Misra bool isOemStateEffecter(Handler& handler, uint16_t effecterId, 744aea5dde1SSampa Misra uint8_t compEffecterCnt, uint16_t& entityType, 745aea5dde1SSampa Misra uint16_t& entityInstance, uint16_t& stateSetId) 746aea5dde1SSampa Misra { 747aea5dde1SSampa Misra pldm_state_effecter_pdr* pdr = nullptr; 748aea5dde1SSampa Misra 749aea5dde1SSampa Misra std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> stateEffecterPdrRepo( 750aea5dde1SSampa Misra pldm_pdr_init(), pldm_pdr_destroy); 751aea5dde1SSampa Misra Repo stateEffecterPDRs(stateEffecterPdrRepo.get()); 752aea5dde1SSampa Misra getRepoByType(handler.getRepo(), stateEffecterPDRs, 753aea5dde1SSampa Misra PLDM_STATE_EFFECTER_PDR); 754aea5dde1SSampa Misra if (stateEffecterPDRs.empty()) 755aea5dde1SSampa Misra { 756aea5dde1SSampa Misra std::cerr << "Failed to get record by PDR type\n"; 757aea5dde1SSampa Misra return false; 758aea5dde1SSampa Misra } 759aea5dde1SSampa Misra 760aea5dde1SSampa Misra PdrEntry pdrEntry{}; 761aea5dde1SSampa Misra auto pdrRecord = stateEffecterPDRs.getFirstRecord(pdrEntry); 762aea5dde1SSampa Misra while (pdrRecord) 763aea5dde1SSampa Misra { 764aea5dde1SSampa Misra pdr = reinterpret_cast<pldm_state_effecter_pdr*>(pdrEntry.data); 765aea5dde1SSampa Misra assert(pdr != NULL); 766aea5dde1SSampa Misra if (pdr->effecter_id != effecterId) 767aea5dde1SSampa Misra { 768aea5dde1SSampa Misra pdr = nullptr; 769aea5dde1SSampa Misra pdrRecord = stateEffecterPDRs.getNextRecord(pdrRecord, pdrEntry); 770aea5dde1SSampa Misra continue; 771aea5dde1SSampa Misra } 772aea5dde1SSampa Misra 773aea5dde1SSampa Misra auto tmpEntityType = pdr->entity_type; 774aea5dde1SSampa Misra auto tmpEntityInstance = pdr->entity_instance; 775aea5dde1SSampa Misra auto tmpPossibleStates = 776aea5dde1SSampa Misra reinterpret_cast<state_effecter_possible_states*>( 777aea5dde1SSampa Misra pdr->possible_states); 778aea5dde1SSampa Misra auto tmpStateSetId = tmpPossibleStates->state_set_id; 779aea5dde1SSampa Misra 780aea5dde1SSampa Misra if (compEffecterCnt > pdr->composite_effecter_count) 781aea5dde1SSampa Misra { 782aea5dde1SSampa Misra std::cerr << "The requester sent wrong composite effecter" 783aea5dde1SSampa Misra << " count for the effecter, EFFECTER_ID=" << effecterId 784aea5dde1SSampa Misra << "COMP_EFF_CNT=" << (uint16_t)compEffecterCnt << "\n"; 785aea5dde1SSampa Misra return false; 786aea5dde1SSampa Misra } 787aea5dde1SSampa Misra 788aea5dde1SSampa Misra if ((tmpEntityType >= PLDM_OEM_ENTITY_TYPE_START && 789aea5dde1SSampa Misra tmpEntityType <= PLDM_OEM_ENTITY_TYPE_END) || 790aea5dde1SSampa Misra (tmpStateSetId >= PLDM_OEM_STATE_SET_ID_START && 791aea5dde1SSampa Misra tmpStateSetId < PLDM_OEM_STATE_SET_ID_END)) 792aea5dde1SSampa Misra { 793aea5dde1SSampa Misra entityType = tmpEntityType; 794aea5dde1SSampa Misra entityInstance = tmpEntityInstance; 795aea5dde1SSampa Misra stateSetId = tmpStateSetId; 796aea5dde1SSampa Misra return true; 797aea5dde1SSampa Misra } 798aea5dde1SSampa Misra else 799aea5dde1SSampa Misra { 800aea5dde1SSampa Misra return false; 801aea5dde1SSampa Misra } 802aea5dde1SSampa Misra } 803aea5dde1SSampa Misra return false; 804aea5dde1SSampa Misra } 805aea5dde1SSampa Misra 806bc669f1bSDeepak Kodihalli } // namespace platform 807557dfb00SDeepak Kodihalli } // namespace responder 808557dfb00SDeepak Kodihalli } // namespace pldm 809