1 #pragma once 2 3 #include "libpldm/base.h" 4 #include "libpldm/bios.h" 5 #include "libpldm/fru.h" 6 #include "libpldm/platform.h" 7 8 #include "common/utils.hpp" 9 10 #include <err.h> 11 #include <sys/socket.h> 12 #include <sys/un.h> 13 #include <unistd.h> 14 15 #include <CLI/CLI.hpp> 16 #include <nlohmann/json.hpp> 17 18 #include <cstring> 19 #include <iomanip> 20 #include <iostream> 21 #include <utility> 22 23 namespace pldmtool 24 { 25 26 namespace helper 27 { 28 29 constexpr uint8_t PLDM_ENTITY_ID = 8; 30 constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1; 31 using ordered_json = nlohmann::ordered_json; 32 33 /** @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 42 template <class T> 43 void 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 } 52 53 /** @brief Display in JSON format. 54 * 55 * @param[in] data - data to print in json 56 * 57 * @return - None 58 */ 59 static inline void DisplayInJson(const ordered_json& data) 60 { 61 std::cout << data.dump(4) << std::endl; 62 } 63 64 /** @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 69 * @param[in] pldmVerbose - verbosity flag - true/false 70 * 71 * @return - 0 on success. 72 * -1 or -errno on failure. 73 */ 74 int mctpSockSendRecv(const std::vector<uint8_t>& requestMsg, 75 std::vector<uint8_t>& responseMsg, bool pldmVerbose); 76 77 class CommandInterface 78 { 79 public: 80 explicit CommandInterface(const char* type, const char* name, 81 CLI::App* app) : 82 pldmType(type), 83 commandName(name), mctp_eid(PLDM_ENTITY_ID), pldmVerbose(false), 84 instanceId(0) 85 { 86 app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID"); 87 app->add_flag("-v, --verbose", pldmVerbose); 88 app->callback([&]() { exec(); }); 89 } 90 91 virtual ~CommandInterface() = default; 92 93 virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0; 94 95 virtual void parseResponseMsg(struct pldm_msg* responsePtr, 96 size_t payloadLength) = 0; 97 98 virtual void exec(); 99 100 int pldmSendRecv(std::vector<uint8_t>& requestMsg, 101 std::vector<uint8_t>& responseMsg); 102 103 private: 104 const std::string pldmType; 105 const std::string commandName; 106 uint8_t mctp_eid; 107 bool pldmVerbose; 108 109 protected: 110 uint8_t instanceId; 111 }; 112 113 } // namespace helper 114 } // namespace pldmtool 115