diff options
Diffstat (limited to 'user_channel/usercommands.cpp')
-rw-r--r-- | user_channel/usercommands.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/user_channel/usercommands.cpp b/user_channel/usercommands.cpp index 76def4b..1c94182 100644 --- a/user_channel/usercommands.cpp +++ b/user_channel/usercommands.cpp @@ -430,6 +430,91 @@ ipmi_ret_t ipmiSetUserPassword(ipmi_netfn_t netfn, ipmi_cmd_t cmd, return IPMI_CC_INVALID_FIELD_REQUEST; } +/** @brief implements the get channel authentication command + * @param ctx - IPMI context pointer (for channel) + * @param extData - get IPMI 2.0 extended data + * @param reserved1 - skip 3 bits + * @param chNum - channel number to get info about + * @param reserved2 - skip 4 bits + * @param privLevel - requested privilege level + + * @returns ipmi completion code plus response data + * - channel number + * - rmcpAuthTypes - RMCP auth types (IPMI 1.5) + * - reserved1 + * - extDataSupport - true for IPMI 2.0 extensions + * - anonymousLogin - true for anonymous login enabled + * - nullUsers - true for null user names enabled + * - nonNullUsers - true for non-null usernames enabled + * - userAuth - false for user authentication enabled + * - perMessageAuth - false for per message authentication enabled + * - KGStatus - true for Kg required for authentication + * - reserved2 + * - rmcp - RMCP (IPMI 1.5) connection support + * - rmcpp - RMCP+ (IPMI 2.0) connection support + * - reserved3 + * - oemID - OEM IANA of any OEM auth support + * - oemAuxillary - OEM data for auth + */ +ipmi::RspType<uint8_t, // channel number + uint6_t, // rmcpAuthTypes + bool, // reserved1 + bool, // extDataSupport + bool, // anonymousLogin + bool, // nullUsers + bool, // nonNullUsers + bool, // userAuth + bool, // perMessageAuth + bool, // KGStatus + uint2_t, // reserved2 + bool, // rmcp + bool, // rmcpp + uint6_t, // reserved3 + uint24_t, // oemID + uint8_t // oemAuxillary + > + ipmiGetChannelAuthenticationCapabilities(ipmi::Context::ptr ctx, + uint4_t chNum, uint3_t reserved1, + bool extData, uint4_t privLevel, + uint4_t reserved2) +{ + + uint8_t channel = + convertCurrentChannelNum(static_cast<uint8_t>(chNum), ctx); + + if (reserved1 || reserved2 || !isValidChannel(channel) || + !isValidPrivLimit(static_cast<uint8_t>(privLevel)) || + (EChannelSessSupported::none == getChannelSessionSupport(channel))) + { + return ipmi::response(ccInvalidFieldRequest); + } + + constexpr bool extDataSupport = true; // true for IPMI 2.0 extensions + constexpr bool reserved3 = false; + constexpr uint6_t rmcpAuthTypes = 0; // IPMI 1.5 auth types - not supported + constexpr uint2_t reserved4 = 0; + constexpr bool KGStatus = false; // Not supporting now. + constexpr bool perMessageAuth = false; // Per message auth - enabled + constexpr bool userAuth = false; // User authentication - enabled + constexpr bool nullUsers = false; // Null user names - not supported + constexpr bool anonymousLogin = false; // Anonymous login - not supported + constexpr uint6_t reserved5 = 0; + constexpr bool rmcpp = true; // IPMI 2.0 - supported + constexpr bool rmcp = false; // IPMI 1.5 - not supported + constexpr uint24_t oemID = 0; + constexpr uint8_t oemAuxillary = 0; + + bool nonNullUsers = 0; + uint8_t maxChUsers = 0, enabledUsers = 0, fixedUsers = 0; + ipmi::ipmiUserGetAllCounts(maxChUsers, enabledUsers, fixedUsers); + nonNullUsers = enabledUsers > 0; + + return ipmi::responseSuccess( + channel, rmcpAuthTypes, reserved3, extDataSupport, anonymousLogin, + nullUsers, nonNullUsers, userAuth, perMessageAuth, KGStatus, reserved4, + rmcp, rmcpp, reserved5, oemID, oemAuxillary); +} + void registerUserIpmiFunctions() __attribute__((constructor)); void registerUserIpmiFunctions() { @@ -449,6 +534,10 @@ void registerUserIpmiFunctions() ipmi_register_callback(NETFUN_APP, IPMI_CMD_SET_USER_PASSWORD, NULL, ipmiSetUserPassword, PRIVILEGE_ADMIN); + ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnApp, + ipmi::app::cmdGetChannelAuthCapabilities, + ipmi::Privilege::Callback, + ipmiGetChannelAuthenticationCapabilities); return; } } // namespace ipmi |