158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef NET_QUIC_QUIC_ACK_NOTIFIER_H_ 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define NET_QUIC_QUIC_ACK_NOTIFIER_H_ 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/quic/quic_protocol.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace net { 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Used to register with a QuicConnection for notification once a set of packets 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// have all been ACKed. 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The connection informs this class of newly ACKed sequence numbers, and once 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// we have seen ACKs for all the sequence numbers we are interested in, we 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// trigger a call to a provided Closure. 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class NET_EXPORT_PRIVATE QuicAckNotifier { 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class NET_EXPORT_PRIVATE DelegateInterface 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public base::RefCounted<DelegateInterface> { 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DelegateInterface(); 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Args: 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // num_original_packets - Number of packets in the original transmission. 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // num_original_bytes - Number of packets in the original transmission. 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // num_retransmitted_packets - Number of packets that had to be 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // retransmitted. 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // num_retransmitted_bytes - Number of bytes that had to be retransmitted. 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnAckNotification(int num_original_packets, 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_original_bytes, 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_retransmitted_packets, 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int num_retransmitted_bytes, 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch QuicTime::Delta delta_largest_observed) = 0; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) friend class base::RefCounted<DelegateInterface>; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Delegates are ref counted. 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~DelegateInterface(); 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // QuicAckNotifier is expected to keep its own reference to the delegate. 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit QuicAckNotifier(DelegateInterface* delegate); 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~QuicAckNotifier(); 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Register a sequence number that this AckNotifier should be interested in. 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void AddSequenceNumber(const QuicPacketSequenceNumber& sequence_number, 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int packet_payload_size); 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Called by the QuicConnection on receipt of new ACK frame, with the sequence 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // number referenced by the ACK frame. 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Deletes the matching sequence number from the stored set of sequence 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // numbers. If this set is now empty, call the stored delegate's 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // OnAckNotification method. 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Returns true if the provided sequence_number caused the delegate to be 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // called, false otherwise. 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool OnAck(QuicPacketSequenceNumber sequence_number, 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch QuicTime::Delta delta_largest_observed); 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool IsEmpty() { return sequence_numbers_.empty(); } 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If a packet is retransmitted by the connection it will be sent with a 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // different sequence number. Updates our internal set of sequence_numbers to 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // track the latest number. 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void UpdateSequenceNumber(QuicPacketSequenceNumber old_sequence_number, 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) QuicPacketSequenceNumber new_sequence_number); 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) struct PacketInfo { 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PacketInfo(); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit PacketInfo(int payload_size); 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int packet_payload_size; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The delegate's OnAckNotification() method will be called once we have been 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // notified of ACKs for all the sequence numbers we are tracking. 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This is not owned by OnAckNotifier and must outlive it. 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<DelegateInterface> delegate_; 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequence numbers this notifier is waiting to hear about. The 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // delegate will not be called until this is empty. 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::hash_map<QuicPacketSequenceNumber, PacketInfo> sequence_numbers_; 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Transmission and retransmission stats. 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Number of packets in the original transmission. 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int original_packet_count_; 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Number of packets in the original transmission. 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int original_byte_count_; 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Number of packets that had to be retransmitted. 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int retransmitted_packet_count_; 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Number of bytes that had to be retransmitted. 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int retransmitted_byte_count_; 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DISALLOW_COPY_AND_ASSIGN(QuicAckNotifier); 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; // namespace net 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif // NET_QUIC_QUIC_ACK_NOTIFIER_H_ 102