1 #pragma once
2 
3 #include "message_handler.hpp"
4 
5 #include <vector>
6 
7 namespace command
8 {
9 
10 constexpr uint8_t IPMI_CC_INVALID_PRIV_LEVEL = 0x80;
11 constexpr uint8_t IPMI_CC_EXCEEDS_USER_PRIV = 0x81;
12 // bits 30 & 31 (MSB) hold the instanceID, hence shifting by 30 bits
13 constexpr uint8_t myNetInstanceSessionIdShiftMask = 30;
14 // bits 6 & 7 (MSB) hold the instanceID, hence shifting by 6 bits
15 constexpr uint8_t myNetInstanceSessionHandleShiftMask = 6;
16 
17 /**
18  * @struct SetSessionPrivLevelReq
19  *
20  * IPMI Request data for Set Session Privilege Level command
21  */
22 struct SetSessionPrivLevelReq
23 {
24 
25 #if BYTE_ORDER == LITTLE_ENDIAN
26     uint8_t reqPrivLevel : 4;
27     uint8_t reserved : 4;
28 #endif
29 
30 #if BYTE_ORDER == BIG_ENDIAN
31     uint8_t reserved : 4;
32     uint8_t reqPrivLevel : 4;
33 #endif
34 
35 } __attribute__((packed));
36 
37 /**
38  * @struct SetSessionPrivLevelResp
39  *
40  * IPMI Response data for Set Session Privilege Level command
41  */
42 struct SetSessionPrivLevelResp
43 {
44     uint8_t completionCode;
45 
46 #if BYTE_ORDER == LITTLE_ENDIAN
47     uint8_t newPrivLevel : 4;
48     uint8_t reserved : 4;
49 #endif
50 
51 #if BYTE_ORDER == BIG_ENDIAN
52     uint8_t reserved : 4;
53     uint8_t newPrivLevel : 4;
54 #endif
55 
56 } __attribute__((packed));
57 
58 /**
59  * @brief Set Session Privilege Command
60  *
61  * This command is sent in authenticated format. When a session is activated,
62  * the session is set to an initial privilege level. A session that is
63  * activated at a maximum privilege level of Callback is set to an initial
64  * privilege level of Callback and cannot be changed. All other sessions are
65  * initially set to USER level, regardless of the maximum privilege level
66  * requested in the RAKP Message 1.
67  *
68  * This command cannot be used to set a privilege level higher than the lowest
69  * of the privilege level set for the user(via the Set User Access command) and
70  * the privilege limit for the channel that was set via the Set Channel Access
71  * command.
72  *
73  * @param[in] inPayload - Request Data for the command
74  * @param[in] handler - Reference to the Message Handler
75  *
76  * @return Response data for the command
77  */
78 std::vector<uint8_t>
79     setSessionPrivilegeLevel(const std::vector<uint8_t>& inPayload,
80                              std::shared_ptr<message::Handler>& handler);
81 /**
82  * @struct CloseSessionRequest
83  *
84  * IPMI Request data for Close Session command
85  */
86 struct CloseSessionRequest
87 {
88     uint32_t sessionID;
89     uint8_t sessionHandle;
90 } __attribute__((packed));
91 
92 /**
93  * @struct CloseSessionResponse
94  *
95  * IPMI Response data for Close Session command
96  */
97 struct CloseSessionResponse
98 {
99     uint8_t completionCode;
100 } __attribute__((packed));
101 
102 /**
103  * @brief Close Session Command
104  *
105  * This command is used to immediately terminate a session in progress. It is
106  * typically used to close the session that the user is communicating over,
107  * though it can be used to other terminate sessions in progress (provided that
108  * the user is operating at the appropriate privilege level, or the command is
109  * executed over a local channel - e.g. the system interface). Closing
110  * sessionless session ( session zero) is restricted in this command
111  *
112  * @param[in] inPayload - Request Data for the command
113  * @param[in] handler - Reference to the Message Handler
114  *
115  * @return Response data for the command
116  */
117 std::vector<uint8_t> closeSession(const std::vector<uint8_t>& inPayload,
118                                   std::shared_ptr<message::Handler>& handler);
119 
120 } // namespace command
121