/* * SPDX-FileCopyrightText: Copyright OpenBMC Authors * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mctp { class MctpRequester { public: MctpRequester() = delete; MctpRequester(const MctpRequester&) = delete; MctpRequester(MctpRequester&&) = delete; MctpRequester& operator=(const MctpRequester&) = delete; MctpRequester& operator=(MctpRequester&&) = delete; explicit MctpRequester(boost::asio::io_context& ctx); void sendRecvMsg(uint8_t eid, std::span reqMsg, std::move_only_function)> callback); private: using cb_t = std::move_only_function)>; static constexpr uint8_t msgType = ocp::accelerator_management::messageType; struct RequestContext { std::vector reqMsg; cb_t callback; RequestContext(const RequestContext&) = delete; RequestContext& operator=(const RequestContext&) = delete; RequestContext(RequestContext&&) = default; RequestContext& operator=(RequestContext&&) = default; ~RequestContext() = default; explicit RequestContext(std::span req, cb_t&& cb) : reqMsg(req.begin(), req.end()), callback(std::move(cb)) {} }; struct EidContext { boost::asio::steady_timer timer; uint8_t iid{}; boost::container::devector queue; EidContext(boost::asio::io_context& io) : timer{io}, iid{0xFF} {} EidContext(EidContext&&) noexcept = default; EidContext& operator=(EidContext&&) noexcept = default; EidContext& operator=(const EidContext&) = delete; EidContext(const EidContext&) = delete; ~EidContext() = default; }; std::optional getNextIid(uint8_t eid); void startReceive(); void processRecvMsg(const boost::system::error_code& ec, size_t length); void handleSendMsgCompletion(uint8_t eid, const boost::system::error_code& ec, size_t length); void handleResult(uint8_t eid, const std::error_code& ec, std::span buffer); void processQueue(uint8_t eid); boost::asio::io_context& io; boost::asio::generic::datagram_protocol::socket mctpSocket; static constexpr size_t maxMessageSize = 65536 + 256; std::array buffer{}; MctpAsioEndpoint recvEndPoint; std::unordered_map requestContextQueues; }; } // namespace mctp