OLD | NEW |
---|---|
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 <set> | 7 #include <set> |
8 | 8 |
9 #include "base/cpu.h" | 9 #include "base/cpu.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
64 // TODO: This should be tested and optimized, and even better, suggest a window | 64 // TODO: This should be tested and optimized, and even better, suggest a window |
65 // that corresponds to historical bandwidth and min-RTT. | 65 // that corresponds to historical bandwidth and min-RTT. |
66 // Larger initial congestion windows can, if we don't overshoot, reduce latency | 66 // Larger initial congestion windows can, if we don't overshoot, reduce latency |
67 // by avoiding the RTT needed for slow start to double (and re-double) from a | 67 // by avoiding the RTT needed for slow start to double (and re-double) from a |
68 // default of 10. | 68 // default of 10. |
69 // We match SPDY's use of 32 when secure (since we'd compete with SPDY). | 69 // We match SPDY's use of 32 when secure (since we'd compete with SPDY). |
70 const int32 kServerSecureInitialCongestionWindow = 32; | 70 const int32 kServerSecureInitialCongestionWindow = 32; |
71 // Be conservative, and just use double a typical TCP ICWND for HTTP. | 71 // Be conservative, and just use double a typical TCP ICWND for HTTP. |
72 const int32 kServerInecureInitialCongestionWindow = 20; | 72 const int32 kServerInecureInitialCongestionWindow = 20; |
73 | 73 |
74 const char kDummyHostname[] = "quic.global.props"; | |
75 const uint16 kDummyPort = 0; | |
76 | |
74 void HistogramCreateSessionFailure(enum CreateSessionFailure error) { | 77 void HistogramCreateSessionFailure(enum CreateSessionFailure error) { |
75 UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.CreationError", error, | 78 UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.CreationError", error, |
76 CREATION_ERROR_MAX); | 79 CREATION_ERROR_MAX); |
77 } | 80 } |
78 | 81 |
79 bool IsEcdsaSupported() { | 82 bool IsEcdsaSupported() { |
80 #if defined(OS_WIN) | 83 #if defined(OS_WIN) |
81 if (base::win::GetVersion() < base::win::VERSION_VISTA) | 84 if (base::win::GetVersion() < base::win::VERSION_VISTA) |
82 return false; | 85 return false; |
83 #endif | 86 #endif |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
518 crypto_config_.AddCanonicalSuffix(".googlevideo.com"); | 521 crypto_config_.AddCanonicalSuffix(".googlevideo.com"); |
519 crypto_config_.SetProofVerifier( | 522 crypto_config_.SetProofVerifier( |
520 new ProofVerifierChromium(cert_verifier, transport_security_state)); | 523 new ProofVerifierChromium(cert_verifier, transport_security_state)); |
521 crypto_config_.SetChannelIDSource( | 524 crypto_config_.SetChannelIDSource( |
522 new ChannelIDSourceChromium(channel_id_service)); | 525 new ChannelIDSourceChromium(channel_id_service)); |
523 base::CPU cpu; | 526 base::CPU cpu; |
524 if (cpu.has_aesni() && cpu.has_avx()) | 527 if (cpu.has_aesni() && cpu.has_avx()) |
525 crypto_config_.PreferAesGcm(); | 528 crypto_config_.PreferAesGcm(); |
526 if (!IsEcdsaSupported()) | 529 if (!IsEcdsaSupported()) |
527 crypto_config_.DisableEcdsa(); | 530 crypto_config_.DisableEcdsa(); |
531 if (http_server_properties_) { | |
532 // TODO(rtenneti): Delete host_port_pair and persist data in globals. | |
533 HostPortPair host_port_pair(kDummyHostname, kDummyPort); | |
534 if (http_server_properties_->GetSupportsQuic(host_port_pair).used_quic) | |
535 require_confirmation_ = false; | |
Ryan Hamilton
2014/09/25 20:59:42
This does not appear to be using the IP address. D
ramant (doing other things)
2014/09/26 00:04:05
Done.
| |
536 } | |
528 } | 537 } |
529 | 538 |
530 QuicStreamFactory::~QuicStreamFactory() { | 539 QuicStreamFactory::~QuicStreamFactory() { |
531 CloseAllSessions(ERR_ABORTED); | 540 CloseAllSessions(ERR_ABORTED); |
532 while (!all_sessions_.empty()) { | 541 while (!all_sessions_.empty()) { |
533 delete all_sessions_.begin()->first; | 542 delete all_sessions_.begin()->first; |
534 all_sessions_.erase(all_sessions_.begin()); | 543 all_sessions_.erase(all_sessions_.begin()); |
535 } | 544 } |
536 STLDeleteValues(&active_jobs_); | 545 STLDeleteValues(&active_jobs_); |
537 } | 546 } |
538 | 547 |
548 void QuicStreamFactory::set_require_confirmation(bool require_confirmation) { | |
549 require_confirmation_ = require_confirmation; | |
550 if (http_server_properties_) { | |
551 // TODO(rtenneti): Delete host_port_pair and persist data in globals. | |
552 HostPortPair host_port_pair(kDummyHostname, kDummyPort); | |
553 http_server_properties_->SetSupportsQuic( | |
554 host_port_pair, !require_confirmation, local_address_.ToString()); | |
555 } | |
556 } | |
557 | |
539 int QuicStreamFactory::Create(const HostPortPair& host_port_pair, | 558 int QuicStreamFactory::Create(const HostPortPair& host_port_pair, |
540 bool is_https, | 559 bool is_https, |
541 PrivacyMode privacy_mode, | 560 PrivacyMode privacy_mode, |
542 base::StringPiece method, | 561 base::StringPiece method, |
543 const BoundNetLog& net_log, | 562 const BoundNetLog& net_log, |
544 QuicStreamRequest* request) { | 563 QuicStreamRequest* request) { |
545 QuicServerId server_id(host_port_pair, is_https, privacy_mode); | 564 QuicServerId server_id(host_port_pair, is_https, privacy_mode); |
546 if (HasActiveSession(server_id)) { | 565 if (HasActiveSession(server_id)) { |
547 request->set_stream(CreateIfSessionExists(server_id, net_log)); | 566 request->set_stream(CreateIfSessionExists(server_id, net_log)); |
548 return OK; | 567 return OK; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
609 session_aliases_[session].insert(server_id); | 628 session_aliases_[session].insert(server_id); |
610 return true; | 629 return true; |
611 } | 630 } |
612 } | 631 } |
613 return false; | 632 return false; |
614 } | 633 } |
615 | 634 |
616 void QuicStreamFactory::OnJobComplete(Job* job, int rv) { | 635 void QuicStreamFactory::OnJobComplete(Job* job, int rv) { |
617 if (rv == OK) { | 636 if (rv == OK) { |
618 if (!always_require_handshake_confirmation_) | 637 if (!always_require_handshake_confirmation_) |
619 require_confirmation_ = false; | 638 set_require_confirmation(false); |
620 | 639 |
621 // Create all the streams, but do not notify them yet. | 640 // Create all the streams, but do not notify them yet. |
622 for (RequestSet::iterator it = job_requests_map_[job].begin(); | 641 for (RequestSet::iterator it = job_requests_map_[job].begin(); |
623 it != job_requests_map_[job].end() ; ++it) { | 642 it != job_requests_map_[job].end() ; ++it) { |
624 DCHECK(HasActiveSession(job->server_id())); | 643 DCHECK(HasActiveSession(job->server_id())); |
625 (*it)->set_stream(CreateIfSessionExists(job->server_id(), | 644 (*it)->set_stream(CreateIfSessionExists(job->server_id(), |
626 (*it)->net_log())); | 645 (*it)->net_log())); |
627 } | 646 } |
628 } | 647 } |
629 while (!job_requests_map_[job].empty()) { | 648 while (!job_requests_map_[job].empty()) { |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
765 } | 784 } |
766 return list; | 785 return list; |
767 } | 786 } |
768 | 787 |
769 void QuicStreamFactory::ClearCachedStatesInCryptoConfig() { | 788 void QuicStreamFactory::ClearCachedStatesInCryptoConfig() { |
770 crypto_config_.ClearCachedStates(); | 789 crypto_config_.ClearCachedStates(); |
771 } | 790 } |
772 | 791 |
773 void QuicStreamFactory::OnIPAddressChanged() { | 792 void QuicStreamFactory::OnIPAddressChanged() { |
774 CloseAllSessions(ERR_NETWORK_CHANGED); | 793 CloseAllSessions(ERR_NETWORK_CHANGED); |
775 require_confirmation_ = true; | 794 set_require_confirmation(true); |
776 } | 795 } |
777 | 796 |
778 void QuicStreamFactory::OnCertAdded(const X509Certificate* cert) { | 797 void QuicStreamFactory::OnCertAdded(const X509Certificate* cert) { |
779 CloseAllSessions(ERR_CERT_DATABASE_CHANGED); | 798 CloseAllSessions(ERR_CERT_DATABASE_CHANGED); |
780 } | 799 } |
781 | 800 |
782 void QuicStreamFactory::OnCACertChanged(const X509Certificate* cert) { | 801 void QuicStreamFactory::OnCACertChanged(const X509Certificate* cert) { |
783 // We should flush the sessions if we removed trust from a | 802 // We should flush the sessions if we removed trust from a |
784 // cert, because a previously trusted server may have become | 803 // cert, because a previously trusted server may have become |
785 // untrusted. | 804 // untrusted. |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
850 } | 869 } |
851 // Set a buffer large enough to contain the initial CWND's worth of packet | 870 // Set a buffer large enough to contain the initial CWND's worth of packet |
852 // to work around the problem with CHLO packets being sent out with the | 871 // to work around the problem with CHLO packets being sent out with the |
853 // wrong encryption level, when the send buffer is full. | 872 // wrong encryption level, when the send buffer is full. |
854 rv = socket->SetSendBufferSize(kMaxPacketSize * 20); | 873 rv = socket->SetSendBufferSize(kMaxPacketSize * 20); |
855 if (rv != OK) { | 874 if (rv != OK) { |
856 HistogramCreateSessionFailure(CREATION_ERROR_SETTING_SEND_BUFFER); | 875 HistogramCreateSessionFailure(CREATION_ERROR_SETTING_SEND_BUFFER); |
857 return rv; | 876 return rv; |
858 } | 877 } |
859 | 878 |
879 socket->GetLocalAddress(&local_address_); | |
860 DefaultPacketWriterFactory packet_writer_factory(socket.get()); | 880 DefaultPacketWriterFactory packet_writer_factory(socket.get()); |
861 | 881 |
862 if (!helper_.get()) { | 882 if (!helper_.get()) { |
863 helper_.reset(new QuicConnectionHelper( | 883 helper_.reset(new QuicConnectionHelper( |
864 base::MessageLoop::current()->message_loop_proxy().get(), | 884 base::MessageLoop::current()->message_loop_proxy().get(), |
865 clock_.get(), random_generator_)); | 885 clock_.get(), random_generator_)); |
866 } | 886 } |
867 | 887 |
868 QuicConnection* connection = new QuicConnection(connection_id, | 888 QuicConnection* connection = new QuicConnection(connection_id, |
869 addr, | 889 addr, |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1003 http_server_properties_->ClearAlternateProtocol(server); | 1023 http_server_properties_->ClearAlternateProtocol(server); |
1004 http_server_properties_->SetAlternateProtocol( | 1024 http_server_properties_->SetAlternateProtocol( |
1005 server, alternate.port, alternate.protocol, 1); | 1025 server, alternate.port, alternate.protocol, 1); |
1006 DCHECK_EQ(QUIC, | 1026 DCHECK_EQ(QUIC, |
1007 http_server_properties_->GetAlternateProtocol(server).protocol); | 1027 http_server_properties_->GetAlternateProtocol(server).protocol); |
1008 DCHECK(http_server_properties_->WasAlternateProtocolRecentlyBroken( | 1028 DCHECK(http_server_properties_->WasAlternateProtocolRecentlyBroken( |
1009 server)); | 1029 server)); |
1010 } | 1030 } |
1011 | 1031 |
1012 } // namespace net | 1032 } // namespace net |
OLD | NEW |