Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index e5bcbb98371b137dfd9a9a74a000982a73fb4da4..273f4f54d8ecaff1908792d558c21a5dcdcf46de 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -13,6 +13,7 @@ |
#include <set> |
#include <utility> |
+#include "base/debug/stack_trace.h" |
#include "base/logging.h" |
#include "base/stl_util.h" |
#include "net/base/net_errors.h" |
@@ -162,7 +163,7 @@ QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet, |
#define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
-QuicConnection::QuicConnection(QuicGuid guid, |
+QuicConnection::QuicConnection(QuicConnectionId connection_id, |
IPEndPoint address, |
QuicConnectionHelperInterface* helper, |
QuicPacketWriter* writer, |
@@ -176,7 +177,7 @@ QuicConnection::QuicConnection(QuicGuid guid, |
encryption_level_(ENCRYPTION_NONE), |
clock_(helper->GetClock()), |
random_generator_(helper->GetRandomGenerator()), |
- guid_(guid), |
+ connection_id_(connection_id), |
peer_address_(address), |
largest_seen_packet_with_ack_(0), |
largest_seen_packet_with_stop_waiting_(0), |
@@ -190,7 +191,7 @@ QuicConnection::QuicConnection(QuicGuid guid, |
resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), |
debug_visitor_(NULL), |
- packet_creator_(guid_, &framer_, random_generator_, is_server), |
+ packet_creator_(connection_id_, &framer_, random_generator_, is_server), |
packet_generator_(this, NULL, &packet_creator_), |
idle_network_timeout_( |
QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), |
@@ -208,7 +209,8 @@ QuicConnection::QuicConnection(QuicGuid guid, |
// Pacing will be enabled if the client negotiates it. |
sent_packet_manager_.MaybeEnablePacing(); |
} |
- DVLOG(1) << ENDPOINT << "Created connection with guid: " << guid; |
+ DVLOG(1) << ENDPOINT << "Created connection with connection_id: " |
+ << connection_id; |
timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_)); |
framer_.set_visitor(this); |
framer_.set_received_entropy_calculator(&received_packet_manager_); |
@@ -399,9 +401,10 @@ bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { |
// Will be decrement below if we fall through to return true; |
++stats_.packets_dropped; |
- if (header.public_header.guid != guid_) { |
- DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected GUID: " |
- << header.public_header.guid << " instead of " << guid_; |
+ if (header.public_header.connection_id != connection_id_) { |
+ DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected ConnectionId: " |
+ << header.public_header.connection_id << " instead of " |
+ << connection_id_; |
return false; |
} |
@@ -677,7 +680,8 @@ bool QuicConnection::OnConnectionCloseFrame( |
if (debug_visitor_) { |
debug_visitor_->OnConnectionCloseFrame(frame); |
} |
- DVLOG(1) << ENDPOINT << "Connection " << guid() << " closed with error " |
+ DVLOG(1) << ENDPOINT << "Connection " << connection_id() |
+ << " closed with error " |
<< QuicUtils::ErrorToString(frame.error_code) |
<< " " << frame.error_details; |
last_close_frames_.push_back(frame); |
@@ -727,7 +731,8 @@ void QuicConnection::OnPacketComplete() { |
<< last_rst_frames_.size() << " rsts, " |
<< last_close_frames_.size() << " closes, " |
<< last_stream_frames_.size() |
- << " stream frames for " << last_header_.public_header.guid; |
+ << " stream frames for " |
+ << last_header_.public_header.connection_id; |
MaybeQueueAck(); |
@@ -969,6 +974,20 @@ void QuicConnection::SendRstStream(QuicStreamId id, |
QuicFrame(new QuicRstStreamFrame(id, error, bytes_written))); |
} |
+void QuicConnection::SendWindowUpdate(QuicStreamId id, |
+ QuicStreamOffset byte_offset) { |
+ // Opportunistically bundle an ack with this outgoing packet. |
+ ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); |
+ packet_generator_.AddControlFrame( |
+ QuicFrame(new QuicWindowUpdateFrame(id, byte_offset))); |
+} |
+ |
+void QuicConnection::SendBlocked(QuicStreamId id) { |
+ // Opportunistically bundle an ack with this outgoing packet. |
+ ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); |
+ packet_generator_.AddControlFrame(QuicFrame(new QuicBlockedFrame(id))); |
+} |
+ |
const QuicConnectionStats& QuicConnection::GetStats() { |
// Update rtt and estimated bandwidth. |
stats_.rtt = sent_packet_manager_.SmoothedRtt().ToMicroseconds(); |
@@ -1549,7 +1568,7 @@ void QuicConnection::MaybeProcessRevivedPacket() { |
QuicPacketHeader revived_header; |
char revived_payload[kMaxPacketSize]; |
size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize); |
- revived_header.public_header.guid = guid_; |
+ revived_header.public_header.connection_id = connection_id_; |
revived_header.public_header.version_flag = false; |
revived_header.public_header.reset_flag = false; |
revived_header.fec_flag = false; |
@@ -1604,9 +1623,9 @@ void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error, |
void QuicConnection::SendConnectionClosePacket(QuicErrorCode error, |
const string& details) { |
- DVLOG(1) << ENDPOINT << "Force closing " << guid() << " with error " |
- << QuicUtils::ErrorToString(error) << " (" << error << ") " |
- << details; |
+ DVLOG(1) << ENDPOINT << "Force closing " << connection_id() |
+ << " with error " << QuicUtils::ErrorToString(error) |
+ << " (" << error << ") " << details; |
ScopedPacketBundler ack_bundler(this, SEND_ACK); |
QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(); |
frame->error_code = error; |
@@ -1616,8 +1635,9 @@ void QuicConnection::SendConnectionClosePacket(QuicErrorCode error, |
} |
void QuicConnection::CloseConnection(QuicErrorCode error, bool from_peer) { |
- DCHECK(connected_); |
if (!connected_) { |
+ DLOG(DFATAL) << "Error: attempt to close an already closed connection" |
+ << base::debug::StackTrace().ToString(); |
return; |
} |
connected_ = false; |