blob: ca20b456a562927233106bf10b1c465390eee1cc [file] [log] [blame]
Andrew Jeffery275f7c32024-01-31 12:41:14 +10301#pragma once
2
3#include "MCTPDeviceRepository.hpp"
4#include "MCTPEndpoint.hpp"
5#include "Utils.hpp"
6
7#include <string>
8#include <vector>
9
10struct AssociationServer
11{
12 virtual ~AssociationServer() = default;
13
14 virtual void associate(const std::string& path,
15 const std::vector<Association>& associations) = 0;
16 virtual void disassociate(const std::string& path) = 0;
17};
18
19class MCTPReactor : public std::enable_shared_from_this<MCTPReactor>
20{
21 using MCTPDeviceFactory = std::function<std::shared_ptr<MCTPDevice>(
22 const std::string& interface, const std::vector<std::uint8_t>& physaddr,
23 std::optional<std::uint8_t> eid)>;
24
25 public:
26 MCTPReactor() = delete;
27 MCTPReactor(const MCTPReactor&) = delete;
28 MCTPReactor(MCTPReactor&&) = delete;
29 explicit MCTPReactor(AssociationServer& server) : server(server) {}
30 ~MCTPReactor() = default;
31 MCTPReactor& operator=(const MCTPReactor&) = delete;
32 MCTPReactor& operator=(MCTPReactor&&) = delete;
33
34 void tick();
35
36 void manageMCTPDevice(const std::string& path,
37 const std::shared_ptr<MCTPDevice>& device);
38 void unmanageMCTPDevice(const std::string& path);
39
40 private:
41 static std::optional<std::string> findSMBusInterface(int bus);
42
43 AssociationServer& server;
44 MCTPDeviceRepository devices;
45
46 // Tracks MCTP devices that have failed their setup
47 std::set<std::shared_ptr<MCTPDevice>> deferred;
48
49 void deferSetup(const std::shared_ptr<MCTPDevice>& dev);
50 void setupEndpoint(const std::shared_ptr<MCTPDevice>& dev);
51 void trackEndpoint(const std::shared_ptr<MCTPEndpoint>& ep);
52 void untrackEndpoint(const std::shared_ptr<MCTPEndpoint>& ep);
53};