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