xref: /openbmc/pldm/pldmtool/pldm_cmd_helper.hpp (revision a340eed8)
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 
102526461a0SChinmay Shripad Hegde     /**
103526461a0SChinmay Shripad Hegde      * @brief get MCTP endpoint ID
104526461a0SChinmay Shripad Hegde      *
105526461a0SChinmay Shripad Hegde      * @return uint8_t - MCTP endpoint ID
106526461a0SChinmay Shripad Hegde      */
107526461a0SChinmay Shripad Hegde     inline uint8_t getMCTPEID()
108526461a0SChinmay Shripad Hegde     {
109526461a0SChinmay Shripad Hegde         return mctp_eid;
110526461a0SChinmay Shripad Hegde     }
111526461a0SChinmay Shripad Hegde 
112*a340eed8SPavithra Barithaya     /**
113*a340eed8SPavithra Barithaya      * @brief get PLDM type
114*a340eed8SPavithra Barithaya      *
115*a340eed8SPavithra Barithaya      * @return pldm type
116*a340eed8SPavithra Barithaya      */
117*a340eed8SPavithra Barithaya     inline std::string getPLDMType()
118*a340eed8SPavithra Barithaya     {
119*a340eed8SPavithra Barithaya         return pldmType;
120*a340eed8SPavithra Barithaya     }
121*a340eed8SPavithra Barithaya 
122*a340eed8SPavithra Barithaya     /**
123*a340eed8SPavithra Barithaya      * @brief get command name
124*a340eed8SPavithra Barithaya      *
125*a340eed8SPavithra Barithaya      * @return  the command name
126*a340eed8SPavithra Barithaya      */
127*a340eed8SPavithra Barithaya     inline std::string getCommandName()
128*a340eed8SPavithra Barithaya     {
129*a340eed8SPavithra Barithaya         return commandName;
130*a340eed8SPavithra Barithaya     }
131*a340eed8SPavithra Barithaya 
132f7f5da97SDeepak Kodihalli   private:
133f7f5da97SDeepak Kodihalli     const std::string pldmType;
134f7f5da97SDeepak Kodihalli     const std::string commandName;
135f7f5da97SDeepak Kodihalli     uint8_t mctp_eid;
136f7f5da97SDeepak Kodihalli     bool pldmVerbose;
137f7f5da97SDeepak Kodihalli 
138f7f5da97SDeepak Kodihalli   protected:
139f7f5da97SDeepak Kodihalli     uint8_t instanceId;
140f7f5da97SDeepak Kodihalli };
141f7f5da97SDeepak Kodihalli 
142f7f5da97SDeepak Kodihalli } // namespace helper
143f7f5da97SDeepak Kodihalli } // namespace pldmtool
144