xref: /openbmc/pldm/requester/mctp_endpoint_discovery.hpp (revision 38e12aa2bb59ea10bda8f859b8f98ba0370926f9)
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;
37     /** @brief Get Active EIDs.
38      *
39      *  @param[in] addr - MCTP address of terminus
40      *  @param[in] terminiNames - MCTP terminus name
41      */
42     virtual std::optional<mctp_eid_t> getActiveEidByName(
43         const std::string& terminusName) = 0;
44 
~MctpDiscoveryHandlerIntf()45     virtual ~MctpDiscoveryHandlerIntf() {}
46 };
47 
48 class MctpDiscovery
49 {
50   public:
51     MctpDiscovery() = delete;
52     MctpDiscovery(const MctpDiscovery&) = delete;
53     MctpDiscovery(MctpDiscovery&&) = delete;
54     MctpDiscovery& operator=(const MctpDiscovery&) = delete;
55     MctpDiscovery& operator=(MctpDiscovery&&) = delete;
56     ~MctpDiscovery() = default;
57 
58     /** @brief Constructs the MCTP Discovery object to handle discovery of
59      *         MCTP enabled devices
60      *
61      *  @param[in] bus - reference to systemd bus
62      *  @param[in] list - initializer list to the MctpDiscoveryHandlerIntf
63      */
64     explicit MctpDiscovery(
65         sdbusplus::bus_t& bus,
66         std::initializer_list<MctpDiscoveryHandlerIntf*> list);
67 
68     /** @brief reference to the systemd bus */
69     sdbusplus::bus_t& bus;
70 
71     /** @brief Used to watch for new MCTP endpoints */
72     sdbusplus::bus::match_t mctpEndpointAddedSignal;
73 
74     /** @brief Used to watch for the removed MCTP endpoints */
75     sdbusplus::bus::match_t mctpEndpointRemovedSignal;
76 
77     /** @brief Used to watch for new MCTP endpoints */
78     sdbusplus::bus::match_t mctpEndpointPropChangedSignal;
79 
80     /** @brief List of handlers need to notify when new MCTP
81      * Endpoint is Added/Removed */
82     std::vector<MctpDiscoveryHandlerIntf*> handlers;
83 
84     /** @brief The existing MCTP endpoints */
85     MctpInfos existingMctpInfos;
86 
87     /** @brief Callback function when the propertiesChanged D-Bus
88      * signal is triggered for MCTP endpoint's properties.
89      *
90      *  @param[in] msg - Data associated with subscribed signal
91      */
92     void propertiesChangedCb(sdbusplus::message_t& msg);
93 
94     /** @brief Callback function when MCTP endpoints addedInterface
95      * D-Bus signal raised.
96      *
97      *  @param[in] msg - Data associated with subscribed signal
98      */
99     void discoverEndpoints(sdbusplus::message_t& msg);
100 
101     /** @brief Callback function when MCTP endpoint removedInterface
102      * D-Bus signal raised.
103      *
104      *  @param[in] msg - Data associated with subscribed signal
105      */
106     void removeEndpoints(sdbusplus::message_t& msg);
107 
108     /** @brief Helper function to invoke registered handlers for
109      *  the added MCTP endpoints
110      *
111      *  @param[in] mctpInfos - information of discovered MCTP endpoints
112      */
113     void handleMctpEndpoints(const MctpInfos& mctpInfos);
114 
115     /** @brief Helper function to invoke registered handlers for
116      *  the removed MCTP endpoints
117      *
118      *  @param[in] mctpInfos - information of removed MCTP endpoints
119      */
120     void handleRemovedMctpEndpoints(const MctpInfos& mctpInfos);
121 
122     /** @brief Helper function to invoke registered handlers for
123      *  updating the availability status of the MCTP endpoint
124      *
125      *  @param[in] mctpInfo - information of the target endpoint
126      *  @param[in] availability - new availability status
127      */
128     void updateMctpEndpointAvailability(const MctpInfo& mctpInfo,
129                                         Availability availability);
130 
131     /** @brief Get list of MctpInfos in MCTP control interface.
132      *
133      *  @param[in] mctpInfoMap - information of discovered MCTP endpoints
134      *  and the availability status of each endpoint
135      */
136     void getMctpInfos(std::map<MctpInfo, Availability>& mctpInfoMap);
137 
138     /** @brief Get list of new MctpInfos in addedInterace D-Bus signal message.
139      *
140      *  @param[in] msg - addedInterace D-Bus signal message
141      *  @param[in] mctpInfos - information of added MCTP endpoints
142      */
143     void getAddedMctpInfos(sdbusplus::message_t& msg, MctpInfos& mctpInfos);
144 
145     /** @brief Add new MctpInfos to existingMctpInfos.
146      *
147      *  @param[in] mctpInfos - information of new MCTP endpoints
148      */
149     void addToExistingMctpInfos(const MctpInfos& mctpInfos);
150 
151     /** @brief Erase the removed MCTP endpoint from existingMctpInfos.
152      *
153      *  @param[in] mctpInfos - the remaining MCTP endpoints
154      *  @param[out] removedInfos - the removed MCTP endpoints
155      */
156     void removeFromExistingMctpInfos(MctpInfos& mctpInfos,
157                                      MctpInfos& removedInfos);
158 
159   private:
160     /** @brief Get MCTP Endpoint D-Bus Properties in the
161      *         `xyz.openbmc_project.MCTP.Endpoint` D-Bus interface
162      *
163      *  @param[in] service - the MCTP service name
164      *  @param[in] path - the MCTP endpoints object path
165      *
166      *  @return tuple of Network Index, Endpoint ID and MCTP message types
167      */
168     MctpEndpointProps getMctpEndpointProps(const std::string& service,
169                                            const std::string& path);
170 
171     /** @brief Get Endpoint UUID from `UUID` D-Bus property in the
172      *         `xyz.openbmc_project.Common.UUID` D-Bus interface.
173      *
174      *  @param[in] service - the MCTP service name
175      *  @param[in] path - the MCTP endpoints object path
176      *
177      *  @return Endpoint UUID
178      */
179     UUID getEndpointUUIDProp(const std::string& service,
180                              const std::string& path);
181 
182     /** @brief Get Endpoint Availability status from `Connectivity` D-Bus
183      *         property in the `au.com.codeconstruct.MCTP.Endpoint1` D-Bus
184      *         interface.
185      *
186      *  @param[in] path - the MCTP endpoints object path
187      *
188      *  @return Availability status: true if active false if inactive
189      */
190     Availability getEndpointConnectivityProp(const std::string& path);
191 
192     static constexpr uint8_t mctpTypePLDM = 1;
193 };
194 
195 } // namespace pldm
196