blob: 51dcd12198d5b4bd40c99b3b3f0b44c5226a3840 [file] [log] [blame]
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05001#pragma once
2
George Liu6492f522020-06-16 10:34:05 +08003#include "libpldm/base.h"
4#include "libpldm/bios.h"
5#include "libpldm/fru.h"
6#include "libpldm/platform.h"
7
Deepak Kodihallid130e1a2020-06-17 05:55:32 -05008#include "common/utils.hpp"
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05009
10#include <err.h>
11#include <sys/socket.h>
12#include <sys/un.h>
13#include <unistd.h>
14
John Wang58a0e062019-11-08 15:38:15 +080015#include <CLI/CLI.hpp>
Sridevi Rameshca4a8152020-08-11 09:26:19 -050016#include <nlohmann/json.hpp>
George Liu6492f522020-06-16 10:34:05 +080017
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050018#include <cstring>
19#include <iomanip>
20#include <iostream>
John Wang58a0e062019-11-08 15:38:15 +080021#include <utility>
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050022
John Wang58a0e062019-11-08 15:38:15 +080023namespace pldmtool
24{
25
26namespace helper
27{
28
John Wang58a0e062019-11-08 15:38:15 +080029constexpr uint8_t PLDM_ENTITY_ID = 8;
30constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1;
Sridevi Rameshca4a8152020-08-11 09:26:19 -050031using ordered_json = nlohmann::ordered_json;
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050032
Sridevi Rameshc91822b2020-02-27 09:26:41 -060033/** @brief print the input message if pldmverbose is enabled
34 *
35 * @param[in] pldmVerbose - verbosity flag - true/false
36 * @param[in] msg - message to print
37 * @param[in] data - data to print
38 *
39 * @return - None
40 */
41
42template <class T>
43void Logger(bool pldmverbose, const char* msg, const T& data)
44{
45 if (pldmverbose)
46 {
47 std::stringstream s;
48 s << data;
49 std::cout << msg << s.str() << std::endl;
50 }
51}
Sridevi Rameshca4a8152020-08-11 09:26:19 -050052
53/** @brief Display in JSON format.
54 *
55 * @param[in] data - data to print in json
56 *
57 * @return - None
58 */
59static inline void DisplayInJson(const ordered_json& data)
60{
61 std::cout << data.dump(4) << std::endl;
62}
63
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050064/** @brief MCTP socket read/recieve
65 *
66 * @param[in] requestMsg - Request message to compare against loopback
67 * message recieved from mctp socket
68 * @param[out] responseMsg - Response buffer recieved from mctp socket
Sridevi Rameshc91822b2020-02-27 09:26:41 -060069 * @param[in] pldmVerbose - verbosity flag - true/false
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050070 *
71 * @return - 0 on success.
72 * -1 or -errno on failure.
73 */
74int mctpSockSendRecv(const std::vector<uint8_t>& requestMsg,
Sridevi Rameshc91822b2020-02-27 09:26:41 -060075 std::vector<uint8_t>& responseMsg, bool pldmVerbose);
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050076
John Wang58a0e062019-11-08 15:38:15 +080077class CommandInterface
78{
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +080079
John Wang58a0e062019-11-08 15:38:15 +080080 public:
81 explicit CommandInterface(const char* type, const char* name,
82 CLI::App* app) :
83 pldmType(type),
Deepak Kodihallid6638b72020-07-02 08:36:14 -050084 commandName(name), mctp_eid(PLDM_ENTITY_ID), pldmVerbose(false),
85 instanceId(0)
John Wang58a0e062019-11-08 15:38:15 +080086 {
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +080087 app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID");
Sridevi Rameshc91822b2020-02-27 09:26:41 -060088 app->add_flag("-v, --verbose", pldmVerbose);
John Wang58a0e062019-11-08 15:38:15 +080089 app->callback([&]() { exec(); });
90 }
Sridevi Rameshc91822b2020-02-27 09:26:41 -060091
John Wang58a0e062019-11-08 15:38:15 +080092 virtual ~CommandInterface() = default;
93
94 virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0;
95
96 virtual void parseResponseMsg(struct pldm_msg* responsePtr,
97 size_t payloadLength) = 0;
98
John Wangb754eee2020-02-15 16:10:25 +080099 virtual void exec();
100
101 int pldmSendRecv(std::vector<uint8_t>& requestMsg,
102 std::vector<uint8_t>& responseMsg);
John Wang58a0e062019-11-08 15:38:15 +0800103
104 private:
105 const std::string pldmType;
106 const std::string commandName;
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +0800107 uint8_t mctp_eid;
Sridevi Rameshc91822b2020-02-27 09:26:41 -0600108 bool pldmVerbose;
Pavithra Barithayaac3c45a2020-03-05 02:28:26 -0600109
110 protected:
111 uint8_t instanceId;
John Wang58a0e062019-11-08 15:38:15 +0800112};
113
114} // namespace helper
115} // namespace pldmtool