blob: 5f4654c2f0e1a7187826aebe93f2facae4a0b124 [file] [log] [blame]
Tom Joseph807c7e82017-02-09 19:49:38 +05301#pragma once
2
3#include <systemd/sd-event.h>
4#include <chrono>
5#include <map>
6
7namespace eventloop
8{
9
10/** @struct EventSourceDeleter
11 *
12 * Custom deleter for the sd_event_source*.
13 */
14struct EventSourceDeleter
15{
16 void operator()(sd_event_source* event) const
17 {
18 event = sd_event_source_unref(event);
19 }
20};
21
22using EventSource = std::unique_ptr<sd_event_source, EventSourceDeleter>;
23using IntervalType = std::chrono::microseconds;
24
25/** @enum Timers
26 *
27 * For SOL functioning, there are two timers involved. The character accumulate
28 * interval timer is the amount of time that the BMC will wait before
29 * transmitting a partial SOL packet. The retry interval timer is the time that
30 * BMC will wait before the first retry and the time between retries when
31 * sending SOL packets to the remote console.
32 */
33enum class Timers
34{
35 ACCUMULATE, /**< Character Accumulate Timer */
36 RETRY, /**< Retry Interval Timer */
37};
38
39class EventLoop
40{
41 public:
42
43 EventLoop() = default;
44 ~EventLoop() = default;
45 EventLoop(const EventLoop&) = delete;
46 EventLoop& operator=(const EventLoop&) = delete;
47 EventLoop(EventLoop&&) = delete;
48 EventLoop& operator=(EventLoop&&) = delete;
49
50 /** @brief Timer Map
51 *
52 * The key for the timer map is the timer type. There are two types of
53 * timers, character accumulate timer and retry interval timer. The
54 * entries in the values is the event source for the timer and the
55 * interval.
56 */
57 using TimerMap = std::map<Timers, std::tuple<EventSource,
58 IntervalType>>;
59
60 /** @brief SOL Payload Map.
61 *
62 * The key for the payload map is the payload instance, the entries in
63 * the value are a map of timers.
64 */
65 using PayloadMap = std::map<uint8_t, TimerMap>;
66
67 /** @brief Initialise the event loop and add the handler for incoming
68 * IPMI packets.
69 *
70 * @return EXIT_SUCCESS on success and EXIT_FAILURE on failure.
71 */
72 int startEventLoop();
73
Tom Joseph28d993a2017-04-21 20:47:53 +053074 /** @brief Add host console I/O event source to the event loop.
75 *
76 * @param[in] fd - File descriptor for host console socket.
77 */
78 void startHostConsole(const sol::CustomFD& fd);
79
Tom Joseph807c7e82017-02-09 19:49:38 +053080 /** @brief Remove host console I/O event source. */
81 void stopHostConsole();
82
83 /** @brief Initialize the timers for the SOL payload instance
84 *
85 * This API would add the Character accumulate interval timer event
86 * source and the retry interval timer event source for the SOL payload
87 * instance to the event loop.
88 *
89 * @param[in] payloadInst - SOL payload instance.
90 * @param[in] accumulateInterval - Character accumulate interval.
91 * @param[in] retryInterval - Retry interval.
92 */
93 void startSOLPayloadInstance(uint8_t payloadInst,
94 IntervalType accumulateInterval,
95 IntervalType retryInterval);
96
97 /** @brief Stop the timers for the SOL payload instance.
98 *
99 * This would remove the character accumulate interval timer event
100 * source and the retry interval timer event source from the event
101 * loop.
102 *
103 * @param[in] payloadInst - SOL payload instance
104 */
105 void stopSOLPayloadInstance(uint8_t payloadInst);
106
107 /** @brief Modify the timer event source to enable/disable.
108 *
109 * When the timer is enabled, the timer it set to fire again at
110 * timer's interval for the instance added to the event loop iteration
111 * timestamp. When the timer is disabled, the event source for the
112 * timer is disabled.
113 *
114 * @param[in] payloadInst - SOL payload instance.
115 * @param[in] type - Timer type.
116 * @param[in] status - on/off the event source.
117 */
118 void switchTimer(uint8_t payloadInst,
119 Timers type,
120 bool status);
121
122 /** @brief Modify the retry interval timer event source to enable/
123 * disable
124 *
125 * When the timer is enabled, the timer it set to fire again at
126 * retry interval for the instance added to the event loop iteration
127 * timestamp. When the timer is disabled the event source for the
128 * retry interval timer is disabled.
129 *
130 * @param[in] payloadInst - SOL payload instance.
131 * @param[in] status - on/off the event source.
132 */
133 void switchRetryTimer(uint8_t payloadInst, bool status);
134
135 private:
136 /** @brief Event source object for host console. */
137 EventSource hostConsole = nullptr;
138
139 /** @brief Event source for the UDP socket listening on IPMI standard
140 * port.
141 */
142 EventSource udpIPMI = nullptr;
143
144 /** @brief Map to keep information regarding IPMI payload instance and
145 * timers for character accumulate interval and retry interval.
146 */
147 PayloadMap payloadInfo;
148
149 /** @brief Event loop object. */
150 sd_event* event = nullptr;
151};
152
153} // namespace eventloop