xref: /openbmc/pldm/requester/mctp_endpoint_discovery.hpp (revision 75e00422df3f9a4c9341ca8085706b6eaa6605b7)
1 #pragma once
2 
3 #include "common/types.hpp"
4 #include "common/utils.hpp"
5 
6 #include <libpldm/pldm.h>
7 
8 #include <sdbusplus/bus/match.hpp>
9 
10 #include <filesystem>
11 #include <initializer_list>
12 #include <vector>
13 
14 namespace pldm
15 {
16 
17 const std::string emptyUUID = "00000000-0000-0000-0000-000000000000";
18 constexpr const char* MCTPService = "au.com.codeconstruct.MCTP1";
19 constexpr const char* MCTPInterface = "xyz.openbmc_project.MCTP.Endpoint";
20 constexpr const char* EndpointUUID = "xyz.openbmc_project.Common.UUID";
21 constexpr const char* MCTPPath = "/au/com/codeconstruct/mctp1";
22 constexpr const char* MCTPInterfaceCC = "au.com.codeconstruct.MCTP.Endpoint1";
23 constexpr const char* MCTPConnectivityProp = "Connectivity";
24 
25 /** @class MctpDiscoveryHandlerIntf
26  *
27  * This abstract class defines the APIs for MctpDiscovery class has common
28  * interface to execute function from different Manager Classes
29  */
30 class MctpDiscoveryHandlerIntf
31 {
32   public:
33     virtual void handleMctpEndpoints(const MctpInfos& mctpInfos) = 0;
34     virtual void handleRemovedMctpEndpoints(const MctpInfos& mctpInfos) = 0;
35     virtual void updateMctpEndpointAvailability(const MctpInfo& mctpInfo,
36                                                 Availability availability) = 0;
~MctpDiscoveryHandlerIntf()37     virtual ~MctpDiscoveryHandlerIntf() {}
38 };
39 
40 class MctpDiscovery
41 {
42   public:
43     MctpDiscovery() = delete;
44     MctpDiscovery(const MctpDiscovery&) = delete;
45     MctpDiscovery(MctpDiscovery&&) = delete;
46     MctpDiscovery& operator=(const MctpDiscovery&) = delete;
47     MctpDiscovery& operator=(MctpDiscovery&&) = delete;
48     ~MctpDiscovery() = default;
49 
50     /** @brief Constructs the MCTP Discovery object to handle discovery of
51      *         MCTP enabled devices
52      *
53      *  @param[in] bus - reference to systemd bus
54      *  @param[in] list - initializer list to the MctpDiscoveryHandlerIntf
55      */
56     explicit MctpDiscovery(
57         sdbusplus::bus_t& bus,
58         std::initializer_list<MctpDiscoveryHandlerIntf*> list);
59 
60     /** @brief reference to the systemd bus */
61     sdbusplus::bus_t& bus;
62 
63     /** @brief Used to watch for new MCTP endpoints */
64     sdbusplus::bus::match_t mctpEndpointAddedSignal;
65 
66     /** @brief Used to watch for the removed MCTP endpoints */
67     sdbusplus::bus::match_t mctpEndpointRemovedSignal;
68 
69     /** @brief Used to watch for new MCTP endpoints */
70     sdbusplus::bus::match_t mctpEndpointPropChangedSignal;
71 
72     /** @brief List of handlers need to notify when new MCTP
73      * Endpoint is Added/Removed */
74     std::vector<MctpDiscoveryHandlerIntf*> handlers;
75 
76     /** @brief The existing MCTP endpoints */
77     MctpInfos existingMctpInfos;
78 
79     /** @brief Callback function when the propertiesChanged D-Bus
80      * signal is triggered for MCTP endpoint's properties.
81      *
82      *  @param[in] msg - Data associated with subscribed signal
83      */
84     void propertiesChangedCb(sdbusplus::message_t& msg);
85 
86     /** @brief Callback function when MCTP endpoints addedInterface
87      * D-Bus signal raised.
88      *
89      *  @param[in] msg - Data associated with subscribed signal
90      */
91     void discoverEndpoints(sdbusplus::message_t& msg);
92 
93     /** @brief Callback function when MCTP endpoint removedInterface
94      * D-Bus signal raised.
95      *
96      *  @param[in] msg - Data associated with subscribed signal
97      */
98     void removeEndpoints(sdbusplus::message_t& msg);
99 
100     /** @brief Helper function to invoke registered handlers for
101      *  the added MCTP endpoints
102      *
103      *  @param[in] mctpInfos - information of discovered MCTP endpoints
104      */
105     void handleMctpEndpoints(const MctpInfos& mctpInfos);
106 
107     /** @brief Helper function to invoke registered handlers for
108      *  the removed MCTP endpoints
109      *
110      *  @param[in] mctpInfos - information of removed MCTP endpoints
111      */
112     void handleRemovedMctpEndpoints(const MctpInfos& mctpInfos);
113 
114     /** @brief Helper function to invoke registered handlers for
115      *  updating the availability status of the MCTP endpoint
116      *
117      *  @param[in] mctpInfo - information of the target endpoint
118      *  @param[in] availability - new availability status
119      */
120     void updateMctpEndpointAvailability(const MctpInfo& mctpInfo,
121                                         Availability availability);
122 
123     /** @brief Get list of MctpInfos in MCTP control interface.
124      *
125      *  @param[in] mctpInfoMap - information of discovered MCTP endpoints
126      *  and the availability status of each endpoint
127      */
128     void getMctpInfos(std::map<MctpInfo, Availability>& mctpInfoMap);
129 
130     /** @brief Get list of new MctpInfos in addedInterace D-Bus signal message.
131      *
132      *  @param[in] msg - addedInterace D-Bus signal message
133      *  @param[in] mctpInfos - information of added MCTP endpoints
134      */
135     void getAddedMctpInfos(sdbusplus::message_t& msg, MctpInfos& mctpInfos);
136 
137     /** @brief Add new MctpInfos to existingMctpInfos.
138      *
139      *  @param[in] mctpInfos - information of new MCTP endpoints
140      */
141     void addToExistingMctpInfos(const MctpInfos& mctpInfos);
142 
143     /** @brief Erase the removed MCTP endpoint from existingMctpInfos.
144      *
145      *  @param[in] mctpInfos - the remaining MCTP endpoints
146      *  @param[out] removedInfos - the removed MCTP endpoints
147      */
148     void removeFromExistingMctpInfos(MctpInfos& mctpInfos,
149                                      MctpInfos& removedInfos);
150 
151   private:
152     /** @brief Get MCTP Endpoint D-Bus Properties in the
153      *         `xyz.openbmc_project.MCTP.Endpoint` D-Bus interface
154      *
155      *  @param[in] service - the MCTP service name
156      *  @param[in] path - the MCTP endpoints object path
157      *
158      *  @return tuple of Network Index, Endpoint ID and MCTP message types
159      */
160     MctpEndpointProps getMctpEndpointProps(const std::string& service,
161                                            const std::string& path);
162 
163     /** @brief Get Endpoint UUID from `UUID` D-Bus property in the
164      *         `xyz.openbmc_project.Common.UUID` D-Bus interface.
165      *
166      *  @param[in] service - the MCTP service name
167      *  @param[in] path - the MCTP endpoints object path
168      *
169      *  @return Endpoint UUID
170      */
171     UUID getEndpointUUIDProp(const std::string& service,
172                              const std::string& path);
173 
174     /** @brief Get Endpoint Availability status from `Connectivity` D-Bus
175      *         property in the `au.com.codeconstruct.MCTP.Endpoint1` D-Bus
176      *         interface.
177      *
178      *  @param[in] path - the MCTP endpoints object path
179      *
180      *  @return Availability status: true if active false if inactive
181      */
182     Availability getEndpointConnectivityProp(const std::string& path);
183 
184     static constexpr uint8_t mctpTypePLDM = 1;
185 };
186 
187 } // namespace pldm
188