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

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

Issue 14816006: Land Recent QUIC changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added missing NET_PRIVATE_EXPORT to QuicWallTime Created 7 years, 7 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 } 38 }
39 39
40 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, 40 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target,
41 QuicPacketSequenceNumber a, 41 QuicPacketSequenceNumber a,
42 QuicPacketSequenceNumber b) { 42 QuicPacketSequenceNumber b) {
43 return (Delta(target, a) < Delta(target, b)) ? a : b; 43 return (Delta(target, a) < Delta(target, b)) ? a : b;
44 } 44 }
45 45
46 } // namespace 46 } // namespace
47 47
48 QuicFramer::QuicFramer(QuicVersionTag version, 48 QuicFramer::QuicFramer(QuicTag version,
49 QuicTime creation_time, 49 QuicTime creation_time,
50 bool is_server) 50 bool is_server)
51 : visitor_(NULL), 51 : visitor_(NULL),
52 fec_builder_(NULL), 52 fec_builder_(NULL),
53 error_(QUIC_NO_ERROR), 53 error_(QUIC_NO_ERROR),
54 last_sequence_number_(0), 54 last_sequence_number_(0),
55 quic_version_(version), 55 quic_version_(version),
56 decrypter_(QuicDecrypter::Create(kNULL)), 56 decrypter_(QuicDecrypter::Create(kNULL)),
57 alternative_decrypter_latch_(false),
57 is_server_(is_server), 58 is_server_(is_server),
58 creation_time_(creation_time) { 59 creation_time_(creation_time) {
59 DCHECK(IsSupportedVersion(version)); 60 DCHECK(IsSupportedVersion(version));
60 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); 61 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL));
61 } 62 }
62 63
63 QuicFramer::~QuicFramer() {} 64 QuicFramer::~QuicFramer() {}
64 65
65 bool CanTruncate(const QuicFrame& frame) { 66 bool CanTruncate(const QuicFrame& frame) {
66 if (frame.type == ACK_FRAME || 67 if (frame.type == ACK_FRAME ||
(...skipping 27 matching lines...) Expand all
94 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + 95 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
95 GetMinAckFrameSize(); 96 GetMinAckFrameSize();
96 } 97 }
97 98
98 // static 99 // static
99 size_t QuicFramer::GetMinGoAwayFrameSize() { 100 size_t QuicFramer::GetMinGoAwayFrameSize() {
100 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + 101 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
101 kQuicStreamIdSize; 102 kQuicStreamIdSize;
102 } 103 }
103 104
104 bool QuicFramer::IsSupportedVersion(QuicVersionTag version) { 105 bool QuicFramer::IsSupportedVersion(QuicTag version) {
105 return version == kQuicVersion1; 106 return version == kQuicVersion1;
106 } 107 }
107 108
108 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { 109 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) {
109 return kQuicGuidSize + kPublicFlagsSize + 110 return kQuicGuidSize + kPublicFlagsSize +
110 number_versions * kQuicVersionSize; 111 number_versions * kQuicVersionSize;
111 } 112 }
112 113
113 size_t QuicFramer::GetSerializedFrameLength( 114 size_t QuicFramer::GetSerializedFrameLength(
114 const QuicFrame& frame, size_t free_bytes, bool first_frame) { 115 const QuicFrame& frame, size_t free_bytes, bool first_frame) {
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, 282 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number,
282 &writer)) { 283 &writer)) {
283 return NULL; 284 return NULL;
284 } 285 }
285 286
286 return new QuicEncryptedPacket(writer.take(), len, true); 287 return new QuicEncryptedPacket(writer.take(), len, true);
287 } 288 }
288 289
289 QuicEncryptedPacket* QuicFramer::ConstructVersionNegotiationPacket( 290 QuicEncryptedPacket* QuicFramer::ConstructVersionNegotiationPacket(
290 const QuicPacketPublicHeader& header, 291 const QuicPacketPublicHeader& header,
291 const QuicVersionTagList& supported_versions) { 292 const QuicTagVector& supported_versions) {
292 DCHECK(header.version_flag); 293 DCHECK(header.version_flag);
293 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); 294 size_t len = GetVersionNegotiationPacketSize(supported_versions.size());
294 QuicDataWriter writer(len); 295 QuicDataWriter writer(len);
295 296
296 if (!writer.WriteUInt64(header.guid)) { 297 if (!writer.WriteUInt64(header.guid)) {
297 return NULL; 298 return NULL;
298 } 299 }
299 300
300 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION); 301 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION);
301 if (!writer.WriteUInt8(flags)) { 302 if (!writer.WriteUInt8(flags)) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 344
344 reader_.reset(NULL); 345 reader_.reset(NULL);
345 return rv; 346 return rv;
346 } 347 }
347 348
348 bool QuicFramer::ProcessVersionNegotiationPacket( 349 bool QuicFramer::ProcessVersionNegotiationPacket(
349 QuicPacketPublicHeader* public_header) { 350 QuicPacketPublicHeader* public_header) {
350 DCHECK(!is_server_); 351 DCHECK(!is_server_);
351 // Try reading at least once to raise error if the packet is invalid. 352 // Try reading at least once to raise error if the packet is invalid.
352 do { 353 do {
353 QuicVersionTag version; 354 QuicTag version;
354 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { 355 if (!reader_->ReadBytes(&version, kQuicVersionSize)) {
355 set_detailed_error("Unable to read supported version in negotiation."); 356 set_detailed_error("Unable to read supported version in negotiation.");
356 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); 357 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
357 } 358 }
358 public_header->versions.push_back(version); 359 public_header->versions.push_back(version);
359 } while (!reader_->IsDoneReading()); 360 } while (!reader_->IsDoneReading());
360 361
361 visitor_->OnVersionNegotiationPacket(*public_header); 362 visitor_->OnVersionNegotiationPacket(*public_header);
362 return true; 363 return true;
363 } 364 }
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; 547 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
547 public_header->version_flag = 548 public_header->version_flag =
548 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; 549 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
549 550
550 if (public_header->reset_flag && public_header->version_flag) { 551 if (public_header->reset_flag && public_header->version_flag) {
551 set_detailed_error("Got version flag in reset packet"); 552 set_detailed_error("Got version flag in reset packet");
552 return false; 553 return false;
553 } 554 }
554 555
555 if (public_header->version_flag && is_server_) { 556 if (public_header->version_flag && is_server_) {
556 QuicVersionTag version; 557 QuicTag version;
557 if (!reader_->ReadUInt32(&version)) { 558 if (!reader_->ReadUInt32(&version)) {
558 // Read the version only if the packet is from the client. 559 // Read the version only if the packet is from the client.
559 // version flag from the server means version negotiation packet. 560 // version flag from the server means version negotiation packet.
560 set_detailed_error("Unable to read protocol version."); 561 set_detailed_error("Unable to read protocol version.");
561 return false; 562 return false;
562 } 563 }
563 public_header->versions.push_back(version); 564 public_header->versions.push_back(version);
564 } 565 }
565 return true; 566 return true;
566 } 567 }
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 encrypter_[level].reset(encrypter); 1062 encrypter_[level].reset(encrypter);
1062 } 1063 }
1063 1064
1064 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { 1065 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const {
1065 DCHECK_GE(level, 0); 1066 DCHECK_GE(level, 0);
1066 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); 1067 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
1067 DCHECK(encrypter_[level].get() != NULL); 1068 DCHECK(encrypter_[level].get() != NULL);
1068 return encrypter_[level].get(); 1069 return encrypter_[level].get();
1069 } 1070 }
1070 1071
1072 void QuicFramer::SwapCryptersForTest(QuicFramer* other) {
1073 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) {
1074 encrypter_[i].swap(other->encrypter_[i]);
1075 }
1076 decrypter_.swap(other->decrypter_);
1077 alternative_decrypter_.swap(other->alternative_decrypter_);
1078
1079 const bool other_latch = other->alternative_decrypter_latch_;
1080 other->alternative_decrypter_latch_ = alternative_decrypter_latch_;
1081 alternative_decrypter_latch_ = other_latch;
1082 }
1083
1071 QuicEncryptedPacket* QuicFramer::EncryptPacket( 1084 QuicEncryptedPacket* QuicFramer::EncryptPacket(
1072 EncryptionLevel level, 1085 EncryptionLevel level,
1073 QuicPacketSequenceNumber packet_sequence_number, 1086 QuicPacketSequenceNumber packet_sequence_number,
1074 const QuicPacket& packet) { 1087 const QuicPacket& packet) {
1075 DCHECK(encrypter_[level].get() != NULL); 1088 DCHECK(encrypter_[level].get() != NULL);
1076 1089
1077 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( 1090 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket(
1078 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); 1091 packet_sequence_number, packet.AssociatedData(), packet.Plaintext()));
1079 if (out.get() == NULL) { 1092 if (out.get() == NULL) {
1080 RaiseError(QUIC_ENCRYPTION_FAILURE); 1093 RaiseError(QUIC_ENCRYPTION_FAILURE);
(...skipping 28 matching lines...) Expand all
1109 } 1122 }
1110 1123
1111 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number, 1124 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number,
1112 bool version_flag, 1125 bool version_flag,
1113 const QuicEncryptedPacket& packet) { 1126 const QuicEncryptedPacket& packet) {
1114 StringPiece encrypted; 1127 StringPiece encrypted;
1115 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { 1128 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) {
1116 return false; 1129 return false;
1117 } 1130 }
1118 DCHECK(decrypter_.get() != NULL); 1131 DCHECK(decrypter_.get() != NULL);
1119 LOG(INFO) << "Decrypting packet";
1120 decrypted_.reset(decrypter_->DecryptPacket( 1132 decrypted_.reset(decrypter_->DecryptPacket(
1121 sequence_number, 1133 sequence_number,
1122 GetAssociatedDataFromEncryptedPacket(packet, version_flag), 1134 GetAssociatedDataFromEncryptedPacket(packet, version_flag),
1123 encrypted)); 1135 encrypted));
1124 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { 1136 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) {
1125 LOG(INFO) << "Trying alternative";
1126 decrypted_.reset(alternative_decrypter_->DecryptPacket( 1137 decrypted_.reset(alternative_decrypter_->DecryptPacket(
1127 sequence_number, 1138 sequence_number,
1128 GetAssociatedDataFromEncryptedPacket(packet, version_flag), 1139 GetAssociatedDataFromEncryptedPacket(packet, version_flag),
1129 encrypted)); 1140 encrypted));
1130 if (decrypted_.get() != NULL) { 1141 if (decrypted_.get() != NULL) {
1131 LOG(INFO) << "alternative ok";
1132 if (alternative_decrypter_latch_) { 1142 if (alternative_decrypter_latch_) {
1133 LOG(INFO) << " latching";
1134 // Switch to the alternative decrypter and latch so that we cannot 1143 // Switch to the alternative decrypter and latch so that we cannot
1135 // switch back. 1144 // switch back.
1136 decrypter_.reset(alternative_decrypter_.release()); 1145 decrypter_.reset(alternative_decrypter_.release());
1137 } else { 1146 } else {
1138 LOG(INFO) << " swapping";
1139 // Switch the alternative decrypter so that we use it first next time. 1147 // Switch the alternative decrypter so that we use it first next time.
1140 decrypter_.swap(alternative_decrypter_); 1148 decrypter_.swap(alternative_decrypter_);
1141 } 1149 }
1142 } 1150 }
1143 } 1151 }
1144 1152
1145 if (decrypted_.get() == NULL) { 1153 if (decrypted_.get() == NULL) {
1146 return false; 1154 return false;
1147 } 1155 }
1148 1156
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 1485
1478 bool QuicFramer::RaiseError(QuicErrorCode error) { 1486 bool QuicFramer::RaiseError(QuicErrorCode error) {
1479 DLOG(INFO) << detailed_error_; 1487 DLOG(INFO) << detailed_error_;
1480 set_error(error); 1488 set_error(error);
1481 visitor_->OnError(this); 1489 visitor_->OnError(this);
1482 reader_.reset(NULL); 1490 reader_.reset(NULL);
1483 return false; 1491 return false;
1484 } 1492 }
1485 1493
1486 } // namespace net 1494 } // 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