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/core/quic_protocol.h" | 5 #include "net/quic/core/quic_protocol.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "net/quic/core/quic_flags.h" | 9 #include "net/quic/core/quic_flags.h" |
10 #include "net/quic/core/quic_utils.h" | 10 #include "net/quic/core/quic_utils.h" |
| 11 #include "net/quic/core/quic_versions.h" |
11 | 12 |
12 using base::StringPiece; | 13 using base::StringPiece; |
13 using std::map; | 14 using std::map; |
14 using std::numeric_limits; | 15 using std::numeric_limits; |
15 using std::ostream; | 16 using std::ostream; |
16 using std::string; | 17 using std::string; |
17 | 18 |
18 namespace net { | 19 namespace net { |
19 | 20 |
20 const char* const kFinalOffsetHeaderKey = ":final-offset"; | |
21 | |
22 size_t GetPacketHeaderSize(QuicVersion version, | 21 size_t GetPacketHeaderSize(QuicVersion version, |
23 const QuicPacketHeader& header) { | 22 const QuicPacketHeader& header) { |
24 return GetPacketHeaderSize(version, header.public_header.connection_id_length, | 23 return GetPacketHeaderSize(version, header.public_header.connection_id_length, |
25 header.public_header.version_flag, | 24 header.public_header.version_flag, |
26 header.public_header.multipath_flag, | 25 header.public_header.multipath_flag, |
27 header.public_header.nonce != nullptr, | 26 header.public_header.nonce != nullptr, |
28 header.public_header.packet_number_length); | 27 header.public_header.packet_number_length); |
29 } | 28 } |
30 | 29 |
31 size_t GetPacketHeaderSize(QuicVersion version, | 30 size_t GetPacketHeaderSize(QuicVersion version, |
32 QuicConnectionIdLength connection_id_length, | 31 QuicConnectionIdLength connection_id_length, |
33 bool include_version, | 32 bool include_version, |
34 bool include_path_id, | 33 bool include_path_id, |
35 bool include_diversification_nonce, | 34 bool include_diversification_nonce, |
36 QuicPacketNumberLength packet_number_length) { | 35 QuicPacketNumberLength packet_number_length) { |
37 return kPublicFlagsSize + connection_id_length + | 36 return kPublicFlagsSize + connection_id_length + |
38 (include_version ? kQuicVersionSize : 0) + | 37 (include_version ? kQuicVersionSize : 0) + |
39 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length + | 38 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length + |
40 (include_diversification_nonce ? kDiversificationNonceSize : 0) + | 39 (include_diversification_nonce ? kDiversificationNonceSize : 0); |
41 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
42 } | 40 } |
43 | 41 |
44 size_t GetStartOfEncryptedData(QuicVersion version, | 42 size_t GetStartOfEncryptedData(QuicVersion version, |
45 const QuicPacketHeader& header) { | 43 const QuicPacketHeader& header) { |
46 return GetPacketHeaderSize(version, header) - | 44 return GetPacketHeaderSize(version, header); |
47 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
48 } | 45 } |
49 | 46 |
50 size_t GetStartOfEncryptedData(QuicVersion version, | 47 size_t GetStartOfEncryptedData(QuicVersion version, |
51 QuicConnectionIdLength connection_id_length, | 48 QuicConnectionIdLength connection_id_length, |
52 bool include_version, | 49 bool include_version, |
53 bool include_path_id, | 50 bool include_path_id, |
54 bool include_diversification_nonce, | 51 bool include_diversification_nonce, |
55 QuicPacketNumberLength packet_number_length) { | 52 QuicPacketNumberLength packet_number_length) { |
56 // Encryption starts before private flags. | 53 // Encryption starts before private flags. |
57 return GetPacketHeaderSize(version, connection_id_length, include_version, | 54 return GetPacketHeaderSize(version, connection_id_length, include_version, |
58 include_path_id, include_diversification_nonce, | 55 include_path_id, include_diversification_nonce, |
59 packet_number_length) - | 56 packet_number_length); |
60 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
61 } | 57 } |
62 | 58 |
63 QuicPacketPublicHeader::QuicPacketPublicHeader() | 59 QuicPacketPublicHeader::QuicPacketPublicHeader() |
64 : connection_id(0), | 60 : connection_id(0), |
65 connection_id_length(PACKET_8BYTE_CONNECTION_ID), | 61 connection_id_length(PACKET_8BYTE_CONNECTION_ID), |
66 multipath_flag(false), | 62 multipath_flag(false), |
67 reset_flag(false), | 63 reset_flag(false), |
68 version_flag(false), | 64 version_flag(false), |
69 packet_number_length(PACKET_6BYTE_PACKET_NUMBER), | 65 packet_number_length(PACKET_6BYTE_PACKET_NUMBER), |
70 nonce(nullptr) {} | 66 nonce(nullptr) {} |
71 | 67 |
72 QuicPacketPublicHeader::QuicPacketPublicHeader( | 68 QuicPacketPublicHeader::QuicPacketPublicHeader( |
73 const QuicPacketPublicHeader& other) = default; | 69 const QuicPacketPublicHeader& other) = default; |
74 | 70 |
75 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} | 71 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} |
76 | 72 |
77 QuicPacketHeader::QuicPacketHeader() | 73 QuicPacketHeader::QuicPacketHeader() |
78 : packet_number(0), | 74 : packet_number(0), path_id(kDefaultPathId) {} |
79 path_id(kDefaultPathId), | |
80 entropy_flag(false), | |
81 entropy_hash(0) {} | |
82 | 75 |
83 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) | 76 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) |
84 : public_header(header), | 77 : public_header(header), packet_number(0), path_id(kDefaultPathId) {} |
85 packet_number(0), | |
86 path_id(kDefaultPathId), | |
87 entropy_flag(false), | |
88 entropy_hash(0) {} | |
89 | 78 |
90 QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default; | 79 QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default; |
91 | 80 |
92 QuicPublicResetPacket::QuicPublicResetPacket() | 81 QuicPublicResetPacket::QuicPublicResetPacket() |
93 : nonce_proof(0), rejected_packet_number(0) {} | 82 : nonce_proof(0), rejected_packet_number(0) {} |
94 | 83 |
95 QuicPublicResetPacket::QuicPublicResetPacket( | 84 QuicPublicResetPacket::QuicPublicResetPacket( |
96 const QuicPacketPublicHeader& header) | 85 const QuicPacketPublicHeader& header) |
97 : public_header(header), nonce_proof(0), rejected_packet_number(0) {} | 86 : public_header(header), nonce_proof(0), rejected_packet_number(0) {} |
98 | 87 |
99 QuicBufferAllocator::~QuicBufferAllocator() = default; | |
100 | |
101 void StreamBufferDeleter::operator()(char* buffer) const { | 88 void StreamBufferDeleter::operator()(char* buffer) const { |
102 if (allocator_ != nullptr && buffer != nullptr) { | 89 if (allocator_ != nullptr && buffer != nullptr) { |
103 allocator_->Delete(buffer); | 90 allocator_->Delete(buffer); |
104 } | 91 } |
105 } | 92 } |
106 | 93 |
107 UniqueStreamBuffer NewStreamBuffer(QuicBufferAllocator* allocator, | 94 UniqueStreamBuffer NewStreamBuffer(QuicBufferAllocator* allocator, |
108 size_t size) { | 95 size_t size) { |
109 return UniqueStreamBuffer(allocator->New(size), | 96 return UniqueStreamBuffer(allocator->New(size), |
110 StreamBufferDeleter(allocator)); | 97 StreamBufferDeleter(allocator)); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 offset(offset), | 139 offset(offset), |
153 buffer(std::move(buffer)) { | 140 buffer(std::move(buffer)) { |
154 if (this->buffer != nullptr) { | 141 if (this->buffer != nullptr) { |
155 DCHECK(data_buffer == nullptr); | 142 DCHECK(data_buffer == nullptr); |
156 this->data_buffer = this->buffer.get(); | 143 this->data_buffer = this->buffer.get(); |
157 } | 144 } |
158 } | 145 } |
159 | 146 |
160 QuicStreamFrame::~QuicStreamFrame() {} | 147 QuicStreamFrame::~QuicStreamFrame() {} |
161 | 148 |
162 uint32_t MakeQuicTag(char a, char b, char c, char d) { | |
163 return static_cast<uint32_t>(a) | static_cast<uint32_t>(b) << 8 | | |
164 static_cast<uint32_t>(c) << 16 | static_cast<uint32_t>(d) << 24; | |
165 } | |
166 | |
167 bool ContainsQuicTag(const QuicTagVector& tag_vector, QuicTag tag) { | |
168 return std::find(tag_vector.begin(), tag_vector.end(), tag) != | |
169 tag_vector.end(); | |
170 } | |
171 | |
172 QuicVersionVector AllSupportedVersions() { | |
173 QuicVersionVector supported_versions; | |
174 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
175 supported_versions.push_back(kSupportedQuicVersions[i]); | |
176 } | |
177 return supported_versions; | |
178 } | |
179 | |
180 QuicVersionVector CurrentSupportedVersions() { | |
181 return FilterSupportedVersions(AllSupportedVersions()); | |
182 } | |
183 | |
184 QuicVersionVector FilterSupportedVersions(QuicVersionVector versions) { | |
185 QuicVersionVector filtered_versions(versions.size()); | |
186 filtered_versions.clear(); // Guaranteed by spec not to change capacity. | |
187 for (QuicVersion version : versions) { | |
188 if (version < QUIC_VERSION_34) { | |
189 if (!FLAGS_quic_disable_pre_34) { | |
190 filtered_versions.push_back(version); | |
191 } | |
192 } else if (version == QUIC_VERSION_35) { | |
193 if (FLAGS_quic_enable_version_35) { | |
194 filtered_versions.push_back(version); | |
195 } | |
196 } else if (version == QUIC_VERSION_36) { | |
197 if (FLAGS_quic_enable_version_35 && FLAGS_quic_enable_version_36_v2) { | |
198 filtered_versions.push_back(version); | |
199 } | |
200 } else { | |
201 filtered_versions.push_back(version); | |
202 } | |
203 } | |
204 return filtered_versions; | |
205 } | |
206 | |
207 QuicVersionVector VersionOfIndex(const QuicVersionVector& versions, int index) { | |
208 QuicVersionVector version; | |
209 int version_count = versions.size(); | |
210 if (index >= 0 && index < version_count) { | |
211 version.push_back(versions[index]); | |
212 } else { | |
213 version.push_back(QUIC_VERSION_UNSUPPORTED); | |
214 } | |
215 return version; | |
216 } | |
217 | |
218 QuicTag QuicVersionToQuicTag(const QuicVersion version) { | |
219 switch (version) { | |
220 case QUIC_VERSION_32: | |
221 return MakeQuicTag('Q', '0', '3', '2'); | |
222 case QUIC_VERSION_33: | |
223 return MakeQuicTag('Q', '0', '3', '3'); | |
224 case QUIC_VERSION_34: | |
225 return MakeQuicTag('Q', '0', '3', '4'); | |
226 case QUIC_VERSION_35: | |
227 return MakeQuicTag('Q', '0', '3', '5'); | |
228 case QUIC_VERSION_36: | |
229 return MakeQuicTag('Q', '0', '3', '6'); | |
230 default: | |
231 // This shold be an ERROR because we should never attempt to convert an | |
232 // invalid QuicVersion to be written to the wire. | |
233 LOG(ERROR) << "Unsupported QuicVersion: " << version; | |
234 return 0; | |
235 } | |
236 } | |
237 | |
238 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) { | |
239 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
240 if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) { | |
241 return kSupportedQuicVersions[i]; | |
242 } | |
243 } | |
244 // Reading from the client so this should not be considered an ERROR. | |
245 DVLOG(1) << "Unsupported QuicTag version: " | |
246 << QuicUtils::TagToString(version_tag); | |
247 return QUIC_VERSION_UNSUPPORTED; | |
248 } | |
249 | |
250 #define RETURN_STRING_LITERAL(x) \ | |
251 case x: \ | |
252 return #x | |
253 | |
254 string QuicVersionToString(const QuicVersion version) { | |
255 switch (version) { | |
256 RETURN_STRING_LITERAL(QUIC_VERSION_32); | |
257 RETURN_STRING_LITERAL(QUIC_VERSION_33); | |
258 RETURN_STRING_LITERAL(QUIC_VERSION_34); | |
259 RETURN_STRING_LITERAL(QUIC_VERSION_35); | |
260 RETURN_STRING_LITERAL(QUIC_VERSION_36); | |
261 default: | |
262 return "QUIC_VERSION_UNSUPPORTED"; | |
263 } | |
264 } | |
265 | |
266 string QuicVersionVectorToString(const QuicVersionVector& versions) { | |
267 string result = ""; | |
268 for (size_t i = 0; i < versions.size(); ++i) { | |
269 if (i != 0) { | |
270 result.append(","); | |
271 } | |
272 result.append(QuicVersionToString(versions[i])); | |
273 } | |
274 return result; | |
275 } | |
276 | |
277 ostream& operator<<(ostream& os, const Perspective& s) { | |
278 if (s == Perspective::IS_SERVER) { | |
279 os << "IS_SERVER"; | |
280 } else { | |
281 os << "IS_CLIENT"; | |
282 } | |
283 return os; | |
284 } | |
285 | |
286 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { | 149 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { |
287 os << "{ connection_id: " << header.public_header.connection_id | 150 os << "{ connection_id: " << header.public_header.connection_id |
288 << ", connection_id_length: " << header.public_header.connection_id_length | 151 << ", connection_id_length: " << header.public_header.connection_id_length |
289 << ", packet_number_length: " << header.public_header.packet_number_length | 152 << ", packet_number_length: " << header.public_header.packet_number_length |
290 << ", multipath_flag: " << header.public_header.multipath_flag | 153 << ", multipath_flag: " << header.public_header.multipath_flag |
291 << ", reset_flag: " << header.public_header.reset_flag | 154 << ", reset_flag: " << header.public_header.reset_flag |
292 << ", version_flag: " << header.public_header.version_flag; | 155 << ", version_flag: " << header.public_header.version_flag; |
293 if (header.public_header.version_flag) { | 156 if (header.public_header.version_flag) { |
294 os << ", version:"; | 157 os << ", version:"; |
295 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { | 158 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { |
296 os << " "; | 159 os << " "; |
297 os << QuicVersionToString(header.public_header.versions[i]); | 160 os << QuicVersionToString(header.public_header.versions[i]); |
298 } | 161 } |
299 } | 162 } |
300 if (header.public_header.nonce != nullptr) { | 163 if (header.public_header.nonce != nullptr) { |
301 os << ", diversification_nonce: " | 164 os << ", diversification_nonce: " |
302 << QuicUtils::HexEncode(StringPiece(header.public_header.nonce->data(), | 165 << QuicUtils::HexEncode(StringPiece(header.public_header.nonce->data(), |
303 header.public_header.nonce->size())); | 166 header.public_header.nonce->size())); |
304 } | 167 } |
305 os << ", entropy_flag: " << header.entropy_flag | 168 os << ", path_id: " << static_cast<int>(header.path_id) |
306 << ", entropy hash: " << static_cast<int>(header.entropy_hash) | |
307 << ", path_id: " << static_cast<int>(header.path_id) | |
308 << ", packet_number: " << header.packet_number << " }\n"; | 169 << ", packet_number: " << header.packet_number << " }\n"; |
309 return os; | 170 return os; |
310 } | 171 } |
311 | 172 |
312 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, | 173 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, |
313 QuicPacketNumber packet_number, | 174 QuicPacketNumber packet_number, |
314 QuicPacketNumber peer_least_packet_awaiting_ack) { | 175 QuicPacketNumber peer_least_packet_awaiting_ack) { |
315 if (ack_frame.missing) { | |
316 return packet_number > ack_frame.largest_observed || | |
317 ack_frame.packets.Contains(packet_number); | |
318 } | |
319 return packet_number >= peer_least_packet_awaiting_ack && | 176 return packet_number >= peer_least_packet_awaiting_ack && |
320 !ack_frame.packets.Contains(packet_number); | 177 !ack_frame.packets.Contains(packet_number); |
321 } | 178 } |
322 | 179 |
323 QuicStopWaitingFrame::QuicStopWaitingFrame() | 180 QuicStopWaitingFrame::QuicStopWaitingFrame() |
324 : path_id(kDefaultPathId), entropy_hash(0), least_unacked(0) {} | 181 : path_id(kDefaultPathId), least_unacked(0) {} |
325 | 182 |
326 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} | 183 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} |
327 | 184 |
328 QuicAckFrame::QuicAckFrame() | 185 QuicAckFrame::QuicAckFrame() |
329 : largest_observed(0), | 186 : largest_observed(0), |
330 ack_delay_time(QuicTime::Delta::Infinite()), | 187 ack_delay_time(QuicTime::Delta::Infinite()), |
331 path_id(kDefaultPathId), | 188 path_id(kDefaultPathId) {} |
332 entropy_hash(0), | |
333 is_truncated(false), | |
334 missing(true) {} | |
335 | 189 |
336 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; | 190 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; |
337 | 191 |
338 QuicAckFrame::~QuicAckFrame() {} | 192 QuicAckFrame::~QuicAckFrame() {} |
339 | 193 |
340 QuicRstStreamFrame::QuicRstStreamFrame() | 194 QuicRstStreamFrame::QuicRstStreamFrame() |
341 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR), byte_offset(0) {} | 195 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR), byte_offset(0) {} |
342 | 196 |
343 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, | 197 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, |
344 QuicRstStreamErrorCode error_code, | 198 QuicRstStreamErrorCode error_code, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) | 235 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) |
382 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {} | 236 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {} |
383 | 237 |
384 QuicFrame::QuicFrame(QuicBlockedFrame* frame) | 238 QuicFrame::QuicFrame(QuicBlockedFrame* frame) |
385 : type(BLOCKED_FRAME), blocked_frame(frame) {} | 239 : type(BLOCKED_FRAME), blocked_frame(frame) {} |
386 | 240 |
387 QuicFrame::QuicFrame(QuicPathCloseFrame* frame) | 241 QuicFrame::QuicFrame(QuicPathCloseFrame* frame) |
388 : type(PATH_CLOSE_FRAME), path_close_frame(frame) {} | 242 : type(PATH_CLOSE_FRAME), path_close_frame(frame) {} |
389 | 243 |
390 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { | 244 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { |
391 os << "{ entropy_hash: " << static_cast<int>(sent_info.entropy_hash) | 245 os << "{ least_unacked: " << sent_info.least_unacked << " }\n"; |
392 << ", least_unacked: " << sent_info.least_unacked << " }\n"; | |
393 return os; | 246 return os; |
394 } | 247 } |
395 | 248 |
396 PacketNumberQueue::PacketNumberQueue() = default; | 249 PacketNumberQueue::PacketNumberQueue() = default; |
397 PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default; | 250 PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default; |
398 // TODO(rtenneti): on windows RValue reference gives errors. | 251 // TODO(rtenneti): on windows RValue reference gives errors. |
399 // PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default; | 252 // PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default; |
400 PacketNumberQueue::~PacketNumberQueue() {} | 253 PacketNumberQueue::~PacketNumberQueue() {} |
401 | 254 |
402 PacketNumberQueue& PacketNumberQueue::operator=( | 255 PacketNumberQueue& PacketNumberQueue::operator=( |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 for (const Interval<QuicPacketNumber>& interval : q) { | 363 for (const Interval<QuicPacketNumber>& interval : q) { |
511 for (QuicPacketNumber packet_number = interval.min(); | 364 for (QuicPacketNumber packet_number = interval.min(); |
512 packet_number < interval.max(); ++packet_number) { | 365 packet_number < interval.max(); ++packet_number) { |
513 os << packet_number << " "; | 366 os << packet_number << " "; |
514 } | 367 } |
515 } | 368 } |
516 return os; | 369 return os; |
517 } | 370 } |
518 | 371 |
519 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { | 372 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { |
520 os << "{ entropy_hash: " << static_cast<int>(ack_frame.entropy_hash) | 373 os << "{ largest_observed: " << ack_frame.largest_observed |
521 << ", largest_observed: " << ack_frame.largest_observed | |
522 << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds() | 374 << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds() |
523 << ", packets: [ " << ack_frame.packets << " ]" | 375 << ", packets: [ " << ack_frame.packets << " ]" |
524 << ", is_truncated: " << ack_frame.is_truncated | |
525 << ", received_packets: [ "; | 376 << ", received_packets: [ "; |
526 for (const std::pair<QuicPacketNumber, QuicTime>& p : | 377 for (const std::pair<QuicPacketNumber, QuicTime>& p : |
527 ack_frame.received_packet_times) { | 378 ack_frame.received_packet_times) { |
528 os << p.first << " at " << p.second.ToDebuggingValue() << " "; | 379 os << p.first << " at " << p.second.ToDebuggingValue() << " "; |
529 } | 380 } |
530 os << " ] }\n"; | 381 os << " ] }\n"; |
531 return os; | 382 return os; |
532 } | 383 } |
533 | 384 |
534 ostream& operator<<(ostream& os, const QuicFrame& frame) { | 385 ostream& operator<<(ostream& os, const QuicFrame& frame) { |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 | 603 |
753 StringPiece QuicPacket::Plaintext(QuicVersion version) const { | 604 StringPiece QuicPacket::Plaintext(QuicVersion version) const { |
754 const size_t start_of_encrypted_data = GetStartOfEncryptedData( | 605 const size_t start_of_encrypted_data = GetStartOfEncryptedData( |
755 version, connection_id_length_, includes_version_, includes_path_id_, | 606 version, connection_id_length_, includes_version_, includes_path_id_, |
756 includes_diversification_nonce_, packet_number_length_); | 607 includes_diversification_nonce_, packet_number_length_); |
757 return StringPiece(data() + start_of_encrypted_data, | 608 return StringPiece(data() + start_of_encrypted_data, |
758 length() - start_of_encrypted_data); | 609 length() - start_of_encrypted_data); |
759 } | 610 } |
760 | 611 |
761 QuicVersionManager::QuicVersionManager(QuicVersionVector supported_versions) | 612 QuicVersionManager::QuicVersionManager(QuicVersionVector supported_versions) |
762 : disable_pre_34_(FLAGS_quic_disable_pre_34), | 613 : enable_version_36_(FLAGS_quic_enable_version_36_v3), |
763 enable_version_35_(FLAGS_quic_enable_version_35), | |
764 enable_version_36_(FLAGS_quic_enable_version_36_v2), | |
765 allowed_supported_versions_(supported_versions), | 614 allowed_supported_versions_(supported_versions), |
766 filtered_supported_versions_( | 615 filtered_supported_versions_( |
767 FilterSupportedVersions(supported_versions)) {} | 616 FilterSupportedVersions(supported_versions)) {} |
768 | 617 |
769 QuicVersionManager::~QuicVersionManager() {} | 618 QuicVersionManager::~QuicVersionManager() {} |
770 | 619 |
771 const QuicVersionVector& QuicVersionManager::GetSupportedVersions() { | 620 const QuicVersionVector& QuicVersionManager::GetSupportedVersions() { |
772 if (disable_pre_34_ != FLAGS_quic_disable_pre_34 || | 621 MaybeRefilterSupportedVersions(); |
773 enable_version_35_ != FLAGS_quic_enable_version_35 || | 622 return filtered_supported_versions_; |
774 enable_version_36_ != FLAGS_quic_enable_version_36_v2) { | 623 } |
775 disable_pre_34_ = FLAGS_quic_disable_pre_34; | 624 |
776 enable_version_35_ = FLAGS_quic_enable_version_35; | 625 void QuicVersionManager::MaybeRefilterSupportedVersions() { |
777 enable_version_36_ = FLAGS_quic_enable_version_36_v2; | 626 if (enable_version_36_ != FLAGS_quic_enable_version_36_v3) { |
778 filtered_supported_versions_ = | 627 enable_version_36_ = FLAGS_quic_enable_version_36_v3; |
779 FilterSupportedVersions(allowed_supported_versions_); | 628 RefilterSupportedVersions(); |
780 } | 629 } |
781 return filtered_supported_versions_; | 630 } |
| 631 |
| 632 void QuicVersionManager::RefilterSupportedVersions() { |
| 633 filtered_supported_versions_ = |
| 634 FilterSupportedVersions(allowed_supported_versions_); |
782 } | 635 } |
783 | 636 |
784 AckListenerWrapper::AckListenerWrapper(QuicAckListenerInterface* listener, | 637 AckListenerWrapper::AckListenerWrapper(QuicAckListenerInterface* listener, |
785 QuicPacketLength data_length) | 638 QuicPacketLength data_length) |
786 : ack_listener(listener), length(data_length) { | 639 : ack_listener(listener), length(data_length) { |
787 DCHECK(listener != nullptr); | 640 DCHECK(listener != nullptr); |
788 } | 641 } |
789 | 642 |
790 AckListenerWrapper::AckListenerWrapper(const AckListenerWrapper& other) = | 643 AckListenerWrapper::AckListenerWrapper(const AckListenerWrapper& other) = |
791 default; | 644 default; |
792 | 645 |
793 AckListenerWrapper::~AckListenerWrapper() {} | 646 AckListenerWrapper::~AckListenerWrapper() {} |
794 | 647 |
795 SerializedPacket::SerializedPacket(QuicPathId path_id, | 648 SerializedPacket::SerializedPacket(QuicPathId path_id, |
796 QuicPacketNumber packet_number, | 649 QuicPacketNumber packet_number, |
797 QuicPacketNumberLength packet_number_length, | 650 QuicPacketNumberLength packet_number_length, |
798 const char* encrypted_buffer, | 651 const char* encrypted_buffer, |
799 QuicPacketLength encrypted_length, | 652 QuicPacketLength encrypted_length, |
800 QuicPacketEntropyHash entropy_hash, | |
801 bool has_ack, | 653 bool has_ack, |
802 bool has_stop_waiting) | 654 bool has_stop_waiting) |
803 : encrypted_buffer(encrypted_buffer), | 655 : encrypted_buffer(encrypted_buffer), |
804 encrypted_length(encrypted_length), | 656 encrypted_length(encrypted_length), |
805 has_crypto_handshake(NOT_HANDSHAKE), | 657 has_crypto_handshake(NOT_HANDSHAKE), |
806 num_padding_bytes(0), | 658 num_padding_bytes(0), |
807 path_id(path_id), | 659 path_id(path_id), |
808 packet_number(packet_number), | 660 packet_number(packet_number), |
809 packet_number_length(packet_number_length), | 661 packet_number_length(packet_number_length), |
810 encryption_level(ENCRYPTION_NONE), | 662 encryption_level(ENCRYPTION_NONE), |
811 entropy_hash(entropy_hash), | |
812 has_ack(has_ack), | 663 has_ack(has_ack), |
813 has_stop_waiting(has_stop_waiting), | 664 has_stop_waiting(has_stop_waiting), |
814 transmission_type(NOT_RETRANSMISSION), | 665 transmission_type(NOT_RETRANSMISSION), |
815 original_path_id(kInvalidPathId), | 666 original_path_id(kInvalidPathId), |
816 original_packet_number(0) {} | 667 original_packet_number(0) {} |
817 | 668 |
818 SerializedPacket::SerializedPacket(const SerializedPacket& other) = default; | 669 SerializedPacket::SerializedPacket(const SerializedPacket& other) = default; |
819 | 670 |
820 SerializedPacket::~SerializedPacket() {} | 671 SerializedPacket::~SerializedPacket() {} |
821 | 672 |
(...skipping 25 matching lines...) Expand all Loading... |
847 is_unackable(false), | 698 is_unackable(false), |
848 has_crypto_handshake(has_crypto_handshake), | 699 has_crypto_handshake(has_crypto_handshake), |
849 num_padding_bytes(num_padding_bytes), | 700 num_padding_bytes(num_padding_bytes), |
850 retransmission(0) {} | 701 retransmission(0) {} |
851 | 702 |
852 TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default; | 703 TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default; |
853 | 704 |
854 TransmissionInfo::~TransmissionInfo() {} | 705 TransmissionInfo::~TransmissionInfo() {} |
855 | 706 |
856 } // namespace net | 707 } // namespace net |
OLD | NEW |