普通文本  |  86行  |  2.5 KB

// Copyright 2013 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.

#include "net/quic/quic_ack_notifier.h"

#include <set>

#include "base/logging.h"
#include "base/stl_util.h"

using base::hash_map;
using std::make_pair;

namespace net {

QuicAckNotifier::PacketInfo::PacketInfo() : packet_payload_size(0) {
}

QuicAckNotifier::PacketInfo::PacketInfo(int payload_size)
    : packet_payload_size(payload_size) {
}

QuicAckNotifier::DelegateInterface::DelegateInterface() {}

QuicAckNotifier::DelegateInterface::~DelegateInterface() {}

QuicAckNotifier::QuicAckNotifier(DelegateInterface* delegate)
    : delegate_(delegate),
      original_packet_count_(0),
      original_byte_count_(0),
      retransmitted_packet_count_(0),
      retransmitted_byte_count_(0) {
  DCHECK(delegate);
}

QuicAckNotifier::~QuicAckNotifier() {
}

void QuicAckNotifier::AddSequenceNumber(
    const QuicPacketSequenceNumber& sequence_number,
    int packet_payload_size) {
  sequence_numbers_.insert(make_pair(sequence_number,
                                     PacketInfo(packet_payload_size)));
  ++original_packet_count_;
  original_byte_count_ += packet_payload_size;
}

bool QuicAckNotifier::OnAck(QuicPacketSequenceNumber sequence_number,
                            QuicTime::Delta delta_largest_observed) {
  DCHECK(ContainsKey(sequence_numbers_, sequence_number));
  sequence_numbers_.erase(sequence_number);
  if (IsEmpty()) {
    // We have seen all the sequence numbers we were waiting for, trigger
    // callback notification.
    delegate_->OnAckNotification(
        original_packet_count_, original_byte_count_,
        retransmitted_packet_count_, retransmitted_byte_count_,
        delta_largest_observed);
    return true;
  }
  return false;
}

void QuicAckNotifier::UpdateSequenceNumber(
    QuicPacketSequenceNumber old_sequence_number,
    QuicPacketSequenceNumber new_sequence_number) {
  DCHECK(!ContainsKey(sequence_numbers_, new_sequence_number));

  PacketInfo packet_info;
  hash_map<QuicPacketSequenceNumber, PacketInfo>::iterator it =
      sequence_numbers_.find(old_sequence_number);
  if (it != sequence_numbers_.end()) {
    packet_info = it->second;
    sequence_numbers_.erase(it);
  } else {
    DLOG(DFATAL) << "Old sequence number not found.";
  }

  ++retransmitted_packet_count_;
  retransmitted_byte_count_ += packet_info.packet_payload_size;
  sequence_numbers_.insert(make_pair(new_sequence_number, packet_info));
}

};  // namespace net