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