blob: 0758c8d43d7865bbae7dedb203a4ab0f0312b6cc [file] [log] [blame]
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05001#include "pldm_base_cmd.hpp"
2
3#include "pldm_cmd_helper.hpp"
4
John Wang58a0e062019-11-08 15:38:15 +08005#include "libpldm/utils.h"
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05006
John Wang58a0e062019-11-08 15:38:15 +08007namespace pldmtool
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05008{
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05009
John Wang58a0e062019-11-08 15:38:15 +080010namespace base
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050011{
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050012
John Wang58a0e062019-11-08 15:38:15 +080013namespace
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050014{
John Wang58a0e062019-11-08 15:38:15 +080015
16using namespace pldmtool::helper;
17
18std::vector<std::unique_ptr<CommandInterface>> commands;
19const std::map<const char*, pldm_supported_types> pldmTypes{
20 {"base", PLDM_BASE}, {"platform", PLDM_PLATFORM}, {"bios", PLDM_BIOS},
21 {"fru", PLDM_FRU}, {"oem", PLDM_OEM},
22};
23
24} // namespace
25
26class GetPLDMTypes : public CommandInterface
27{
28 public:
29 ~GetPLDMTypes() = default;
30 GetPLDMTypes() = delete;
31 GetPLDMTypes(const GetPLDMTypes&) = delete;
32 GetPLDMTypes(GetPLDMTypes&&) = default;
33 GetPLDMTypes& operator=(const GetPLDMTypes&) = delete;
34 GetPLDMTypes& operator=(GetPLDMTypes&&) = default;
35
36 using CommandInterface::CommandInterface;
37
38 std::pair<int, std::vector<uint8_t>> createRequestMsg() override
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050039 {
John Wang58a0e062019-11-08 15:38:15 +080040 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
41 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
42 auto rc = encode_get_types_req(PLDM_LOCAL_INSTANCE_ID, request);
43 return {rc, requestMsg};
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050044 }
45
John Wang58a0e062019-11-08 15:38:15 +080046 void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050047 {
John Wang58a0e062019-11-08 15:38:15 +080048 uint8_t cc = 0;
49 std::vector<bitfield8_t> types(8);
50 auto rc = decode_get_types_resp(responsePtr, payloadLength, &cc,
51 types.data());
52 if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
53 {
54 std::cerr << "Response Message Error: "
Sampa Misraaa8ae722019-12-12 03:20:40 -060055 << "rc=" << rc << ",cc=" << (int)cc << "\n";
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050056 return;
John Wang58a0e062019-11-08 15:38:15 +080057 }
58
59 printPldmTypes(types);
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050060 }
61
John Wang58a0e062019-11-08 15:38:15 +080062 private:
63 void printPldmTypes(std::vector<bitfield8_t>& types)
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050064 {
John Wang58a0e062019-11-08 15:38:15 +080065 std::cout << "Supported types:";
66 for (int i = 0; i < PLDM_MAX_TYPES; i++)
67 {
68 bitfield8_t b = types[i / 8];
69 if (b.byte & (1 << i % 8))
70 {
71 std::cout << " " << i;
72 auto it = std::find_if(
73 pldmTypes.begin(), pldmTypes.end(),
74 [i](const auto& typePair) { return typePair.second == i; });
75 if (it != pldmTypes.end())
76 {
77
78 std::cout << "(" << it->first << ")";
79 }
80 }
81 }
82
83 std::cout << std::endl;
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050084 }
John Wang58a0e062019-11-08 15:38:15 +080085};
86
87class GetPLDMVersion : public CommandInterface
88{
89 public:
90 ~GetPLDMVersion() = default;
91 GetPLDMVersion() = delete;
92 GetPLDMVersion(const GetPLDMVersion&) = delete;
93 GetPLDMVersion(GetPLDMVersion&&) = default;
94 GetPLDMVersion& operator=(const GetPLDMVersion&) = delete;
95 GetPLDMVersion& operator=(GetPLDMVersion&&) = default;
96
97 explicit GetPLDMVersion(const char* type, const char* name, CLI::App* app) :
98 CommandInterface(type, name, app)
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050099 {
John Wang58a0e062019-11-08 15:38:15 +0800100 app->add_option("-t,--type", pldmType, "pldm supported type")
101 ->required()
102 ->transform(CLI::CheckedTransformer(pldmTypes, CLI::ignore_case));
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500103 }
John Wang58a0e062019-11-08 15:38:15 +0800104 std::pair<int, std::vector<uint8_t>> createRequestMsg() override
105 {
106 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
107 PLDM_GET_VERSION_REQ_BYTES);
108 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
109
110 auto rc = encode_get_version_req(PLDM_LOCAL_INSTANCE_ID, 0,
111 PLDM_GET_FIRSTPART, pldmType, request);
112 return {rc, requestMsg};
113 }
114
115 void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
116 {
117 uint8_t cc = 0, transferFlag = 0;
118 uint32_t transferHandle = 0;
119 ver32_t version;
120 auto rc =
121 decode_get_version_resp(responsePtr, payloadLength, &cc,
122 &transferHandle, &transferFlag, &version);
123 if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
124 {
125 std::cerr << "Response Message Error: "
Sampa Misraaa8ae722019-12-12 03:20:40 -0600126 << "rc=" << rc << ",cc=" << (int)cc << "\n";
John Wang58a0e062019-11-08 15:38:15 +0800127 return;
128 }
129 char buffer[16] = {0};
130 ver2str(&version, buffer, sizeof(buffer));
131 std::cout << "Type " << pldmType;
132 auto it = std::find_if(
133 pldmTypes.begin(), pldmTypes.end(),
134 [&](const auto& typePair) { return typePair.second == pldmType; });
135
136 if (it != pldmTypes.end())
137 {
138 std::cout << "(" << it->first << ")";
139 }
140 std::cout << ": " << buffer << std::endl;
141 }
142
143 private:
144 pldm_supported_types pldmType;
145};
146
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600147class GetTID : public CommandInterface
148{
149 public:
150 ~GetTID() = default;
151 GetTID() = delete;
152 GetTID(const GetTID&) = delete;
153 GetTID(GetTID&&) = default;
154 GetTID& operator=(const GetTID&) = delete;
155 GetTID& operator=(GetTID&&) = default;
156
157 using CommandInterface::CommandInterface;
158
159 std::pair<int, std::vector<uint8_t>> createRequestMsg() override
160 {
161 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
162 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
163 auto rc = encode_get_tid_req(PLDM_LOCAL_INSTANCE_ID, request);
164 return {rc, requestMsg};
165 }
166
167 void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
168 {
169 uint8_t cc = 0;
170 uint8_t tid = 0;
171 std::vector<bitfield8_t> types(8);
172 auto rc = decode_get_tid_resp(responsePtr, payloadLength, &cc, &tid);
173 if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
174 {
175 std::cerr << "Response Message Error: "
176 << "rc=" << rc << ",cc=" << (int)cc << "\n";
177 return;
178 }
179 std::cout << "Parsed Response Msg: " << std::endl;
180 std::cout << "TID : " << static_cast<uint32_t>(tid) << std::endl;
181 }
182};
183
John Wang58a0e062019-11-08 15:38:15 +0800184void registerCommand(CLI::App& app)
185{
186 auto base = app.add_subcommand("base", "base type command");
187 base->require_subcommand(1);
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600188
John Wang58a0e062019-11-08 15:38:15 +0800189 auto getPLDMTypes =
190 base->add_subcommand("GetPLDMTypes", "get pldm supported types");
191 commands.push_back(
192 std::make_unique<GetPLDMTypes>("base", "GetPLDMTypes", getPLDMTypes));
193
194 auto getPLDMVersion =
195 base->add_subcommand("GetPLDMVersion", "get version of a certain type");
196 commands.push_back(std::make_unique<GetPLDMVersion>(
197 "base", "GetPLDMVersion", getPLDMVersion));
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600198
199 auto getPLDMTID = base->add_subcommand("GetTID", "get Terminus ID (TID)");
200 commands.push_back(std::make_unique<GetTID>("base", "GetTID", getPLDMTID));
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500201}
John Wang58a0e062019-11-08 15:38:15 +0800202
203} // namespace base
204} // namespace pldmtool