summaryrefslogtreecommitdiffstats
path: root/include/ipmid/handler.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/ipmid/handler.hpp')
-rw-r--r--include/ipmid/handler.hpp93
1 files changed, 49 insertions, 44 deletions
diff --git a/include/ipmid/handler.hpp b/include/ipmid/handler.hpp
index 1421c3d..b6c6c0f 100644
--- a/include/ipmid/handler.hpp
+++ b/include/ipmid/handler.hpp
@@ -153,6 +153,7 @@ class IpmiHandler final : public HandlerBase
using ResultType = boost::callable_traits::return_type_t<Handler>;
UnpackArgsType unpackArgs;
+ request->payload.trailingOk = false;
ipmi::Cc unpackError = request->unpack(unpackArgs);
if (unpackError != ipmi::ccSuccess)
{
@@ -178,45 +179,47 @@ class IpmiHandler final : public HandlerBase
* parameter selector. All the remaining data can be extracted using
* the Payload class and the unpack API available to the Payload class.
*/
- std::optional<InputArgsType> inputArgs;
- if constexpr (std::tuple_size<InputArgsType>::value > 0)
+ ResultType result;
+ try
{
- if constexpr (std::is_same<std::tuple_element_t<0, InputArgsType>,
- boost::asio::yield_context>::value)
- {
- inputArgs.emplace(std::tuple_cat(
- std::forward_as_tuple(*(request->ctx->yield)),
- std::move(unpackArgs)));
- }
- else if constexpr (std::is_same<
- std::tuple_element_t<0, InputArgsType>,
- ipmi::Context::ptr>::value)
- {
- inputArgs.emplace(
- std::tuple_cat(std::forward_as_tuple(request->ctx),
- std::move(unpackArgs)));
- }
- else if constexpr (std::is_same<
- std::tuple_element_t<0, InputArgsType>,
- ipmi::message::Request::ptr>::value)
+ std::optional<InputArgsType> inputArgs;
+ if constexpr (std::tuple_size<InputArgsType>::value > 0)
{
- inputArgs.emplace(std::tuple_cat(std::forward_as_tuple(request),
- std::move(unpackArgs)));
+ if constexpr (std::is_same<
+ std::tuple_element_t<0, InputArgsType>,
+ boost::asio::yield_context>::value)
+ {
+ inputArgs.emplace(std::tuple_cat(
+ std::forward_as_tuple(request->ctx->yield),
+ std::move(unpackArgs)));
+ }
+ else if constexpr (std::is_same<
+ std::tuple_element_t<0, InputArgsType>,
+ ipmi::Context::ptr>::value)
+ {
+ inputArgs.emplace(
+ std::tuple_cat(std::forward_as_tuple(request->ctx),
+ std::move(unpackArgs)));
+ }
+ else if constexpr (std::is_same<
+ std::tuple_element_t<0, InputArgsType>,
+ ipmi::message::Request::ptr>::value)
+ {
+ inputArgs.emplace(std::tuple_cat(
+ std::forward_as_tuple(request), std::move(unpackArgs)));
+ }
+ else
+ {
+ // no special parameters were requested (but others were)
+ inputArgs.emplace(std::move(unpackArgs));
+ }
}
else
{
- // no special parameters were requested (but others were)
- inputArgs.emplace(std::move(unpackArgs));
+ // no parameters were requested
+ inputArgs = std::move(unpackArgs);
}
- }
- else
- {
- // no parameters were requested
- inputArgs = std::move(unpackArgs);
- }
- ResultType result;
- try
- {
+
// execute the registered callback function and get the
// ipmi::RspType<>
result = std::apply(handler_, *inputArgs);
@@ -264,6 +267,7 @@ class IpmiHandler final : public HandlerBase
};
#ifdef ALLOW_DEPRECATED_API
+static constexpr size_t maxLegacyBufferSize = 64 * 1024;
/**
* @brief Legacy IPMI handler class
*
@@ -307,17 +311,17 @@ class IpmiHandler<ipmid_callback_t> final : public HandlerBase
executeCallback(message::Request::ptr request) override
{
message::Response::ptr response = request->makeResponse();
- size_t len = request->payload.size();
// allocate a big response buffer here
- response->payload.resize(
- getChannelMaxTransferSize(request->ctx->channel));
+ response->payload.resize(maxLegacyBufferSize);
+ size_t len = request->payload.size() - request->payload.rawIndex;
Cc ccRet{ccSuccess};
try
{
- ccRet = handler_(request->ctx->netFn, request->ctx->cmd,
- request->payload.data(), response->payload.data(),
- &len, handlerCtx);
+ ccRet =
+ handler_(request->ctx->netFn, request->ctx->cmd,
+ request->payload.data() + request->payload.rawIndex,
+ response->payload.data(), &len, handlerCtx);
}
catch (const std::exception& e)
{
@@ -396,16 +400,17 @@ class IpmiHandler<oem::Handler> final : public HandlerBase
executeCallback(message::Request::ptr request) override
{
message::Response::ptr response = request->makeResponse();
- size_t len = request->payload.size();
// allocate a big response buffer here
- response->payload.resize(
- getChannelMaxTransferSize(request->ctx->channel));
+ response->payload.resize(maxLegacyBufferSize);
+ size_t len = request->payload.size() - request->payload.rawIndex;
Cc ccRet{ccSuccess};
try
{
- ccRet = handler_(request->ctx->cmd, request->payload.data(),
- response->payload.data(), &len);
+ ccRet =
+ handler_(request->ctx->cmd,
+ request->payload.data() + request->payload.rawIndex,
+ response->payload.data(), &len);
}
catch (const std::exception& e)
{
OpenPOWER on IntegriCloud