xref: /openbmc/pldm/pldmtool/pldm_cmd_helper.hpp (revision 2576aecd)
1f7f5da97SDeepak Kodihalli #pragma once
2f7f5da97SDeepak Kodihalli 
33d03f3faSDung Cao #include "common/instance_id.hpp"
4f7f5da97SDeepak Kodihalli #include "common/utils.hpp"
5f7f5da97SDeepak Kodihalli 
6f7f5da97SDeepak Kodihalli #include <err.h>
7c453e164SGeorge Liu #include <libpldm/base.h>
8c453e164SGeorge Liu #include <libpldm/bios.h>
9c453e164SGeorge Liu #include <libpldm/fru.h>
10c453e164SGeorge Liu #include <libpldm/platform.h>
11f7f5da97SDeepak Kodihalli #include <sys/socket.h>
12f7f5da97SDeepak Kodihalli #include <sys/un.h>
13f7f5da97SDeepak Kodihalli #include <unistd.h>
14f7f5da97SDeepak Kodihalli 
15f7f5da97SDeepak Kodihalli #include <CLI/CLI.hpp>
16ca4a815bSSridevi Ramesh #include <nlohmann/json.hpp>
17f7f5da97SDeepak Kodihalli 
18f7f5da97SDeepak Kodihalli #include <cstring>
19f7f5da97SDeepak Kodihalli #include <iomanip>
20f7f5da97SDeepak Kodihalli #include <iostream>
21f7f5da97SDeepak Kodihalli #include <utility>
22f7f5da97SDeepak Kodihalli 
23f7f5da97SDeepak Kodihalli namespace pldmtool
24f7f5da97SDeepak Kodihalli {
25f7f5da97SDeepak Kodihalli 
26f7f5da97SDeepak Kodihalli namespace helper
27f7f5da97SDeepak Kodihalli {
28f7f5da97SDeepak Kodihalli 
29f7f5da97SDeepak Kodihalli constexpr uint8_t PLDM_ENTITY_ID = 8;
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>
Logger(bool pldmverbose,const char * msg,const T & data)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  */
DisplayInJson(const ordered_json & data)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 
63*2576aecdSManojkiran Eda /** @brief MCTP socket read/receive
64f7f5da97SDeepak Kodihalli  *
65f7f5da97SDeepak Kodihalli  *  @param[in]  requestMsg - Request message to compare against loopback
66*2576aecdSManojkiran Eda  *              message received from mctp socket
67*2576aecdSManojkiran Eda  *  @param[out] responseMsg - Response buffer received 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:
CommandInterface(const char * type,const char * name,CLI::App * app)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);
879427089eSThu Nguyen         app->add_option("-n, --retry-count", numRetries,
889427089eSThu Nguyen                         "Number of retry when PLDM request message is failed");
89f7f5da97SDeepak Kodihalli         app->callback([&]() { exec(); });
90f7f5da97SDeepak Kodihalli     }
91f7f5da97SDeepak Kodihalli 
92f7f5da97SDeepak Kodihalli     virtual ~CommandInterface() = default;
93f7f5da97SDeepak Kodihalli 
94f7f5da97SDeepak Kodihalli     virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0;
95f7f5da97SDeepak Kodihalli 
96f7f5da97SDeepak Kodihalli     virtual void parseResponseMsg(struct pldm_msg* responsePtr,
97f7f5da97SDeepak Kodihalli                                   size_t payloadLength) = 0;
98f7f5da97SDeepak Kodihalli 
99f7f5da97SDeepak Kodihalli     virtual void exec();
100f7f5da97SDeepak Kodihalli 
101f7f5da97SDeepak Kodihalli     int pldmSendRecv(std::vector<uint8_t>& requestMsg,
102f7f5da97SDeepak Kodihalli                      std::vector<uint8_t>& responseMsg);
103f7f5da97SDeepak Kodihalli 
104526461a0SChinmay Shripad Hegde     /**
105526461a0SChinmay Shripad Hegde      * @brief get MCTP endpoint ID
106526461a0SChinmay Shripad Hegde      *
107526461a0SChinmay Shripad Hegde      * @return uint8_t - MCTP endpoint ID
108526461a0SChinmay Shripad Hegde      */
getMCTPEID()109526461a0SChinmay Shripad Hegde     inline uint8_t getMCTPEID()
110526461a0SChinmay Shripad Hegde     {
111526461a0SChinmay Shripad Hegde         return mctp_eid;
112526461a0SChinmay Shripad Hegde     }
113526461a0SChinmay Shripad Hegde 
114a340eed8SPavithra Barithaya     /**
115a340eed8SPavithra Barithaya      * @brief get PLDM type
116a340eed8SPavithra Barithaya      *
117a340eed8SPavithra Barithaya      * @return pldm type
118a340eed8SPavithra Barithaya      */
getPLDMType()119a340eed8SPavithra Barithaya     inline std::string getPLDMType()
120a340eed8SPavithra Barithaya     {
121a340eed8SPavithra Barithaya         return pldmType;
122a340eed8SPavithra Barithaya     }
123a340eed8SPavithra Barithaya 
124a340eed8SPavithra Barithaya     /**
125a340eed8SPavithra Barithaya      * @brief get command name
126a340eed8SPavithra Barithaya      *
127a340eed8SPavithra Barithaya      * @return  the command name
128a340eed8SPavithra Barithaya      */
getCommandName()129a340eed8SPavithra Barithaya     inline std::string getCommandName()
130a340eed8SPavithra Barithaya     {
131a340eed8SPavithra Barithaya         return commandName;
132a340eed8SPavithra Barithaya     }
133a340eed8SPavithra Barithaya 
134f7f5da97SDeepak Kodihalli   private:
135f7f5da97SDeepak Kodihalli     const std::string pldmType;
136f7f5da97SDeepak Kodihalli     const std::string commandName;
137f7f5da97SDeepak Kodihalli     uint8_t mctp_eid;
138f7f5da97SDeepak Kodihalli     bool pldmVerbose;
139f7f5da97SDeepak Kodihalli 
140f7f5da97SDeepak Kodihalli   protected:
141f7f5da97SDeepak Kodihalli     uint8_t instanceId;
1423d03f3faSDung Cao     pldm::InstanceIdDb instanceIdDb;
1439427089eSThu Nguyen     uint8_t numRetries = 0;
144f7f5da97SDeepak Kodihalli };
145f7f5da97SDeepak Kodihalli 
146f7f5da97SDeepak Kodihalli } // namespace helper
147f7f5da97SDeepak Kodihalli } // namespace pldmtool
148