blob: 1f21ea2b78ff8cae76d0e21d199049862ba67cd1 [file] [log] [blame]
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05001#pragma once
2
Deepak Kodihallid130e1a2020-06-17 05:55:32 -05003#include "common/utils.hpp"
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05004
5#include <err.h>
George Liuc453e162022-12-21 17:16:23 +08006#include <libpldm/base.h>
7#include <libpldm/bios.h>
8#include <libpldm/fru.h>
9#include <libpldm/platform.h>
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050010#include <sys/socket.h>
11#include <sys/un.h>
12#include <unistd.h>
13
John Wang58a0e062019-11-08 15:38:15 +080014#include <CLI/CLI.hpp>
Sridevi Rameshca4a8152020-08-11 09:26:19 -050015#include <nlohmann/json.hpp>
George Liu6492f522020-06-16 10:34:05 +080016
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050017#include <cstring>
18#include <iomanip>
19#include <iostream>
John Wang58a0e062019-11-08 15:38:15 +080020#include <utility>
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050021
John Wang58a0e062019-11-08 15:38:15 +080022namespace pldmtool
23{
24
25namespace helper
26{
27
John Wang58a0e062019-11-08 15:38:15 +080028constexpr uint8_t PLDM_ENTITY_ID = 8;
29constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1;
Sridevi Rameshca4a8152020-08-11 09:26:19 -050030using ordered_json = nlohmann::ordered_json;
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050031
Sridevi Rameshc91822b2020-02-27 09:26:41 -060032/** @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
41template <class T>
42void 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}
Sridevi Rameshca4a8152020-08-11 09:26:19 -050051
52/** @brief Display in JSON format.
53 *
54 * @param[in] data - data to print in json
55 *
56 * @return - None
57 */
58static inline void DisplayInJson(const ordered_json& data)
59{
60 std::cout << data.dump(4) << std::endl;
61}
62
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050063/** @brief MCTP socket read/recieve
64 *
65 * @param[in] requestMsg - Request message to compare against loopback
66 * message recieved from mctp socket
67 * @param[out] responseMsg - Response buffer recieved from mctp socket
Sridevi Rameshc91822b2020-02-27 09:26:41 -060068 * @param[in] pldmVerbose - verbosity flag - true/false
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050069 *
70 * @return - 0 on success.
71 * -1 or -errno on failure.
72 */
73int mctpSockSendRecv(const std::vector<uint8_t>& requestMsg,
Sridevi Rameshc91822b2020-02-27 09:26:41 -060074 std::vector<uint8_t>& responseMsg, bool pldmVerbose);
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050075
John Wang58a0e062019-11-08 15:38:15 +080076class CommandInterface
77{
78 public:
79 explicit CommandInterface(const char* type, const char* name,
80 CLI::App* app) :
81 pldmType(type),
Deepak Kodihallid6638b72020-07-02 08:36:14 -050082 commandName(name), mctp_eid(PLDM_ENTITY_ID), pldmVerbose(false),
83 instanceId(0)
John Wang58a0e062019-11-08 15:38:15 +080084 {
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +080085 app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID");
Sridevi Rameshc91822b2020-02-27 09:26:41 -060086 app->add_flag("-v, --verbose", pldmVerbose);
John Wang58a0e062019-11-08 15:38:15 +080087 app->callback([&]() { exec(); });
88 }
Sridevi Rameshc91822b2020-02-27 09:26:41 -060089
John Wang58a0e062019-11-08 15:38:15 +080090 virtual ~CommandInterface() = default;
91
92 virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0;
93
94 virtual void parseResponseMsg(struct pldm_msg* responsePtr,
95 size_t payloadLength) = 0;
96
John Wangb754eee2020-02-15 16:10:25 +080097 virtual void exec();
98
99 int pldmSendRecv(std::vector<uint8_t>& requestMsg,
100 std::vector<uint8_t>& responseMsg);
John Wang58a0e062019-11-08 15:38:15 +0800101
Chinmay Shripad Hegde526461a2023-01-11 13:04:02 +0530102 /**
103 * @brief get MCTP endpoint ID
104 *
105 * @return uint8_t - MCTP endpoint ID
106 */
107 inline uint8_t getMCTPEID()
108 {
109 return mctp_eid;
110 }
111
Pavithra Barithayaa340eed2023-02-14 03:32:47 -0600112 /**
113 * @brief get PLDM type
114 *
115 * @return pldm type
116 */
117 inline std::string getPLDMType()
118 {
119 return pldmType;
120 }
121
122 /**
123 * @brief get command name
124 *
125 * @return the command name
126 */
127 inline std::string getCommandName()
128 {
129 return commandName;
130 }
131
John Wang58a0e062019-11-08 15:38:15 +0800132 private:
133 const std::string pldmType;
134 const std::string commandName;
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +0800135 uint8_t mctp_eid;
Sridevi Rameshc91822b2020-02-27 09:26:41 -0600136 bool pldmVerbose;
Pavithra Barithayaac3c45a2020-03-05 02:28:26 -0600137
138 protected:
139 uint8_t instanceId;
John Wang58a0e062019-11-08 15:38:15 +0800140};
141
142} // namespace helper
143} // namespace pldmtool