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

Side by Side Diff: net/quic/quic_stream_factory.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: Fixes a few scoped_ptr issues. Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_stream_factory.h" 5 #include "net/quic/quic_stream_factory.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 bool prefer_aes, 562 bool prefer_aes,
563 int max_number_of_lossy_connections, 563 int max_number_of_lossy_connections,
564 float packet_loss_threshold, 564 float packet_loss_threshold,
565 int max_disabled_reasons, 565 int max_disabled_reasons,
566 int threshold_public_resets_post_handshake, 566 int threshold_public_resets_post_handshake,
567 int threshold_timeouts_with_open_streams, 567 int threshold_timeouts_with_open_streams,
568 int socket_receive_buffer_size, 568 int socket_receive_buffer_size,
569 bool delay_tcp_race, 569 bool delay_tcp_race,
570 bool store_server_configs_in_properties, 570 bool store_server_configs_in_properties,
571 bool close_sessions_on_ip_change, 571 bool close_sessions_on_ip_change,
572 bool migrate_sessions_on_network_change,
572 const QuicTagVector& connection_options) 573 const QuicTagVector& connection_options)
573 : require_confirmation_(true), 574 : require_confirmation_(true),
574 host_resolver_(host_resolver), 575 host_resolver_(host_resolver),
575 client_socket_factory_(client_socket_factory), 576 client_socket_factory_(client_socket_factory),
576 http_server_properties_(http_server_properties), 577 http_server_properties_(http_server_properties),
577 transport_security_state_(transport_security_state), 578 transport_security_state_(transport_security_state),
578 quic_crypto_client_stream_factory_(quic_crypto_client_stream_factory), 579 quic_crypto_client_stream_factory_(quic_crypto_client_stream_factory),
579 random_generator_(random_generator), 580 random_generator_(random_generator),
580 clock_(clock), 581 clock_(clock),
581 max_packet_length_(max_packet_length), 582 max_packet_length_(max_packet_length),
(...skipping 24 matching lines...) Expand all
606 threshold_timeouts_with_open_streams), 607 threshold_timeouts_with_open_streams),
607 threshold_public_resets_post_handshake_( 608 threshold_public_resets_post_handshake_(
608 threshold_public_resets_post_handshake), 609 threshold_public_resets_post_handshake),
609 socket_receive_buffer_size_(socket_receive_buffer_size), 610 socket_receive_buffer_size_(socket_receive_buffer_size),
610 delay_tcp_race_(delay_tcp_race), 611 delay_tcp_race_(delay_tcp_race),
611 yield_after_packets_(kQuicYieldAfterPacketsRead), 612 yield_after_packets_(kQuicYieldAfterPacketsRead),
612 yield_after_duration_(QuicTime::Delta::FromMilliseconds( 613 yield_after_duration_(QuicTime::Delta::FromMilliseconds(
613 kQuicYieldAfterDurationMilliseconds)), 614 kQuicYieldAfterDurationMilliseconds)),
614 store_server_configs_in_properties_(store_server_configs_in_properties), 615 store_server_configs_in_properties_(store_server_configs_in_properties),
615 close_sessions_on_ip_change_(close_sessions_on_ip_change), 616 close_sessions_on_ip_change_(close_sessions_on_ip_change),
617 migrate_sessions_on_network_change_(migrate_sessions_on_network_change),
616 port_seed_(random_generator_->RandUint64()), 618 port_seed_(random_generator_->RandUint64()),
617 check_persisted_supports_quic_(true), 619 check_persisted_supports_quic_(true),
618 has_initialized_data_(false), 620 has_initialized_data_(false),
619 task_runner_(nullptr), 621 task_runner_(nullptr),
620 weak_factory_(this) { 622 weak_factory_(this) {
621 DCHECK(transport_security_state_); 623 DCHECK(transport_security_state_);
622 DCHECK(http_server_properties_); 624 DCHECK(http_server_properties_);
623 crypto_config_.set_user_agent_id(user_agent_id); 625 crypto_config_.set_user_agent_id(user_agent_id);
624 crypto_config_.AddCanonicalSuffix(".c.youtube.com"); 626 crypto_config_.AddCanonicalSuffix(".c.youtube.com");
625 crypto_config_.AddCanonicalSuffix(".googlevideo.com"); 627 crypto_config_.AddCanonicalSuffix(".googlevideo.com");
(...skipping 18 matching lines...) Expand all
644 if (!IsEcdsaSupported()) 646 if (!IsEcdsaSupported())
645 crypto_config_.DisableEcdsa(); 647 crypto_config_.DisableEcdsa();
646 // When disk cache is used to store the server configs, HttpCache code calls 648 // When disk cache is used to store the server configs, HttpCache code calls
647 // |set_quic_server_info_factory| if |quic_server_info_factory_| wasn't 649 // |set_quic_server_info_factory| if |quic_server_info_factory_| wasn't
648 // created. 650 // created.
649 if (store_server_configs_in_properties_) { 651 if (store_server_configs_in_properties_) {
650 quic_server_info_factory_.reset( 652 quic_server_info_factory_.reset(
651 new PropertiesBasedQuicServerInfoFactory(http_server_properties_)); 653 new PropertiesBasedQuicServerInfoFactory(http_server_properties_));
652 } 654 }
653 655
656 #if defined(OS_ANDROID)
657 // Migration only implemented for Android versions >= L.
658 // TODO (jri): Maybe move this to NetworkChangeNotifier, as a
659 // IsSupported (or some such) method.
660 if (migrate_sessions_on_network_change_ &&
661 base::android::BuildInfo::GetInstance()->sdk_int() >=
662 base::android::SDK_VERSION_LOLLIPOP) {
663 NetworkChangeNotifier::AddNetworkObserver(this);
664 } else if (close_sessions_on_ip_change_) {
665 NetworkChangeNotifier::AddIPAddressObserver(this);
666 }
667 #else
654 if (close_sessions_on_ip_change_) { 668 if (close_sessions_on_ip_change_) {
655 NetworkChangeNotifier::AddIPAddressObserver(this); 669 NetworkChangeNotifier::AddIPAddressObserver(this);
656 } 670 }
671 #endif
657 } 672 }
658 673
659 QuicStreamFactory::~QuicStreamFactory() { 674 QuicStreamFactory::~QuicStreamFactory() {
660 CloseAllSessions(ERR_ABORTED); 675 CloseAllSessions(ERR_ABORTED);
661 while (!all_sessions_.empty()) { 676 while (!all_sessions_.empty()) {
662 delete all_sessions_.begin()->first; 677 delete all_sessions_.begin()->first;
663 all_sessions_.erase(all_sessions_.begin()); 678 all_sessions_.erase(all_sessions_.begin());
664 } 679 }
665 while (!active_jobs_.empty()) { 680 while (!active_jobs_.empty()) {
666 const QuicServerId server_id = active_jobs_.begin()->first; 681 const QuicServerId server_id = active_jobs_.begin()->first;
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 list->Append(session->GetInfoAsValue(hosts)); 1139 list->Append(session->GetInfoAsValue(hosts));
1125 } 1140 }
1126 } 1141 }
1127 return list.Pass(); 1142 return list.Pass();
1128 } 1143 }
1129 1144
1130 void QuicStreamFactory::ClearCachedStatesInCryptoConfig() { 1145 void QuicStreamFactory::ClearCachedStatesInCryptoConfig() {
1131 crypto_config_.ClearCachedStates(); 1146 crypto_config_.ClearCachedStates();
1132 } 1147 }
1133 1148
1149 // We still need OnIPAddressChanged, but not for Android >= L.
1150 // pauljensen: How do we do this?
1134 void QuicStreamFactory::OnIPAddressChanged() { 1151 void QuicStreamFactory::OnIPAddressChanged() {
1135 CloseAllSessions(ERR_NETWORK_CHANGED); 1152 CloseAllSessions(ERR_NETWORK_CHANGED);
1136 set_require_confirmation(true); 1153 set_require_confirmation(true);
1137 } 1154 }
1138 1155
1156 void QuicStreamFactory::OnNetworkConnected(
1157 NetworkChangeNotifier::NetworkHandle network) {
1158 // Nothing to do.
Ryan Hamilton 2015/11/18 22:23:36 I'm not sure that this comment adds any value.
1159 }
1160
1161 void QuicStreamFactory::OnNetworkMadeDefault(
1162 NetworkChangeNotifier::NetworkHandle network) {
1163 // Nothing to do.
1164 }
1165
1166 void QuicStreamFactory::OnNetworkDisconnected(
1167 NetworkChangeNotifier::NetworkHandle network) {
1168 MigrateOrCloseSessions(network);
1169 }
1170
1171 void QuicStreamFactory::OnNetworkSoonToDisconnect(
1172 NetworkChangeNotifier::NetworkHandle network) {
1173 MigrateOrCloseSessions(network);
1174 }
1175
1176 void QuicStreamFactory::MigrateOrCloseSessions(
1177 NetworkChangeNotifier::NetworkHandle network) {
1178 // TODO(jri): Need a "verified" flag on each network that gets set when
1179 // any data is received on the network.
1180 set_require_confirmation(true);
1181
1182 // pauljensen: do we need the following "== network" check?
1183 NetworkChangeNotifier::NetworkList network_list;
1184 NetworkChangeNotifier::GetConnectedNetworks(&network_list);
1185 if (network_list.empty() ||
1186 (network_list.size() == 1 && network_list[0] == network)) {
1187 CloseAllSessions(ERR_NETWORK_CHANGED);
1188 return;
1189 }
1190
1191 // Find a new network that old sockets can be migrated to.
1192 // pauljensen: do we need the following "== network" check?
1193 NetworkChangeNotifier::NetworkHandle new_network =
1194 NetworkChangeNotifier::kInvalidNetworkHandle;
1195 for (NetworkChangeNotifier::NetworkHandle n : network_list) {
1196 if (n == network) {
1197 continue;
1198 }
1199 new_network = n;
1200 }
1201
1202 DCHECK_NE(NetworkChangeNotifier::kInvalidNetworkHandle, new_network);
1203 DCHECK_NE(network, new_network);
Ryan Hamilton 2015/11/18 22:23:36 It looks like these DCHECKs are needed because of
Jana 2015/11/21 02:21:22 Good suggestion -- there was definitely redundant
1204
1205 for (auto& it : all_sessions_) {
1206 QuicChromiumClientSession* session = it.first;
1207 QuicServerId server_id = it.second;
1208
1209 if (session->GetNumOpenStreams() == 0) {
1210 // If idle session, close session
1211 active_sessions_.erase(server_id);
1212 // TODO(jri): Add new error for QUIC connection migration.
1213 session->CloseSessionOnError(ERR_NETWORK_CHANGED, QUIC_INTERNAL_ERROR);
Ryan Hamilton 2015/11/18 22:23:36 CloseSessionOnError causes the session to be remov
Jana 2015/11/21 02:21:22 Ah, ok, I see that now. Removed.
1214 // } else if (session->current_network() == new_network) {
1215 // @@@ TODO (jri): store network and record in session when
1216 // BindToNetwork() is called.
1217 // If session is already using |network|, move on.
1218 // continue;
Ryan Hamilton 2015/11/18 22:23:36 What's up with this code?
Jana 2015/11/21 02:21:22 Cleaned it up some and added a method in session t
1219 continue;
1220 }
1221 // If session has active streams,
1222 // (i) make the session GO_AWAY,
1223 // (ii) create a new socket (which should be bound to the new interface),
1224 // (iii) migrate the session to using the new socket.
1225 OnSessionGoingAway(session);
Ryan Hamilton 2015/11/18 22:23:36 I wonder if you want to send a GOAWAY as well?
Jana 2015/11/21 02:21:22 Why? We won't sent any more requests to the server
1226 QuicConnection* connection = session->connection();
1227 scoped_ptr<DatagramClientSocket> socket =
1228 CreateDatagramClientSocket(all_sessions_[session], session->net_log());
Ryan Hamilton 2015/11/18 22:23:36 instead of all_sessions_[session] can you call ses
Jana 2015/11/21 02:21:22 Ah! Didn't know that existed. Done.
1229 int rv = ConfigureDatagramClientSocket(socket.get(),
1230 connection->peer_address(), network);
Ryan Hamilton 2015/11/18 22:23:36 It looks like both places this method is called is
Jana 2015/11/21 02:21:22 I had it together first (some earlier rev) but I n
1231 if (rv != OK) {
Ryan Hamilton 2015/11/18 22:23:36 nit: no need to store rv in a variable if it's not
Jana 2015/11/21 02:21:22 Done.
1232 session->CloseSessionOnError(ERR_NETWORK_CHANGED, QUIC_INTERNAL_ERROR);
1233 continue;
1234 }
1235 scoped_ptr<QuicPacketReader> new_reader(new QuicPacketReader(
1236 socket.get(), clock_.get(), session, yield_after_packets_,
1237 yield_after_duration_, session->net_log()));
1238 DefaultPacketWriterFactory packet_writer_factory(socket.get());
1239 scoped_ptr<QuicPacketWriter> new_writer(
1240 packet_writer_factory.Create(connection));
1241
1242 if (!session->MigrateToSocket(socket.Pass(), new_reader.Pass(),
1243 new_writer.Pass())) {
1244 // TODO (jri): Log this as a different ERROR.
1245 session->CloseSessionOnError(ERR_NETWORK_CHANGED, QUIC_INTERNAL_ERROR);
1246 }
1247 }
1248 }
1249
1139 void QuicStreamFactory::OnSSLConfigChanged() { 1250 void QuicStreamFactory::OnSSLConfigChanged() {
1140 CloseAllSessions(ERR_CERT_DATABASE_CHANGED); 1251 CloseAllSessions(ERR_CERT_DATABASE_CHANGED);
1141 } 1252 }
1142 1253
1143 void QuicStreamFactory::OnCertAdded(const X509Certificate* cert) { 1254 void QuicStreamFactory::OnCertAdded(const X509Certificate* cert) {
1144 CloseAllSessions(ERR_CERT_DATABASE_CHANGED); 1255 CloseAllSessions(ERR_CERT_DATABASE_CHANGED);
1145 } 1256 }
1146 1257
1147 void QuicStreamFactory::OnCACertChanged(const X509Certificate* cert) { 1258 void QuicStreamFactory::OnCACertChanged(const X509Certificate* cert) {
1148 // We should flush the sessions if we removed trust from a 1259 // We should flush the sessions if we removed trust from a
(...skipping 13 matching lines...) Expand all
1162 // TODO(rtenneti): crbug.com/498823 - delete active_sessions_.empty() check. 1273 // TODO(rtenneti): crbug.com/498823 - delete active_sessions_.empty() check.
1163 if (active_sessions_.empty()) 1274 if (active_sessions_.empty())
1164 return false; 1275 return false;
1165 return ContainsKey(active_sessions_, server_id); 1276 return ContainsKey(active_sessions_, server_id);
1166 } 1277 }
1167 1278
1168 bool QuicStreamFactory::HasActiveJob(const QuicServerId& key) const { 1279 bool QuicStreamFactory::HasActiveJob(const QuicServerId& key) const {
1169 return ContainsKey(active_jobs_, key); 1280 return ContainsKey(active_jobs_, key);
1170 } 1281 }
1171 1282
1172 int QuicStreamFactory::CreateSession(const QuicServerId& server_id, 1283 scoped_ptr<DatagramClientSocket> QuicStreamFactory::CreateDatagramClientSocket(
1173 int cert_verify_flags, 1284 const QuicServerId& server_id,
1174 scoped_ptr<QuicServerInfo> server_info, 1285 const BoundNetLog& net_log) {
1175 const AddressList& address_list,
1176 base::TimeTicks dns_resolution_end_time,
1177 const BoundNetLog& net_log,
1178 QuicChromiumClientSession** session) {
1179 bool enable_port_selection = enable_port_selection_; 1286 bool enable_port_selection = enable_port_selection_;
1180 if (enable_port_selection && 1287 if (enable_port_selection &&
1181 ContainsKey(gone_away_aliases_, server_id)) { 1288 ContainsKey(gone_away_aliases_, server_id)) {
1182 // Disable port selection when the server is going away. 1289 // Disable port selection when the server is going away.
1183 // There is no point in trying to return to the same server, if 1290 // There is no point in trying to return to the same server, if
1184 // that server is no longer handling requests. 1291 // that server is no longer handling requests.
1185 enable_port_selection = false; 1292 enable_port_selection = false;
1186 gone_away_aliases_.erase(server_id); 1293 gone_away_aliases_.erase(server_id);
1187 } 1294 }
1188
1189 QuicConnectionId connection_id = random_generator_->RandUint64();
1190 IPEndPoint addr = *address_list.begin();
1191 scoped_refptr<PortSuggester> port_suggester = 1295 scoped_refptr<PortSuggester> port_suggester =
1192 new PortSuggester(server_id.host_port_pair(), port_seed_); 1296 new PortSuggester(server_id.host_port_pair(), port_seed_);
1193 DatagramSocket::BindType bind_type = enable_port_selection ? 1297 DatagramSocket::BindType bind_type = enable_port_selection ?
1194 DatagramSocket::RANDOM_BIND : // Use our callback. 1298 DatagramSocket::RANDOM_BIND : // Use our callback.
1195 DatagramSocket::DEFAULT_BIND; // Use OS to randomize. 1299 DatagramSocket::DEFAULT_BIND; // Use OS to randomize.
1300
1196 scoped_ptr<DatagramClientSocket> socket( 1301 scoped_ptr<DatagramClientSocket> socket(
1197 client_socket_factory_->CreateDatagramClientSocket( 1302 client_socket_factory_->CreateDatagramClientSocket(
1198 bind_type, 1303 bind_type,
1199 base::Bind(&PortSuggester::SuggestPort, port_suggester), 1304 base::Bind(&PortSuggester::SuggestPort, port_suggester),
1200 net_log.net_log(), net_log.source())); 1305 net_log.net_log(), net_log.source()));
1201 1306
1307 UMA_HISTOGRAM_COUNTS("Net.QuicEphemeralPortsSuggested",
1308 port_suggester->call_count());
1309 if (enable_port_selection) {
1310 DCHECK_LE(1u, port_suggester->call_count());
1311 } else {
1312 DCHECK_EQ(0u, port_suggester->call_count());
1313 }
1314
1315 return socket;
1316 }
1317
1318 int QuicStreamFactory::ConfigureDatagramClientSocket(
1319 DatagramClientSocket* socket,
1320 IPEndPoint addr,
1321 NetworkChangeNotifier::NetworkHandle network) {
1202 if (enable_non_blocking_io_ && 1322 if (enable_non_blocking_io_ &&
1203 client_socket_factory_ == ClientSocketFactory::GetDefaultFactory()) { 1323 client_socket_factory_ == ClientSocketFactory::GetDefaultFactory()) {
1204 #if defined(OS_WIN) 1324 #if defined(OS_WIN)
1205 static_cast<UDPClientSocket*>(socket.get())->UseNonBlockingIO(); 1325 static_cast<UDPClientSocket*>(socket.get())->UseNonBlockingIO();
1206 #endif 1326 #endif
1207 } 1327 }
1208 1328
1209 int rv = socket->Connect(addr); 1329 // If caller leaves network unspecified, find current default.
1330 int rv;
1331 if (network == NetworkChangeNotifier::kInvalidNetworkHandle) {
1332 rv = socket->BindToDefaultNetwork();
1333 } else {
1334 rv = socket->BindToNetwork(network);
1335 }
1336 if (rv != OK) {
1337 return rv;
1338 }
1210 1339
1340 rv = socket->Connect(addr);
1211 if (rv != OK) { 1341 if (rv != OK) {
1212 HistogramCreateSessionFailure(CREATION_ERROR_CONNECTING_SOCKET); 1342 HistogramCreateSessionFailure(CREATION_ERROR_CONNECTING_SOCKET);
1213 return rv; 1343 return rv;
1214 } 1344 }
1215 UMA_HISTOGRAM_COUNTS("Net.QuicEphemeralPortsSuggested",
1216 port_suggester->call_count());
1217 if (enable_port_selection) {
1218 DCHECK_LE(1u, port_suggester->call_count());
1219 } else {
1220 DCHECK_EQ(0u, port_suggester->call_count());
1221 }
1222 1345
1223 rv = socket->SetReceiveBufferSize(socket_receive_buffer_size_); 1346 rv = socket->SetReceiveBufferSize(socket_receive_buffer_size_);
1224 if (rv != OK) { 1347 if (rv != OK) {
1225 HistogramCreateSessionFailure(CREATION_ERROR_SETTING_RECEIVE_BUFFER); 1348 HistogramCreateSessionFailure(CREATION_ERROR_SETTING_RECEIVE_BUFFER);
1226 return rv; 1349 return rv;
1227 } 1350 }
1351
1228 // Set a buffer large enough to contain the initial CWND's worth of packet 1352 // Set a buffer large enough to contain the initial CWND's worth of packet
1229 // to work around the problem with CHLO packets being sent out with the 1353 // to work around the problem with CHLO packets being sent out with the
1230 // wrong encryption level, when the send buffer is full. 1354 // wrong encryption level, when the send buffer is full.
1231 rv = socket->SetSendBufferSize(kMaxPacketSize * 20); 1355 rv = socket->SetSendBufferSize(kMaxPacketSize * 20);
1232 if (rv != OK) { 1356 if (rv != OK) {
1233 HistogramCreateSessionFailure(CREATION_ERROR_SETTING_SEND_BUFFER); 1357 HistogramCreateSessionFailure(CREATION_ERROR_SETTING_SEND_BUFFER);
1234 return rv; 1358 return rv;
1235 } 1359 }
1236 1360
1237 socket->GetLocalAddress(&local_address_); 1361 socket->GetLocalAddress(&local_address_);
1238 if (check_persisted_supports_quic_) { 1362 if (check_persisted_supports_quic_) {
1239 check_persisted_supports_quic_ = false; 1363 check_persisted_supports_quic_ = false;
1240 IPAddressNumber last_address; 1364 IPAddressNumber last_address;
1241 if (http_server_properties_->GetSupportsQuic(&last_address) && 1365 if (http_server_properties_->GetSupportsQuic(&last_address) &&
1242 last_address == local_address_.address()) { 1366 last_address == local_address_.address()) {
1243 require_confirmation_ = false; 1367 require_confirmation_ = false;
1244 } 1368 }
1245 } 1369 }
1246 1370
1371 return OK;
1372 }
1373
1374 int QuicStreamFactory::CreateSession(const QuicServerId& server_id,
1375 int cert_verify_flags,
1376 scoped_ptr<QuicServerInfo> server_info,
1377 const AddressList& address_list,
1378 base::TimeTicks dns_resolution_end_time,
1379 const BoundNetLog& net_log,
1380 QuicChromiumClientSession** session) {
1381 IPEndPoint addr = *address_list.begin();
1382
1383 scoped_ptr<DatagramClientSocket> socket =
1384 CreateDatagramClientSocket(server_id, net_log);
1385
1386 int rv = ConfigureDatagramClientSocket(
1387 socket.get(), addr, NetworkChangeNotifier::kInvalidNetworkHandle);
Ryan Hamilton 2015/11/18 22:23:36 PLease add a comment here about using an "invalid"
Jana 2015/11/21 02:21:22 added a comment here and in the .h declaration of
1388
1389 if (rv != OK) {
1390 return rv;
1391 }
1392
1247 DefaultPacketWriterFactory packet_writer_factory(socket.get()); 1393 DefaultPacketWriterFactory packet_writer_factory(socket.get());
1248
1249 if (!helper_.get()) { 1394 if (!helper_.get()) {
1250 helper_.reset( 1395 helper_.reset(
1251 new QuicConnectionHelper(base::ThreadTaskRunnerHandle::Get().get(), 1396 new QuicConnectionHelper(base::ThreadTaskRunnerHandle::Get().get(),
1252 clock_.get(), random_generator_)); 1397 clock_.get(), random_generator_));
1253 } 1398 }
1254 1399
1400 QuicConnectionId connection_id = random_generator_->RandUint64();
1255 QuicConnection* connection = new QuicConnection( 1401 QuicConnection* connection = new QuicConnection(
1256 connection_id, addr, helper_.get(), packet_writer_factory, 1402 connection_id, addr, helper_.get(), packet_writer_factory,
1257 true /* owns_writer */, Perspective::IS_CLIENT, supported_versions_); 1403 true /* owns_writer */, Perspective::IS_CLIENT, supported_versions_);
1258 connection->SetMaxPacketLength(max_packet_length_); 1404 connection->SetMaxPacketLength(max_packet_length_);
1259 1405
1260 InitializeCachedStateInCryptoConfig(server_id, server_info); 1406 InitializeCachedStateInCryptoConfig(server_id, server_info);
1261 1407
1262 QuicConfig config = config_; 1408 QuicConfig config = config_;
1263 config.SetSocketReceiveBufferToSend(socket_receive_buffer_size_); 1409 config.SetSocketReceiveBufferToSend(socket_receive_buffer_size_);
1264 config.set_max_undecryptable_packets(kMaxUndecryptablePackets); 1410 config.set_max_undecryptable_packets(kMaxUndecryptablePackets);
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1448 // Since the session was active, there's no longer an 1594 // Since the session was active, there's no longer an
1449 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP 1595 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP
1450 // job also fails. So to avoid not using QUIC when we otherwise could, we mark 1596 // job also fails. So to avoid not using QUIC when we otherwise could, we mark
1451 // it as recently broken, which means that 0-RTT will be disabled but we'll 1597 // it as recently broken, which means that 0-RTT will be disabled but we'll
1452 // still race. 1598 // still race.
1453 http_server_properties_->MarkAlternativeServiceRecentlyBroken( 1599 http_server_properties_->MarkAlternativeServiceRecentlyBroken(
1454 alternative_service); 1600 alternative_service);
1455 } 1601 }
1456 1602
1457 } // namespace net 1603 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698