1 #pragma once
2 
3 #include "session.hpp"
4 
5 #include <map>
6 #include <memory>
7 #include <mutex>
8 
9 namespace session
10 {
11 
12 enum class RetrieveOption
13 {
14     BMC_SESSION_ID,
15     RC_SESSION_ID,
16 };
17 
18 constexpr size_t SESSION_ZERO = 0;
19 constexpr size_t MAX_SESSIONLESS_COUNT = 1;
20 constexpr size_t MAX_SESSION_COUNT = 5;
21 
22 /**
23  * @class Manager
24  *
25  * Manager class acts a manager for the IPMI sessions and provides interfaces
26  * to start a session, stop a session and get reference to the session objects.
27  *
28  */
29 
30 class Manager
31 {
32   public:
33     // BMC Session ID is the key for the map
34     using SessionMap = std::map<SessionID, std::shared_ptr<Session>>;
35 
36     Manager();
37     ~Manager() = default;
38     Manager(const Manager&) = delete;
39     Manager& operator=(const Manager&) = delete;
40     Manager(Manager&&) = default;
41     Manager& operator=(Manager&&) = default;
42 
43     /**
44      * @brief Start an IPMI session
45      *
46      * @param[in] remoteConsoleSessID - Remote Console Session ID mentioned
47      *            in the Open SessionRequest Command
48      * @param[in] priv - Privilege level requested
49      * @param[in] authAlgo - Authentication Algorithm
50      * @param[in] intAlgo - Integrity Algorithm
51      * @param[in] cryptAlgo - Confidentiality Algorithm
52      *
53      * @return session handle on success and nullptr on failure
54      *
55      */
56     std::weak_ptr<Session> startSession(SessionID remoteConsoleSessID,
57                                         Privilege priv,
58                                         cipher::rakp_auth::Algorithms authAlgo,
59                                         cipher::integrity::Algorithms intAlgo,
60                                         cipher::crypt::Algorithms cryptAlgo);
61 
62     /**
63      * @brief Stop IPMI Session
64      *
65      * @param[in] bmcSessionID - BMC Session ID
66      *
67      * @return true on success and failure if session ID is invalid
68      *
69      */
70     bool stopSession(SessionID bmcSessionID);
71 
72     /**
73      * @brief Get Session Handle
74      *
75      * @param[in] sessionID - Session ID
76      * @param[in] option - Select between BMC Session ID and Remote Console
77      *            Session ID, Default option is BMC Session ID
78      *
79      * @return session handle on success and nullptr on failure
80      *
81      */
82     std::weak_ptr<Session>
83         getSession(SessionID sessionID,
84                    RetrieveOption option = RetrieveOption::BMC_SESSION_ID);
85 
86   private:
87     /**
88      * @brief Session Manager keeps the session objects as a sorted
89      *        associative container with Session ID as the unique key
90      */
91     SessionMap sessionsMap;
92 
93     /**
94      * @brief Clean Session Stale Entries
95      *
96      *  Removes the inactive sessions entries from the Session Map
97      */
98     void cleanStaleEntries();
99 };
100 
101 } // namespace session
102