blob: 08ec3bc39e3c3359fcb4c3727dd8a67b9b18ee83 [file] [log] [blame]
Gilbert Chen77e6fe72024-08-06 09:23:30 +00001#pragma once
2
3#include "libpldm/platform.h"
4#include "libpldm/pldm.h"
5
6#include "common/types.hpp"
7#include "numeric_sensor.hpp"
8#include "pldmd/dbus_impl_requester.hpp"
9#include "requester/handler.hpp"
10#include "terminus.hpp"
11#include "terminus_manager.hpp"
12
13namespace pldm
14{
15namespace platform_mc
16{
17
Dung Caof48015b2023-11-21 04:38:29 +000018using EventType = uint8_t;
19using HandlerFunc =
20 std::function<int(pldm_tid_t tid, uint16_t eventId,
21 const uint8_t* eventData, size_t eventDataSize)>;
22using EventMap = std::map<EventType, HandlerFunc>;
23
Gilbert Chen77e6fe72024-08-06 09:23:30 +000024/**
25 * @brief EventManager
26 *
27 * This class manages PLDM events from terminus. The function includes providing
28 * the API for process event data and using phosphor-logging API to log the
29 * event.
30 *
31 */
32class EventManager
33{
34 public:
35 EventManager() = delete;
36 EventManager(const EventManager&) = delete;
37 EventManager(EventManager&&) = delete;
38 EventManager& operator=(const EventManager&) = delete;
39 EventManager& operator=(EventManager&&) = delete;
40 virtual ~EventManager() = default;
41
42 explicit EventManager(TerminusManager& terminusManager,
43 TerminiMapper& termini) :
Dung Caof48015b2023-11-21 04:38:29 +000044 terminusManager(terminusManager), termini(termini)
45 {
46 // Default response handler for PollForPlatFormEventMessage
47 registerPolledEventHandler(
48 PLDM_MESSAGE_POLL_EVENT,
49 [this](pldm_tid_t tid, uint16_t eventId, const uint8_t* eventData,
50 size_t eventDataSize) {
51 return this->handlePlatformEvent(tid, eventId,
52 PLDM_MESSAGE_POLL_EVENT,
53 eventData, eventDataSize);
54 });
55 registerPolledEventHandler(
56 PLDM_CPER_EVENT,
57 [this](pldm_tid_t tid, uint16_t eventId, const uint8_t* eventData,
58 size_t eventDataSize) {
59 return this->handlePlatformEvent(tid, eventId, PLDM_CPER_EVENT,
60 eventData, eventDataSize);
61 });
62 };
Gilbert Chen77e6fe72024-08-06 09:23:30 +000063
64 /** @brief Handle platform event
65 *
66 * @param[in] tid - tid where the event is from
67 * @param[in] eventId - event Id
68 * @param[in] eventClass - event class
69 * @param[in] eventData - event data
70 * @param[in] eventDataSize - size of event data
71 * @return PLDM completion code
72 */
73 int handlePlatformEvent(pldm_tid_t tid, uint16_t eventId,
74 uint8_t eventClass, const uint8_t* eventData,
75 size_t eventDataSize);
76
77 /** @brief Set available state of terminus for pldm request.
78 *
79 * @param[in] tid - terminus ID
80 * @param[in] state - Terminus available state for PLDM request messages
81 */
82 void updateAvailableState(pldm_tid_t tid, Availability state)
83 {
84 availableState[tid] = state;
85 };
86
87 /** @brief Get available state of terminus for pldm request.
88 *
89 * @param[in] tid - terminus ID
90 */
91 bool getAvailableState(pldm_tid_t tid)
92 {
93 if (!availableState.contains(tid))
94 {
95 return false;
96 }
97 return availableState[tid];
98 };
99
Dung Caof48015b2023-11-21 04:38:29 +0000100 /** @brief A Coroutine to poll all events from terminus
101 *
102 * @param[in] tid - the destination TID
103 * @param[in] pollDataTransferHandle - the dataTransferHandle from
104 * pldmMessagePollEvent event
105 * @return coroutine return_value - PLDM completion code
106 */
107 exec::task<int> pollForPlatformEventTask(pldm_tid_t tid,
108 uint32_t pollDataTransferHandle);
109
110 /** @brief Register response handler for the polled events from
111 * PollForPlatFormEventMessage
112 */
Thu Nguyen6894e902024-10-22 10:51:46 +0000113 void registerPolledEventHandler(uint8_t eventClass,
114 pldm::platform_mc::HandlerFunc function)
Dung Caof48015b2023-11-21 04:38:29 +0000115 {
116 eventHandlers.insert_or_assign(eventClass, std::move(function));
117 }
118
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000119 protected:
120 /** @brief Helper method to process the PLDM Numeric sensor event class
121 *
122 * @param[in] tid - tid where the event is from
123 * @param[in] sensorId - Sensor ID which is the source of event
124 * @param[in] sensorData - Numeric sensor event data
125 * @param[in] sensorDataLength - event data length
126 *
127 * @return PLDM completion code
128 */
129 int processNumericSensorEvent(pldm_tid_t tid, uint16_t sensorId,
130 const uint8_t* sensorData,
131 size_t sensorDataLength);
132
Thu Nguyen9fc79122024-09-10 10:15:01 +0000133 /** @brief Helper method to process the PLDM CPER event class
134 *
135 * @param[in] tid - tid where the event is from
136 * @param[in] eventId - Event ID which is the source of event
137 * @param[in] eventData - CPER event data
138 * @param[in] eventDataSize - event data length
139 *
140 * @return PLDM completion code
141 */
Dung Caof48015b2023-11-21 04:38:29 +0000142 virtual int processCperEvent(pldm_tid_t tid, uint16_t eventId,
143 const uint8_t* eventData,
144 const size_t eventDataSize);
Thu Nguyen9fc79122024-09-10 10:15:01 +0000145
146 /** @brief Helper method to create CPER dump log
147 *
148 * @param[in] dataType - CPER event data type
149 * @param[in] dataPath - CPER event data fault log file path
150 * @param[in] typeName - Terminus name which creates CPER event
151 *
152 * @return PLDM completion code
153 */
154 int createCperDumpEntry(const std::string& dataType,
155 const std::string& dataPath,
156 const std::string& typeName);
157
Dung Caof48015b2023-11-21 04:38:29 +0000158 /** @brief Send pollForPlatformEventMessage and return response
159 *
160 * @param[in] tid - Destination TID
161 * @param[in] formatVersion - format Version
162 * @param[in] transferOpFlag - Transfer Operation Flag
163 * @param[in] dataTransferHandle - Data transfer handle
164 * @param[in] eventIdToAcknowledge - Event ID
165 * @param[out] completionCode - the complete code of response message
166 * @param[out] eventTid - Event terminus ID
167 * @param[out] eventId - Event ID
168 * @param[out] nextDataTransferHandle - Next handle to get next data part
169 * @param[out] transferFlag - transfer Flag of response data
170 * @param[out] eventClass - event class
171 * @param[out] eventDataSize - data size of event response message
172 * @param[out] eventData - event data of response message
173 * @param[out] eventDataIntegrityChecksum - check sum of final event
174 *
175 * @return coroutine return_value - PLDM completion code
176 */
177 exec::task<int> pollForPlatformEventMessage(
178 pldm_tid_t tid, uint8_t formatVersion, uint8_t transferOperationFlag,
179 uint32_t dataTransferHandle, uint16_t eventIdToAcknowledge,
180 uint8_t& completionCode, uint8_t& eventTid, uint16_t& eventId,
181 uint32_t& nextDataTransferHandle, uint8_t& transferFlag,
182 uint8_t& eventClass, uint32_t& eventDataSize, uint8_t*& eventData,
183 uint32_t& eventDataIntegrityChecksum);
184
185 /** @brief Get the parameters for next pollForPlatformEventMessage to get
186 * the remaining part of event if has
187 *
188 * @param[in] eventId - Event ID
189 * @param[in] eventMessage - event data of response message
190 * @param[in] transferFlag - transfer Flag of response data
191 * @param[in] eventDataIntegrityChecksum - check sum of final event
192 * @param[in] nextDataTransferHandle - Next handle to get next data part
193 * @param[out] transferOperationFlag - transfer Flag of next request data
194 * @param[out] dataTransferHandle - Data transfer handle
195 * @param[out] eventIdToAcknowledge - Event ID
196 *
197 * @return return_value - PLDM completion code
198 */
199 int getNextPartParameters(
200 uint16_t eventId, std::vector<uint8_t> eventMessage,
201 uint8_t transferFlag, uint32_t eventDataIntegrityChecksum,
202 uint32_t nextDataTransferHandle, uint8_t* transferOperationFlag,
203 uint32_t* dataTransferHandle, uint32_t* eventIdToAcknowledge);
204
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000205 /** @brief Reference of terminusManager */
206 TerminusManager& terminusManager;
207
208 /** @brief List of discovered termini */
209 TerminiMapper& termini;
210
211 /** @brief Available state for pldm request of terminus */
212 std::unordered_map<pldm_tid_t, Availability> availableState;
Dung Caof48015b2023-11-21 04:38:29 +0000213
214 /** @brief map of PLDM event type of polled event to EventHandlers */
215 pldm::platform_mc::EventMap eventHandlers;
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000216};
217} // namespace platform_mc
218} // namespace pldm