1 // Copyright 2015 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 6 #ifndef NET_QUIC_QUIC_CHROMIUM_PACKET_READER_H_ 7 #define NET_QUIC_QUIC_CHROMIUM_PACKET_READER_H_ 8 9 #include "base/memory/raw_ptr.h" 10 #include "base/memory/weak_ptr.h" 11 #include "net/base/io_buffer.h" 12 #include "net/base/net_export.h" 13 #include "net/log/net_log_with_source.h" 14 #include "net/socket/datagram_client_socket.h" 15 #include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h" 16 #include "net/third_party/quiche/src/quiche/quic/core/quic_time.h" 17 18 namespace quic { 19 class QuicClock; 20 } // namespace quic 21 namespace net { 22 23 // If more than this many packets have been read or more than that many 24 // milliseconds have passed, QuicChromiumPacketReader::StartReading() yields by 25 // doing a QuicChromiumPacketReader::PostTask(). 26 const int kQuicYieldAfterPacketsRead = 32; 27 const int kQuicYieldAfterDurationMilliseconds = 2; 28 29 class NET_EXPORT_PRIVATE QuicChromiumPacketReader { 30 public: 31 class NET_EXPORT_PRIVATE Visitor { 32 public: 33 virtual ~Visitor() = default; 34 // Called when the read operation failed. The visitor returns 35 // whether the reader should keep reading. 36 virtual bool OnReadError(int result, 37 const DatagramClientSocket* socket) = 0; 38 virtual bool OnPacket(const quic::QuicReceivedPacket& packet, 39 const quic::QuicSocketAddress& local_address, 40 const quic::QuicSocketAddress& peer_address) = 0; 41 }; 42 43 QuicChromiumPacketReader(std::unique_ptr<DatagramClientSocket> socket, 44 const quic::QuicClock* clock, 45 Visitor* visitor, 46 int yield_after_packets, 47 quic::QuicTime::Delta yield_after_duration, 48 const NetLogWithSource& net_log); 49 50 QuicChromiumPacketReader(const QuicChromiumPacketReader&) = delete; 51 QuicChromiumPacketReader& operator=(const QuicChromiumPacketReader&) = delete; 52 53 virtual ~QuicChromiumPacketReader(); 54 55 // Causes the QuicConnectionHelper to start reading from the socket 56 // and passing the data along to the quic::QuicConnection. 57 void StartReading(); 58 socket()59 DatagramClientSocket* socket() { return socket_.get(); } 60 61 void CloseSocket(); 62 63 private: 64 // A completion callback invoked when a read completes. 65 void OnReadComplete(int result); 66 // Return true if reading should continue. 67 bool ProcessReadResult(int result); 68 69 std::unique_ptr<DatagramClientSocket> socket_; 70 71 raw_ptr<Visitor> visitor_; 72 bool read_pending_ = false; 73 int num_packets_read_ = 0; 74 raw_ptr<const quic::QuicClock> clock_; // Not owned. 75 int yield_after_packets_; 76 quic::QuicTime::Delta yield_after_duration_; 77 quic::QuicTime yield_after_; 78 scoped_refptr<IOBufferWithSize> read_buffer_; 79 NetLogWithSource net_log_; 80 // Stores whether receiving ECN is in the feature list to avoid accessing 81 // the feature list for every packet. 82 bool report_ecn_; 83 84 base::WeakPtrFactory<QuicChromiumPacketReader> weak_factory_{this}; 85 }; 86 87 } // namespace net 88 89 #endif // NET_QUIC_QUIC_CHROMIUM_PACKET_READER_H_ 90