Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(463)

Unified Diff: net/quic/quic_chromium_client_session.cc

Issue 1327923002: Migrates QUIC sessions to a new network when old network is (about to be) disconnected. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@home
Patch Set: Fixed StartReading method Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/quic/quic_chromium_client_session.cc
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index 0e7cb7b2debfa3fb6c163c6e23da05be8ee73fe9..6ee1c66891919c45fa6af1e5b7aa60c9a6dda237 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -40,6 +40,11 @@ const int k0RttHandshakeTimeoutMs = 300;
// IPv6 packets have an additional 20 bytes of overhead than IPv4 packets.
const size_t kAdditionalOverheadForIPv6 = 20;
+// Maximum number of Readers that are created for any session due to
+// connection migration. A new Reader is created every time this endpoint's
+// IP address changes.
+const size_t kMaxReadersPerQuicSession = 5;
+
// Histograms for tracking down the crashes from http://crbug.com/354669
// Note: these values must be kept in sync with the corresponding values in:
// tools/metrics/histograms/histograms.xml
@@ -175,18 +180,19 @@ QuicChromiumClientSession::QuicChromiumClientSession(
server_id_(server_id),
require_confirmation_(false),
stream_factory_(stream_factory),
- socket_(socket.Pass()),
transport_security_state_(transport_security_state),
server_info_(server_info.Pass()),
num_total_streams_(0),
task_runner_(task_runner),
net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_QUIC_SESSION)),
- packet_reader_(socket_.get(), this, net_log_),
dns_resolution_end_time_(dns_resolution_end_time),
logger_(new QuicConnectionLogger(this, connection_description, net_log_)),
going_away_(false),
disabled_reason_(QUIC_DISABLED_NOT),
weak_factory_(this) {
+ sockets_[0] = socket.Pass();
Ryan Hamilton 2015/09/08 04:09:37 nit: sockets_.push_back(socket.Pass())
Jana 2015/11/17 01:50:08 Done.
+ packet_readers_[0].reset(
+ new QuicPacketReader(sockets_[0].get(), this, net_log_));
Ryan Hamilton 2015/09/08 04:09:37 ditto
Jana 2015/11/17 01:50:08 Done.
crypto_stream_.reset(
crypto_client_stream_factory
? crypto_client_stream_factory->CreateQuicCryptoClientStream(
@@ -744,7 +750,10 @@ void QuicChromiumClientSession::OnConnectionClosed(QuicErrorCode error,
if (!callback_.is_null()) {
base::ResetAndReturn(&callback_).Run(ERR_QUIC_PROTOCOL_ERROR);
}
- socket_->Close();
+
+ for (size_t i = 0; i < sockets_.size(); ++i) {
Ryan Hamilton 2015/09/08 04:09:37 nit: for (Socket socket : sockets) { ... }
Jana 2015/11/17 01:50:08 Done.
+ sockets_[i]->Close();
+ }
QuicSession::OnConnectionClosed(error, from_peer);
DCHECK(dynamic_streams().empty());
CloseAllStreams(ERR_UNEXPECTED);
@@ -788,7 +797,9 @@ void QuicChromiumClientSession::OnProofVerifyDetailsAvailable(
}
void QuicChromiumClientSession::StartReading() {
- packet_reader_.StartReading();
+ for (size_t i = 0; i < packet_readers_.size(); ++i) {
Ryan Hamilton 2015/09/08 04:09:37 nit: c++11 foreach loop
Jana 2015/11/17 01:50:08 Done.
+ packet_readers_[i]->StartReading();
+ }
}
void QuicChromiumClientSession::CloseSessionOnError(int error,
@@ -953,4 +964,21 @@ void QuicChromiumClientSession::OnConnectTimeout() {
// DCHECK_EQ(0u, GetNumOpenStreams());
}
+void QuicChromiumClientSession::AddSocket(
+ scoped_ptr<DatagramClientSocket> socket) {
+ size_t num_sockets = sockets_.size();
+ sockets_.resize(num_sockets + 1);
+ sockets_[num_sockets - 1] = socket.Pass();
Ryan Hamilton 2015/09/08 04:09:37 I think you can just do sockets_.push_back(socket.
Jana 2015/11/17 01:50:08 Done.
+}
+
+bool QuicChromiumClientSession::AddPacketReader(QuicPacketReader* reader) {
+ size_t num_readers = packet_readers_.size();
+ if (num_readers >= kMaxReadersPerQuicSession) {
+ return false;
+ }
+ packet_readers_.resize(num_readers + 1);
+ packet_readers_[num_readers - 1].reset(reader);
+ return true;
+}
Ryan Hamilton 2015/09/08 04:09:37 It's a bit surprising that the AddSocket method re
Jana 2015/11/17 01:50:08 Yeah, this wasn't great, so I cleaned it up now, P
+
} // namespace net

Powered by Google App Engine
This is Rietveld 408576698