1 #include "mctp_endpoint_discovery.hpp" 2 3 #include "common/types.hpp" 4 #include "common/utils.hpp" 5 6 #include <algorithm> 7 #include <map> 8 #include <string> 9 #include <string_view> 10 #include <vector> 11 12 namespace pldm 13 { 14 MctpDiscovery::MctpDiscovery(sdbusplus::bus_t& bus, 15 fw_update::Manager* fwManager) : 16 bus(bus), 17 fwManager(fwManager), 18 mctpEndpointSignal(bus, 19 sdbusplus::bus::match::rules::interfacesAdded( 20 "/xyz/openbmc_project/mctp"), 21 std::bind_front(&MctpDiscovery::dicoverEndpoints, this)) 22 { 23 pldm::utils::ObjectValueTree objects; 24 25 try 26 { 27 objects = pldm::utils::DBusHandler::getManagedObj(MCTPService, 28 MCTPPath); 29 } 30 catch (const std::exception& e) 31 { 32 error("Failed to call the D-Bus Method: {ERROR}", "ERROR", e); 33 return; 34 } 35 36 std::vector<mctp_eid_t> eids; 37 38 for (const auto& [objectPath, interfaces] : objects) 39 { 40 for (const auto& [intfName, properties] : interfaces) 41 { 42 if (intfName == mctpEndpointIntfName) 43 { 44 if (properties.contains("EID") && 45 properties.contains("SupportedMessageTypes")) 46 { 47 auto eid = std::get<mctp_eid_t>(properties.at("EID")); 48 auto types = std::get<std::vector<uint8_t>>( 49 properties.at("SupportedMessageTypes")); 50 if (std::find(types.begin(), types.end(), mctpTypePLDM) != 51 types.end()) 52 { 53 eids.emplace_back(eid); 54 } 55 } 56 } 57 } 58 } 59 60 if (eids.size() && fwManager) 61 { 62 fwManager->handleMCTPEndpoints(eids); 63 } 64 } 65 66 void MctpDiscovery::dicoverEndpoints(sdbusplus::message_t& msg) 67 { 68 constexpr std::string_view mctpEndpointIntfName{ 69 "xyz.openbmc_project.MCTP.Endpoint"}; 70 std::vector<mctp_eid_t> eids; 71 72 sdbusplus::message::object_path objPath; 73 std::map<std::string, std::map<std::string, dbus::Value>> interfaces; 74 msg.read(objPath, interfaces); 75 76 for (const auto& [intfName, properties] : interfaces) 77 { 78 if (intfName == mctpEndpointIntfName) 79 { 80 if (properties.contains("EID") && 81 properties.contains("SupportedMessageTypes")) 82 { 83 auto eid = std::get<mctp_eid_t>(properties.at("EID")); 84 auto types = std::get<std::vector<uint8_t>>( 85 properties.at("SupportedMessageTypes")); 86 if (std::find(types.begin(), types.end(), mctpTypePLDM) != 87 types.end()) 88 { 89 eids.emplace_back(eid); 90 } 91 } 92 } 93 } 94 95 if (eids.size() && fwManager) 96 { 97 fwManager->handleMCTPEndpoints(eids); 98 } 99 } 100 101 } // namespace pldm 102