xref: /openbmc/pldm/pldmtool/pldm_cmd_helper.hpp (revision 526461a0)
1f7f5da97SDeepak Kodihalli #pragma once
2f7f5da97SDeepak Kodihalli 
3f7f5da97SDeepak Kodihalli #include "common/utils.hpp"
4f7f5da97SDeepak Kodihalli 
5f7f5da97SDeepak Kodihalli #include <err.h>
6c453e164SGeorge Liu #include <libpldm/base.h>
7c453e164SGeorge Liu #include <libpldm/bios.h>
8c453e164SGeorge Liu #include <libpldm/fru.h>
9c453e164SGeorge Liu #include <libpldm/platform.h>
10f7f5da97SDeepak Kodihalli #include <sys/socket.h>
11f7f5da97SDeepak Kodihalli #include <sys/un.h>
12f7f5da97SDeepak Kodihalli #include <unistd.h>
13f7f5da97SDeepak Kodihalli 
14f7f5da97SDeepak Kodihalli #include <CLI/CLI.hpp>
15ca4a815bSSridevi Ramesh #include <nlohmann/json.hpp>
16f7f5da97SDeepak Kodihalli 
17f7f5da97SDeepak Kodihalli #include <cstring>
18f7f5da97SDeepak Kodihalli #include <iomanip>
19f7f5da97SDeepak Kodihalli #include <iostream>
20f7f5da97SDeepak Kodihalli #include <utility>
21f7f5da97SDeepak Kodihalli 
22f7f5da97SDeepak Kodihalli namespace pldmtool
23f7f5da97SDeepak Kodihalli {
24f7f5da97SDeepak Kodihalli 
25f7f5da97SDeepak Kodihalli namespace helper
26f7f5da97SDeepak Kodihalli {
27f7f5da97SDeepak Kodihalli 
28f7f5da97SDeepak Kodihalli constexpr uint8_t PLDM_ENTITY_ID = 8;
29f7f5da97SDeepak Kodihalli constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1;
30ca4a815bSSridevi Ramesh using ordered_json = nlohmann::ordered_json;
31f7f5da97SDeepak Kodihalli 
32f7f5da97SDeepak Kodihalli /** @brief print the input message if pldmverbose is enabled
33f7f5da97SDeepak Kodihalli  *
34f7f5da97SDeepak Kodihalli  *  @param[in]  pldmVerbose - verbosity flag - true/false
35f7f5da97SDeepak Kodihalli  *  @param[in]  msg         - message to print
36f7f5da97SDeepak Kodihalli  *  @param[in]  data        - data to print
37f7f5da97SDeepak Kodihalli  *
38f7f5da97SDeepak Kodihalli  *  @return - None
39f7f5da97SDeepak Kodihalli  */
40f7f5da97SDeepak Kodihalli 
41f7f5da97SDeepak Kodihalli template <class T>
42f7f5da97SDeepak Kodihalli void Logger(bool pldmverbose, const char* msg, const T& data)
43f7f5da97SDeepak Kodihalli {
44f7f5da97SDeepak Kodihalli     if (pldmverbose)
45f7f5da97SDeepak Kodihalli     {
46f7f5da97SDeepak Kodihalli         std::stringstream s;
47f7f5da97SDeepak Kodihalli         s << data;
48f7f5da97SDeepak Kodihalli         std::cout << msg << s.str() << std::endl;
49f7f5da97SDeepak Kodihalli     }
50f7f5da97SDeepak Kodihalli }
51ca4a815bSSridevi Ramesh 
52ca4a815bSSridevi Ramesh /** @brief Display in JSON format.
53ca4a815bSSridevi Ramesh  *
54ca4a815bSSridevi Ramesh  *  @param[in]  data - data to print in json
55ca4a815bSSridevi Ramesh  *
56ca4a815bSSridevi Ramesh  *  @return - None
57ca4a815bSSridevi Ramesh  */
58ca4a815bSSridevi Ramesh static inline void DisplayInJson(const ordered_json& data)
59ca4a815bSSridevi Ramesh {
60ca4a815bSSridevi Ramesh     std::cout << data.dump(4) << std::endl;
61ca4a815bSSridevi Ramesh }
62ca4a815bSSridevi Ramesh 
63f7f5da97SDeepak Kodihalli /** @brief MCTP socket read/recieve
64f7f5da97SDeepak Kodihalli  *
65f7f5da97SDeepak Kodihalli  *  @param[in]  requestMsg - Request message to compare against loopback
66f7f5da97SDeepak Kodihalli  *              message recieved from mctp socket
67f7f5da97SDeepak Kodihalli  *  @param[out] responseMsg - Response buffer recieved from mctp socket
68f7f5da97SDeepak Kodihalli  *  @param[in]  pldmVerbose - verbosity flag - true/false
69f7f5da97SDeepak Kodihalli  *
70f7f5da97SDeepak Kodihalli  *  @return -   0 on success.
71f7f5da97SDeepak Kodihalli  *             -1 or -errno on failure.
72f7f5da97SDeepak Kodihalli  */
73f7f5da97SDeepak Kodihalli int mctpSockSendRecv(const std::vector<uint8_t>& requestMsg,
74f7f5da97SDeepak Kodihalli                      std::vector<uint8_t>& responseMsg, bool pldmVerbose);
75f7f5da97SDeepak Kodihalli 
76f7f5da97SDeepak Kodihalli class CommandInterface
77f7f5da97SDeepak Kodihalli {
78f7f5da97SDeepak Kodihalli   public:
79f7f5da97SDeepak Kodihalli     explicit CommandInterface(const char* type, const char* name,
80f7f5da97SDeepak Kodihalli                               CLI::App* app) :
81f7f5da97SDeepak Kodihalli         pldmType(type),
82d6638b70SDeepak Kodihalli         commandName(name), mctp_eid(PLDM_ENTITY_ID), pldmVerbose(false),
83d6638b70SDeepak Kodihalli         instanceId(0)
84f7f5da97SDeepak Kodihalli     {
85f7f5da97SDeepak Kodihalli         app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID");
86f7f5da97SDeepak Kodihalli         app->add_flag("-v, --verbose", pldmVerbose);
87f7f5da97SDeepak Kodihalli         app->callback([&]() { exec(); });
88f7f5da97SDeepak Kodihalli     }
89f7f5da97SDeepak Kodihalli 
90f7f5da97SDeepak Kodihalli     virtual ~CommandInterface() = default;
91f7f5da97SDeepak Kodihalli 
92f7f5da97SDeepak Kodihalli     virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0;
93f7f5da97SDeepak Kodihalli 
94f7f5da97SDeepak Kodihalli     virtual void parseResponseMsg(struct pldm_msg* responsePtr,
95f7f5da97SDeepak Kodihalli                                   size_t payloadLength) = 0;
96f7f5da97SDeepak Kodihalli 
97f7f5da97SDeepak Kodihalli     virtual void exec();
98f7f5da97SDeepak Kodihalli 
99f7f5da97SDeepak Kodihalli     int pldmSendRecv(std::vector<uint8_t>& requestMsg,
100f7f5da97SDeepak Kodihalli                      std::vector<uint8_t>& responseMsg);
101f7f5da97SDeepak Kodihalli 
102*526461a0SChinmay Shripad Hegde     /**
103*526461a0SChinmay Shripad Hegde      * @brief get MCTP endpoint ID
104*526461a0SChinmay Shripad Hegde      *
105*526461a0SChinmay Shripad Hegde      * @return uint8_t - MCTP endpoint ID
106*526461a0SChinmay Shripad Hegde      */
107*526461a0SChinmay Shripad Hegde     inline uint8_t getMCTPEID()
108*526461a0SChinmay Shripad Hegde     {
109*526461a0SChinmay Shripad Hegde         return mctp_eid;
110*526461a0SChinmay Shripad Hegde     }
111*526461a0SChinmay Shripad Hegde 
112f7f5da97SDeepak Kodihalli   private:
113f7f5da97SDeepak Kodihalli     const std::string pldmType;
114f7f5da97SDeepak Kodihalli     const std::string commandName;
115f7f5da97SDeepak Kodihalli     uint8_t mctp_eid;
116f7f5da97SDeepak Kodihalli     bool pldmVerbose;
117f7f5da97SDeepak Kodihalli 
118f7f5da97SDeepak Kodihalli   protected:
119f7f5da97SDeepak Kodihalli     uint8_t instanceId;
120f7f5da97SDeepak Kodihalli };
121f7f5da97SDeepak Kodihalli 
122f7f5da97SDeepak Kodihalli } // namespace helper
123f7f5da97SDeepak Kodihalli } // namespace pldmtool
124