1f7f5da97SDeepak Kodihalli #pragma once 2f7f5da97SDeepak Kodihalli 3f7f5da97SDeepak Kodihalli #include "common/utils.hpp" 4f7f5da97SDeepak Kodihalli 5f7f5da97SDeepak Kodihalli #include <err.h> 6c453e164SGeorge Liu #include <libpldm/base.h> 7c453e164SGeorge Liu #include <libpldm/bios.h> 8c453e164SGeorge Liu #include <libpldm/fru.h> 9c453e164SGeorge Liu #include <libpldm/platform.h> 10f7f5da97SDeepak Kodihalli #include <sys/socket.h> 11f7f5da97SDeepak Kodihalli #include <sys/un.h> 12f7f5da97SDeepak Kodihalli #include <unistd.h> 13f7f5da97SDeepak Kodihalli 14f7f5da97SDeepak Kodihalli #include <CLI/CLI.hpp> 15ca4a815bSSridevi Ramesh #include <nlohmann/json.hpp> 16f7f5da97SDeepak Kodihalli 17f7f5da97SDeepak Kodihalli #include <cstring> 18f7f5da97SDeepak Kodihalli #include <iomanip> 19f7f5da97SDeepak Kodihalli #include <iostream> 20f7f5da97SDeepak Kodihalli #include <utility> 21f7f5da97SDeepak Kodihalli 22f7f5da97SDeepak Kodihalli namespace pldmtool 23f7f5da97SDeepak Kodihalli { 24f7f5da97SDeepak Kodihalli 25f7f5da97SDeepak Kodihalli namespace helper 26f7f5da97SDeepak Kodihalli { 27f7f5da97SDeepak Kodihalli 28f7f5da97SDeepak Kodihalli constexpr uint8_t PLDM_ENTITY_ID = 8; 29f7f5da97SDeepak Kodihalli constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1; 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> 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 */ 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 63f7f5da97SDeepak Kodihalli /** @brief MCTP socket read/recieve 64f7f5da97SDeepak Kodihalli * 65f7f5da97SDeepak Kodihalli * @param[in] requestMsg - Request message to compare against loopback 66f7f5da97SDeepak Kodihalli * message recieved from mctp socket 67f7f5da97SDeepak Kodihalli * @param[out] responseMsg - Response buffer recieved 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: 79f7f5da97SDeepak Kodihalli explicit CommandInterface(const char* type, const char* name, 80f7f5da97SDeepak Kodihalli CLI::App* app) : 81f7f5da97SDeepak Kodihalli pldmType(type), 82d6638b70SDeepak Kodihalli commandName(name), mctp_eid(PLDM_ENTITY_ID), pldmVerbose(false), 83d6638b70SDeepak Kodihalli instanceId(0) 84f7f5da97SDeepak Kodihalli { 85f7f5da97SDeepak Kodihalli app->add_option("-m,--mctp_eid", mctp_eid, "MCTP endpoint ID"); 86f7f5da97SDeepak Kodihalli app->add_flag("-v, --verbose", pldmVerbose); 87f7f5da97SDeepak Kodihalli app->callback([&]() { exec(); }); 88f7f5da97SDeepak Kodihalli } 89f7f5da97SDeepak Kodihalli 90f7f5da97SDeepak Kodihalli virtual ~CommandInterface() = default; 91f7f5da97SDeepak Kodihalli 92f7f5da97SDeepak Kodihalli virtual std::pair<int, std::vector<uint8_t>> createRequestMsg() = 0; 93f7f5da97SDeepak Kodihalli 94f7f5da97SDeepak Kodihalli virtual void parseResponseMsg(struct pldm_msg* responsePtr, 95f7f5da97SDeepak Kodihalli size_t payloadLength) = 0; 96f7f5da97SDeepak Kodihalli 97f7f5da97SDeepak Kodihalli virtual void exec(); 98f7f5da97SDeepak Kodihalli 99f7f5da97SDeepak Kodihalli int pldmSendRecv(std::vector<uint8_t>& requestMsg, 100f7f5da97SDeepak Kodihalli std::vector<uint8_t>& responseMsg); 101f7f5da97SDeepak Kodihalli 102*526461a0SChinmay Shripad Hegde /** 103*526461a0SChinmay Shripad Hegde * @brief get MCTP endpoint ID 104*526461a0SChinmay Shripad Hegde * 105*526461a0SChinmay Shripad Hegde * @return uint8_t - MCTP endpoint ID 106*526461a0SChinmay Shripad Hegde */ 107*526461a0SChinmay Shripad Hegde inline uint8_t getMCTPEID() 108*526461a0SChinmay Shripad Hegde { 109*526461a0SChinmay Shripad Hegde return mctp_eid; 110*526461a0SChinmay Shripad Hegde } 111*526461a0SChinmay Shripad Hegde 112f7f5da97SDeepak Kodihalli private: 113f7f5da97SDeepak Kodihalli const std::string pldmType; 114f7f5da97SDeepak Kodihalli const std::string commandName; 115f7f5da97SDeepak Kodihalli uint8_t mctp_eid; 116f7f5da97SDeepak Kodihalli bool pldmVerbose; 117f7f5da97SDeepak Kodihalli 118f7f5da97SDeepak Kodihalli protected: 119f7f5da97SDeepak Kodihalli uint8_t instanceId; 120f7f5da97SDeepak Kodihalli }; 121f7f5da97SDeepak Kodihalli 122f7f5da97SDeepak Kodihalli } // namespace helper 123f7f5da97SDeepak Kodihalli } // namespace pldmtool 124