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

Side by Side Diff: net/tools/quic/stateless_rejector.cc

Issue 2322233004: Landing Recent QUIC changes until Sun Sep 4 03:41:00 (Closed)
Patch Set: Remove simulation files from the build. Created 4 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 unified diff | Download patch
« no previous file with comments | « net/tools/quic/stateless_rejector.h ('k') | net/tools/quic/stateless_rejector_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/tools/quic/stateless_rejector.h" 5 #include "net/tools/quic/stateless_rejector.h"
6 6
7 #include "net/quic/core/quic_crypto_server_stream.h" 7 #include "net/quic/core/quic_crypto_server_stream.h"
8 #include "net/quic/core/quic_flags.h" 8 #include "net/quic/core/quic_flags.h"
9 9
10 namespace net { 10 namespace net {
11 11
12 class StatelessRejector::ValidateCallback 12 class StatelessRejector::ValidateCallback
13 : public ValidateClientHelloResultCallback { 13 : public ValidateClientHelloResultCallback {
14 public: 14 public:
15 explicit ValidateCallback(StatelessRejector* rejector) 15 explicit ValidateCallback(
16 : rejector_(rejector) {} 16 std::unique_ptr<StatelessRejector> rejector,
17 std::unique_ptr<StatelessRejector::ProcessDoneCallback> cb)
18 : rejector_(std::move(rejector)), cb_(std::move(cb)) {}
17 19
18 ~ValidateCallback() override {} 20 ~ValidateCallback() override {}
19 21
20 void RunImpl(const CryptoHandshakeMessage& client_hello, 22 void RunImpl(const CryptoHandshakeMessage& client_hello,
21 const Result& result, 23 const Result& result,
22 std::unique_ptr<ProofSource::Details> /* proof_source_details */) 24 std::unique_ptr<ProofSource::Details> /* proof_source_details */)
23 override { 25 override {
24 rejector_->ProcessClientHello(client_hello, result); 26 StatelessRejector* rejector_ptr = rejector_.get();
27 rejector_ptr->ProcessClientHello(client_hello, result, std::move(rejector_),
28 std::move(cb_));
25 } 29 }
26 30
27 private: 31 private:
28 StatelessRejector* rejector_; 32 std::unique_ptr<StatelessRejector> rejector_;
33 std::unique_ptr<StatelessRejector::ProcessDoneCallback> cb_;
29 }; 34 };
30 35
31 StatelessRejector::StatelessRejector( 36 StatelessRejector::StatelessRejector(
32 QuicVersion version, 37 QuicVersion version,
33 const QuicVersionVector& versions, 38 const QuicVersionVector& versions,
34 const QuicCryptoServerConfig* crypto_config, 39 const QuicCryptoServerConfig* crypto_config,
35 QuicCompressedCertsCache* compressed_certs_cache, 40 QuicCompressedCertsCache* compressed_certs_cache,
36 const QuicClock* clock, 41 const QuicClock* clock,
37 QuicRandom* random, 42 QuicRandom* random,
38 QuicByteCount chlo_packet_size, 43 QuicByteCount chlo_packet_size,
39 const IPEndPoint& client_address, 44 const IPEndPoint& client_address,
40 const IPEndPoint& server_address) 45 const IPEndPoint& server_address)
41 : state_(FAILED), 46 : state_(UNKNOWN),
42 error_(QUIC_INTERNAL_ERROR), 47 error_(QUIC_INTERNAL_ERROR),
43 version_(version), 48 version_(version),
44 versions_(versions), 49 versions_(versions),
45 connection_id_(0), 50 connection_id_(0),
46 chlo_packet_size_(chlo_packet_size), 51 chlo_packet_size_(chlo_packet_size),
47 client_address_(client_address), 52 client_address_(client_address),
48 server_address_(server_address), 53 server_address_(server_address),
49 clock_(clock), 54 clock_(clock),
50 random_(random), 55 random_(random),
51 crypto_config_(crypto_config), 56 crypto_config_(crypto_config),
52 compressed_certs_cache_(compressed_certs_cache), 57 compressed_certs_cache_(compressed_certs_cache) {}
53 chlo_(nullptr) {}
54 58
55 StatelessRejector::~StatelessRejector() {} 59 StatelessRejector::~StatelessRejector() {}
56 60
57 void StatelessRejector::OnChlo(QuicVersion version, 61 void StatelessRejector::OnChlo(QuicVersion version,
58 QuicConnectionId connection_id, 62 QuicConnectionId connection_id,
59 QuicConnectionId server_designated_connection_id, 63 QuicConnectionId server_designated_connection_id,
60 const CryptoHandshakeMessage& message) { 64 const CryptoHandshakeMessage& message) {
61 DCHECK_EQ(kCHLO, message.tag()); 65 DCHECK_EQ(kCHLO, message.tag());
62 DCHECK_NE(connection_id, server_designated_connection_id); 66 DCHECK_NE(connection_id, server_designated_connection_id);
67 DCHECK_EQ(state_, UNKNOWN);
63 68
64 if (!FLAGS_enable_quic_stateless_reject_support || 69 if (!FLAGS_enable_quic_stateless_reject_support ||
65 !FLAGS_quic_use_cheap_stateless_rejects || 70 !FLAGS_quic_use_cheap_stateless_rejects ||
66 !QuicCryptoServerStream::DoesPeerSupportStatelessRejects(message) || 71 !QuicCryptoServerStream::DoesPeerSupportStatelessRejects(message) ||
67 version <= QUIC_VERSION_32) { 72 version <= QUIC_VERSION_32) {
68 state_ = UNSUPPORTED; 73 state_ = UNSUPPORTED;
69 return; 74 return;
70 } 75 }
71 76
72 connection_id_ = connection_id; 77 connection_id_ = connection_id;
73 server_designated_connection_id_ = server_designated_connection_id; 78 server_designated_connection_id_ = server_designated_connection_id;
74 chlo_ = &message; 79 chlo_ = message; // Note: copies the message
80 }
75 81
76 crypto_config_->ValidateClientHello( 82 void StatelessRejector::Process(std::unique_ptr<StatelessRejector> rejector,
77 message, client_address_.address(), server_address_.address(), version_, 83 std::unique_ptr<ProcessDoneCallback> cb) {
78 clock_, &proof_, new ValidateCallback(this)); 84 // If we were able to make a decision about this CHLO based purely on the
85 // information available in OnChlo, just invoke the done callback immediately.
86 if (rejector->state() != UNKNOWN) {
87 cb->Run(std::move(rejector));
88 return;
89 }
90
91 StatelessRejector* rejector_ptr = rejector.get();
92 rejector_ptr->crypto_config_->ValidateClientHello(
93 rejector_ptr->chlo_, rejector_ptr->client_address_.address(),
94 rejector_ptr->server_address_.address(), rejector_ptr->version_,
95 rejector_ptr->clock_, &rejector_ptr->proof_,
96 new ValidateCallback(std::move(rejector), std::move(cb)));
79 } 97 }
80 98
81 void StatelessRejector::ProcessClientHello( 99 void StatelessRejector::ProcessClientHello(
82 const CryptoHandshakeMessage& client_hello, 100 const CryptoHandshakeMessage& client_hello,
83 const ValidateClientHelloResultCallback::Result& result) { 101 const ValidateClientHelloResultCallback::Result& result,
102 std::unique_ptr<StatelessRejector> rejector,
103 std::unique_ptr<StatelessRejector::ProcessDoneCallback> cb) {
84 QuicCryptoNegotiatedParameters params; 104 QuicCryptoNegotiatedParameters params;
85 DiversificationNonce diversification_nonce; 105 DiversificationNonce diversification_nonce;
86 QuicErrorCode error = crypto_config_->ProcessClientHello( 106 QuicErrorCode error = crypto_config_->ProcessClientHello(
87 result, 107 result,
88 /*reject_only=*/true, connection_id_, server_address_.address(), 108 /*reject_only=*/true, connection_id_, server_address_.address(),
89 client_address_, version_, versions_, 109 client_address_, version_, versions_,
90 /*use_stateless_rejects=*/true, server_designated_connection_id_, clock_, 110 /*use_stateless_rejects=*/true, server_designated_connection_id_, clock_,
91 random_, compressed_certs_cache_, &params, &proof_, 111 random_, compressed_certs_cache_, &params, &proof_,
92 QuicCryptoStream::CryptoMessageFramingOverhead(version_), 112 QuicCryptoStream::CryptoMessageFramingOverhead(version_),
93 chlo_packet_size_, &reply_, &diversification_nonce, &error_details_); 113 chlo_packet_size_, &reply_, &diversification_nonce, &error_details_);
94 if (error != QUIC_NO_ERROR) { 114 if (error != QUIC_NO_ERROR) {
95 error_ = error; 115 error_ = error;
96 return; 116 state_ = FAILED;
117 } else if (reply_.tag() == kSREJ) {
118 state_ = REJECTED;
119 } else {
120 state_ = ACCEPTED;
97 } 121 }
98 122 cb->Run(std::move(rejector));
99 if (reply_.tag() == kSREJ) {
100 state_ = REJECTED;
101 return;
102 }
103
104 state_ = ACCEPTED;
105 } 123 }
106 124
107 } // namespace net 125 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/stateless_rejector.h ('k') | net/tools/quic/stateless_rejector_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698