| Index: net/quic/quic_connection.h
|
| diff --git a/net/quic/quic_connection.h b/net/quic/quic_connection.h
|
| index c37d9ad57c21cee03fd6977120a0237d6e188bc3..2aac2409b8a2b294581b6d995ca7647e08b1f9c6 100644
|
| --- a/net/quic/quic_connection.h
|
| +++ b/net/quic/quic_connection.h
|
| @@ -431,15 +431,6 @@ class NET_EXPORT_PRIVATE QuicConnection
|
| // Make sure an ack we got from our peer is sane.
|
| bool ValidateAckFrame(const QuicAckFrame& incoming_ack);
|
|
|
| - // These two are called by OnAckFrame to update the appropriate internal
|
| - // state.
|
| - //
|
| - // Updates internal state based on incoming_ack.received_info
|
| - void UpdatePacketInformationReceivedByPeer(
|
| - const QuicAckFrame& incoming_ack);
|
| - // Updates internal state based in incoming_ack.sent_info
|
| - void UpdatePacketInformationSentByPeer(const QuicAckFrame& incoming_ack);
|
| -
|
| QuicConnectionHelperInterface* helper() { return helper_.get(); }
|
|
|
| protected:
|
| @@ -470,21 +461,32 @@ class NET_EXPORT_PRIVATE QuicConnection
|
| struct RetransmissionInfo {
|
| explicit RetransmissionInfo(QuicPacketSequenceNumber sequence_number)
|
| : sequence_number(sequence_number),
|
| - scheduled_time(QuicTime::Zero()),
|
| number_nacks(0),
|
| number_retransmissions(0) {
|
| }
|
|
|
| QuicPacketSequenceNumber sequence_number;
|
| - QuicTime scheduled_time;
|
| size_t number_nacks;
|
| size_t number_retransmissions;
|
| };
|
|
|
| - class RetransmissionInfoComparator {
|
| + struct RetransmissionTime {
|
| + RetransmissionTime(QuicPacketSequenceNumber sequence_number,
|
| + const QuicTime& scheduled_time,
|
| + bool for_fec)
|
| + : sequence_number(sequence_number),
|
| + scheduled_time(scheduled_time),
|
| + for_fec(for_fec) { }
|
| +
|
| + QuicPacketSequenceNumber sequence_number;
|
| + QuicTime scheduled_time;
|
| + bool for_fec;
|
| + };
|
| +
|
| + class RetransmissionTimeComparator {
|
| public:
|
| - bool operator()(const RetransmissionInfo& lhs,
|
| - const RetransmissionInfo& rhs) const {
|
| + bool operator()(const RetransmissionTime& lhs,
|
| + const RetransmissionTime& rhs) const {
|
| DCHECK(lhs.scheduled_time.IsInitialized() &&
|
| rhs.scheduled_time.IsInitialized());
|
| return lhs.scheduled_time > rhs.scheduled_time;
|
| @@ -497,9 +499,9 @@ class NET_EXPORT_PRIVATE QuicConnection
|
| typedef std::map<QuicFecGroupNumber, QuicFecGroup*> FecGroupMap;
|
| typedef base::hash_map<QuicPacketSequenceNumber,
|
| RetransmissionInfo> RetransmissionMap;
|
| - typedef std::priority_queue<RetransmissionInfo,
|
| - std::vector<RetransmissionInfo>,
|
| - RetransmissionInfoComparator>
|
| + typedef std::priority_queue<RetransmissionTime,
|
| + std::vector<RetransmissionTime>,
|
| + RetransmissionTimeComparator>
|
| RetransmissionTimeouts;
|
|
|
| // Selects and updates the version of the protocol being used by selecting a
|
| @@ -509,9 +511,11 @@ class NET_EXPORT_PRIVATE QuicConnection
|
| // Sends a version negotiation packet to the peer.
|
| void SendVersionNegotiationPacket();
|
|
|
| - void MaybeSetupRetransmission(QuicPacketSequenceNumber sequence_number);
|
| + void SetupRetransmission(QuicPacketSequenceNumber sequence_number);
|
| bool IsRetransmission(QuicPacketSequenceNumber sequence_number);
|
|
|
| + void SetupAbandonFecTimer(QuicPacketSequenceNumber sequence_number);
|
| +
|
| // Drop packet corresponding to |sequence_number| by deleting entries from
|
| // |unacked_packets_| and |retransmission_map_|, if present. We need to drop
|
| // all packets with encryption level NONE after the default level has been set
|
| @@ -526,10 +530,25 @@ class NET_EXPORT_PRIVATE QuicConnection
|
| // revive and process the packet.
|
| void MaybeProcessRevivedPacket();
|
|
|
| + void HandleAckForSentPackets(const QuicAckFrame& incoming_ack,
|
| + SequenceNumberSet* acked_packets);
|
| + void HandleAckForSentFecPackets(const QuicAckFrame& incoming_ack,
|
| + SequenceNumberSet* acked_packets);
|
| +
|
| + // These two are called by OnAckFrame.
|
| + //
|
| + // Updates internal state based on incoming_ack.received_info
|
| + void UpdatePacketInformationReceivedByPeer(
|
| + const QuicAckFrame& incoming_ack);
|
| + // Updates internal state based on incoming_ack.sent_info
|
| + void UpdatePacketInformationSentByPeer(const QuicAckFrame& incoming_ack);
|
| +
|
| void UpdateOutgoingAck();
|
|
|
| void MaybeSendAckInResponseToPacket();
|
|
|
| + void MaybeAbandonFecPacket(QuicPacketSequenceNumber sequence_number);
|
| +
|
| // Get the FEC group associate with the last processed packet or NULL, if the
|
| // group has already been deleted.
|
| QuicFecGroup* GetFecGroup();
|
| @@ -572,6 +591,12 @@ class NET_EXPORT_PRIVATE QuicConnection
|
| // to this map, which contains owning pointers to the contained frames.
|
| UnackedPacketMap unacked_packets_;
|
|
|
| + // Pending fec packets that have not been acked yet. These packets need to be
|
| + // cleared out of the cgst_window after a timeout since FEC packets are never
|
| + // retransmitted.
|
| + // Ask: What should be the timeout for these packets?
|
| + UnackedPacketMap unacked_fec_packets_;
|
| +
|
| // Heap of packets that we might need to retransmit, and the time at
|
| // which we should retransmit them. Every time a packet is sent it is added
|
| // to this heap which is O(log(number of pending packets to be retransmitted))
|
|
|