diff options
author | Tom Joseph <tomjoseph@in.ibm.com> | 2017-02-09 19:49:38 +0530 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2017-04-24 11:01:43 +0000 |
commit | 807c7e89b73fd54fd4d245048535232018122212 (patch) | |
tree | 6d027f70e4675762be30844f04f6c8703874a3f4 | |
parent | 2be58bcb343487151c082e7193e5d09887acc318 (diff) | |
download | phosphor-net-ipmid-807c7e89b73fd54fd4d245048535232018122212.tar.gz phosphor-net-ipmid-807c7e89b73fd54fd4d245048535232018122212.zip |
Interfaces for the sd_event_loop adaptation
The sd_event_loop is adapted for handling the udp socket for IPMI
network traffic, host console unix socket, character accumulate
interval timer & retry interval timer for the SOL payload.
Change-Id: I6ccec70821c01ae6db0bf04049a61e7854a798ec
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | sd_event_loop.hpp | 147 |
2 files changed, 149 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am index 7480d0c..da9d488 100644 --- a/Makefile.am +++ b/Makefile.am @@ -40,7 +40,8 @@ netipmid_SOURCES = \ provider_registration.cpp \ crypt_algo.hpp \ crypt_algo.cpp \ - sol/console_buffer.hpp + sol/console_buffer.hpp \ + sd_event_loop.hpp netipmid_CPPFLAGS = -DNET_IPMID_LIB_PATH=\"/usr/lib/net-ipmid/\" netipmid_LDFLAGS = $(SYSTEMD_LIBS) $(CRYPTO_LIBS) $(libmapper_LIBS) $(LIBADD_DLOPEN) -export-dynamic diff --git a/sd_event_loop.hpp b/sd_event_loop.hpp new file mode 100644 index 0000000..0a3a2f1 --- /dev/null +++ b/sd_event_loop.hpp @@ -0,0 +1,147 @@ +#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 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 |