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

Side by Side Diff: net/quic/quic_framer.cc

Issue 12806002: Land Recent QUIC Changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor comment fix Created 7 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_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 (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_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include "base/hash_tables.h" 7 #include "base/hash_tables.h"
8 #include "net/quic/crypto/quic_decrypter.h" 8 #include "net/quic/crypto/quic_decrypter.h"
9 #include "net/quic/crypto/quic_encrypter.h" 9 #include "net/quic/crypto/quic_encrypter.h"
10 #include "net/quic/quic_data_reader.h" 10 #include "net/quic/quic_data_reader.h"
(...skipping 27 matching lines...) Expand all
38 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, 38 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target,
39 QuicPacketSequenceNumber a, 39 QuicPacketSequenceNumber a,
40 QuicPacketSequenceNumber b) { 40 QuicPacketSequenceNumber b) {
41 return (Delta(target, a) < Delta(target, b)) ? a : b; 41 return (Delta(target, a) < Delta(target, b)) ? a : b;
42 } 42 }
43 43
44 } // namespace 44 } // namespace
45 45
46 QuicFramer::QuicFramer(QuicVersionTag version, 46 QuicFramer::QuicFramer(QuicVersionTag version,
47 QuicDecrypter* decrypter, 47 QuicDecrypter* decrypter,
48 QuicEncrypter* encrypter) 48 QuicEncrypter* encrypter,
49 bool is_server)
49 : visitor_(NULL), 50 : visitor_(NULL),
50 fec_builder_(NULL), 51 fec_builder_(NULL),
51 error_(QUIC_NO_ERROR), 52 error_(QUIC_NO_ERROR),
52 last_sequence_number_(0), 53 last_sequence_number_(0),
53 quic_version_(version), 54 quic_version_(version),
54 decrypter_(decrypter), 55 decrypter_(decrypter),
55 encrypter_(encrypter) { 56 encrypter_(encrypter),
56 DCHECK_EQ(kQuicVersion1, version); 57 is_server_(is_server) {
58 DCHECK(IsSupportedVersion(version));
57 } 59 }
58 60
59 QuicFramer::~QuicFramer() {} 61 QuicFramer::~QuicFramer() {}
60 62
61 bool CanTruncate(const QuicFrame& frame) { 63 bool CanTruncate(const QuicFrame& frame) {
62 if (frame.type == ACK_FRAME || 64 if (frame.type == ACK_FRAME ||
63 frame.type == CONNECTION_CLOSE_FRAME) { 65 frame.type == CONNECTION_CLOSE_FRAME) {
64 return true; 66 return true;
65 } 67 }
66 return false; 68 return false;
(...skipping 22 matching lines...) Expand all
89 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + 91 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
90 GetMinAckFrameSize(); 92 GetMinAckFrameSize();
91 } 93 }
92 94
93 // static 95 // static
94 size_t QuicFramer::GetMinGoAwayFrameSize() { 96 size_t QuicFramer::GetMinGoAwayFrameSize() {
95 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + 97 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
96 kQuicStreamIdSize; 98 kQuicStreamIdSize;
97 } 99 }
98 100
101 bool QuicFramer::IsSupportedVersion(QuicVersionTag version) {
102 return version == kQuicVersion1;
103 }
104
105 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) {
106 return kQuicGuidSize + kPublicFlagsSize +
107 number_versions * kQuicVersionSize;
108 }
109
99 size_t QuicFramer::GetSerializedFrameLength( 110 size_t QuicFramer::GetSerializedFrameLength(
100 const QuicFrame& frame, size_t free_bytes, bool first_frame) { 111 const QuicFrame& frame, size_t free_bytes, bool first_frame) {
101 if (frame.type == PADDING_FRAME) { 112 if (frame.type == PADDING_FRAME) {
102 // PADDING implies end of packet. 113 // PADDING implies end of packet.
103 return free_bytes; 114 return free_bytes;
104 } 115 }
105 size_t frame_len = ComputeFrameLength(frame); 116 size_t frame_len = ComputeFrameLength(frame);
106 if (frame_len > free_bytes) { 117 if (frame_len > free_bytes) {
107 // Only truncate the first frame in a packet, so if subsequent ones go 118 // Only truncate the first frame in a packet, so if subsequent ones go
108 // over, stop including more frames. 119 // over, stop including more frames.
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 QuicPacket::NewFecPacket( 249 QuicPacket::NewFecPacket(
239 writer.take(), len, true, 250 writer.take(), len, true,
240 header.public_header.version_flag), 251 header.public_header.version_flag),
241 GetPacketEntropyHash(header), NULL); 252 GetPacketEntropyHash(header), NULL);
242 } 253 }
243 254
244 // static 255 // static
245 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket( 256 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket(
246 const QuicPublicResetPacket& packet) { 257 const QuicPublicResetPacket& packet) {
247 DCHECK(packet.public_header.reset_flag); 258 DCHECK(packet.public_header.reset_flag);
248 DCHECK(!packet.public_header.version_flag);
249 size_t len = GetPublicResetPacketSize(); 259 size_t len = GetPublicResetPacketSize();
250 QuicDataWriter writer(len); 260 QuicDataWriter writer(len);
251 261
252 if (!writer.WriteUInt64(packet.public_header.guid)) { 262 if (!writer.WriteUInt64(packet.public_header.guid)) {
253 return NULL; 263 return NULL;
254 } 264 }
255 265
256 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST); 266 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST);
257 if (!writer.WriteUInt8(flags)) { 267 if (!writer.WriteUInt8(flags)) {
258 return NULL; 268 return NULL;
259 } 269 }
260 270
261 if (!writer.WriteUInt64(packet.nonce_proof)) { 271 if (!writer.WriteUInt64(packet.nonce_proof)) {
262 return NULL; 272 return NULL;
263 } 273 }
264 274
265 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, 275 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number,
266 &writer)) { 276 &writer)) {
267 return NULL; 277 return NULL;
268 } 278 }
269 279
270 return new QuicEncryptedPacket(writer.take(), len, true); 280 return new QuicEncryptedPacket(writer.take(), len, true);
271 } 281 }
272 282
283 QuicEncryptedPacket* QuicFramer::ConstructVersionNegotiationPacket(
284 const QuicPacketPublicHeader& header,
285 const QuicVersionTagList& supported_versions) {
286 DCHECK(header.version_flag);
287 size_t len = GetVersionNegotiationPacketSize(supported_versions.size());
288 QuicDataWriter writer(len);
289
290 if (!writer.WriteUInt64(header.guid)) {
291 return NULL;
292 }
293
294 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION);
295 if (!writer.WriteUInt8(flags)) {
296 return NULL;
297 }
298
299 for (size_t i = 0; i < supported_versions.size(); ++i) {
300 if (!writer.WriteUInt32(supported_versions[i])) {
301 return NULL;
302 }
303 }
304
305 return new QuicEncryptedPacket(writer.take(), len, true);
306 }
307
273 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { 308 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
274 DCHECK(!reader_.get()); 309 DCHECK(!reader_.get());
275 reader_.reset(new QuicDataReader(packet.data(), packet.length())); 310 reader_.reset(new QuicDataReader(packet.data(), packet.length()));
276 311
312 visitor_->OnPacket();
313
277 // First parse the public header. 314 // First parse the public header.
278 QuicPacketPublicHeader public_header; 315 QuicPacketPublicHeader public_header;
279 if (!ProcessPublicHeader(&public_header)) { 316 if (!ProcessPublicHeader(&public_header)) {
280 DLOG(WARNING) << "Unable to process public header."; 317 DLOG(WARNING) << "Unable to process public header.";
281 return RaiseError(QUIC_INVALID_PACKET_HEADER); 318 return RaiseError(QUIC_INVALID_PACKET_HEADER);
282 } 319 }
283 // TODO(satyamshekhar): Handle version negotiation. 320
284 if (public_header.version_flag && public_header.version != quic_version_) { 321 if (is_server_ && public_header.version_flag &&
285 return false; 322 public_header.versions[0] != quic_version_) {
323 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) {
324 reader_.reset(NULL);
325 return true;
326 }
286 } 327 }
287 328
288 bool rv; 329 bool rv;
289 if (public_header.reset_flag) { 330 if (!is_server_ && public_header.version_flag) {
331 rv = ProcessVersionNegotiationPacket(&public_header);
332 } else if (public_header.reset_flag) {
290 rv = ProcessPublicResetPacket(public_header); 333 rv = ProcessPublicResetPacket(public_header);
291 } else { 334 } else {
292 rv = ProcessDataPacket(public_header, packet); 335 rv = ProcessDataPacket(public_header, packet);
293 } 336 }
294 337
295 reader_.reset(NULL); 338 reader_.reset(NULL);
296 return rv; 339 return rv;
297 } 340 }
298 341
342 bool QuicFramer::ProcessVersionNegotiationPacket(
343 QuicPacketPublicHeader* public_header) {
344 DCHECK(!is_server_);
345 // Try reading at least once to raise error if the packet is invalid.
346 do {
347 QuicVersionTag version;
348 if (!reader_->ReadBytes(&version, kQuicVersionSize)) {
349 set_detailed_error("Unable to read supported version in negotiation.");
350 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
351 }
352 public_header->versions.push_back(version);
353 } while (!reader_->IsDoneReading());
354
355 visitor_->OnVersionNegotiationPacket(*public_header);
356 return true;
357 }
358
299 bool QuicFramer::ProcessDataPacket( 359 bool QuicFramer::ProcessDataPacket(
300 const QuicPacketPublicHeader& public_header, 360 const QuicPacketPublicHeader& public_header,
301 const QuicEncryptedPacket& packet) { 361 const QuicEncryptedPacket& packet) {
302 visitor_->OnPacket();
303
304 QuicPacketHeader header(public_header); 362 QuicPacketHeader header(public_header);
305 if (!ProcessPacketHeader(&header, packet)) { 363 if (!ProcessPacketHeader(&header, packet)) {
306 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessPacketHeader sets the error. 364 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessPacketHeader sets the error.
307 DLOG(WARNING) << "Unable to process data packet header."; 365 DLOG(WARNING) << "Unable to process data packet header.";
308 return false; 366 return false;
309 } 367 }
310 368
311 if (!visitor_->OnPacketHeader(header)) { 369 if (!visitor_->OnPacketHeader(header)) {
312 // The visitor suppresses further processing of the packet. 370 // The visitor suppresses further processing of the packet.
313 return true; 371 return true;
(...skipping 23 matching lines...) Expand all
337 } 395 }
338 396
339 visitor_->OnPacketComplete(); 397 visitor_->OnPacketComplete();
340 return true; 398 return true;
341 } 399 }
342 400
343 bool QuicFramer::ProcessPublicResetPacket( 401 bool QuicFramer::ProcessPublicResetPacket(
344 const QuicPacketPublicHeader& public_header) { 402 const QuicPacketPublicHeader& public_header) {
345 QuicPublicResetPacket packet(public_header); 403 QuicPublicResetPacket packet(public_header);
346 if (!reader_->ReadUInt64(&packet.nonce_proof)) { 404 if (!reader_->ReadUInt64(&packet.nonce_proof)) {
405 // TODO(satyamshekhar): Raise error.
347 set_detailed_error("Unable to read nonce proof."); 406 set_detailed_error("Unable to read nonce proof.");
348 return false; 407 return false;
349 } 408 }
350 // TODO(satyamshekhar): validate nonce to protect against DoS. 409 // TODO(satyamshekhar): validate nonce to protect against DoS.
351 410
352 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { 411 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) {
353 set_detailed_error("Unable to read rejected sequence number."); 412 set_detailed_error("Unable to read rejected sequence number.");
354 return false; 413 return false;
355 } 414 }
356 visitor_->OnPublicResetPacket(packet); 415 visitor_->OnPublicResetPacket(packet);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 flags |= PACKET_PUBLIC_FLAGS_RST; 455 flags |= PACKET_PUBLIC_FLAGS_RST;
397 } 456 }
398 if (header.public_header.version_flag) { 457 if (header.public_header.version_flag) {
399 flags |= PACKET_PUBLIC_FLAGS_VERSION; 458 flags |= PACKET_PUBLIC_FLAGS_VERSION;
400 } 459 }
401 if (!writer->WriteUInt8(flags)) { 460 if (!writer->WriteUInt8(flags)) {
402 return false; 461 return false;
403 } 462 }
404 463
405 if (header.public_header.version_flag) { 464 if (header.public_header.version_flag) {
465 DCHECK(!is_server_);
406 writer->WriteUInt32(quic_version_); 466 writer->WriteUInt32(quic_version_);
407 } 467 }
408 468
409 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) { 469 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) {
410 return false; 470 return false;
411 } 471 }
412 472
413 flags = 0; 473 flags = 0;
414 if (header.fec_flag) { 474 if (header.fec_flag) {
415 flags |= PACKET_PRIVATE_FLAGS_FEC; 475 flags |= PACKET_PRIVATE_FLAGS_FEC;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 534
475 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) { 535 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) {
476 set_detailed_error("Illegal public flags value."); 536 set_detailed_error("Illegal public flags value.");
477 return false; 537 return false;
478 } 538 }
479 539
480 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; 540 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
481 public_header->version_flag = 541 public_header->version_flag =
482 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; 542 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
483 543
484 if (public_header->version_flag && 544 if (public_header->reset_flag && public_header->version_flag) {
485 !reader_->ReadUInt32(&public_header->version)) { 545 set_detailed_error("Got version flag in reset packet");
486 set_detailed_error("Unable to read protocol version.");
487 return false; 546 return false;
488 } 547 }
489 548
549 if (public_header->version_flag && is_server_) {
550 QuicVersionTag version;
551 if (!reader_->ReadUInt32(&version)) {
552 // Read the version only if the packet is from the client.
553 // version flag from the server means version negotiation packet.
554 set_detailed_error("Unable to read protocol version.");
555 return false;
556 }
557 public_header->versions.push_back(version);
558 }
490 return true; 559 return true;
491 } 560 }
492 561
493 // static 562 // static
494 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet, 563 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet,
495 QuicGuid* guid) { 564 QuicGuid* guid) {
496 QuicDataReader reader(packet.data(), packet.length()); 565 QuicDataReader reader(packet.data(), packet.length());
497 return reader.ReadUInt64(guid); 566 return reader.ReadUInt64(guid);
498 } 567 }
499 568
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) { 735 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) {
667 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) { 736 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) {
668 set_detailed_error("Unable to read entropy hash for received packets."); 737 set_detailed_error("Unable to read entropy hash for received packets.");
669 return false; 738 return false;
670 } 739 }
671 740
672 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) { 741 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) {
673 set_detailed_error("Unable to read largest observed."); 742 set_detailed_error("Unable to read largest observed.");
674 return false; 743 return false;
675 } 744 }
745 // TODO(pwestin): read and update delta_time_largest_observed.
676 746
677 uint8 num_missing_packets; 747 uint8 num_missing_packets;
678 if (!reader_->ReadBytes(&num_missing_packets, 1)) { 748 if (!reader_->ReadBytes(&num_missing_packets, 1)) {
679 set_detailed_error("Unable to read num missing packets."); 749 set_detailed_error("Unable to read num missing packets.");
680 return false; 750 return false;
681 } 751 }
682 752
683 for (int i = 0; i < num_missing_packets; ++i) { 753 for (int i = 0; i < num_missing_packets; ++i) {
684 QuicPacketSequenceNumber sequence_number; 754 QuicPacketSequenceNumber sequence_number;
685 if (!ProcessPacketSequenceNumber(&sequence_number)) { 755 if (!ProcessPacketSequenceNumber(&sequence_number)) {
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 } 952 }
883 frame.reason_phrase = reason_phrase.as_string(); 953 frame.reason_phrase = reason_phrase.as_string();
884 954
885 visitor_->OnGoAwayFrame(frame); 955 visitor_->OnGoAwayFrame(frame);
886 return true; 956 return true;
887 } 957 }
888 958
889 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( 959 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
890 const QuicEncryptedPacket& encrypted, bool includes_version) { 960 const QuicEncryptedPacket& encrypted, bool includes_version) {
891 return StringPiece(encrypted.data() + kStartOfHashData, 961 return StringPiece(encrypted.data() + kStartOfHashData,
892 GetStartOfEncryptedData(includes_version) 962 GetStartOfEncryptedData(includes_version) -
893 - kStartOfHashData); 963 kStartOfHashData);
894 } 964 }
895 965
896 QuicEncryptedPacket* QuicFramer::EncryptPacket( 966 QuicEncryptedPacket* QuicFramer::EncryptPacket(
897 QuicPacketSequenceNumber packet_sequence_number, 967 QuicPacketSequenceNumber packet_sequence_number,
898 const QuicPacket& packet) { 968 const QuicPacket& packet) {
899 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet_sequence_number, 969 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet_sequence_number,
900 packet.AssociatedData(), 970 packet.AssociatedData(),
901 packet.Plaintext())); 971 packet.Plaintext()));
902 if (out.get() == NULL) { 972 if (out.get() == NULL) {
903 RaiseError(QUIC_ENCRYPTION_FAILURE); 973 RaiseError(QUIC_ENCRYPTION_FAILURE);
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 size_t received_entropy_offset = writer->length(); 1139 size_t received_entropy_offset = writer->length();
1070 if (!writer->WriteUInt8(frame.received_info.entropy_hash)) { 1140 if (!writer->WriteUInt8(frame.received_info.entropy_hash)) {
1071 return false; 1141 return false;
1072 } 1142 }
1073 1143
1074 size_t largest_observed_offset = writer->length(); 1144 size_t largest_observed_offset = writer->length();
1075 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed, 1145 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed,
1076 writer)) { 1146 writer)) {
1077 return false; 1147 return false;
1078 } 1148 }
1149 // TODO(pwestin): calculate and add delta_time_largest_observed to the
1150 // message.
1079 1151
1080 // We don't check for overflowing uint8 here, because we only can fit 192 acks 1152 // We don't check for overflowing uint8 here, because we only can fit 192 acks
1081 // per packet, so if we overflow we will be truncated. 1153 // per packet, so if we overflow we will be truncated.
1082 uint8 num_missing_packets = frame.received_info.missing_packets.size(); 1154 uint8 num_missing_packets = frame.received_info.missing_packets.size();
1083 size_t num_missing_packets_offset = writer->length(); 1155 size_t num_missing_packets_offset = writer->length();
1084 if (!writer->WriteBytes(&num_missing_packets, 1)) { 1156 if (!writer->WriteBytes(&num_missing_packets, 1)) {
1085 return false; 1157 return false;
1086 } 1158 }
1087 1159
1088 SequenceNumberSet::const_iterator it = 1160 SequenceNumberSet::const_iterator it =
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 1323
1252 bool QuicFramer::RaiseError(QuicErrorCode error) { 1324 bool QuicFramer::RaiseError(QuicErrorCode error) {
1253 DLOG(INFO) << detailed_error_; 1325 DLOG(INFO) << detailed_error_;
1254 set_error(error); 1326 set_error(error);
1255 visitor_->OnError(this); 1327 visitor_->OnError(this);
1256 reader_.reset(NULL); 1328 reader_.reset(NULL);
1257 return false; 1329 return false;
1258 } 1330 }
1259 1331
1260 } // namespace net 1332 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698