diff options
Diffstat (limited to 'apphandler.cpp')
-rw-r--r-- | apphandler.cpp | 37 |
1 files changed, 31 insertions, 6 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) { |