xref: /aosp_15_r20/external/cronet/net/quic/quic_chromium_packet_reader.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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