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