Sessions Manager to manage IPMI sessions

IPMI Sessions manager is responsible for managing IPMI sessions and
routines for starting and stopping sessions.

Change-Id: Ic5c559fdc0dab0145e463689026c2f1c66f24a59
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/sessions_manager.hpp b/sessions_manager.hpp
new file mode 100644
index 0000000..71bb7e4
--- /dev/null
+++ b/sessions_manager.hpp
@@ -0,0 +1,96 @@
+#pragma once
+
+#include <map>
+#include <memory>
+#include <mutex>
+
+#include "session.hpp"
+
+namespace session
+{
+
+enum class RetrieveOption
+{
+    BMC_SESSION_ID,
+    RC_SESSION_ID,
+};
+
+constexpr size_t SESSION_ZERO = 0;
+constexpr size_t MAX_SESSIONLESS_COUNT = 1;
+constexpr size_t MAX_SESSION_COUNT = 5;
+
+/*
+ * @class Manager
+ *
+ * Manager class acts a manager for the IPMI sessions and provides interfaces
+ * to start a session, stop a session and get reference to the session objects.
+ *
+ */
+
+class Manager
+{
+    public:
+
+        // BMC Session ID is the key for the map
+        using SessionMap = std::map<SessionID, std::shared_ptr<Session>>;
+
+        Manager();
+        ~Manager() = default;
+        Manager(const Manager&) = delete;
+        Manager& operator=(const Manager&) = delete;
+        Manager(Manager&&) = default;
+        Manager& operator=(Manager&&) = default;
+
+        /*
+         * @brief Start an IPMI session
+         *
+         * @param[in] remoteConsoleSessID - Remote Console Session ID mentioned
+         *            in the Open SessionRequest Command
+         * @param[in] priv - Privilege level requested
+         * @param[in] authAlgo - Authentication Algorithm
+         *
+         * @return session handle on success and nullptr on failure
+         *
+         */
+        std::weak_ptr<Session> startSession(SessionID remoteConsoleSessID,
+                Privilege priv, cipher::rakp_auth::Algorithms authAlgo);
+
+        /*
+         * @brief Stop IPMI Session
+         *
+         * @param[in] bmcSessionID - BMC Session ID
+         *
+         */
+        void stopSession(SessionID bmcSessionID);
+
+        /*
+         * @brief Get Session Handle
+         *
+         * @param[in] sessionID - Session ID
+         * @param[in] option - Select between BMC Session ID and Remote Console
+         *            Session ID, Default option is BMC Session ID
+         *
+         * @return session handle on success and nullptr on failure
+         *
+         */
+        std::weak_ptr<Session> getSession(
+               SessionID sessionID,
+               RetrieveOption option = RetrieveOption::BMC_SESSION_ID);
+
+    private:
+
+        /*
+         * @brief Session Manager keeps the session objects as a sorted
+         *        associative container with Session ID as the unique key
+         */
+        SessionMap sessionsMap;
+
+        /*
+         * @brief Clean Session Stale Entries
+         *
+         *  Removes the inactive sessions entries from the Session Map
+         */
+        void cleanStaleEntries();
+};
+
+} // namespace session