xref: /openbmc/pldm/pldmtool/pldm_fru_cmd.cpp (revision 579a34a3)
1 #include "pldm_fru_cmd.hpp"
2 
3 #include "pldm_cmd_helper.hpp"
4 
5 namespace pldmtool
6 {
7 
8 namespace fru
9 {
10 
11 namespace
12 {
13 
14 using namespace pldmtool::helper;
15 
16 std::vector<std::unique_ptr<CommandInterface>> commands;
17 
18 } // namespace
19 
20 class GetFruRecordTableMetadata : public CommandInterface
21 {
22   public:
23     ~GetFruRecordTableMetadata() = default;
24     GetFruRecordTableMetadata() = delete;
25     GetFruRecordTableMetadata(const GetFruRecordTableMetadata&) = delete;
26     GetFruRecordTableMetadata(GetFruRecordTableMetadata&&) = default;
27     GetFruRecordTableMetadata&
28         operator=(const GetFruRecordTableMetadata&) = delete;
29     GetFruRecordTableMetadata& operator=(GetFruRecordTableMetadata&&) = default;
30 
31     using CommandInterface::CommandInterface;
32 
33     std::pair<int, std::vector<uint8_t>> createRequestMsg() override
34     {
35         std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
36         auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
37 
38         auto rc = encode_get_fru_record_table_metadata_req(
39             instanceId, request, PLDM_GET_FRU_RECORD_TABLE_METADATA_REQ_BYTES);
40         return {rc, requestMsg};
41     }
42 
43     void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
44     {
45         uint8_t cc = 0;
46         uint8_t fru_data_major_version, fru_data_minor_version;
47         uint32_t fru_table_maximum_size, fru_table_length;
48         uint16_t total_record_set_identifiers, total_table_records;
49         uint32_t checksum;
50 
51         auto rc = decode_get_fru_record_table_metadata_resp(
52             responsePtr, payloadLength, &cc, &fru_data_major_version,
53             &fru_data_minor_version, &fru_table_maximum_size, &fru_table_length,
54             &total_record_set_identifiers, &total_table_records, &checksum);
55         if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
56         {
57             std::cerr << "Response Message Error: "
58                       << "rc=" << rc << ",cc=" << (int)cc << std::endl;
59             return;
60         }
61         std::cout << "FRUDATAMajorVersion : "
62                   << static_cast<uint32_t>(fru_data_major_version) << std::endl;
63         std::cout << "FRUDATAMinorVersion : "
64                   << static_cast<uint32_t>(fru_data_minor_version) << std::endl;
65         std::cout << "FRUTableMaximumSize : " << fru_table_maximum_size
66                   << std::endl;
67         std::cout << "FRUTableLength : " << fru_table_length << std::endl;
68         std::cout << "Total number of Record Set Identifiers in table : "
69                   << total_record_set_identifiers << std::endl;
70         std::cout << "Total number of records in table :  "
71                   << total_table_records << std::endl;
72         std::cout << "FRU DATAStructureTableIntegrityChecksum :  " << checksum
73                   << std::endl;
74     }
75 };
76 
77 void registerCommand(CLI::App& app)
78 {
79     auto fru = app.add_subcommand("fru", "FRU type command");
80     fru->require_subcommand(1);
81     auto getFruRecordTableMetadata = fru->add_subcommand(
82         "GetFruRecordTableMetadata", "get FRU record table metadata");
83     commands.push_back(std::make_unique<GetFruRecordTableMetadata>(
84         "fru", "GetFruRecordTableMetadata", getFruRecordTableMetadata));
85 }
86 
87 } // namespace fru
88 
89 } // namespace pldmtool
90