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