11ed5f7a6SRashmica Gupta #include "common/transport.hpp"
21ed5f7a6SRashmica Gupta 
3c453e164SGeorge Liu #include <libpldm/platform.h>
49d494bbeSDeepak Kodihalli 
56492f524SGeorge Liu #include <CLI/CLI.hpp>
649cfb138SRiya Dixit #include <phosphor-logging/lg2.hpp>
76492f524SGeorge Liu 
86492f524SGeorge Liu #include <array>
96492f524SGeorge Liu 
1049cfb138SRiya Dixit PHOSPHOR_LOG2_USING;
1149cfb138SRiya Dixit 
main(int argc,char ** argv)129d494bbeSDeepak Kodihalli int main(int argc, char** argv)
139d494bbeSDeepak Kodihalli {
149d494bbeSDeepak Kodihalli     CLI::App app{"Send PLDM command SetStateEffecterStates"};
159d494bbeSDeepak Kodihalli     uint8_t mctpEid{};
169d494bbeSDeepak Kodihalli     app.add_option("-m,--mctp_eid", mctpEid, "MCTP EID")->required();
179d494bbeSDeepak Kodihalli     uint16_t effecterId{};
189d494bbeSDeepak Kodihalli     app.add_option("-e,--effecter", effecterId, "Effecter Id")->required();
199d494bbeSDeepak Kodihalli     uint8_t state{};
209d494bbeSDeepak Kodihalli     app.add_option("-s,--state", state, "New state value")->required();
219d494bbeSDeepak Kodihalli     CLI11_PARSE(app, argc, argv);
229d494bbeSDeepak Kodihalli 
239d494bbeSDeepak Kodihalli     // Encode PLDM Request message
249d494bbeSDeepak Kodihalli     uint8_t effecterCount = 1;
259d494bbeSDeepak Kodihalli     std::array<uint8_t, sizeof(pldm_msg_hdr) + sizeof(effecterId) +
269d494bbeSDeepak Kodihalli                             sizeof(effecterCount) +
279d494bbeSDeepak Kodihalli                             sizeof(set_effecter_state_field)>
289d494bbeSDeepak Kodihalli         requestMsg{};
299d494bbeSDeepak Kodihalli     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
309d494bbeSDeepak Kodihalli     set_effecter_state_field stateField{PLDM_REQUEST_SET, state};
319d494bbeSDeepak Kodihalli     auto rc = encode_set_state_effecter_states_req(0, effecterId, effecterCount,
329d494bbeSDeepak Kodihalli                                                    &stateField, request);
339d494bbeSDeepak Kodihalli     if (rc != PLDM_SUCCESS)
349d494bbeSDeepak Kodihalli     {
35087a751fSRiya Dixit         error(
36087a751fSRiya Dixit             "Failed to encode set state effecter states request message, response code '{RC}'",
37087a751fSRiya Dixit             "RC", lg2::hex, rc);
389d494bbeSDeepak Kodihalli         return -1;
399d494bbeSDeepak Kodihalli     }
409d494bbeSDeepak Kodihalli 
411ed5f7a6SRashmica Gupta     PldmTransport pldmTransport{};
429d494bbeSDeepak Kodihalli 
431ed5f7a6SRashmica Gupta     void* responseMsg = nullptr;
449d494bbeSDeepak Kodihalli     size_t responseMsgSize{};
459d494bbeSDeepak Kodihalli     // Send PLDM request msg and wait for response
461ed5f7a6SRashmica Gupta     rc = pldmTransport.sendRecvMsg(static_cast<pldm_tid_t>(mctpEid),
471ed5f7a6SRashmica Gupta                                    requestMsg.data(), requestMsg.size(),
481ed5f7a6SRashmica Gupta                                    responseMsg, responseMsgSize);
499d494bbeSDeepak Kodihalli     if (0 > rc)
509d494bbeSDeepak Kodihalli     {
5149cfb138SRiya Dixit         error(
52087a751fSRiya Dixit             "Failed to send message/receive response, response code '{RC}' and error - {ERROR}",
53087a751fSRiya Dixit             "RC", rc, "ERROR", errno);
549d494bbeSDeepak Kodihalli         return -1;
559d494bbeSDeepak Kodihalli     }
569d494bbeSDeepak Kodihalli     pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg);
57087a751fSRiya Dixit     info(
58087a751fSRiya Dixit         "Done! Got the response for PLDM send receive message request, response code '{RC}'",
59*1e5c81e0SRiya Dixit         "RC", lg2::hex, response->payload[0]);
609d494bbeSDeepak Kodihalli     free(responseMsg);
619d494bbeSDeepak Kodihalli 
629d494bbeSDeepak Kodihalli     return 0;
639d494bbeSDeepak Kodihalli }
64