| #pragma once |
| |
| #include <systemd/sd-event.h> |
| #include <chrono> |
| #include <map> |
| |
| namespace eventloop |
| { |
| |
| /** @struct EventSourceDeleter |
| * |
| * Custom deleter for the sd_event_source*. |
| */ |
| struct EventSourceDeleter |
| { |
| void operator()(sd_event_source* event) const |
| { |
| event = sd_event_source_unref(event); |
| } |
| }; |
| |
| using EventSource = std::unique_ptr<sd_event_source, EventSourceDeleter>; |
| using IntervalType = std::chrono::microseconds; |
| |
| /** @enum Timers |
| * |
| * For SOL functioning, there are two timers involved. The character accumulate |
| * interval timer is the amount of time that the BMC will wait before |
| * transmitting a partial SOL packet. The retry interval timer is the time that |
| * BMC will wait before the first retry and the time between retries when |
| * sending SOL packets to the remote console. |
| */ |
| enum class Timers |
| { |
| ACCUMULATE, /**< Character Accumulate Timer */ |
| RETRY, /**< Retry Interval Timer */ |
| }; |
| |
| class EventLoop |
| { |
| public: |
| |
| EventLoop() = default; |
| ~EventLoop() = default; |
| EventLoop(const EventLoop&) = delete; |
| EventLoop& operator=(const EventLoop&) = delete; |
| EventLoop(EventLoop&&) = delete; |
| EventLoop& operator=(EventLoop&&) = delete; |
| |
| /** @brief Timer Map |
| * |
| * The key for the timer map is the timer type. There are two types of |
| * timers, character accumulate timer and retry interval timer. The |
| * entries in the values is the event source for the timer and the |
| * interval. |
| */ |
| using TimerMap = std::map<Timers, std::tuple<EventSource, |
| IntervalType>>; |
| |
| /** @brief SOL Payload Map. |
| * |
| * The key for the payload map is the payload instance, the entries in |
| * the value are a map of timers. |
| */ |
| using PayloadMap = std::map<uint8_t, TimerMap>; |
| |
| /** @brief Initialise the event loop and add the handler for incoming |
| * IPMI packets. |
| * |
| * @return EXIT_SUCCESS on success and EXIT_FAILURE on failure. |
| */ |
| int startEventLoop(); |
| |
| /** @brief Add host console I/O event source to the event loop. |
| * |
| * @param[in] fd - File descriptor for host console socket. |
| */ |
| void startHostConsole(const sol::CustomFD& fd); |
| |
| /** @brief Remove host console I/O event source. */ |
| void stopHostConsole(); |
| |
| /** @brief Initialize the timers for the SOL payload instance |
| * |
| * This API would add the Character accumulate interval timer event |
| * source and the retry interval timer event source for the SOL payload |
| * instance to the event loop. |
| * |
| * @param[in] payloadInst - SOL payload instance. |
| * @param[in] accumulateInterval - Character accumulate interval. |
| * @param[in] retryInterval - Retry interval. |
| */ |
| void startSOLPayloadInstance(uint8_t payloadInst, |
| IntervalType accumulateInterval, |
| IntervalType retryInterval); |
| |
| /** @brief Stop the timers for the SOL payload instance. |
| * |
| * This would remove the character accumulate interval timer event |
| * source and the retry interval timer event source from the event |
| * loop. |
| * |
| * @param[in] payloadInst - SOL payload instance |
| */ |
| void stopSOLPayloadInstance(uint8_t payloadInst); |
| |
| /** @brief Modify the timer event source to enable/disable. |
| * |
| * When the timer is enabled, the timer it set to fire again at |
| * timer's interval for the instance added to the event loop iteration |
| * timestamp. When the timer is disabled, the event source for the |
| * timer is disabled. |
| * |
| * @param[in] payloadInst - SOL payload instance. |
| * @param[in] type - Timer type. |
| * @param[in] status - on/off the event source. |
| */ |
| void switchTimer(uint8_t payloadInst, |
| Timers type, |
| bool status); |
| |
| /** @brief Modify the retry interval timer event source to enable/ |
| * disable |
| * |
| * When the timer is enabled, the timer it set to fire again at |
| * retry interval for the instance added to the event loop iteration |
| * timestamp. When the timer is disabled the event source for the |
| * retry interval timer is disabled. |
| * |
| * @param[in] payloadInst - SOL payload instance. |
| * @param[in] status - on/off the event source. |
| */ |
| void switchRetryTimer(uint8_t payloadInst, bool status); |
| |
| private: |
| /** @brief Event source object for host console. */ |
| EventSource hostConsole = nullptr; |
| |
| /** @brief Event source for the UDP socket listening on IPMI standard |
| * port. |
| */ |
| EventSource udpIPMI = nullptr; |
| |
| /** @brief Map to keep information regarding IPMI payload instance and |
| * timers for character accumulate interval and retry interval. |
| */ |
| PayloadMap payloadInfo; |
| |
| /** @brief Event loop object. */ |
| sd_event* event = nullptr; |
| }; |
| |
| } // namespace eventloop |