xref: /openbmc/pldm/libpldmresponder/fru.hpp (revision 1f4df219)
1 #pragma once
2 
3 #include "config.h"
4 
5 #include "fru_parser.hpp"
6 #include "handler.hpp"
7 
8 #include <map>
9 #include <sdbusplus/message.hpp>
10 #include <string>
11 #include <variant>
12 #include <vector>
13 
14 #include "libpldm/fru.h"
15 
16 namespace pldm
17 {
18 
19 namespace responder
20 {
21 
22 namespace dbus
23 {
24 
25 using Value =
26     std::variant<bool, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t,
27                  uint64_t, double, std::string, std::vector<uint8_t>>;
28 using PropertyMap = std::map<Property, Value>;
29 using InterfaceMap = std::map<Interface, PropertyMap>;
30 using ObjectValueTree = std::map<sdbusplus::message::object_path, InterfaceMap>;
31 
32 } // namespace dbus
33 
34 /** @class FruImpl
35  *
36  *  @brief Builds the PLDM FRU table containing the FRU records
37  */
38 class FruImpl
39 {
40   public:
41     /* @brief Header size for FRU record, it includes the FRU record set
42      *        identifier, FRU record type, Number of FRU fields, Encoding type
43      *        of FRU fields
44      */
45     static constexpr size_t recHeaderSize =
46         sizeof(struct pldm_fru_record_data_format) -
47         sizeof(struct pldm_fru_record_tlv);
48 
49     /** @brief The FRU table is populated by processing the D-Bus inventory
50      *         namespace, based on the config files for FRU. The configPath is
51      *         consumed to build the FruParser object.
52      *
53      *  @param[in] configPath - path to the directory containing config files
54      * for PLDM FRU
55      */
56     FruImpl(const std::string& configPath);
57 
58     /** @brief Total length of the FRU table in bytes, this excludes the pad
59      *         bytes and the checksum.
60      *
61      *  @return size of the FRU table
62      */
63     uint32_t size() const
64     {
65         return table.size() - padBytes;
66     }
67 
68     /** @brief The checksum of the contents of the FRU table
69      *
70      *  @return checksum
71      */
72     uint32_t checkSum() const
73     {
74         return checksum;
75     }
76 
77     /** @brief Number of record set identifiers in the FRU tables
78      *
79      *  @return number of record set identifiers
80      */
81     uint16_t numRSI() const
82     {
83         return rsi;
84     }
85 
86     /** @brief The number of FRU records in the table
87      *
88      *  @return number of FRU records
89      */
90     uint16_t numRecords() const
91     {
92         return numRecs;
93     }
94 
95     /** @brief Get the FRU table
96      *
97      *  @param[out] - Populate response with the FRU table
98      */
99     void getFRUTable(Response& response);
100 
101   private:
102     uint16_t nextRSI()
103     {
104         return ++rsi;
105     }
106 
107     uint16_t rsi = 0;
108     uint16_t numRecs = 0;
109     uint8_t padBytes = 0;
110     std::vector<uint8_t> table;
111     uint32_t checksum = 0;
112 
113     /** @brief populateRecord builds the FRU records for an instance of FRU and
114      *         updates the FRU table with the FRU records.
115      *
116      *  @param[in] interfaces - D-Bus interfaces and the associated property
117      *                          values for the FRU
118      *  @param[in] recordInfos - FRU record info to build the FRU records
119      */
120     void populateRecords(const pldm::responder::dbus::InterfaceMap& interfaces,
121                          const fru_parser::FruRecordInfos& recordInfos);
122 };
123 
124 namespace fru
125 {
126 
127 class Handler : public CmdHandler
128 {
129 
130   public:
131     Handler(const std::string configPath) : impl(configPath)
132     {
133         handlers.emplace(PLDM_GET_FRU_RECORD_TABLE_METADATA,
134                          [this](const pldm_msg* request, size_t payloadLength) {
135                              return this->getFRURecordTableMetadata(
136                                  request, payloadLength);
137                          });
138 
139         handlers.emplace(PLDM_GET_FRU_RECORD_TABLE,
140                          [this](const pldm_msg* request, size_t payloadLength) {
141                              return this->getFRURecordTable(request,
142                                                             payloadLength);
143                          });
144     }
145 
146     FruImpl impl;
147 
148     /** @brief Handler for Get FRURecordTableMetadata
149      *
150      *  @param[in] request - Request message payload
151      *  @param[in] payloadLength - Request payload length
152      *
153      *  @return PLDM response message
154      */
155     Response getFRURecordTableMetadata(const pldm_msg* request,
156                                        size_t payloadLength);
157 
158     /** @brief Handler for GetFRURecordTable
159      *
160      *  @param[in] request - Request message payload
161      *  @param[in] payloadLength - Request payload length
162      *
163      *  @return PLDM response message
164      */
165     Response getFRURecordTable(const pldm_msg* request, size_t payloadLength);
166 };
167 
168 } // namespace fru
169 
170 } // namespace responder
171 
172 } // namespace pldm
173