1 #pragma once 2 3 #include "common/instance_id.hpp" 4 #include "common/utils.hpp" 5 6 #include <err.h> 7 #include <libpldm/base.h> 8 #include <libpldm/bios.h> 9 #include <libpldm/fru.h> 10 #include <libpldm/platform.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 using ordered_json = nlohmann::ordered_json; 31 32 /** @brief print the input message if pldmverbose is enabled 33 * 34 * @param[in] pldmVerbose - verbosity flag - true/false 35 * @param[in] msg - message to print 36 * @param[in] data - data to print 37 * 38 * @return - None 39 */ 40 41 template <class T> 42 void Logger(bool pldmverbose, const char* msg, const T& data) 43 { 44 if (pldmverbose) 45 { 46 std::stringstream s; 47 s << data; 48 std::cout << msg << s.str() << std::endl; 49 } 50 } 51 52 /** @brief Display in JSON format. 53 * 54 * @param[in] data - data to print in json 55 * 56 * @return - None 57 */ 58 static inline void DisplayInJson(const ordered_json& data) 59 { 60 std::cout << data.dump(4) << std::endl; 61 } 62 63 /** @brief MCTP socket read/receive 64 * 65 * @param[in] requestMsg - Request message to compare against loopback 66 * message received from mctp socket 67 * @param[out] responseMsg - Response buffer received from mctp socket 68 * @param[in] pldmVerbose - verbosity flag - true/false 69 * 70 * @return - 0 on success. 71 * -1 or -errno on failure. 72 */ 73 int mctpSockSendRecv(const std::vector<uint8_t>& requestMsg, 74 std::vector<uint8_t>& responseMsg, bool pldmVerbose); 75 76 class CommandInterface 77 { 78 public: 79 explicit CommandInterface(const char* type, const char* name, 80 CLI::App* app) : 81 pldmType(type), commandName(name), mctp_eid(PLDM_ENTITY_ID), 82 pldmVerbose(false), instanceId(0) 83 { 84 app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID"); 85 app->add_flag("-v, --verbose", pldmVerbose); 86 app->add_option("-n, --retry-count", numRetries, 87 "Number of retry when PLDM request message is failed"); 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 /** 104 * @brief get MCTP endpoint ID 105 * 106 * @return uint8_t - MCTP endpoint ID 107 */ 108 inline uint8_t getMCTPEID() 109 { 110 return mctp_eid; 111 } 112 113 /** 114 * @brief get PLDM type 115 * 116 * @return pldm type 117 */ 118 inline std::string getPLDMType() 119 { 120 return pldmType; 121 } 122 123 /** 124 * @brief get command name 125 * 126 * @return the command name 127 */ 128 inline std::string getCommandName() 129 { 130 return commandName; 131 } 132 133 private: 134 const std::string pldmType; 135 const std::string commandName; 136 uint8_t mctp_eid; 137 bool pldmVerbose; 138 139 protected: 140 uint8_t instanceId; 141 pldm::InstanceIdDb instanceIdDb; 142 uint8_t numRetries = 0; 143 }; 144 145 } // namespace helper 146 } // namespace pldmtool 147