blob: 3ce01f393b3c4c0766ca6eb8dc7cdea7d9267e61 [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>
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
George Liu83409572019-12-24 18:42:54 +080028using namespace pldm::utils;
John Wang58a0e062019-11-08 15:38:15 +080029constexpr uint8_t PLDM_ENTITY_ID = 8;
30constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1;
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050031
32/** @brief Print the buffer
33 *
34 * @param[in] buffer - Buffer to print
Sridevi Rameshc91822b2020-02-27 09:26:41 -060035 * @param[in] pldmVerbose -verbosity flag - true/false
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050036 *
37 * @return - None
38 */
Sridevi Rameshc91822b2020-02-27 09:26:41 -060039void printBuffer(const std::vector<uint8_t>& buffer, bool pldmVerbose);
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050040
Sridevi Rameshc91822b2020-02-27 09:26:41 -060041/** @brief print the input message if pldmverbose is enabled
42 *
43 * @param[in] pldmVerbose - verbosity flag - true/false
44 * @param[in] msg - message to print
45 * @param[in] data - data to print
46 *
47 * @return - None
48 */
49
50template <class T>
51void Logger(bool pldmverbose, const char* msg, const T& data)
52{
53 if (pldmverbose)
54 {
55 std::stringstream s;
56 s << data;
57 std::cout << msg << s.str() << std::endl;
58 }
59}
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050060/** @brief MCTP socket read/recieve
61 *
62 * @param[in] requestMsg - Request message to compare against loopback
63 * message recieved from mctp socket
64 * @param[out] responseMsg - Response buffer recieved from mctp socket
Sridevi Rameshc91822b2020-02-27 09:26:41 -060065 * @param[in] pldmVerbose - verbosity flag - true/false
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050066 *
67 * @return - 0 on success.
68 * -1 or -errno on failure.
69 */
70int mctpSockSendRecv(const std::vector<uint8_t>& requestMsg,
Sridevi Rameshc91822b2020-02-27 09:26:41 -060071 std::vector<uint8_t>& responseMsg, bool pldmVerbose);
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050072
John Wang58a0e062019-11-08 15:38:15 +080073class CommandInterface
74{
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +080075
John Wang58a0e062019-11-08 15:38:15 +080076 public:
77 explicit CommandInterface(const char* type, const char* name,
78 CLI::App* app) :
79 pldmType(type),
Deepak Kodihallid6638b72020-07-02 08:36:14 -050080 commandName(name), mctp_eid(PLDM_ENTITY_ID), pldmVerbose(false),
81 instanceId(0)
John Wang58a0e062019-11-08 15:38:15 +080082 {
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +080083 app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID");
Sridevi Rameshc91822b2020-02-27 09:26:41 -060084 app->add_flag("-v, --verbose", pldmVerbose);
John Wang58a0e062019-11-08 15:38:15 +080085 app->callback([&]() { exec(); });
86 }
Sridevi Rameshc91822b2020-02-27 09:26:41 -060087
John Wang58a0e062019-11-08 15:38:15 +080088 virtual ~CommandInterface() = default;
89
90 virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0;
91
92 virtual void parseResponseMsg(struct pldm_msg* responsePtr,
93 size_t payloadLength) = 0;
94
John Wangb754eee2020-02-15 16:10:25 +080095 virtual void exec();
96
97 int pldmSendRecv(std::vector<uint8_t>& requestMsg,
98 std::vector<uint8_t>& responseMsg);
John Wang58a0e062019-11-08 15:38:15 +080099
100 private:
101 const std::string pldmType;
102 const std::string commandName;
Pavithra Barithayaf5ad6c72019-12-06 15:10:52 +0800103 uint8_t mctp_eid;
Sridevi Rameshc91822b2020-02-27 09:26:41 -0600104 bool pldmVerbose;
Pavithra Barithayaac3c45a2020-03-05 02:28:26 -0600105
106 protected:
107 uint8_t instanceId;
John Wang58a0e062019-11-08 15:38:15 +0800108};
109
110} // namespace helper
111} // namespace pldmtool