| // Copyright 2015 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. |
| |
| // A class to read incoming QUIC packets from the UDP socket. |
| |
| #ifndef QUICHE_QUIC_CORE_QUIC_PACKET_READER_H_ |
| #define QUICHE_QUIC_CORE_QUIC_PACKET_READER_H_ |
| |
| #include "absl/base/optimization.h" |
| #include "net/third_party/quiche/src/quic/core/quic_clock.h" |
| #include "net/third_party/quiche/src/quic/core/quic_packets.h" |
| #include "net/third_party/quiche/src/quic/core/quic_process_packet_interface.h" |
| #include "net/third_party/quiche/src/quic/core/quic_udp_socket.h" |
| #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" |
| #include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h" |
| |
| namespace quic { |
| |
| // Read in larger batches to minimize recvmmsg overhead. |
| const int kNumPacketsPerReadMmsgCall = 16; |
| |
| class QUIC_EXPORT_PRIVATE QuicPacketReader { |
| public: |
| QuicPacketReader(); |
| QuicPacketReader(const QuicPacketReader&) = delete; |
| QuicPacketReader& operator=(const QuicPacketReader&) = delete; |
| |
| virtual ~QuicPacketReader(); |
| |
| // Reads a number of packets from the given fd, and then passes them off to |
| // the PacketProcessInterface. Returns true if there may be additional |
| // packets available on the socket. |
| // Populates |packets_dropped| if it is non-null and the socket is configured |
| // to track dropped packets and some packets are read. |
| // If the socket has timestamping enabled, the per packet timestamps will be |
| // passed to the processor. Otherwise, |clock| will be used. |
| virtual bool ReadAndDispatchPackets(int fd, |
| int port, |
| const QuicClock& clock, |
| ProcessPacketInterface* processor, |
| QuicPacketCount* packets_dropped); |
| |
| private: |
| // Return the self ip from |packet_info|. |
| // For dual stack sockets, |packet_info| may contain both a v4 and a v6 ip, in |
| // that case, |prefer_v6_ip| is used to determine which one is used as the |
| // return value. If neither v4 nor v6 ip exists, return an uninitialized ip. |
| static QuicIpAddress GetSelfIpFromPacketInfo( |
| const QuicUdpPacketInfo& packet_info, |
| bool prefer_v6_ip); |
| |
| struct QUIC_EXPORT_PRIVATE ReadBuffer { |
| ABSL_CACHELINE_ALIGNED char |
| control_buffer[kDefaultUdpPacketControlBufferSize]; // For ancillary |
| // data. |
| ABSL_CACHELINE_ALIGNED char packet_buffer[kMaxIncomingPacketSize]; |
| }; |
| |
| QuicUdpSocketApi socket_api_; |
| std::vector<ReadBuffer> read_buffers_; |
| QuicUdpSocketApi::ReadPacketResults read_results_; |
| }; |
| |
| } // namespace quic |
| |
| #endif // QUICHE_QUIC_CORE_QUIC_PACKET_READER_H_ |