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