1 // Copyright 2014 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_TOOLS_QUIC_QUIC_SIMPLE_SERVER_PACKET_WRITER_H_ 6 #define NET_TOOLS_QUIC_QUIC_SIMPLE_SERVER_PACKET_WRITER_H_ 7 8 #include <stddef.h> 9 10 #include "base/functional/callback.h" 11 #include "base/memory/weak_ptr.h" 12 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection.h" 13 #include "net/third_party/quiche/src/quiche/quic/core/quic_packet_writer.h" 14 #include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h" 15 16 namespace quic { 17 class QuicDispatcher; 18 } // namespace quic 19 namespace net { 20 class UDPServerSocket; 21 } // namespace net 22 namespace quic { 23 struct WriteResult; 24 } // namespace quic 25 namespace net { 26 27 // Chrome specific packet writer which uses a UDPServerSocket for writing 28 // data. 29 class QuicSimpleServerPacketWriter : public quic::QuicPacketWriter { 30 public: 31 QuicSimpleServerPacketWriter(UDPServerSocket* socket, 32 quic::QuicDispatcher* dispatcher); 33 34 QuicSimpleServerPacketWriter(const QuicSimpleServerPacketWriter&) = delete; 35 QuicSimpleServerPacketWriter& operator=(const QuicSimpleServerPacketWriter&) = 36 delete; 37 38 ~QuicSimpleServerPacketWriter() override; 39 40 quic::WriteResult WritePacket( 41 const char* buffer, 42 size_t buf_len, 43 const quic::QuicIpAddress& self_address, 44 const quic::QuicSocketAddress& peer_address, 45 quic::PerPacketOptions* options, 46 const quic::QuicPacketWriterParams& params) override; 47 48 void OnWriteComplete(int rv); 49 50 // quic::QuicPacketWriter implementation: 51 bool IsWriteBlocked() const override; 52 void SetWritable() override; 53 std::optional<int> MessageTooBigErrorCode() const override; 54 quic::QuicByteCount GetMaxPacketSize( 55 const quic::QuicSocketAddress& peer_address) const override; 56 bool SupportsReleaseTime() const override; 57 bool IsBatchMode() const override; 58 bool SupportsEcn() const override; 59 quic::QuicPacketBuffer GetNextWriteLocation( 60 const quic::QuicIpAddress& self_address, 61 const quic::QuicSocketAddress& peer_address) override; 62 quic::WriteResult Flush() override; 63 64 private: 65 UDPServerSocket* socket_; 66 67 // To be notified after every successful asynchronous write. 68 quic::QuicDispatcher* dispatcher_; 69 70 // Whether a write is currently in flight. 71 bool write_blocked_ = false; 72 73 base::WeakPtrFactory<QuicSimpleServerPacketWriter> weak_factory_{this}; 74 }; 75 76 } // namespace net 77 78 #endif // NET_TOOLS_QUIC_QUIC_SIMPLE_SERVER_PACKET_WRITER_H_ 79