blob: bd890d900b386d7726a38e6213e8732b48734741 [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
George Liu83409572019-12-24 18:42:54 +080029using namespace pldm::utils;
John Wang58a0e062019-11-08 15:38:15 +080030constexpr uint8_t PLDM_ENTITY_ID = 8;
31constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1;
Sridevi Rameshca4a8152020-08-11 09:26:19 -050032using ordered_json = nlohmann::ordered_json;
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050033
Sridevi Rameshc91822b2020-02-27 09:26:41 -060034/** @brief print the input message if pldmverbose is enabled
35 *
36 * @param[in] pldmVerbose - verbosity flag - true/false
37 * @param[in] msg - message to print
38 * @param[in] data - data to print
39 *
40 * @return - None
41 */
42
43template <class T>
44void Logger(bool pldmverbose, const char* msg, const T& data)
45{
46 if (pldmverbose)
47 {
48 std::stringstream s;
49 s << data;
50 std::cout << msg << s.str() << std::endl;
51 }
52}
Sridevi Rameshca4a8152020-08-11 09:26:19 -050053
54/** @brief Display in JSON format.
55 *
56 * @param[in] data - data to print in json
57 *
58 * @return - None
59 */
60static inline void DisplayInJson(const ordered_json& data)
61{
62 std::cout << data.dump(4) << std::endl;
63}
64
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050065/** @brief MCTP socket read/recieve
66 *
67 * @param[in] requestMsg - Request message to compare against loopback
68 * message recieved from mctp socket
69 * @param[out] responseMsg - Response buffer recieved from mctp socket
Sridevi Rameshc91822b2020-02-27 09:26:41 -060070 * @param[in] pldmVerbose - verbosity flag - true/false
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050071 *
72 * @return - 0 on success.
73 * -1 or -errno on failure.
74 */
75int mctpSockSendRecv(const std::vector<uint8_t>& requestMsg,
Sridevi Rameshc91822b2020-02-27 09:26:41 -060076 std::vector<uint8_t>& responseMsg, bool pldmVerbose);
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050077
John Wang58a0e062019-11-08 15:38:15 +080078class CommandInterface
79{
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +080080
John Wang58a0e062019-11-08 15:38:15 +080081 public:
82 explicit CommandInterface(const char* type, const char* name,
83 CLI::App* app) :
84 pldmType(type),
Deepak Kodihallid6638b72020-07-02 08:36:14 -050085 commandName(name), mctp_eid(PLDM_ENTITY_ID), pldmVerbose(false),
86 instanceId(0)
John Wang58a0e062019-11-08 15:38:15 +080087 {
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +080088 app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID");
Sridevi Rameshc91822b2020-02-27 09:26:41 -060089 app->add_flag("-v, --verbose", pldmVerbose);
John Wang58a0e062019-11-08 15:38:15 +080090 app->callback([&]() { exec(); });
91 }
Sridevi Rameshc91822b2020-02-27 09:26:41 -060092
John Wang58a0e062019-11-08 15:38:15 +080093 virtual ~CommandInterface() = default;
94
95 virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0;
96
97 virtual void parseResponseMsg(struct pldm_msg* responsePtr,
98 size_t payloadLength) = 0;
99
John Wangb754eee2020-02-15 16:10:25 +0800100 virtual void exec();
101
102 int pldmSendRecv(std::vector<uint8_t>& requestMsg,
103 std::vector<uint8_t>& responseMsg);
John Wang58a0e062019-11-08 15:38:15 +0800104
105 private:
106 const std::string pldmType;
107 const std::string commandName;
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +0800108 uint8_t mctp_eid;
Sridevi Rameshc91822b2020-02-27 09:26:41 -0600109 bool pldmVerbose;
Pavithra Barithayaac3c45a2020-03-05 02:28:26 -0600110
111 protected:
112 uint8_t instanceId;
John Wang58a0e062019-11-08 15:38:15 +0800113};
114
115} // namespace helper
116} // namespace pldmtool