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