|  | #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 | 
|  | * | 
|  | * @return true on success and failure if session ID is invalid | 
|  | * | 
|  | */ | 
|  | bool 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 |