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