diff options
-rw-r--r-- | apphandler.cpp | 37 | ||||
-rw-r--r-- | include/ipmid/message.hpp | 9 | ||||
-rw-r--r-- | include/ipmid/sessiondef.hpp | 1 | ||||
-rw-r--r-- | ipmid-new.cpp | 15 |
4 files changed, 48 insertions, 14 deletions
diff --git a/apphandler.cpp b/apphandler.cpp index 8f11a8c..43cddd7 100644 --- a/apphandler.cpp +++ b/apphandler.cpp @@ -974,6 +974,7 @@ uint8_t getTotalSessionCount() * This function validates the request data and retrive request session id, * session handle. * + * @param[in] ctx - context of current session. * @param[in] sessionIndex - request session index * @param[in] payload - input payload * @param[in] reqSessionId - unpacked session Id will be asigned @@ -982,20 +983,43 @@ uint8_t getTotalSessionCount() * @return success completion code if request data is valid * else return the correcponding error completion code. **/ -uint8_t getSessionInfoRequestData(const uint8_t sessionIndex, +uint8_t getSessionInfoRequestData(const ipmi::Context::ptr ctx, + const uint8_t sessionIndex, ipmi::message::Payload& payload, uint32_t& reqSessionId, uint8_t& reqSessionHandle) { - if (sessionIndex == session::sessionZero || - ((sessionIndex > session::maxSessionCountPerChannel) && - (sessionIndex < session::searchSessionByHandle))) + if ((sessionIndex > session::maxSessionCountPerChannel) && + (sessionIndex < session::searchSessionByHandle)) { return ipmi::ccInvalidFieldRequest; } switch (sessionIndex) { + case session::searchCurrentSession: + + ipmi::ChannelInfo chInfo; + ipmi::getChannelInfo(ctx->channel, chInfo); + + if (static_cast<ipmi::EChannelMediumType>(chInfo.mediumType) != + ipmi::EChannelMediumType::lan8032) + { + return ipmi::ccInvalidFieldRequest; + } + + if (!payload.fullyUnpacked()) + { + return ipmi::ccReqDataLenInvalid; + } + // Check if current sessionId is 0, sessionId 0 is reserved. + if (ctx->sessionId == session::sessionZero) + { + return session::ccInvalidSessionId; + } + reqSessionId = ctx->sessionId; + break; + case session::searchSessionByHandle: if ((payload.unpack(reqSessionHandle)) || @@ -1120,7 +1144,8 @@ ipmi::RspType< std::array<uint8_t, macAddrLen>, // mac address uint16_t // remote port >>> - ipmiAppGetSessionInfo(uint8_t sessionIndex, ipmi::message::Payload& payload) + ipmiAppGetSessionInfo(ipmi::Context::ptr ctx, uint8_t sessionIndex, + ipmi::message::Payload& payload) { uint32_t reqSessionId = 0; uint8_t reqSessionHandle = session::defaultSessionHandle; @@ -1128,7 +1153,7 @@ ipmi::RspType< uint8_t state = 0xFF; uint8_t completionCode = getSessionInfoRequestData( - sessionIndex, payload, reqSessionId, reqSessionHandle); + ctx, sessionIndex, payload, reqSessionId, reqSessionHandle); if (completionCode) { diff --git a/include/ipmid/message.hpp b/include/ipmid/message.hpp index 0dc7ca8..c828e3c 100644 --- a/include/ipmid/message.hpp +++ b/include/ipmid/message.hpp @@ -42,11 +42,11 @@ struct Context Context& operator=(Context&&) = delete; Context(std::shared_ptr<sdbusplus::asio::connection> bus, NetFn netFn, - Cmd cmd, int channel, int userId, Privilege priv, int rqSA, - boost::asio::yield_context& yield) : + Cmd cmd, int channel, int userId, uint32_t sessionId, + Privilege priv, int rqSA, boost::asio::yield_context& yield) : bus(bus), - netFn(netFn), cmd(cmd), channel(channel), userId(userId), priv(priv), - rqSA(rqSA), yield(yield) + netFn(netFn), cmd(cmd), channel(channel), userId(userId), + sessionId(sessionId), priv(priv), rqSA(rqSA), yield(yield) { } @@ -56,6 +56,7 @@ struct Context Cmd cmd; int channel; int userId; + uint32_t sessionId; Privilege priv; // srcAddr is only set on IPMB requests because // Platform Event Message needs it to determine the incoming format diff --git a/include/ipmid/sessiondef.hpp b/include/ipmid/sessiondef.hpp index 7802fb9..ac63f8f 100644 --- a/include/ipmid/sessiondef.hpp +++ b/include/ipmid/sessiondef.hpp @@ -32,6 +32,7 @@ static constexpr uint8_t defaultSessionHandle = 0xFF; static constexpr uint8_t maxNetworkInstanceSupported = 4; static constexpr uint8_t ccInvalidSessionId = 0x87; static constexpr uint8_t ccInvalidSessionHandle = 0x88; +static constexpr uint8_t searchCurrentSession = 0; static constexpr uint8_t searchSessionByHandle = 0xFE; static constexpr uint8_t searchSessionById = 0xFF; // MSB BIT 7 BIT 6 assigned for netipmid instance in session handle. diff --git a/ipmid-new.cpp b/ipmid-new.cpp index f210c5d..03b6b8a 100644 --- a/ipmid-new.cpp +++ b/ipmid-new.cpp @@ -477,6 +477,7 @@ auto executionEntry(boost::asio::yield_context yield, Privilege privilege = Privilege::None; int rqSA = 0; uint8_t userId = 0; // undefined user + uint32_t sessionId = 0; // figure out what channel the request came in on uint8_t channel = channelFromMessage(m); @@ -489,15 +490,19 @@ auto executionEntry(boost::asio::yield_context yield, return dbusResponse(ipmi::ccDestinationUnavailable); } - // session-based channels are required to provide userId/privilege + // session-based channels are required to provide userId, privilege and + // sessionId if (getChannelSessionSupport(channel) != EChannelSessSupported::none) { try { Value requestPriv = options.at("privilege"); Value requestUserId = options.at("userId"); + Value requestSessionId = options.at("currentSessionId"); privilege = static_cast<Privilege>(std::get<int>(requestPriv)); userId = static_cast<uint8_t>(std::get<int>(requestUserId)); + sessionId = + static_cast<uint32_t>(std::get<uint32_t>(requestSessionId)); } catch (const std::exception& e) { @@ -533,11 +538,13 @@ auto executionEntry(boost::asio::yield_context yield, log<level::DEBUG>("Set up ipmi context", entry("SENDER=%s", sender.c_str()), entry("NETFN=0x%X", netFn), entry("CMD=0x%X", cmd), entry("CHANNEL=%u", channel), entry("USERID=%u", userId), + entry("SESSIONID=0x%X", sessionId), entry("PRIVILEGE=%u", static_cast<uint8_t>(privilege)), entry("RQSA=%x", rqSA)); - auto ctx = std::make_shared<ipmi::Context>(getSdBus(), netFn, cmd, channel, - userId, privilege, rqSA, yield); + auto ctx = + std::make_shared<ipmi::Context>(getSdBus(), netFn, cmd, channel, userId, + sessionId, privilege, rqSA, yield); auto request = std::make_shared<ipmi::message::Request>( ctx, std::forward<std::vector<uint8_t>>(data)); message::Response::ptr response = executeIpmiCommand(request); @@ -750,7 +757,7 @@ void handleLegacyIpmiCommand(sdbusplus::message::message& m) m.read(seq, netFn, lun, cmd, data); std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus(); auto ctx = std::make_shared<ipmi::Context>( - bus, netFn, cmd, 0, 0, ipmi::Privilege::Admin, 0, yield); + bus, netFn, cmd, 0, 0, 0, ipmi::Privilege::Admin, 0, yield); auto request = std::make_shared<ipmi::message::Request>( ctx, std::forward<std::vector<uint8_t>>(data)); ipmi::message::Response::ptr response = |