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/recieve 64 * 65 * @param[in] requestMsg - Request message to compare against loopback 66 * message recieved from mctp socket 67 * @param[out] responseMsg - Response buffer recieved 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), 82 commandName(name), mctp_eid(PLDM_ENTITY_ID), pldmVerbose(false), 83 instanceId(0) 84 { 85 app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID"); 86 app->add_flag("-v, --verbose", pldmVerbose); 87 app->add_option("-n, --retry-count", numRetries, 88 "Number of retry when PLDM request message is failed"); 89 app->callback([&]() { exec(); }); 90 } 91 92 virtual ~CommandInterface() = default; 93 94 virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0; 95 96 virtual void parseResponseMsg(struct pldm_msg* responsePtr, 97 size_t payloadLength) = 0; 98 99 virtual void exec(); 100 101 int pldmSendRecv(std::vector<uint8_t>& requestMsg, 102 std::vector<uint8_t>& responseMsg); 103 104 /** 105 * @brief get MCTP endpoint ID 106 * 107 * @return uint8_t - MCTP endpoint ID 108 */ 109 inline uint8_t getMCTPEID() 110 { 111 return mctp_eid; 112 } 113 114 /** 115 * @brief get PLDM type 116 * 117 * @return pldm type 118 */ 119 inline std::string getPLDMType() 120 { 121 return pldmType; 122 } 123 124 /** 125 * @brief get command name 126 * 127 * @return the command name 128 */ 129 inline std::string getCommandName() 130 { 131 return commandName; 132 } 133 134 private: 135 const std::string pldmType; 136 const std::string commandName; 137 uint8_t mctp_eid; 138 bool pldmVerbose; 139 140 protected: 141 uint8_t instanceId; 142 pldm::InstanceIdDb instanceIdDb; 143 uint8_t numRetries = 0; 144 }; 145 146 } // namespace helper 147 } // namespace pldmtool 148