blob: c499f88675fc446679bac1fb928c58869850ab35 [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"
Gilbert Chen77e6fe72024-08-06 09:23:30 +00007#include "event_manager.hpp"
Gilbert Chen6c7fed42022-02-22 15:40:17 +00008#include "platform_manager.hpp"
9#include "requester/handler.hpp"
10#include "requester/mctp_endpoint_discovery.hpp"
Gilbert Cheneac61a42022-02-23 20:56:19 +000011#include "sensor_manager.hpp"
Gilbert Chen6c7fed42022-02-22 15:40:17 +000012#include "terminus_manager.hpp"
13
14namespace pldm
15{
16namespace platform_mc
17{
18
19/**
20 * @brief Manager
21 *
22 * This class handles all the aspect of the PLDM Platform Monitoring and Control
23 * specification for the MCTP devices
24 */
25class Manager : public pldm::MctpDiscoveryHandlerIntf
26{
27 public:
28 Manager() = delete;
29 Manager(const Manager&) = delete;
30 Manager(Manager&&) = delete;
31 Manager& operator=(const Manager&) = delete;
32 Manager& operator=(Manager&&) = delete;
33 ~Manager() = default;
34
35 explicit Manager(sdeventplus::Event& event, RequesterHandler& handler,
36 pldm::InstanceIdDb& instanceIdDb) :
Thu Nguyen51d66b52024-08-06 09:15:55 +000037 terminusManager(event, handler, instanceIdDb, termini, this,
38 pldm::BmcMctpEid),
Gilbert Cheneac61a42022-02-23 20:56:19 +000039 platformManager(terminusManager, termini),
Gilbert Chen77e6fe72024-08-06 09:23:30 +000040 sensorManager(event, terminusManager, termini, this),
41 eventManager(terminusManager, termini)
Gilbert Chen6c7fed42022-02-22 15:40:17 +000042 {}
43
44 /** @brief Helper function to do the actions before discovering terminus
45 *
46 * @return coroutine return_value - PLDM completion code
47 */
48 exec::task<int> beforeDiscoverTerminus();
49
50 /** @brief Helper function to do the actions after discovering terminus
51 *
52 * @return coroutine return_value - PLDM completion code
53 */
54 exec::task<int> afterDiscoverTerminus();
55
56 /** @brief Helper function to invoke registered handlers for
57 * the added MCTP endpoints
58 *
59 * @param[in] mctpInfos - list information of the MCTP endpoints
60 */
61 void handleMctpEndpoints(const MctpInfos& mctpInfos)
62 {
63 terminusManager.discoverMctpTerminus(mctpInfos);
64 }
65
66 /** @brief Helper function to invoke registered handlers for
67 * the removed MCTP endpoints
68 *
69 * @param[in] mctpInfos - list information of the MCTP endpoints
70 */
71 void handleRemovedMctpEndpoints(const MctpInfos& mctpInfos)
72 {
73 terminusManager.removeMctpTerminus(mctpInfos);
74 }
75
Gilbert Cheneac61a42022-02-23 20:56:19 +000076 /** @brief Helper function to start sensor polling of the terminus TID
77 */
78 void startSensorPolling(pldm_tid_t tid)
79 {
80 sensorManager.startPolling(tid);
81 }
82
83 /** @brief Helper function to set available state for pldm request (sensor
84 * polling and event polling) of the terminus TID. The `false` state
85 * will trigger stop flow in coroutine of sensor polling/event
86 * polling task to stop.
87 */
88 void updateAvailableState(pldm_tid_t tid, Availability state)
89 {
90 if (termini.contains(tid))
91 {
92 sensorManager.updateAvailableState(tid, state);
Gilbert Chen77e6fe72024-08-06 09:23:30 +000093 eventManager.updateAvailableState(tid, state);
Gilbert Cheneac61a42022-02-23 20:56:19 +000094 }
95 }
96
97 /** @brief Helper function to stop sensor polling of the terminus TID
98 */
99 void stopSensorPolling(pldm_tid_t tid)
100 {
101 sensorManager.stopPolling(tid);
102 }
103
Thu Nguyen9fc79122024-09-10 10:15:01 +0000104 /** @brief Sensor event handler function
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000105 *
106 * @param[in] request - Event message
107 * @param[in] payloadLength - Event message payload size
108 * @param[in] tid - Terminus ID
109 * @param[in] eventDataOffset - Event data offset
110 *
111 * @return PLDM error code: PLDM_SUCCESS when there is no error in handling
112 * the event
113 */
114 int handleSensorEvent(const pldm_msg* request, size_t payloadLength,
115 uint8_t /* formatVersion */, uint8_t tid,
116 size_t eventDataOffset)
117 {
118 auto eventData = reinterpret_cast<const uint8_t*>(request->payload) +
119 eventDataOffset;
120 auto eventDataSize = payloadLength - eventDataOffset;
Thu Nguyen9fc79122024-09-10 10:15:01 +0000121 eventManager.handlePlatformEvent(tid, PLDM_PLATFORM_EVENT_ID_NULL,
122 PLDM_SENSOR_EVENT, eventData,
123 eventDataSize);
124 return PLDM_SUCCESS;
125 }
126
127 /** @brief CPER event handler function
128 *
129 * @param[in] request - Event message
130 * @param[in] payloadLength - Event message payload size
131 * @param[in] tid - Terminus ID
132 * @param[in] eventDataOffset - Event data offset
133 *
134 * @return PLDM error code: PLDM_SUCCESS when there is no error in handling
135 * the event
136 */
137 int handleCperEvent(const pldm_msg* request, size_t payloadLength,
138 uint8_t /* formatVersion */, uint8_t tid,
139 size_t eventDataOffset)
140 {
141 auto eventData =
142 const_cast<const uint8_t*>(request->payload) + eventDataOffset;
143 auto eventDataSize = payloadLength - eventDataOffset;
144 eventManager.handlePlatformEvent(tid, PLDM_PLATFORM_EVENT_ID_NULL,
145 PLDM_CPER_EVENT, eventData,
146 eventDataSize);
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000147 return PLDM_SUCCESS;
148 }
149
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000150 private:
151 /** @brief List of discovered termini */
152 TerminiMapper termini{};
153
154 /** @brief Terminus interface for calling the hook functions */
155 TerminusManager terminusManager;
156
157 /** @brief Platform interface for calling the hook functions */
158 PlatformManager platformManager;
Gilbert Cheneac61a42022-02-23 20:56:19 +0000159
160 /** @brief Store platform manager handler */
161 SensorManager sensorManager;
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000162
163 /** @brief Store event manager handler */
164 EventManager eventManager;
Gilbert Chen6c7fed42022-02-22 15:40:17 +0000165};
166} // namespace platform_mc
167} // namespace pldm