quic_ack_notifier_manager.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/quic/quic_ack_notifier_manager.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <stddef.h> 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <list> 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <map> 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <utility> 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <vector> 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/stl_util.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/quic/quic_ack_notifier.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/quic/quic_protocol.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace net { 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)AckNotifierManager::AckNotifierManager() {} 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)AckNotifierManager::~AckNotifierManager() { 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) STLDeleteElements(&ack_notifiers_); 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AckNotifierManager::OnPacketAcked( 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuicPacketSequenceNumber sequence_number) { 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Inform all the registered AckNotifiers of the new ACK. 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AckNotifierMap::iterator map_it = ack_notifier_map_.find(sequence_number); 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (map_it == ack_notifier_map_.end()) { 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // No AckNotifier is interested in this sequence number. 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // One or more AckNotifiers are registered as interested in this sequence 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // number. Iterate through them and call OnAck on each. 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (AckNotifierSet::iterator set_it = map_it->second.begin(); 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) set_it != map_it->second.end(); ++set_it) { 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuicAckNotifier* ack_notifier = *set_it; 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ack_notifier->OnAck(sequence_number); 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If this has resulted in an empty AckNotifer, erase it. 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (ack_notifier->IsEmpty()) { 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delete ack_notifier; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ack_notifiers_.erase(ack_notifier); 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove the sequence number from the map as we have notified all the 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // registered AckNotifiers, and we won't see it again. 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ack_notifier_map_.erase(map_it); 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AckNotifierManager::UpdateSequenceNumber( 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) QuicPacketSequenceNumber old_sequence_number, 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) QuicPacketSequenceNumber new_sequence_number) { 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AckNotifierMap::iterator map_it = ack_notifier_map_.find(old_sequence_number); 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (map_it != ack_notifier_map_.end()) { 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // We will add an entry to the map for the new sequence number, and move 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // list of AckNotifiers over. 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AckNotifierSet new_set; 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (AckNotifierSet::iterator notifier_it = map_it->second.begin(); 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) notifier_it != map_it->second.end(); ++notifier_it) { 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) (*notifier_it) 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ->UpdateSequenceNumber(old_sequence_number, new_sequence_number); 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new_set.insert(*notifier_it); 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ack_notifier_map_[new_sequence_number] = new_set; 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ack_notifier_map_.erase(map_it); 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AckNotifierManager::OnSerializedPacket( 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const SerializedPacket& serialized_packet) { 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Run through all the frames and if any of them are stream frames and have 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // an AckNotifier registered, then inform the AckNotifier that it should be 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // interested in this packet's sequence number. 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RetransmittableFrames* frames = serialized_packet.retransmittable_frames; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // AckNotifiers can only be attached to retransmittable frames. 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!frames) { 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (QuicFrames::const_iterator it = frames->frames().begin(); 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it != frames->frames().end(); ++it) { 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (it->type == STREAM_FRAME && it->stream_frame->notifier != NULL) { 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The AckNotifier needs to know it is tracking this packet's sequence 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // number. 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it->stream_frame->notifier->AddSequenceNumber( 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) serialized_packet.sequence_number); 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Add the AckNotifier to our set of AckNotifiers. 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ack_notifiers_.insert(it->stream_frame->notifier); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Update the mapping in the other direction, from sequence 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // number to AckNotifier. 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ack_notifier_map_[serialized_packet.sequence_number] 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .insert(it->stream_frame->notifier); 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace net 106