#include "mctp_endpoint_discovery.hpp" #include "common/types.hpp" #include "common/utils.hpp" #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, dbusTimeout); 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