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