| #include "mctp_endpoint_discovery.hpp" |
| |
| #include "common/types.hpp" |
| #include "common/utils.hpp" |
| |
| #include <libpldm/pldm.h> |
| |
| #include <algorithm> |
| #include <map> |
| #include <string> |
| #include <string_view> |
| #include <vector> |
| |
| namespace pldm |
| { |
| MctpDiscovery::MctpDiscovery(sdbusplus::bus_t& bus, |
| fw_update::Manager* fwManager) : |
| bus(bus), |
| fwManager(fwManager), |
| mctpEndpointSignal(bus, |
| sdbusplus::bus::match::rules::interfacesAdded( |
| "/xyz/openbmc_project/mctp"), |
| std::bind_front(&MctpDiscovery::dicoverEndpoints, this)) |
| { |
| dbus::ObjectValueTree objects; |
| |
| try |
| { |
| auto method = bus.new_method_call( |
| "xyz.openbmc_project.MCTP", "/xyz/openbmc_project/mctp", |
| "org.freedesktop.DBus.ObjectManager", "GetManagedObjects"); |
| auto reply = bus.call( |
| method, |
| std::chrono::duration_cast<microsec>(sec(DBUS_TIMEOUT)).count()); |
| reply.read(objects); |
| } |
| catch (const std::exception& e) |
| { |
| return; |
| } |
| |
| std::vector<mctp_eid_t> eids; |
| |
| for (const auto& [objectPath, interfaces] : objects) |
| { |
| for (const auto& [intfName, properties] : interfaces) |
| { |
| if (intfName == mctpEndpointIntfName) |
| { |
| if (properties.contains("EID") && |
| properties.contains("SupportedMessageTypes")) |
| { |
| auto eid = std::get<mctp_eid_t>(properties.at("EID")); |
| auto types = std::get<std::vector<uint8_t>>( |
| properties.at("SupportedMessageTypes")); |
| if (std::find(types.begin(), types.end(), mctpTypePLDM) != |
| types.end()) |
| { |
| eids.emplace_back(eid); |
| } |
| } |
| } |
| } |
| } |
| |
| if (eids.size() && fwManager) |
| { |
| fwManager->handleMCTPEndpoints(eids); |
| } |
| } |
| |
| void MctpDiscovery::dicoverEndpoints(sdbusplus::message_t& msg) |
| { |
| constexpr std::string_view mctpEndpointIntfName{ |
| "xyz.openbmc_project.MCTP.Endpoint"}; |
| std::vector<mctp_eid_t> eids; |
| |
| sdbusplus::message::object_path objPath; |
| std::map<std::string, std::map<std::string, dbus::Value>> interfaces; |
| msg.read(objPath, interfaces); |
| |
| for (const auto& [intfName, properties] : interfaces) |
| { |
| if (intfName == mctpEndpointIntfName) |
| { |
| if (properties.contains("EID") && |
| properties.contains("SupportedMessageTypes")) |
| { |
| auto eid = std::get<size_t>(properties.at("EID")); |
| auto types = std::get<std::vector<uint8_t>>( |
| properties.at("SupportedMessageTypes")); |
| if (std::find(types.begin(), types.end(), mctpTypePLDM) != |
| types.end()) |
| { |
| eids.emplace_back(eid); |
| } |
| } |
| } |
| } |
| |
| if (eids.size() && fwManager) |
| { |
| fwManager->handleMCTPEndpoints(eids); |
| } |
| } |
| |
| } // namespace pldm |