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