/* * SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & * AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace mctp { class Requester { public: Requester() = delete; Requester(const Requester&) = delete; Requester(Requester&&) = delete; Requester& operator=(const Requester&) = delete; Requester& operator=(Requester&&) = delete; explicit Requester(boost::asio::io_context& ctx); void sendRecvMsg(uint8_t eid, std::span reqMsg, std::span respMsg, std::move_only_function callback); private: void processRecvMsg(std::span reqMsg, std::span respMsg, const boost::system::error_code& ec, size_t length); void handleSendMsgCompletion(uint8_t eid, std::span reqMsg, std::span respMsg, const boost::system::error_code& ec, size_t length); boost::asio::generic::datagram_protocol::socket mctpSocket; static constexpr size_t maxMessageSize = 65536 + 256; boost::asio::generic::datagram_protocol::endpoint sendEndPoint; boost::asio::generic::datagram_protocol::endpoint recvEndPoint; boost::asio::steady_timer expiryTimer; std::unordered_map> completionCallbacks; static constexpr uint8_t msgType = ocp::accelerator_management::messageType; }; class QueuingRequester { public: QueuingRequester() = delete; QueuingRequester(const QueuingRequester&) = delete; QueuingRequester(QueuingRequester&&) = delete; QueuingRequester& operator=(const QueuingRequester&) = delete; QueuingRequester& operator=(QueuingRequester&&) = delete; explicit QueuingRequester(boost::asio::io_context& ctx) : requester(ctx) {} void sendRecvMsg(uint8_t eid, std::span reqMsg, std::span respMsg, std::move_only_function callback); private: struct RequestContext { std::span reqMsg; std::span respMsg; std::move_only_function callback; RequestContext(const RequestContext&) = delete; RequestContext& operator=(const RequestContext&) = delete; RequestContext(RequestContext&&) = default; RequestContext& operator=(RequestContext&&) = default; ~RequestContext() = default; explicit RequestContext(std::span req, std::span resp, std::move_only_function&& cb) : reqMsg(req), respMsg(resp), callback(std::move(cb)) {} }; void handleResult(uint8_t eid, int result); void processQueue(uint8_t eid); Requester requester; std::unordered_map< uint8_t, boost::container::devector>> requestContextQueues; }; using MctpRequester = QueuingRequester; } // namespace mctp