1d130e1a3SDeepak Kodihalli #include "utils.hpp"
2d130e1a3SDeepak Kodihalli
3c453e164SGeorge Liu #include <libpldm/pdr.h>
4c453e164SGeorge Liu #include <libpldm/pldm_types.h>
56c7fed4cSGilbert Chen #include <linux/mctp.h>
6d130e1a3SDeepak Kodihalli
749cfb138SRiya Dixit #include <phosphor-logging/lg2.hpp>
8d130e1a3SDeepak Kodihalli #include <xyz/openbmc_project/Common/error.hpp>
97b4d59aaSPavithra Barithaya #include <xyz/openbmc_project/Logging/Create/client.hpp>
107b4d59aaSPavithra Barithaya #include <xyz/openbmc_project/ObjectMapper/client.hpp>
11d130e1a3SDeepak Kodihalli
125492207aSTom Joseph #include <algorithm>
13d130e1a3SDeepak Kodihalli #include <array>
145492207aSTom Joseph #include <cctype>
15d130e1a3SDeepak Kodihalli #include <ctime>
16d130e1a3SDeepak Kodihalli #include <fstream>
17d130e1a3SDeepak Kodihalli #include <iostream>
18d130e1a3SDeepak Kodihalli #include <map>
19d130e1a3SDeepak Kodihalli #include <stdexcept>
20d130e1a3SDeepak Kodihalli #include <string>
21d130e1a3SDeepak Kodihalli #include <vector>
22d130e1a3SDeepak Kodihalli
2349cfb138SRiya Dixit PHOSPHOR_LOG2_USING;
2449cfb138SRiya Dixit
25d130e1a3SDeepak Kodihalli namespace pldm
26d130e1a3SDeepak Kodihalli {
27d130e1a3SDeepak Kodihalli namespace utils
28d130e1a3SDeepak Kodihalli {
297b4d59aaSPavithra Barithaya
308fa40dbeSChau Ly using ObjectMapper = sdbusplus::client::xyz::openbmc_project::ObjectMapper<>;
318fa40dbeSChau Ly
328fa40dbeSChau Ly constexpr const char* MCTP_INTERFACE_CC = "au.com.codeconstruct.MCTP.Endpoint1";
338fa40dbeSChau Ly constexpr const char* MCTP_ENDPOINT_RECOVER_METHOD = "Recover";
348fa40dbeSChau Ly
findStateEffecterPDR(uint8_t,uint16_t entityID,uint16_t stateSetId,const pldm_pdr * repo)35366507c8SPatrick Williams std::vector<std::vector<uint8_t>> findStateEffecterPDR(
36366507c8SPatrick Williams uint8_t /*tid*/, uint16_t entityID, uint16_t stateSetId,
37366507c8SPatrick Williams const pldm_pdr* repo)
38d130e1a3SDeepak Kodihalli {
39d130e1a3SDeepak Kodihalli uint8_t* outData = nullptr;
40d130e1a3SDeepak Kodihalli uint32_t size{};
41d130e1a3SDeepak Kodihalli const pldm_pdr_record* record{};
42d130e1a3SDeepak Kodihalli std::vector<std::vector<uint8_t>> pdrs;
43d130e1a3SDeepak Kodihalli try
44d130e1a3SDeepak Kodihalli {
45d130e1a3SDeepak Kodihalli do
46d130e1a3SDeepak Kodihalli {
47d130e1a3SDeepak Kodihalli record = pldm_pdr_find_record_by_type(repo, PLDM_STATE_EFFECTER_PDR,
48d130e1a3SDeepak Kodihalli record, &outData, &size);
49d130e1a3SDeepak Kodihalli if (record)
50d130e1a3SDeepak Kodihalli {
51*39d13b77SPavithra Barithaya auto pdr = new (outData) pldm_state_effecter_pdr;
52d130e1a3SDeepak Kodihalli auto compositeEffecterCount = pdr->composite_effecter_count;
53d130e1a3SDeepak Kodihalli auto possible_states_start = pdr->possible_states;
54d130e1a3SDeepak Kodihalli
55d130e1a3SDeepak Kodihalli for (auto effecters = 0x00; effecters < compositeEffecterCount;
56d130e1a3SDeepak Kodihalli effecters++)
57d130e1a3SDeepak Kodihalli {
58*39d13b77SPavithra Barithaya auto possibleStates = new (possible_states_start)
59*39d13b77SPavithra Barithaya state_effecter_possible_states;
60d130e1a3SDeepak Kodihalli auto setId = possibleStates->state_set_id;
61d130e1a3SDeepak Kodihalli auto possibleStateSize =
62d130e1a3SDeepak Kodihalli possibleStates->possible_states_size;
63d130e1a3SDeepak Kodihalli
64d130e1a3SDeepak Kodihalli if (pdr->entity_type == entityID && setId == stateSetId)
65d130e1a3SDeepak Kodihalli {
66d130e1a3SDeepak Kodihalli std::vector<uint8_t> effecter_pdr(&outData[0],
67d130e1a3SDeepak Kodihalli &outData[size]);
68d130e1a3SDeepak Kodihalli pdrs.emplace_back(std::move(effecter_pdr));
69d130e1a3SDeepak Kodihalli break;
70d130e1a3SDeepak Kodihalli }
71d130e1a3SDeepak Kodihalli possible_states_start += possibleStateSize + sizeof(setId) +
72d130e1a3SDeepak Kodihalli sizeof(possibleStateSize);
73d130e1a3SDeepak Kodihalli }
74d130e1a3SDeepak Kodihalli }
75d130e1a3SDeepak Kodihalli
76d130e1a3SDeepak Kodihalli } while (record);
77d130e1a3SDeepak Kodihalli }
78d130e1a3SDeepak Kodihalli catch (const std::exception& e)
79d130e1a3SDeepak Kodihalli {
8076f2c60aSRiya Dixit error("Failed to obtain a record, error - {ERROR}", "ERROR", e);
81d130e1a3SDeepak Kodihalli }
82d130e1a3SDeepak Kodihalli
83d130e1a3SDeepak Kodihalli return pdrs;
84d130e1a3SDeepak Kodihalli }
85d130e1a3SDeepak Kodihalli
86366507c8SPatrick Williams std::vector<std::vector<uint8_t>> findStateSensorPDR(
findStateSensorPDR(uint8_t,uint16_t entityID,uint16_t stateSetId,const pldm_pdr * repo)87366507c8SPatrick Williams uint8_t /*tid*/, uint16_t entityID, uint16_t stateSetId,
88d130e1a3SDeepak Kodihalli const pldm_pdr* repo)
89d130e1a3SDeepak Kodihalli {
90d130e1a3SDeepak Kodihalli uint8_t* outData = nullptr;
91d130e1a3SDeepak Kodihalli uint32_t size{};
92d130e1a3SDeepak Kodihalli const pldm_pdr_record* record{};
93d130e1a3SDeepak Kodihalli std::vector<std::vector<uint8_t>> pdrs;
94d130e1a3SDeepak Kodihalli try
95d130e1a3SDeepak Kodihalli {
96d130e1a3SDeepak Kodihalli do
97d130e1a3SDeepak Kodihalli {
98d130e1a3SDeepak Kodihalli record = pldm_pdr_find_record_by_type(repo, PLDM_STATE_SENSOR_PDR,
99d130e1a3SDeepak Kodihalli record, &outData, &size);
100d130e1a3SDeepak Kodihalli if (record)
101d130e1a3SDeepak Kodihalli {
102*39d13b77SPavithra Barithaya auto pdr = new (outData) pldm_state_sensor_pdr;
103d130e1a3SDeepak Kodihalli auto compositeSensorCount = pdr->composite_sensor_count;
104d130e1a3SDeepak Kodihalli auto possible_states_start = pdr->possible_states;
105d130e1a3SDeepak Kodihalli
106d130e1a3SDeepak Kodihalli for (auto sensors = 0x00; sensors < compositeSensorCount;
107d130e1a3SDeepak Kodihalli sensors++)
108d130e1a3SDeepak Kodihalli {
109*39d13b77SPavithra Barithaya auto possibleStates = new (possible_states_start)
110*39d13b77SPavithra Barithaya state_sensor_possible_states;
111d130e1a3SDeepak Kodihalli auto setId = possibleStates->state_set_id;
112d130e1a3SDeepak Kodihalli auto possibleStateSize =
113d130e1a3SDeepak Kodihalli possibleStates->possible_states_size;
114d130e1a3SDeepak Kodihalli
115d130e1a3SDeepak Kodihalli if (pdr->entity_type == entityID && setId == stateSetId)
116d130e1a3SDeepak Kodihalli {
117d130e1a3SDeepak Kodihalli std::vector<uint8_t> sensor_pdr(&outData[0],
118d130e1a3SDeepak Kodihalli &outData[size]);
119d130e1a3SDeepak Kodihalli pdrs.emplace_back(std::move(sensor_pdr));
120d130e1a3SDeepak Kodihalli break;
121d130e1a3SDeepak Kodihalli }
122d130e1a3SDeepak Kodihalli possible_states_start += possibleStateSize + sizeof(setId) +
123d130e1a3SDeepak Kodihalli sizeof(possibleStateSize);
124d130e1a3SDeepak Kodihalli }
125d130e1a3SDeepak Kodihalli }
126d130e1a3SDeepak Kodihalli
127d130e1a3SDeepak Kodihalli } while (record);
128d130e1a3SDeepak Kodihalli }
129d130e1a3SDeepak Kodihalli catch (const std::exception& e)
130d130e1a3SDeepak Kodihalli {
13176f2c60aSRiya Dixit error(
13276f2c60aSRiya Dixit "Failed to obtain a record with entity ID '{ENTITYID}', error - {ERROR}",
13376f2c60aSRiya Dixit "ENTITYID", entityID, "ERROR", e);
134d130e1a3SDeepak Kodihalli }
135d130e1a3SDeepak Kodihalli
136d130e1a3SDeepak Kodihalli return pdrs;
137d130e1a3SDeepak Kodihalli }
138d130e1a3SDeepak Kodihalli
139d130e1a3SDeepak Kodihalli uint8_t readHostEID()
140d130e1a3SDeepak Kodihalli {
readHostEID()141d130e1a3SDeepak Kodihalli uint8_t eid{};
14206052cc5SBrad Bishop std::ifstream eidFile{HOST_EID_PATH};
143d130e1a3SDeepak Kodihalli if (!eidFile.good())
144d130e1a3SDeepak Kodihalli {
14576f2c60aSRiya Dixit error("Failed to open remote terminus EID file at path '{PATH}'",
14676f2c60aSRiya Dixit "PATH", static_cast<std::string>(HOST_EID_PATH));
147d130e1a3SDeepak Kodihalli }
148d130e1a3SDeepak Kodihalli else
149d130e1a3SDeepak Kodihalli {
150d130e1a3SDeepak Kodihalli std::string eidStr;
151d130e1a3SDeepak Kodihalli eidFile >> eidStr;
152d130e1a3SDeepak Kodihalli if (!eidStr.empty())
153d130e1a3SDeepak Kodihalli {
154d130e1a3SDeepak Kodihalli eid = atoi(eidStr.c_str());
155d130e1a3SDeepak Kodihalli }
156d130e1a3SDeepak Kodihalli else
157d130e1a3SDeepak Kodihalli {
15876f2c60aSRiya Dixit error("Remote terminus EID file was empty");
159d130e1a3SDeepak Kodihalli }
160d130e1a3SDeepak Kodihalli }
161d130e1a3SDeepak Kodihalli
162d130e1a3SDeepak Kodihalli return eid;
163d130e1a3SDeepak Kodihalli }
164d130e1a3SDeepak Kodihalli
1656c7fed4cSGilbert Chen bool isValidEID(eid mctpEid)
1666c7fed4cSGilbert Chen {
isValidEID(eid mctpEid)1676c7fed4cSGilbert Chen if (mctpEid == MCTP_ADDR_NULL || mctpEid < MCTP_START_VALID_EID ||
1686c7fed4cSGilbert Chen mctpEid == MCTP_ADDR_ANY)
1696c7fed4cSGilbert Chen {
1706c7fed4cSGilbert Chen return false;
1716c7fed4cSGilbert Chen }
1726c7fed4cSGilbert Chen
1736c7fed4cSGilbert Chen return true;
1746c7fed4cSGilbert Chen }
1756c7fed4cSGilbert Chen
176d130e1a3SDeepak Kodihalli uint8_t getNumPadBytes(uint32_t data)
177d130e1a3SDeepak Kodihalli {
getNumPadBytes(uint32_t data)178d130e1a3SDeepak Kodihalli uint8_t pad;
179d130e1a3SDeepak Kodihalli pad = ((data % 4) ? (4 - data % 4) : 0);
180d130e1a3SDeepak Kodihalli return pad;
181d130e1a3SDeepak Kodihalli } // end getNumPadBytes
182d130e1a3SDeepak Kodihalli
183d130e1a3SDeepak Kodihalli bool uintToDate(uint64_t data, uint16_t* year, uint8_t* month, uint8_t* day,
184d130e1a3SDeepak Kodihalli uint8_t* hour, uint8_t* min, uint8_t* sec)
uintToDate(uint64_t data,uint16_t * year,uint8_t * month,uint8_t * day,uint8_t * hour,uint8_t * min,uint8_t * sec)185d130e1a3SDeepak Kodihalli {
186d130e1a3SDeepak Kodihalli constexpr uint64_t max_data = 29991231115959;
187d130e1a3SDeepak Kodihalli constexpr uint64_t min_data = 19700101000000;
188d130e1a3SDeepak Kodihalli if (data < min_data || data > max_data)
189d130e1a3SDeepak Kodihalli {
190d130e1a3SDeepak Kodihalli return false;
191d130e1a3SDeepak Kodihalli }
192d130e1a3SDeepak Kodihalli
193d130e1a3SDeepak Kodihalli *year = data / 10000000000;
194d130e1a3SDeepak Kodihalli data = data % 10000000000;
195d130e1a3SDeepak Kodihalli *month = data / 100000000;
196d130e1a3SDeepak Kodihalli data = data % 100000000;
197d130e1a3SDeepak Kodihalli *day = data / 1000000;
198d130e1a3SDeepak Kodihalli data = data % 1000000;
199d130e1a3SDeepak Kodihalli *hour = data / 10000;
200d130e1a3SDeepak Kodihalli data = data % 10000;
201d130e1a3SDeepak Kodihalli *min = data / 100;
202d130e1a3SDeepak Kodihalli *sec = data % 100;
203d130e1a3SDeepak Kodihalli
204d130e1a3SDeepak Kodihalli return true;
205d130e1a3SDeepak Kodihalli }
206d130e1a3SDeepak Kodihalli
20716c2a0a0SPatrick Williams std::optional<std::vector<set_effecter_state_field>> parseEffecterData(
20816c2a0a0SPatrick Williams const std::vector<uint8_t>& effecterData, uint8_t effecterCount)
parseEffecterData(const std::vector<uint8_t> & effecterData,uint8_t effecterCount)209d130e1a3SDeepak Kodihalli {
210d130e1a3SDeepak Kodihalli std::vector<set_effecter_state_field> stateField;
211d130e1a3SDeepak Kodihalli
212d130e1a3SDeepak Kodihalli if (effecterData.size() != effecterCount * 2)
213d130e1a3SDeepak Kodihalli {
214d130e1a3SDeepak Kodihalli return std::nullopt;
215d130e1a3SDeepak Kodihalli }
216d130e1a3SDeepak Kodihalli
217d130e1a3SDeepak Kodihalli for (uint8_t i = 0; i < effecterCount; ++i)
218d130e1a3SDeepak Kodihalli {
219d130e1a3SDeepak Kodihalli uint8_t set_request = effecterData[i * 2] == PLDM_REQUEST_SET
220d130e1a3SDeepak Kodihalli ? PLDM_REQUEST_SET
221d130e1a3SDeepak Kodihalli : PLDM_NO_CHANGE;
222d130e1a3SDeepak Kodihalli set_effecter_state_field filed{set_request, effecterData[i * 2 + 1]};
223d130e1a3SDeepak Kodihalli stateField.emplace_back(std::move(filed));
224d130e1a3SDeepak Kodihalli }
225d130e1a3SDeepak Kodihalli
226d130e1a3SDeepak Kodihalli return std::make_optional(std::move(stateField));
227d130e1a3SDeepak Kodihalli }
228d130e1a3SDeepak Kodihalli
229d130e1a3SDeepak Kodihalli std::string DBusHandler::getService(const char* path,
230d130e1a3SDeepak Kodihalli const char* interface) const
getService(const char * path,const char * interface) const231d130e1a3SDeepak Kodihalli {
232d130e1a3SDeepak Kodihalli using DbusInterfaceList = std::vector<std::string>;
233d130e1a3SDeepak Kodihalli std::map<std::string, std::vector<std::string>> mapperResponse;
234d130e1a3SDeepak Kodihalli auto& bus = DBusHandler::getBus();
235d130e1a3SDeepak Kodihalli
2367b4d59aaSPavithra Barithaya auto mapper = bus.new_method_call(ObjectMapper::default_service,
2377b4d59aaSPavithra Barithaya ObjectMapper::instance_path,
2387b4d59aaSPavithra Barithaya ObjectMapper::interface, "GetObject");
239df9a6d34SGeorge Liu
240df9a6d34SGeorge Liu if (interface)
241df9a6d34SGeorge Liu {
242d130e1a3SDeepak Kodihalli mapper.append(path, DbusInterfaceList({interface}));
243df9a6d34SGeorge Liu }
244df9a6d34SGeorge Liu else
245df9a6d34SGeorge Liu {
246df9a6d34SGeorge Liu mapper.append(path, DbusInterfaceList({}));
247df9a6d34SGeorge Liu }
248d130e1a3SDeepak Kodihalli
24991a092f6Svkaverap@in.ibm.com auto mapperResponseMsg = bus.call(mapper, dbusTimeout);
250d130e1a3SDeepak Kodihalli mapperResponseMsg.read(mapperResponse);
251d130e1a3SDeepak Kodihalli return mapperResponse.begin()->first;
252d130e1a3SDeepak Kodihalli }
253d130e1a3SDeepak Kodihalli
254366507c8SPatrick Williams GetSubTreeResponse DBusHandler::getSubtree(
255366507c8SPatrick Williams const std::string& searchPath, int depth,
getSubtree(const std::string & searchPath,int depth,const std::vector<std::string> & ifaceList) const2561ef62c37SManojkiran Eda const std::vector<std::string>& ifaceList) const
2571ef62c37SManojkiran Eda {
2581ef62c37SManojkiran Eda auto& bus = pldm::utils::DBusHandler::getBus();
2597b4d59aaSPavithra Barithaya auto method = bus.new_method_call(ObjectMapper::default_service,
2607b4d59aaSPavithra Barithaya ObjectMapper::instance_path,
2617b4d59aaSPavithra Barithaya ObjectMapper::interface, "GetSubTree");
2621ef62c37SManojkiran Eda method.append(searchPath, depth, ifaceList);
26391a092f6Svkaverap@in.ibm.com auto reply = bus.call(method, dbusTimeout);
2641ef62c37SManojkiran Eda GetSubTreeResponse response;
2651ef62c37SManojkiran Eda reply.read(response);
2661ef62c37SManojkiran Eda return response;
2671ef62c37SManojkiran Eda }
2681ef62c37SManojkiran Eda
2692ec8269fSPavithra Barithaya GetSubTreePathsResponse DBusHandler::getSubTreePaths(
2702ec8269fSPavithra Barithaya const std::string& objectPath, int depth,
getSubTreePaths(const std::string & objectPath,int depth,const std::vector<std::string> & ifaceList) const2712ec8269fSPavithra Barithaya const std::vector<std::string>& ifaceList) const
2722ec8269fSPavithra Barithaya {
2732ec8269fSPavithra Barithaya std::vector<std::string> paths;
2742ec8269fSPavithra Barithaya auto& bus = pldm::utils::DBusHandler::getBus();
2752ec8269fSPavithra Barithaya auto method = bus.new_method_call(
2762ec8269fSPavithra Barithaya ObjectMapper::default_service, ObjectMapper::instance_path,
2772ec8269fSPavithra Barithaya ObjectMapper::interface, "GetSubTreePaths");
2782ec8269fSPavithra Barithaya method.append(objectPath, depth, ifaceList);
2792ec8269fSPavithra Barithaya auto reply = bus.call(method, dbusTimeout);
2802ec8269fSPavithra Barithaya
2812ec8269fSPavithra Barithaya reply.read(paths);
2822ec8269fSPavithra Barithaya return paths;
2832ec8269fSPavithra Barithaya }
2842ec8269fSPavithra Barithaya
285549e4bc8SDelphine CC Chiu GetAncestorsResponse DBusHandler::getAncestors(
286549e4bc8SDelphine CC Chiu const std::string& path, const std::vector<std::string>& ifaceList) const
getAncestors(const std::string & path,const std::vector<std::string> & ifaceList) const287549e4bc8SDelphine CC Chiu {
288549e4bc8SDelphine CC Chiu auto& bus = pldm::utils::DBusHandler::getBus();
289549e4bc8SDelphine CC Chiu auto method = bus.new_method_call(ObjectMapper::default_service,
290549e4bc8SDelphine CC Chiu ObjectMapper::instance_path,
291549e4bc8SDelphine CC Chiu ObjectMapper::interface, "GetAncestors");
292549e4bc8SDelphine CC Chiu method.append(path, ifaceList);
293549e4bc8SDelphine CC Chiu auto reply = bus.call(method, dbusTimeout);
294549e4bc8SDelphine CC Chiu GetAncestorsResponse response;
295549e4bc8SDelphine CC Chiu reply.read(response);
296549e4bc8SDelphine CC Chiu return response;
297549e4bc8SDelphine CC Chiu }
298549e4bc8SDelphine CC Chiu
29992fb0b55SManojkiran Eda void reportError(const char* errorMsg)
300d130e1a3SDeepak Kodihalli {
reportError(const char * errorMsg)301d130e1a3SDeepak Kodihalli auto& bus = pldm::utils::DBusHandler::getBus();
3027b4d59aaSPavithra Barithaya using LoggingCreate =
3037b4d59aaSPavithra Barithaya sdbusplus::client::xyz::openbmc_project::logging::Create<>;
30476f2c60aSRiya Dixit try
30576f2c60aSRiya Dixit {
306d130e1a3SDeepak Kodihalli using namespace sdbusplus::xyz::openbmc_project::Logging::server;
30792fb0b55SManojkiran Eda auto severity =
30892fb0b55SManojkiran Eda sdbusplus::xyz::openbmc_project::Logging::server::convertForMessage(
30992fb0b55SManojkiran Eda sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level::
31092fb0b55SManojkiran Eda Error);
3117b4d59aaSPavithra Barithaya auto method = bus.new_method_call(LoggingCreate::default_service,
3127b4d59aaSPavithra Barithaya LoggingCreate::instance_path,
3137b4d59aaSPavithra Barithaya LoggingCreate::interface, "Create");
3147b4d59aaSPavithra Barithaya
315d130e1a3SDeepak Kodihalli std::map<std::string, std::string> addlData{};
316d130e1a3SDeepak Kodihalli method.append(errorMsg, severity, addlData);
3175b71b86fSvkaverap@in.ibm.com bus.call_noreply(method, dbusTimeout);
318d130e1a3SDeepak Kodihalli }
319d130e1a3SDeepak Kodihalli catch (const std::exception& e)
320d130e1a3SDeepak Kodihalli {
32149cfb138SRiya Dixit error(
32276f2c60aSRiya Dixit "Failed to do dbus call for creating error log for '{ERRMSG}' at path '{PATH}' and interface '{INTERFACE}', error - {ERROR}",
32376f2c60aSRiya Dixit "ERRMSG", errorMsg, "PATH", LoggingCreate::instance_path,
32476f2c60aSRiya Dixit "INTERFACE", LoggingCreate::interface, "ERROR", e);
325d130e1a3SDeepak Kodihalli }
326d130e1a3SDeepak Kodihalli }
327d130e1a3SDeepak Kodihalli
328d130e1a3SDeepak Kodihalli void DBusHandler::setDbusProperty(const DBusMapping& dBusMap,
329d130e1a3SDeepak Kodihalli const PropertyValue& value) const
setDbusProperty(const DBusMapping & dBusMap,const PropertyValue & value) const330d130e1a3SDeepak Kodihalli {
331d130e1a3SDeepak Kodihalli auto setDbusValue = [&dBusMap, this](const auto& variant) {
332d130e1a3SDeepak Kodihalli auto& bus = getBus();
33316c2a0a0SPatrick Williams auto service =
33416c2a0a0SPatrick Williams getService(dBusMap.objectPath.c_str(), dBusMap.interface.c_str());
335d130e1a3SDeepak Kodihalli auto method = bus.new_method_call(
336d130e1a3SDeepak Kodihalli service.c_str(), dBusMap.objectPath.c_str(), dbusProperties, "Set");
337d130e1a3SDeepak Kodihalli method.append(dBusMap.interface.c_str(), dBusMap.propertyName.c_str(),
338d130e1a3SDeepak Kodihalli variant);
3395b71b86fSvkaverap@in.ibm.com bus.call_noreply(method, dbusTimeout);
340d130e1a3SDeepak Kodihalli };
341d130e1a3SDeepak Kodihalli
342d130e1a3SDeepak Kodihalli if (dBusMap.propertyType == "uint8_t")
343d130e1a3SDeepak Kodihalli {
344d130e1a3SDeepak Kodihalli std::variant<uint8_t> v = std::get<uint8_t>(value);
345d130e1a3SDeepak Kodihalli setDbusValue(v);
346d130e1a3SDeepak Kodihalli }
347d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "bool")
348d130e1a3SDeepak Kodihalli {
349d130e1a3SDeepak Kodihalli std::variant<bool> v = std::get<bool>(value);
350d130e1a3SDeepak Kodihalli setDbusValue(v);
351d130e1a3SDeepak Kodihalli }
352d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "int16_t")
353d130e1a3SDeepak Kodihalli {
354d130e1a3SDeepak Kodihalli std::variant<int16_t> v = std::get<int16_t>(value);
355d130e1a3SDeepak Kodihalli setDbusValue(v);
356d130e1a3SDeepak Kodihalli }
357d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "uint16_t")
358d130e1a3SDeepak Kodihalli {
359d130e1a3SDeepak Kodihalli std::variant<uint16_t> v = std::get<uint16_t>(value);
360d130e1a3SDeepak Kodihalli setDbusValue(v);
361d130e1a3SDeepak Kodihalli }
362d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "int32_t")
363d130e1a3SDeepak Kodihalli {
364d130e1a3SDeepak Kodihalli std::variant<int32_t> v = std::get<int32_t>(value);
365d130e1a3SDeepak Kodihalli setDbusValue(v);
366d130e1a3SDeepak Kodihalli }
367d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "uint32_t")
368d130e1a3SDeepak Kodihalli {
369d130e1a3SDeepak Kodihalli std::variant<uint32_t> v = std::get<uint32_t>(value);
370d130e1a3SDeepak Kodihalli setDbusValue(v);
371d130e1a3SDeepak Kodihalli }
372d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "int64_t")
373d130e1a3SDeepak Kodihalli {
374d130e1a3SDeepak Kodihalli std::variant<int64_t> v = std::get<int64_t>(value);
375d130e1a3SDeepak Kodihalli setDbusValue(v);
376d130e1a3SDeepak Kodihalli }
377d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "uint64_t")
378d130e1a3SDeepak Kodihalli {
379d130e1a3SDeepak Kodihalli std::variant<uint64_t> v = std::get<uint64_t>(value);
380d130e1a3SDeepak Kodihalli setDbusValue(v);
381d130e1a3SDeepak Kodihalli }
382d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "double")
383d130e1a3SDeepak Kodihalli {
384d130e1a3SDeepak Kodihalli std::variant<double> v = std::get<double>(value);
385d130e1a3SDeepak Kodihalli setDbusValue(v);
386d130e1a3SDeepak Kodihalli }
387d130e1a3SDeepak Kodihalli else if (dBusMap.propertyType == "string")
388d130e1a3SDeepak Kodihalli {
389d130e1a3SDeepak Kodihalli std::variant<std::string> v = std::get<std::string>(value);
390d130e1a3SDeepak Kodihalli setDbusValue(v);
391d130e1a3SDeepak Kodihalli }
392d130e1a3SDeepak Kodihalli else
393d130e1a3SDeepak Kodihalli {
39476f2c60aSRiya Dixit error("Unsupported property type '{TYPE}'", "TYPE",
39576f2c60aSRiya Dixit dBusMap.propertyType);
39676f2c60aSRiya Dixit throw std::invalid_argument("UnSupported Dbus Type");
397d130e1a3SDeepak Kodihalli }
398d130e1a3SDeepak Kodihalli }
399d130e1a3SDeepak Kodihalli
400d130e1a3SDeepak Kodihalli PropertyValue DBusHandler::getDbusPropertyVariant(
401d130e1a3SDeepak Kodihalli const char* objPath, const char* dbusProp, const char* dbusInterface) const
getDbusPropertyVariant(const char * objPath,const char * dbusProp,const char * dbusInterface) const402d130e1a3SDeepak Kodihalli {
403d130e1a3SDeepak Kodihalli auto& bus = DBusHandler::getBus();
404d130e1a3SDeepak Kodihalli auto service = getService(objPath, dbusInterface);
40516c2a0a0SPatrick Williams auto method =
40616c2a0a0SPatrick Williams bus.new_method_call(service.c_str(), objPath, dbusProperties, "Get");
407d130e1a3SDeepak Kodihalli method.append(dbusInterface, dbusProp);
40875b8f464SPatrick Williams return bus.call(method, dbusTimeout).unpack<PropertyValue>();
409d130e1a3SDeepak Kodihalli }
410d130e1a3SDeepak Kodihalli
411754041d0SRiya Dixit ObjectValueTree DBusHandler::getManagedObj(const char* service,
412754041d0SRiya Dixit const char* rootPath)
getManagedObj(const char * service,const char * rootPath)413754041d0SRiya Dixit {
414754041d0SRiya Dixit auto& bus = DBusHandler::getBus();
415754041d0SRiya Dixit auto method = bus.new_method_call(service, rootPath,
416754041d0SRiya Dixit "org.freedesktop.DBus.ObjectManager",
417754041d0SRiya Dixit "GetManagedObjects");
418754041d0SRiya Dixit return bus.call(method).unpack<ObjectValueTree>();
419754041d0SRiya Dixit }
420754041d0SRiya Dixit
42116c2a0a0SPatrick Williams PropertyMap DBusHandler::getDbusPropertiesVariant(
42216c2a0a0SPatrick Williams const char* serviceName, const char* objPath,
getDbusPropertiesVariant(const char * serviceName,const char * objPath,const char * dbusInterface) const42344524a5fSGilbert Chen const char* dbusInterface) const
42444524a5fSGilbert Chen {
42544524a5fSGilbert Chen auto& bus = DBusHandler::getBus();
42616c2a0a0SPatrick Williams auto method =
42716c2a0a0SPatrick Williams bus.new_method_call(serviceName, objPath, dbusProperties, "GetAll");
42844524a5fSGilbert Chen method.append(dbusInterface);
42944524a5fSGilbert Chen return bus.call(method, dbusTimeout).unpack<PropertyMap>();
43044524a5fSGilbert Chen }
43144524a5fSGilbert Chen
432d130e1a3SDeepak Kodihalli PropertyValue jsonEntryToDbusVal(std::string_view type,
433d130e1a3SDeepak Kodihalli const nlohmann::json& value)
jsonEntryToDbusVal(std::string_view type,const nlohmann::json & value)434d130e1a3SDeepak Kodihalli {
435d130e1a3SDeepak Kodihalli PropertyValue propValue{};
436d130e1a3SDeepak Kodihalli if (type == "uint8_t")
437d130e1a3SDeepak Kodihalli {
438d130e1a3SDeepak Kodihalli propValue = static_cast<uint8_t>(value);
439d130e1a3SDeepak Kodihalli }
440d130e1a3SDeepak Kodihalli else if (type == "uint16_t")
441d130e1a3SDeepak Kodihalli {
442d130e1a3SDeepak Kodihalli propValue = static_cast<uint16_t>(value);
443d130e1a3SDeepak Kodihalli }
444d130e1a3SDeepak Kodihalli else if (type == "uint32_t")
445d130e1a3SDeepak Kodihalli {
446d130e1a3SDeepak Kodihalli propValue = static_cast<uint32_t>(value);
447d130e1a3SDeepak Kodihalli }
448d130e1a3SDeepak Kodihalli else if (type == "uint64_t")
449d130e1a3SDeepak Kodihalli {
450d130e1a3SDeepak Kodihalli propValue = static_cast<uint64_t>(value);
451d130e1a3SDeepak Kodihalli }
452d130e1a3SDeepak Kodihalli else if (type == "int16_t")
453d130e1a3SDeepak Kodihalli {
454d130e1a3SDeepak Kodihalli propValue = static_cast<int16_t>(value);
455d130e1a3SDeepak Kodihalli }
456d130e1a3SDeepak Kodihalli else if (type == "int32_t")
457d130e1a3SDeepak Kodihalli {
458d130e1a3SDeepak Kodihalli propValue = static_cast<int32_t>(value);
459d130e1a3SDeepak Kodihalli }
460d130e1a3SDeepak Kodihalli else if (type == "int64_t")
461d130e1a3SDeepak Kodihalli {
462d130e1a3SDeepak Kodihalli propValue = static_cast<int64_t>(value);
463d130e1a3SDeepak Kodihalli }
464d130e1a3SDeepak Kodihalli else if (type == "bool")
465d130e1a3SDeepak Kodihalli {
466d130e1a3SDeepak Kodihalli propValue = static_cast<bool>(value);
467d130e1a3SDeepak Kodihalli }
468d130e1a3SDeepak Kodihalli else if (type == "double")
469d130e1a3SDeepak Kodihalli {
470d130e1a3SDeepak Kodihalli propValue = static_cast<double>(value);
471d130e1a3SDeepak Kodihalli }
472d130e1a3SDeepak Kodihalli else if (type == "string")
473d130e1a3SDeepak Kodihalli {
474d130e1a3SDeepak Kodihalli propValue = static_cast<std::string>(value);
475d130e1a3SDeepak Kodihalli }
476d130e1a3SDeepak Kodihalli else
477d130e1a3SDeepak Kodihalli {
47876f2c60aSRiya Dixit error("Unknown D-Bus property type '{TYPE}'", "TYPE", type);
479d130e1a3SDeepak Kodihalli }
480d130e1a3SDeepak Kodihalli
481d130e1a3SDeepak Kodihalli return propValue;
482d130e1a3SDeepak Kodihalli }
483d130e1a3SDeepak Kodihalli
484d130e1a3SDeepak Kodihalli uint16_t findStateEffecterId(const pldm_pdr* pdrRepo, uint16_t entityType,
485d130e1a3SDeepak Kodihalli uint16_t entityInstance, uint16_t containerId,
findStateEffecterId(const pldm_pdr * pdrRepo,uint16_t entityType,uint16_t entityInstance,uint16_t containerId,uint16_t stateSetId,bool localOrRemote)486a4a96162SSampa Misra uint16_t stateSetId, bool localOrRemote)
487d130e1a3SDeepak Kodihalli {
488d130e1a3SDeepak Kodihalli uint8_t* pdrData = nullptr;
489d130e1a3SDeepak Kodihalli uint32_t pdrSize{};
490d130e1a3SDeepak Kodihalli const pldm_pdr_record* record{};
491d130e1a3SDeepak Kodihalli do
492d130e1a3SDeepak Kodihalli {
493d130e1a3SDeepak Kodihalli record = pldm_pdr_find_record_by_type(pdrRepo, PLDM_STATE_EFFECTER_PDR,
494d130e1a3SDeepak Kodihalli record, &pdrData, &pdrSize);
495a4a96162SSampa Misra if (record && (localOrRemote ^ pldm_pdr_record_is_remote(record)))
496d130e1a3SDeepak Kodihalli {
497*39d13b77SPavithra Barithaya auto pdr = new (pdrData) pldm_state_effecter_pdr;
498d130e1a3SDeepak Kodihalli auto compositeEffecterCount = pdr->composite_effecter_count;
499d130e1a3SDeepak Kodihalli auto possible_states_start = pdr->possible_states;
500d130e1a3SDeepak Kodihalli
501d130e1a3SDeepak Kodihalli for (auto effecters = 0x00; effecters < compositeEffecterCount;
502d130e1a3SDeepak Kodihalli effecters++)
503d130e1a3SDeepak Kodihalli {
504*39d13b77SPavithra Barithaya auto possibleStates = new (possible_states_start)
505*39d13b77SPavithra Barithaya state_effecter_possible_states;
506d130e1a3SDeepak Kodihalli auto setId = possibleStates->state_set_id;
507d130e1a3SDeepak Kodihalli auto possibleStateSize = possibleStates->possible_states_size;
508d130e1a3SDeepak Kodihalli
509d130e1a3SDeepak Kodihalli if (entityType == pdr->entity_type &&
510d130e1a3SDeepak Kodihalli entityInstance == pdr->entity_instance &&
511d130e1a3SDeepak Kodihalli containerId == pdr->container_id && stateSetId == setId)
512d130e1a3SDeepak Kodihalli {
513d130e1a3SDeepak Kodihalli return pdr->effecter_id;
514d130e1a3SDeepak Kodihalli }
515d130e1a3SDeepak Kodihalli possible_states_start += possibleStateSize + sizeof(setId) +
516d130e1a3SDeepak Kodihalli sizeof(possibleStateSize);
517d130e1a3SDeepak Kodihalli }
518d130e1a3SDeepak Kodihalli }
519d130e1a3SDeepak Kodihalli } while (record);
520d130e1a3SDeepak Kodihalli
521d130e1a3SDeepak Kodihalli return PLDM_INVALID_EFFECTER_ID;
522d130e1a3SDeepak Kodihalli }
523d130e1a3SDeepak Kodihalli
524fe4d88bbSChicago Duan int emitStateSensorEventSignal(uint8_t tid, uint16_t sensorId,
525fe4d88bbSChicago Duan uint8_t sensorOffset, uint8_t eventState,
526fe4d88bbSChicago Duan uint8_t previousEventState)
emitStateSensorEventSignal(uint8_t tid,uint16_t sensorId,uint8_t sensorOffset,uint8_t eventState,uint8_t previousEventState)527fe4d88bbSChicago Duan {
528fe4d88bbSChicago Duan try
529fe4d88bbSChicago Duan {
530fe4d88bbSChicago Duan auto& bus = DBusHandler::getBus();
531fe4d88bbSChicago Duan auto msg = bus.new_signal("/xyz/openbmc_project/pldm",
532fe4d88bbSChicago Duan "xyz.openbmc_project.PLDM.Event",
533fe4d88bbSChicago Duan "StateSensorEvent");
534fe4d88bbSChicago Duan msg.append(tid, sensorId, sensorOffset, eventState, previousEventState);
535fe4d88bbSChicago Duan
536fe4d88bbSChicago Duan msg.signal_send();
537fe4d88bbSChicago Duan }
53851330585SPatrick Williams catch (const std::exception& e)
539fe4d88bbSChicago Duan {
54076f2c60aSRiya Dixit error("Failed to emit pldm event signal, error - {ERROR}", "ERROR", e);
541fe4d88bbSChicago Duan return PLDM_ERROR;
542fe4d88bbSChicago Duan }
543fe4d88bbSChicago Duan
544fe4d88bbSChicago Duan return PLDM_SUCCESS;
545fe4d88bbSChicago Duan }
546fe4d88bbSChicago Duan
5478fa40dbeSChau Ly void recoverMctpEndpoint(const std::string& endpointObjPath)
5488fa40dbeSChau Ly {
5498fa40dbeSChau Ly auto& bus = DBusHandler::getBus();
recoverMctpEndpoint(const std::string & endpointObjPath)5508fa40dbeSChau Ly try
5518fa40dbeSChau Ly {
5528fa40dbeSChau Ly std::string service = DBusHandler().getService(endpointObjPath.c_str(),
5538fa40dbeSChau Ly MCTP_INTERFACE_CC);
5548fa40dbeSChau Ly
5558fa40dbeSChau Ly auto method = bus.new_method_call(
5568fa40dbeSChau Ly service.c_str(), endpointObjPath.c_str(), MCTP_INTERFACE_CC,
5578fa40dbeSChau Ly MCTP_ENDPOINT_RECOVER_METHOD);
5588fa40dbeSChau Ly bus.call_noreply(method, dbusTimeout);
5598fa40dbeSChau Ly }
5608fa40dbeSChau Ly catch (const std::exception& e)
5618fa40dbeSChau Ly {
5628fa40dbeSChau Ly error(
5638fa40dbeSChau Ly "failed to make a D-Bus call to recover MCTP Endpoint, ERROR {ERR_EXCEP}",
5648fa40dbeSChau Ly "ERR_EXCEP", e);
5658fa40dbeSChau Ly }
5668fa40dbeSChau Ly }
5678fa40dbeSChau Ly
5683a0e3b9bSSampa Misra uint16_t findStateSensorId(const pldm_pdr* pdrRepo, uint8_t tid,
5693a0e3b9bSSampa Misra uint16_t entityType, uint16_t entityInstance,
5703a0e3b9bSSampa Misra uint16_t containerId, uint16_t stateSetId)
findStateSensorId(const pldm_pdr * pdrRepo,uint8_t tid,uint16_t entityType,uint16_t entityInstance,uint16_t containerId,uint16_t stateSetId)5713a0e3b9bSSampa Misra {
5723a0e3b9bSSampa Misra auto pdrs = findStateSensorPDR(tid, entityType, stateSetId, pdrRepo);
5733a0e3b9bSSampa Misra for (auto pdr : pdrs)
5743a0e3b9bSSampa Misra {
575*39d13b77SPavithra Barithaya auto sensorPdr = new (pdr.data()) pldm_state_sensor_pdr;
5763a0e3b9bSSampa Misra auto compositeSensorCount = sensorPdr->composite_sensor_count;
5773a0e3b9bSSampa Misra auto possible_states_start = sensorPdr->possible_states;
5783a0e3b9bSSampa Misra
5793a0e3b9bSSampa Misra for (auto sensors = 0x00; sensors < compositeSensorCount; sensors++)
5803a0e3b9bSSampa Misra {
581*39d13b77SPavithra Barithaya auto possibleStates = new (possible_states_start)
582*39d13b77SPavithra Barithaya state_sensor_possible_states;
5833a0e3b9bSSampa Misra auto setId = possibleStates->state_set_id;
5843a0e3b9bSSampa Misra auto possibleStateSize = possibleStates->possible_states_size;
5853a0e3b9bSSampa Misra if (entityType == sensorPdr->entity_type &&
5863a0e3b9bSSampa Misra entityInstance == sensorPdr->entity_instance &&
5873a0e3b9bSSampa Misra stateSetId == setId && containerId == sensorPdr->container_id)
5883a0e3b9bSSampa Misra {
5893a0e3b9bSSampa Misra return sensorPdr->sensor_id;
5903a0e3b9bSSampa Misra }
59116c2a0a0SPatrick Williams possible_states_start +=
59216c2a0a0SPatrick Williams possibleStateSize + sizeof(setId) + sizeof(possibleStateSize);
5933a0e3b9bSSampa Misra }
5943a0e3b9bSSampa Misra }
5953a0e3b9bSSampa Misra return PLDM_INVALID_EFFECTER_ID;
5963a0e3b9bSSampa Misra }
5973a0e3b9bSSampa Misra
598e5268cdaSTom Joseph void printBuffer(bool isTx, const std::vector<uint8_t>& buffer)
599ae28bc77SSridevi Ramesh {
600cd4cd457SManojkiran Eda if (buffer.empty())
601ae28bc77SSridevi Ramesh {
printBuffer(bool isTx,const std::vector<uint8_t> & buffer)602cd4cd457SManojkiran Eda return;
603e5268cdaSTom Joseph }
604cd4cd457SManojkiran Eda
605cd4cd457SManojkiran Eda std::cout << (isTx ? "Tx: " : "Rx: ");
606cd4cd457SManojkiran Eda
607cd4cd457SManojkiran Eda std::ranges::for_each(buffer, [](uint8_t byte) {
608cd4cd457SManojkiran Eda std::cout << std::format("{:02x} ", byte);
609cd4cd457SManojkiran Eda });
610cd4cd457SManojkiran Eda
__anon9a5454480202(uint8_t byte) 611cd4cd457SManojkiran Eda std::cout << std::endl;
612ae28bc77SSridevi Ramesh }
613ae28bc77SSridevi Ramesh
6145492207aSTom Joseph std::string toString(const struct variable_field& var)
6155492207aSTom Joseph {
6165492207aSTom Joseph if (var.ptr == nullptr || !var.length)
6175492207aSTom Joseph {
toString(const struct variable_field & var)6185492207aSTom Joseph return "";
6195492207aSTom Joseph }
6205492207aSTom Joseph
6215492207aSTom Joseph std::string str(reinterpret_cast<const char*>(var.ptr), var.length);
6225492207aSTom Joseph std::replace_if(
6235492207aSTom Joseph str.begin(), str.end(), [](const char& c) { return !isprint(c); }, ' ');
6245492207aSTom Joseph return str;
6255492207aSTom Joseph }
6265492207aSTom Joseph
__anon9a5454480302(const char& c) 627872f0f69SGeorge Liu std::vector<std::string> split(std::string_view srcStr, std::string_view delim,
628872f0f69SGeorge Liu std::string_view trimStr)
629872f0f69SGeorge Liu {
630872f0f69SGeorge Liu std::vector<std::string> out;
631872f0f69SGeorge Liu size_t start;
632872f0f69SGeorge Liu size_t end = 0;
633872f0f69SGeorge Liu
634872f0f69SGeorge Liu while ((start = srcStr.find_first_not_of(delim, end)) != std::string::npos)
635872f0f69SGeorge Liu {
636872f0f69SGeorge Liu end = srcStr.find(delim, start);
637872f0f69SGeorge Liu std::string_view dstStr = srcStr.substr(start, end - start);
638872f0f69SGeorge Liu if (!trimStr.empty())
639872f0f69SGeorge Liu {
640872f0f69SGeorge Liu dstStr.remove_prefix(dstStr.find_first_not_of(trimStr));
64116c2a0a0SPatrick Williams dstStr.remove_suffix(
64216c2a0a0SPatrick Williams dstStr.size() - 1 - dstStr.find_last_not_of(trimStr));
643872f0f69SGeorge Liu }
644872f0f69SGeorge Liu
645872f0f69SGeorge Liu if (!dstStr.empty())
646872f0f69SGeorge Liu {
647872f0f69SGeorge Liu out.push_back(std::string(dstStr));
648872f0f69SGeorge Liu }
649872f0f69SGeorge Liu }
650872f0f69SGeorge Liu
651872f0f69SGeorge Liu return out;
652872f0f69SGeorge Liu }
653872f0f69SGeorge Liu
654ef773059SManojkiran Eda std::string getCurrentSystemTime()
655ef773059SManojkiran Eda {
65609a89821SManojkiran Eda const auto zonedTime{std::chrono::zoned_time{
65709a89821SManojkiran Eda std::chrono::current_zone(), std::chrono::system_clock::now()}};
getCurrentSystemTime()65809a89821SManojkiran Eda return std::format("{:%F %Z %T}", zonedTime);
659ef773059SManojkiran Eda }
660ef773059SManojkiran Eda
661eefe49bfSSridevi Ramesh bool checkForFruPresence(const std::string& objPath)
662eefe49bfSSridevi Ramesh {
663eefe49bfSSridevi Ramesh bool isPresent = false;
664eefe49bfSSridevi Ramesh static constexpr auto presentInterface =
checkForFruPresence(const std::string & objPath)665eefe49bfSSridevi Ramesh "xyz.openbmc_project.Inventory.Item";
666eefe49bfSSridevi Ramesh static constexpr auto presentProperty = "Present";
667eefe49bfSSridevi Ramesh try
668eefe49bfSSridevi Ramesh {
669eefe49bfSSridevi Ramesh auto propVal = pldm::utils::DBusHandler().getDbusPropertyVariant(
670eefe49bfSSridevi Ramesh objPath.c_str(), presentProperty, presentInterface);
671eefe49bfSSridevi Ramesh isPresent = std::get<bool>(propVal);
672eefe49bfSSridevi Ramesh }
673eefe49bfSSridevi Ramesh catch (const sdbusplus::exception::SdBusError& e)
674eefe49bfSSridevi Ramesh {
67576f2c60aSRiya Dixit error("Failed to check for FRU presence at {PATH}, error - {ERROR}",
67676f2c60aSRiya Dixit "PATH", objPath, "ERROR", e);
677eefe49bfSSridevi Ramesh }
678eefe49bfSSridevi Ramesh return isPresent;
679eefe49bfSSridevi Ramesh }
680eefe49bfSSridevi Ramesh
6815db6e872SSagar Srinivas bool checkIfLogicalBitSet(const uint16_t& containerId)
6825db6e872SSagar Srinivas {
6835db6e872SSagar Srinivas return !(containerId & 0x8000);
6845db6e872SSagar Srinivas }
checkIfLogicalBitSet(const uint16_t & containerId)6855db6e872SSagar Srinivas
6865e542be2SPavithra Barithaya void setFruPresence(const std::string& fruObjPath, bool present)
6875e542be2SPavithra Barithaya {
6885e542be2SPavithra Barithaya pldm::utils::PropertyValue value{present};
6895e542be2SPavithra Barithaya pldm::utils::DBusMapping dbusMapping;
6905e542be2SPavithra Barithaya dbusMapping.objectPath = fruObjPath;
6915e542be2SPavithra Barithaya dbusMapping.interface = "xyz.openbmc_project.Inventory.Item";
6925e542be2SPavithra Barithaya dbusMapping.propertyName = "Present";
6935e542be2SPavithra Barithaya dbusMapping.propertyType = "bool";
6945e542be2SPavithra Barithaya try
6955e542be2SPavithra Barithaya {
6965e542be2SPavithra Barithaya pldm::utils::DBusHandler().setDbusProperty(dbusMapping, value);
6975e542be2SPavithra Barithaya }
6985e542be2SPavithra Barithaya catch (const std::exception& e)
6995e542be2SPavithra Barithaya {
7005e542be2SPavithra Barithaya error(
70176f2c60aSRiya Dixit "Failed to set the present property on path '{PATH}', error - {ERROR}.",
7025e542be2SPavithra Barithaya "PATH", fruObjPath, "ERROR", e);
7035e542be2SPavithra Barithaya }
7045e542be2SPavithra Barithaya }
7055e542be2SPavithra Barithaya
706b8cf46b8SThu Nguyen std::string_view trimNameForDbus(std::string& name)
707b8cf46b8SThu Nguyen {
708b8cf46b8SThu Nguyen std::replace(name.begin(), name.end(), ' ', '_');
709b8cf46b8SThu Nguyen auto nullTerminatorPos = name.find('\0');
trimNameForDbus(std::string & name)710b8cf46b8SThu Nguyen if (nullTerminatorPos != std::string::npos)
711b8cf46b8SThu Nguyen {
712b8cf46b8SThu Nguyen name.erase(nullTerminatorPos);
713b8cf46b8SThu Nguyen }
714b8cf46b8SThu Nguyen return name;
715b8cf46b8SThu Nguyen }
716a34a64bbSThu Nguyen
717a34a64bbSThu Nguyen bool dbusPropValuesToDouble(const std::string_view& type,
718a34a64bbSThu Nguyen const pldm::utils::PropertyValue& value,
719a34a64bbSThu Nguyen double* doubleValue)
720a34a64bbSThu Nguyen {
dbusPropValuesToDouble(const std::string_view & type,const pldm::utils::PropertyValue & value,double * doubleValue)721a34a64bbSThu Nguyen if (!dbusValueNumericTypeNames.contains(type))
722a34a64bbSThu Nguyen {
723a34a64bbSThu Nguyen return false;
724a34a64bbSThu Nguyen }
725a34a64bbSThu Nguyen
726a34a64bbSThu Nguyen if (!doubleValue)
727a34a64bbSThu Nguyen {
728a34a64bbSThu Nguyen return false;
729a34a64bbSThu Nguyen }
730a34a64bbSThu Nguyen
731a34a64bbSThu Nguyen try
732a34a64bbSThu Nguyen {
733a34a64bbSThu Nguyen if (type == "uint8_t")
734a34a64bbSThu Nguyen {
735a34a64bbSThu Nguyen *doubleValue = static_cast<double>(std::get<uint8_t>(value));
736a34a64bbSThu Nguyen }
737a34a64bbSThu Nguyen else if (type == "int16_t")
738a34a64bbSThu Nguyen {
739a34a64bbSThu Nguyen *doubleValue = static_cast<double>(std::get<int16_t>(value));
740a34a64bbSThu Nguyen }
741a34a64bbSThu Nguyen else if (type == "uint16_t")
742a34a64bbSThu Nguyen {
743a34a64bbSThu Nguyen *doubleValue = static_cast<double>(std::get<uint16_t>(value));
744a34a64bbSThu Nguyen }
745a34a64bbSThu Nguyen else if (type == "int32_t")
746a34a64bbSThu Nguyen {
747a34a64bbSThu Nguyen *doubleValue = static_cast<double>(std::get<int32_t>(value));
748a34a64bbSThu Nguyen }
749a34a64bbSThu Nguyen else if (type == "uint32_t")
750a34a64bbSThu Nguyen {
751a34a64bbSThu Nguyen *doubleValue = static_cast<double>(std::get<uint32_t>(value));
752a34a64bbSThu Nguyen }
753a34a64bbSThu Nguyen else if (type == "int64_t")
754a34a64bbSThu Nguyen {
755a34a64bbSThu Nguyen *doubleValue = static_cast<double>(std::get<int64_t>(value));
756a34a64bbSThu Nguyen }
757a34a64bbSThu Nguyen else if (type == "uint64_t")
758a34a64bbSThu Nguyen {
759a34a64bbSThu Nguyen *doubleValue = static_cast<double>(std::get<uint64_t>(value));
760a34a64bbSThu Nguyen }
761a34a64bbSThu Nguyen else if (type == "double")
762a34a64bbSThu Nguyen {
763a34a64bbSThu Nguyen *doubleValue = static_cast<double>(std::get<double>(value));
764a34a64bbSThu Nguyen }
765a34a64bbSThu Nguyen else
766a34a64bbSThu Nguyen {
767a34a64bbSThu Nguyen return false;
768a34a64bbSThu Nguyen }
769a34a64bbSThu Nguyen }
770a34a64bbSThu Nguyen catch (const std::exception& e)
771a34a64bbSThu Nguyen {
772a34a64bbSThu Nguyen return false;
773a34a64bbSThu Nguyen }
774a34a64bbSThu Nguyen
775a34a64bbSThu Nguyen return true;
776a34a64bbSThu Nguyen }
777b6d3943dSDung Cao
778366507c8SPatrick Williams std::optional<std::string> fruFieldValuestring(const uint8_t* value,
779366507c8SPatrick Williams const uint8_t& length)
780b6d3943dSDung Cao {
781b6d3943dSDung Cao if (!value || !length)
fruFieldValuestring(const uint8_t * value,const uint8_t & length)782b6d3943dSDung Cao {
783b6d3943dSDung Cao lg2::error("Fru data to string invalid data.");
784b6d3943dSDung Cao return std::nullopt;
785b6d3943dSDung Cao }
786b6d3943dSDung Cao
787b6d3943dSDung Cao return std::string(reinterpret_cast<const char*>(value), length);
788b6d3943dSDung Cao }
789b6d3943dSDung Cao
790b6d3943dSDung Cao std::optional<uint32_t> fruFieldParserU32(const uint8_t* value,
791b6d3943dSDung Cao const uint8_t& length)
792b6d3943dSDung Cao {
793b6d3943dSDung Cao if (!value || length != sizeof(uint32_t))
fruFieldParserU32(const uint8_t * value,const uint8_t & length)794b6d3943dSDung Cao {
795b6d3943dSDung Cao lg2::error("Fru data to u32 invalid data.");
796b6d3943dSDung Cao return std::nullopt;
797b6d3943dSDung Cao }
798b6d3943dSDung Cao
799b6d3943dSDung Cao uint32_t ret;
800b6d3943dSDung Cao std::memcpy(&ret, value, length);
801b6d3943dSDung Cao return ret;
802b6d3943dSDung Cao }
803b6d3943dSDung Cao
804d130e1a3SDeepak Kodihalli } // namespace utils
805d130e1a3SDeepak Kodihalli } // namespace pldm
806