| /* |
| // Copyright (c) 2018 Intel Corporation |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| */ |
| #pragma once |
| #include <openssl/crypto.h> |
| |
| #include <ipmid/api.hpp> |
| |
| #include <array> |
| #include <string> |
| |
| namespace ipmi |
| { |
| |
| static constexpr uint8_t maxIpmiChannels = 16; |
| static constexpr uint8_t currentChNum = 0xE; |
| static constexpr uint8_t invalidChannel = 0xff; |
| static constexpr const uint8_t ccActionNotSupportedForChannel = 0x82; |
| static constexpr const uint8_t ccAccessModeNotSupportedForChannel = 0x83; |
| |
| /** |
| * @array of privilege levels |
| */ |
| extern const std::array<std::string, PRIVILEGE_OEM + 1> privList; |
| |
| /** |
| * @enum Channel Protocol Type (refer spec sec 6.4) |
| */ |
| enum class EChannelProtocolType : uint8_t |
| { |
| na = 0x00, |
| ipmbV10 = 0x01, |
| icmbV11 = 0x02, |
| reserved = 0x03, |
| ipmiSmbus = 0x04, |
| kcs = 0x05, |
| smic = 0x06, |
| bt10 = 0x07, |
| bt15 = 0x08, |
| tMode = 0x09, |
| oem = 0x1C, |
| }; |
| |
| /** |
| * @enum Channel Medium Type (refer spec sec 6.5) |
| */ |
| enum class EChannelMediumType : uint8_t |
| { |
| reserved = 0x00, |
| ipmb = 0x01, |
| icmbV10 = 0x02, |
| icmbV09 = 0x03, |
| lan8032 = 0x04, |
| serial = 0x05, |
| otherLan = 0x06, |
| pciSmbus = 0x07, |
| smbusV11 = 0x08, |
| smbusV20 = 0x09, |
| usbV1x = 0x0A, |
| usbV2x = 0x0B, |
| systemInterface = 0x0C, |
| oem = 0x60, |
| unknown = 0x82, |
| }; |
| |
| /** |
| * @enum Channel Session Type (refer spec sec 22.24 - |
| * response data byte 5) |
| */ |
| enum class EChannelSessSupported : uint8_t |
| { |
| none = 0, |
| single = 1, |
| multi = 2, |
| any = 3, |
| }; |
| |
| /** |
| * @enum Channel Access Mode (refer spec sec 6.6) |
| */ |
| enum class EChannelAccessMode : uint8_t |
| { |
| disabled = 0, |
| preboot = 1, |
| alwaysAvail = 2, |
| shared = 3, |
| }; |
| |
| /** |
| * @enum Authentication Types (refer spec sec 13.6 - IPMI |
| * Session Header) |
| */ |
| enum class EAuthType : uint8_t |
| { |
| none = (1 << 0x0), |
| md2 = (1 << 0x1), |
| md5 = (1 << 0x2), |
| reserved = (1 << 0x3), |
| straightPasswd = (1 << 0x4), |
| oem = (1 << 0x5), |
| }; |
| |
| // TODO: Remove duplicate 'PayloadType' definition from netipmid's message.hpp |
| // to phosphor-ipmi-host/include |
| /** |
| * @enum Payload Types (refer spec sec 13.27.3) |
| */ |
| enum class PayloadType : uint8_t |
| { |
| IPMI = 0x00, |
| SOL = 0x01, |
| OPEN_SESSION_REQUEST = 0x10, |
| OPEN_SESSION_RESPONSE = 0x11, |
| RAKP1 = 0x12, |
| RAKP2 = 0x13, |
| RAKP3 = 0x14, |
| RAKP4 = 0x15, |
| INVALID = 0xFF, |
| }; |
| |
| /** |
| * @enum Access mode for channel access set/get (refer spec |
| * sec 22.22 - request byte 2[7:6]) |
| */ |
| typedef enum |
| { |
| doNotSet = 0x00, |
| nvData = 0x01, |
| activeData = 0x02, |
| reserved = 0x03, |
| } EChannelActionType; |
| |
| /** |
| * @enum Access set flag to determine changes that has to be updated |
| * in channel access data configuration. |
| */ |
| enum AccessSetFlag |
| { |
| setAccessMode = (1 << 0), |
| setUserAuthEnabled = (1 << 1), |
| setMsgAuthEnabled = (1 << 2), |
| setAlertingEnabled = (1 << 3), |
| setPrivLimit = (1 << 4), |
| }; |
| |
| /** @struct ChannelAccess |
| * |
| * Structure to store channel access related information, defined in IPMI |
| * specification and used in Get / Set channel access (refer spec sec 22.22 |
| * & 22.23) |
| */ |
| struct ChannelAccess |
| { |
| uint8_t accessMode; |
| bool userAuthDisabled; |
| bool perMsgAuthDisabled; |
| bool alertingDisabled; |
| uint8_t privLimit; |
| }; |
| |
| /** @struct ChannelInfo |
| * |
| * Structure to store data about channel information, which identifies each |
| * channel type and information as defined in IPMI specification. (refer spec |
| * sec 22.22 & 22.23) |
| */ |
| struct ChannelInfo |
| { |
| uint8_t mediumType; |
| uint8_t protocolType; |
| uint8_t sessionSupported; |
| bool isIpmi; // Is session IPMI |
| // This is used in Get LAN Configuration parameter. |
| // This holds the supported AuthTypes for a given channel. |
| uint8_t authTypeSupported; |
| }; |
| |
| /** @brief determines valid channel |
| * |
| * @param[in] chNum- channel number |
| * |
| * @return true if valid, false otherwise |
| */ |
| bool isValidChannel(const uint8_t chNum); |
| |
| /** @brief determines whether channel device exist |
| * |
| * @param[in] chNum - channel number |
| * |
| * @return true if valid, false otherwise |
| */ |
| bool doesDeviceExist(const uint8_t chNum); |
| |
| /** @brief determines whether privilege limit is valid |
| * |
| * @param[in] privLimit - Privilege limit |
| * |
| * @return true if valid, false otherwise |
| */ |
| bool isValidPrivLimit(const uint8_t privLimit); |
| |
| /** @brief determines whether access mode is valid |
| * |
| * @param[in] accessMode - Access mode |
| * |
| * @return true if valid, false otherwise |
| */ |
| bool isValidAccessMode(const uint8_t accessMode); |
| |
| /** @brief determines valid authentication type based on channel number |
| * |
| * @param[in] chNum - channel number |
| * @param[in] authType - authentication type |
| * |
| * @return true if valid, false otherwise |
| */ |
| bool isValidAuthType(const uint8_t chNum, const EAuthType& authType); |
| |
| /** @brief determines supported session type of a channel |
| * |
| * @param[in] chNum - channel number |
| * |
| * @return EChannelSessSupported - supported session type |
| */ |
| EChannelSessSupported getChannelSessionSupport(const uint8_t chNum); |
| |
| /** @brief determines number of active sessions on a channel |
| * |
| * @param[in] chNum - channel number |
| * |
| * @return numer of active sessions |
| */ |
| int getChannelActiveSessions(const uint8_t chNum); |
| |
| /** @brief determines maximum transfer size for a channel |
| * |
| * @param[in] chNum - channel number |
| * |
| * @return maximum bytes that can be transferred on this channel |
| */ |
| size_t getChannelMaxTransferSize(uint8_t chNum); |
| |
| /** @brief initializes channel management |
| * |
| * @return ccSuccess for success, others for failure. |
| */ |
| Cc ipmiChannelInit(); |
| |
| /** @brief provides channel info details |
| * |
| * @param[in] chNum - channel number |
| * @param[out] chInfo - channel info details |
| * |
| * @return ccSuccess for success, others for failure. |
| */ |
| Cc getChannelInfo(const uint8_t chNum, ChannelInfo& chInfo); |
| |
| /** @brief provides channel access data |
| * |
| * @param[in] chNum - channel number |
| * @param[out] chAccessData -channel access data |
| * |
| * @return ccSuccess for success, others for failure. |
| */ |
| Cc getChannelAccessData(const uint8_t chNum, ChannelAccess& chAccessData); |
| |
| /** @brief provides function to convert current channel number (0xE) |
| * |
| * @param[in] chNum - channel number as requested in commands. |
| * @param[in] devChannel - channel number as provided by device (not 0xE) |
| * |
| * @return same channel number or proper channel number for current channel |
| * number (0xE). |
| */ |
| static inline uint8_t convertCurrentChannelNum(const uint8_t chNum, |
| const uint8_t devChannel) |
| { |
| if (chNum == currentChNum) |
| { |
| return devChannel; |
| } |
| return chNum; |
| } |
| |
| /** @brief to set channel access data |
| * |
| * @param[in] chNum - channel number |
| * @param[in] chAccessData - channel access data |
| * @param[in] setFlag - flag to indicate updatable fields |
| * |
| * @return ccSuccess for success, others for failure. |
| */ |
| Cc setChannelAccessData(const uint8_t chNum, const ChannelAccess& chAccessData, |
| const uint8_t setFlag); |
| |
| /** @brief to get channel access data persistent data |
| * |
| * @param[in] chNum - channel number |
| * @param[out] chAccessData - channel access data |
| * |
| * @return ccSuccess for success, others for failure. |
| */ |
| Cc getChannelAccessPersistData(const uint8_t chNum, |
| ChannelAccess& chAccessData); |
| |
| /** @brief to set channel access data persistent data |
| * |
| * @param[in] chNum - channel number |
| * @param[in] chAccessData - channel access data |
| * @param[in] setFlag - flag to indicate updatable fields |
| * |
| * @return ccSuccess for success, others for failure. |
| */ |
| Cc setChannelAccessPersistData(const uint8_t chNum, |
| const ChannelAccess& chAccessData, |
| const uint8_t setFlag); |
| |
| /** @brief provides supported authentication type for the channel |
| * |
| * @param[in] chNum - channel number |
| * @param[out] authTypeSupported - supported authentication type |
| * |
| * @return ccSuccess for success, others for failure. |
| */ |
| Cc getChannelAuthTypeSupported(const uint8_t chNum, uint8_t& authTypeSupported); |
| |
| /** @brief provides enabled authentication type for the channel |
| * |
| * @param[in] chNum - channel number |
| * @param[in] priv - privilege |
| * @param[out] authType - enabled authentication type |
| * |
| * @return ccSuccess for success, others for failure. |
| */ |
| Cc getChannelEnabledAuthType(const uint8_t chNum, const uint8_t priv, |
| EAuthType& authType); |
| |
| /** @brief Retrieves the LAN channel name from the IPMI channel number |
| * |
| * @param[in] chNum - IPMI channel number |
| * |
| * @return the LAN channel name (i.e. eth0) |
| */ |
| std::string getChannelName(const uint8_t chNum); |
| |
| /** @brief Retrieves the LAN channel number from the IPMI channel name |
| * |
| * @param[in] chName - IPMI channel name (i.e. eth0) |
| * |
| * @return the LAN channel number |
| */ |
| uint8_t getChannelByName(const std::string& chName); |
| |
| /** @brief determines whether payload type is valid |
| * |
| * @param[in] payload type - Payload Type |
| * |
| * @return true if valid, false otherwise |
| */ |
| bool isValidPayloadType(const PayloadType payloadType); |
| |
| } // namespace ipmi |