blob: 251ca96a7e8d2e2ff99cbe4e301b16d45ea74da2 [file] [log] [blame]
Tom Joseph3e61aa02016-08-08 08:42:39 -05001#pragma once
2
Vernon Mauery9e801a22018-10-12 13:20:49 -07003#include "session.hpp"
4
Tom Joseph3e61aa02016-08-08 08:42:39 -05005#include <map>
6#include <memory>
7#include <mutex>
8
Tom Joseph3e61aa02016-08-08 08:42:39 -05009namespace session
10{
11
12enum class RetrieveOption
13{
14 BMC_SESSION_ID,
15 RC_SESSION_ID,
16};
17
18constexpr size_t SESSION_ZERO = 0;
19constexpr size_t MAX_SESSIONLESS_COUNT = 1;
20constexpr size_t MAX_SESSION_COUNT = 5;
21
Tom Joseph3563f8f2017-05-08 15:42:54 +053022/**
Tom Joseph3e61aa02016-08-08 08:42:39 -050023 * @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
30class Manager
31{
Vernon Mauery9e801a22018-10-12 13:20:49 -070032 public:
33 // BMC Session ID is the key for the map
34 using SessionMap = std::map<SessionID, std::shared_ptr<Session>>;
Tom Joseph3e61aa02016-08-08 08:42:39 -050035
Vernon Mauery9e801a22018-10-12 13:20:49 -070036 Manager();
37 ~Manager() = default;
38 Manager(const Manager&) = delete;
39 Manager& operator=(const Manager&) = delete;
40 Manager(Manager&&) = default;
41 Manager& operator=(Manager&&) = default;
Tom Joseph3e61aa02016-08-08 08:42:39 -050042
Vernon Mauery9e801a22018-10-12 13:20:49 -070043 /**
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 */
Vernon Maueryae1fda42018-10-15 12:55:34 -070056 std::shared_ptr<Session>
57 startSession(SessionID remoteConsoleSessID, Privilege priv,
58 cipher::rakp_auth::Algorithms authAlgo,
59 cipher::integrity::Algorithms intAlgo,
60 cipher::crypt::Algorithms cryptAlgo);
Tom Joseph3e61aa02016-08-08 08:42:39 -050061
Vernon Mauery9e801a22018-10-12 13:20:49 -070062 /**
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);
Tom Joseph3e61aa02016-08-08 08:42:39 -050071
Vernon Mauery9e801a22018-10-12 13:20:49 -070072 /**
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 */
Vernon Maueryae1fda42018-10-15 12:55:34 -070082 std::shared_ptr<Session>
Vernon Mauery9e801a22018-10-12 13:20:49 -070083 getSession(SessionID sessionID,
84 RetrieveOption option = RetrieveOption::BMC_SESSION_ID);
Tom Joseph3e61aa02016-08-08 08:42:39 -050085
Vernon Mauery9e801a22018-10-12 13:20:49 -070086 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;
Tom Joseph3e61aa02016-08-08 08:42:39 -050092
Vernon Mauery9e801a22018-10-12 13:20:49 -070093 /**
94 * @brief Clean Session Stale Entries
95 *
96 * Removes the inactive sessions entries from the Session Map
97 */
98 void cleanStaleEntries();
Tom Joseph3e61aa02016-08-08 08:42:39 -050099};
100
101} // namespace session