// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef QUICHE_QUIC_CORE_QUIC_PACKET_WRITER_H_ #define QUICHE_QUIC_CORE_QUIC_PACKET_WRITER_H_ #include <cstddef> #include <optional> #include <utility> #include "quiche/quic/core/quic_packets.h" #include "quiche/quic/platform/api/quic_export.h" #include "quiche/quic/platform/api/quic_ip_address.h" #include "quiche/quic/platform/api/quic_socket_address.h" namespace quic { struct WriteResult; // This class allows a platform to pass instructions to an associated child of // QuicWriter without intervening QUIC code understanding anything about its // contents. class QUICHE_EXPORT PerPacketOptions { … }; // The owner of QuicPacketWriter can pass control information via this struct. struct QUICHE_EXPORT QuicPacketWriterParams { … }; // An interface between writers and the entity managing the // socket (in our case the QuicDispatcher). This allows the Dispatcher to // control writes, and manage any writers who end up write blocked. // A concrete writer works in one of the two modes: // - PassThrough mode. This is the default mode. Caller calls WritePacket with // caller-allocated packet buffer. Unless the writer is blocked, each call to // WritePacket triggers a write using the underlying socket API. // // - Batch mode. In this mode, a call to WritePacket may not cause a packet to // be sent using the underlying socket API. Instead, multiple packets are // saved in the writer's internal buffer until they are flushed. The flush can // be explicit, by calling Flush, or implicit, e.g. by calling // WritePacket when the internal buffer is near full. // // Buffer management: // In Batch mode, a writer manages an internal buffer, which is large enough to // hold multiple packets' data. If the caller calls WritePacket with a // caller-allocated packet buffer, the writer will memcpy the buffer into the // internal buffer. Caller can also avoid this memcpy by: // 1. Call GetNextWriteLocation to get a pointer P into the internal buffer. // 2. Serialize the packet directly to P. // 3. Call WritePacket with P as the |buffer|. class QUICHE_EXPORT QuicPacketWriter { … }; } // namespace quic #endif // QUICHE_QUIC_CORE_QUIC_PACKET_WRITER_H_