blob: d8210b4b4ab1a062b7d4492d1af2a649a281e45f [file] [log] [blame]
Gilbert Chen6c7fed42022-02-22 15:40:17 +00001#pragma once
2
3#include "libpldm/pldm.h"
4
5#include "common/instance_id.hpp"
6#include "common/types.hpp"
7#include "platform_manager.hpp"
8#include "requester/handler.hpp"
9#include "requester/mctp_endpoint_discovery.hpp"
Gilbert Cheneac61a42022-02-23 20:56:19 +000010#include "sensor_manager.hpp"
Gilbert Chen6c7fed42022-02-22 15:40:17 +000011#include "terminus_manager.hpp"
12
13namespace pldm
14{
15namespace platform_mc
16{
17
18/**
19 * @brief Manager
20 *
21 * This class handles all the aspect of the PLDM Platform Monitoring and Control
22 * specification for the MCTP devices
23 */
24class Manager : public pldm::MctpDiscoveryHandlerIntf
25{
26 public:
27 Manager() = delete;
28 Manager(const Manager&) = delete;
29 Manager(Manager&&) = delete;
30 Manager& operator=(const Manager&) = delete;
31 Manager& operator=(Manager&&) = delete;
32 ~Manager() = default;
33
34 explicit Manager(sdeventplus::Event& event, RequesterHandler& handler,
35 pldm::InstanceIdDb& instanceIdDb) :
36 terminusManager(event, handler, instanceIdDb, termini, this),
Gilbert Cheneac61a42022-02-23 20:56:19 +000037 platformManager(terminusManager, termini),
38 sensorManager(event, terminusManager, termini)
Gilbert Chen6c7fed42022-02-22 15:40:17 +000039 {}
40
41 /** @brief Helper function to do the actions before discovering terminus
42 *
43 * @return coroutine return_value - PLDM completion code
44 */
45 exec::task<int> beforeDiscoverTerminus();
46
47 /** @brief Helper function to do the actions after discovering terminus
48 *
49 * @return coroutine return_value - PLDM completion code
50 */
51 exec::task<int> afterDiscoverTerminus();
52
53 /** @brief Helper function to invoke registered handlers for
54 * the added MCTP endpoints
55 *
56 * @param[in] mctpInfos - list information of the MCTP endpoints
57 */
58 void handleMctpEndpoints(const MctpInfos& mctpInfos)
59 {
60 terminusManager.discoverMctpTerminus(mctpInfos);
61 }
62
63 /** @brief Helper function to invoke registered handlers for
64 * the removed MCTP endpoints
65 *
66 * @param[in] mctpInfos - list information of the MCTP endpoints
67 */
68 void handleRemovedMctpEndpoints(const MctpInfos& mctpInfos)
69 {
70 terminusManager.removeMctpTerminus(mctpInfos);
71 }
72
Gilbert Cheneac61a42022-02-23 20:56:19 +000073 /** @brief Helper function to start sensor polling of the terminus TID
74 */
75 void startSensorPolling(pldm_tid_t tid)
76 {
77 sensorManager.startPolling(tid);
78 }
79
80 /** @brief Helper function to set available state for pldm request (sensor
81 * polling and event polling) of the terminus TID. The `false` state
82 * will trigger stop flow in coroutine of sensor polling/event
83 * polling task to stop.
84 */
85 void updateAvailableState(pldm_tid_t tid, Availability state)
86 {
87 if (termini.contains(tid))
88 {
89 sensorManager.updateAvailableState(tid, state);
90 }
91 }
92
93 /** @brief Helper function to stop sensor polling of the terminus TID
94 */
95 void stopSensorPolling(pldm_tid_t tid)
96 {
97 sensorManager.stopPolling(tid);
98 }
99
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000100 private:
101 /** @brief List of discovered termini */
102 TerminiMapper termini{};
103
104 /** @brief Terminus interface for calling the hook functions */
105 TerminusManager terminusManager;
106
107 /** @brief Platform interface for calling the hook functions */
108 PlatformManager platformManager;
Gilbert Cheneac61a42022-02-23 20:56:19 +0000109
110 /** @brief Store platform manager handler */
111 SensorManager sensorManager;
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000112};
113} // namespace platform_mc
114} // namespace pldm