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_framer.h" | 5 #include "net/quic/quic_framer.h" |
6 | 6 |
7 #include "base/containers/hash_tables.h" | 7 #include "base/containers/hash_tables.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "net/quic/crypto/crypto_framer.h" | 9 #include "net/quic/crypto/crypto_framer.h" |
10 #include "net/quic/crypto/crypto_handshake_message.h" | 10 #include "net/quic/crypto/crypto_handshake_message.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 // Mask to select the lowest 48 bits of a sequence number. | 31 // Mask to select the lowest 48 bits of a sequence number. |
32 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = | 32 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = |
33 GG_UINT64_C(0x0000FFFFFFFFFFFF); | 33 GG_UINT64_C(0x0000FFFFFFFFFFFF); |
34 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = | 34 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = |
35 GG_UINT64_C(0x00000000FFFFFFFF); | 35 GG_UINT64_C(0x00000000FFFFFFFF); |
36 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = | 36 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = |
37 GG_UINT64_C(0x000000000000FFFF); | 37 GG_UINT64_C(0x000000000000FFFF); |
38 const QuicPacketSequenceNumber k1ByteSequenceNumberMask = | 38 const QuicPacketSequenceNumber k1ByteSequenceNumberMask = |
39 GG_UINT64_C(0x00000000000000FF); | 39 GG_UINT64_C(0x00000000000000FF); |
40 | 40 |
41 const QuicGuid k1ByteGuidMask = GG_UINT64_C(0x00000000000000FF); | 41 const QuicConnectionId k1ByteConnectionIdMask = GG_UINT64_C(0x00000000000000FF); |
42 const QuicGuid k4ByteGuidMask = GG_UINT64_C(0x00000000FFFFFFFF); | 42 const QuicConnectionId k4ByteConnectionIdMask = GG_UINT64_C(0x00000000FFFFFFFF); |
43 | 43 |
44 // Number of bits the sequence number length bits are shifted from the right | 44 // Number of bits the sequence number length bits are shifted from the right |
45 // edge of the public header. | 45 // edge of the public header. |
46 const uint8 kPublicHeaderSequenceNumberShift = 4; | 46 const uint8 kPublicHeaderSequenceNumberShift = 4; |
47 | 47 |
48 // New Frame Types, QUIC v. >= 10: | 48 // New Frame Types, QUIC v. >= 10: |
49 // There are two interpretations for the Frame Type byte in the QUIC protocol, | 49 // There are two interpretations for the Frame Type byte in the QUIC protocol, |
50 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. | 50 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. |
51 // | 51 // |
52 // Regular Frame Types use the Frame Type byte simply. Currently defined | 52 // Regular Frame Types use the Frame Type byte simply. Currently defined |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } | 156 } |
157 | 157 |
158 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 158 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
159 QuicTime creation_time, | 159 QuicTime creation_time, |
160 bool is_server) | 160 bool is_server) |
161 : visitor_(NULL), | 161 : visitor_(NULL), |
162 fec_builder_(NULL), | 162 fec_builder_(NULL), |
163 entropy_calculator_(NULL), | 163 entropy_calculator_(NULL), |
164 error_(QUIC_NO_ERROR), | 164 error_(QUIC_NO_ERROR), |
165 last_sequence_number_(0), | 165 last_sequence_number_(0), |
166 last_serialized_guid_(0), | 166 last_serialized_connection_id_(0), |
167 supported_versions_(supported_versions), | 167 supported_versions_(supported_versions), |
168 alternative_decrypter_latch_(false), | 168 alternative_decrypter_latch_(false), |
169 is_server_(is_server), | 169 is_server_(is_server), |
170 creation_time_(creation_time) { | 170 creation_time_(creation_time) { |
171 DCHECK(!supported_versions.empty()); | 171 DCHECK(!supported_versions.empty()); |
172 quic_version_ = supported_versions_[0]; | 172 quic_version_ = supported_versions_[0]; |
173 decrypter_.reset(QuicDecrypter::Create(kNULL)); | 173 decrypter_.reset(QuicDecrypter::Create(kNULL)); |
174 encrypter_[ENCRYPTION_NONE].reset( | 174 encrypter_[ENCRYPTION_NONE].reset( |
175 QuicEncrypter::Create(kNULL)); | 175 QuicEncrypter::Create(kNULL)); |
176 } | 176 } |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 if (offset == 0) { | 263 if (offset == 0) { |
264 return i; | 264 return i; |
265 } | 265 } |
266 } | 266 } |
267 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; | 267 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; |
268 return 8; | 268 return 8; |
269 } | 269 } |
270 | 270 |
271 // static | 271 // static |
272 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { | 272 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { |
273 return kPublicFlagsSize + PACKET_8BYTE_GUID + | 273 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + |
274 number_versions * kQuicVersionSize; | 274 number_versions * kQuicVersionSize; |
275 } | 275 } |
276 | 276 |
277 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { | 277 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { |
278 for (size_t i = 0; i < supported_versions_.size(); ++i) { | 278 for (size_t i = 0; i < supported_versions_.size(); ++i) { |
279 if (version == supported_versions_[i]) { | 279 if (version == supported_versions_[i]) { |
280 return true; | 280 return true; |
281 } | 281 } |
282 } | 282 } |
283 return false; | 283 return false; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 return kNoPacket; | 448 return kNoPacket; |
449 } | 449 } |
450 } | 450 } |
451 | 451 |
452 // Save the length before writing, because take clears it. | 452 // Save the length before writing, because take clears it. |
453 const size_t len = writer.length(); | 453 const size_t len = writer.length(); |
454 // Less than or equal because truncated acks end up with max_plaintex_size | 454 // Less than or equal because truncated acks end up with max_plaintex_size |
455 // length, even though they're typically slightly shorter. | 455 // length, even though they're typically slightly shorter. |
456 DCHECK_LE(len, packet_size); | 456 DCHECK_LE(len, packet_size); |
457 QuicPacket* packet = QuicPacket::NewDataPacket( | 457 QuicPacket* packet = QuicPacket::NewDataPacket( |
458 writer.take(), len, true, header.public_header.guid_length, | 458 writer.take(), len, true, header.public_header.connection_id_length, |
459 header.public_header.version_flag, | 459 header.public_header.version_flag, |
460 header.public_header.sequence_number_length); | 460 header.public_header.sequence_number_length); |
461 | 461 |
462 if (fec_builder_) { | 462 if (fec_builder_) { |
463 fec_builder_->OnBuiltFecProtectedPayload(header, | 463 fec_builder_->OnBuiltFecProtectedPayload(header, |
464 packet->FecProtectedData()); | 464 packet->FecProtectedData()); |
465 } | 465 } |
466 | 466 |
467 return SerializedPacket(header.packet_sequence_number, | 467 return SerializedPacket(header.packet_sequence_number, |
468 header.public_header.sequence_number_length, packet, | 468 header.public_header.sequence_number_length, packet, |
(...skipping 17 matching lines...) Expand all Loading... |
486 | 486 |
487 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 487 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
488 LOG(DFATAL) << "Failed to add FEC"; | 488 LOG(DFATAL) << "Failed to add FEC"; |
489 return kNoPacket; | 489 return kNoPacket; |
490 } | 490 } |
491 | 491 |
492 return SerializedPacket( | 492 return SerializedPacket( |
493 header.packet_sequence_number, | 493 header.packet_sequence_number, |
494 header.public_header.sequence_number_length, | 494 header.public_header.sequence_number_length, |
495 QuicPacket::NewFecPacket(writer.take(), len, true, | 495 QuicPacket::NewFecPacket(writer.take(), len, true, |
496 header.public_header.guid_length, | 496 header.public_header.connection_id_length, |
497 header.public_header.version_flag, | 497 header.public_header.version_flag, |
498 header.public_header.sequence_number_length), | 498 header.public_header.sequence_number_length), |
499 GetPacketEntropyHash(header), NULL); | 499 GetPacketEntropyHash(header), NULL); |
500 } | 500 } |
501 | 501 |
502 // static | 502 // static |
503 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( | 503 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( |
504 const QuicPublicResetPacket& packet) { | 504 const QuicPublicResetPacket& packet) { |
505 DCHECK(packet.public_header.reset_flag); | 505 DCHECK(packet.public_header.reset_flag); |
506 | 506 |
507 CryptoHandshakeMessage reset; | 507 CryptoHandshakeMessage reset; |
508 reset.set_tag(kPRST); | 508 reset.set_tag(kPRST); |
509 reset.SetValue(kRNON, packet.nonce_proof); | 509 reset.SetValue(kRNON, packet.nonce_proof); |
510 reset.SetValue(kRSEQ, packet.rejected_sequence_number); | 510 reset.SetValue(kRSEQ, packet.rejected_sequence_number); |
511 if (!packet.client_address.address().empty()) { | 511 if (!packet.client_address.address().empty()) { |
512 // packet.client_address is non-empty. | 512 // packet.client_address is non-empty. |
513 QuicSocketAddressCoder address_coder(packet.client_address); | 513 QuicSocketAddressCoder address_coder(packet.client_address); |
514 string serialized_address = address_coder.Encode(); | 514 string serialized_address = address_coder.Encode(); |
515 if (serialized_address.empty()) { | 515 if (serialized_address.empty()) { |
516 return NULL; | 516 return NULL; |
517 } | 517 } |
518 reset.SetStringPiece(kCADR, serialized_address); | 518 reset.SetStringPiece(kCADR, serialized_address); |
519 } | 519 } |
520 const QuicData& reset_serialized = reset.GetSerialized(); | 520 const QuicData& reset_serialized = reset.GetSerialized(); |
521 | 521 |
522 size_t len = kPublicFlagsSize + PACKET_8BYTE_GUID + reset_serialized.length(); | 522 size_t len = |
| 523 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
523 QuicDataWriter writer(len); | 524 QuicDataWriter writer(len); |
524 | 525 |
525 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | | 526 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | |
526 PACKET_PUBLIC_FLAGS_8BYTE_GUID); | 527 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
527 if (!writer.WriteUInt8(flags)) { | 528 if (!writer.WriteUInt8(flags)) { |
528 return NULL; | 529 return NULL; |
529 } | 530 } |
530 | 531 |
531 if (!writer.WriteUInt64(packet.public_header.guid)) { | 532 if (!writer.WriteUInt64(packet.public_header.connection_id)) { |
532 return NULL; | 533 return NULL; |
533 } | 534 } |
534 | 535 |
535 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | 536 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { |
536 return NULL; | 537 return NULL; |
537 } | 538 } |
538 | 539 |
539 return new QuicEncryptedPacket(writer.take(), len, true); | 540 return new QuicEncryptedPacket(writer.take(), len, true); |
540 } | 541 } |
541 | 542 |
542 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( | 543 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( |
543 const QuicPacketPublicHeader& header, | 544 const QuicPacketPublicHeader& header, |
544 const QuicVersionVector& supported_versions) { | 545 const QuicVersionVector& supported_versions) { |
545 DCHECK(header.version_flag); | 546 DCHECK(header.version_flag); |
546 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); | 547 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); |
547 QuicDataWriter writer(len); | 548 QuicDataWriter writer(len); |
548 | 549 |
549 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | | 550 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | |
550 PACKET_PUBLIC_FLAGS_8BYTE_GUID); | 551 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
551 if (!writer.WriteUInt8(flags)) { | 552 if (!writer.WriteUInt8(flags)) { |
552 return NULL; | 553 return NULL; |
553 } | 554 } |
554 | 555 |
555 if (!writer.WriteUInt64(header.guid)) { | 556 if (!writer.WriteUInt64(header.connection_id)) { |
556 return NULL; | 557 return NULL; |
557 } | 558 } |
558 | 559 |
559 for (size_t i = 0; i < supported_versions.size(); ++i) { | 560 for (size_t i = 0; i < supported_versions.size(); ++i) { |
560 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { | 561 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { |
561 return NULL; | 562 return NULL; |
562 } | 563 } |
563 } | 564 } |
564 | 565 |
565 return new QuicEncryptedPacket(writer.take(), len, true); | 566 return new QuicEncryptedPacket(writer.take(), len, true); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 761 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
761 } | 762 } |
762 if (header.public_header.version_flag) { | 763 if (header.public_header.version_flag) { |
763 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 764 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
764 } | 765 } |
765 | 766 |
766 public_flags |= | 767 public_flags |= |
767 GetSequenceNumberFlags(header.public_header.sequence_number_length) | 768 GetSequenceNumberFlags(header.public_header.sequence_number_length) |
768 << kPublicHeaderSequenceNumberShift; | 769 << kPublicHeaderSequenceNumberShift; |
769 | 770 |
770 switch (header.public_header.guid_length) { | 771 switch (header.public_header.connection_id_length) { |
771 case PACKET_0BYTE_GUID: | 772 case PACKET_0BYTE_CONNECTION_ID: |
772 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_0BYTE_GUID)) { | 773 if (!writer->WriteUInt8( |
| 774 public_flags | PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { |
773 return false; | 775 return false; |
774 } | 776 } |
775 break; | 777 break; |
776 case PACKET_1BYTE_GUID: | 778 case PACKET_1BYTE_CONNECTION_ID: |
777 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_1BYTE_GUID)) { | 779 if (!writer->WriteUInt8( |
| 780 public_flags | PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID)) { |
778 return false; | 781 return false; |
779 } | 782 } |
780 if (!writer->WriteUInt8(header.public_header.guid & k1ByteGuidMask)) { | 783 if (!writer->WriteUInt8( |
| 784 header.public_header.connection_id & k1ByteConnectionIdMask)) { |
781 return false; | 785 return false; |
782 } | 786 } |
783 break; | 787 break; |
784 case PACKET_4BYTE_GUID: | 788 case PACKET_4BYTE_CONNECTION_ID: |
785 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_4BYTE_GUID)) { | 789 if (!writer->WriteUInt8( |
| 790 public_flags | PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID)) { |
786 return false; | 791 return false; |
787 } | 792 } |
788 if (!writer->WriteUInt32(header.public_header.guid & k4ByteGuidMask)) { | 793 if (!writer->WriteUInt32( |
| 794 header.public_header.connection_id & k4ByteConnectionIdMask)) { |
789 return false; | 795 return false; |
790 } | 796 } |
791 break; | 797 break; |
792 case PACKET_8BYTE_GUID: | 798 case PACKET_8BYTE_CONNECTION_ID: |
793 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_8BYTE_GUID)) { | 799 if (!writer->WriteUInt8( |
| 800 public_flags | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID)) { |
794 return false; | 801 return false; |
795 } | 802 } |
796 if (!writer->WriteUInt64(header.public_header.guid)) { | 803 if (!writer->WriteUInt64(header.public_header.connection_id)) { |
797 return false; | 804 return false; |
798 } | 805 } |
799 break; | 806 break; |
800 } | 807 } |
801 last_serialized_guid_ = header.public_header.guid; | 808 last_serialized_connection_id_ = header.public_header.connection_id; |
802 | 809 |
803 if (header.public_header.version_flag) { | 810 if (header.public_header.version_flag) { |
804 DCHECK(!is_server_); | 811 DCHECK(!is_server_); |
805 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); | 812 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); |
806 } | 813 } |
807 | 814 |
808 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, | 815 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, |
809 header.packet_sequence_number, writer)) { | 816 header.packet_sequence_number, writer)) { |
810 return false; | 817 return false; |
811 } | 818 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 if (!public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 888 if (!public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) { |
882 set_detailed_error("Illegal public flags value."); | 889 set_detailed_error("Illegal public flags value."); |
883 return false; | 890 return false; |
884 } | 891 } |
885 | 892 |
886 if (public_header->reset_flag && public_header->version_flag) { | 893 if (public_header->reset_flag && public_header->version_flag) { |
887 set_detailed_error("Got version flag in reset packet"); | 894 set_detailed_error("Got version flag in reset packet"); |
888 return false; | 895 return false; |
889 } | 896 } |
890 | 897 |
891 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_GUID) { | 898 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { |
892 case PACKET_PUBLIC_FLAGS_8BYTE_GUID: | 899 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID: |
893 if (!reader_->ReadUInt64(&public_header->guid)) { | 900 if (!reader_->ReadUInt64(&public_header->connection_id)) { |
894 set_detailed_error("Unable to read GUID."); | 901 set_detailed_error("Unable to read ConnectionId."); |
895 return false; | 902 return false; |
896 } | 903 } |
897 public_header->guid_length = PACKET_8BYTE_GUID; | 904 public_header->connection_id_length = PACKET_8BYTE_CONNECTION_ID; |
898 break; | 905 break; |
899 case PACKET_PUBLIC_FLAGS_4BYTE_GUID: | 906 case PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID: |
900 // If the guid is truncated, expect to read the last serialized guid. | 907 // If the connection_id is truncated, expect to read the last serialized |
901 if (!reader_->ReadBytes(&public_header->guid, PACKET_4BYTE_GUID)) { | 908 // connection_id. |
902 set_detailed_error("Unable to read GUID."); | 909 if (!reader_->ReadBytes(&public_header->connection_id, |
| 910 PACKET_4BYTE_CONNECTION_ID)) { |
| 911 set_detailed_error("Unable to read ConnectionId."); |
903 return false; | 912 return false; |
904 } | 913 } |
905 if ((public_header->guid & k4ByteGuidMask) != | 914 if ((public_header->connection_id & k4ByteConnectionIdMask) != |
906 (last_serialized_guid_ & k4ByteGuidMask)) { | 915 (last_serialized_connection_id_ & k4ByteConnectionIdMask)) { |
907 set_detailed_error( | 916 set_detailed_error("Truncated 4 byte ConnectionId does not match " |
908 "Truncated 4 byte GUID does not match previous guid."); | 917 "previous connection_id."); |
909 return false; | 918 return false; |
910 } | 919 } |
911 public_header->guid_length = PACKET_4BYTE_GUID; | 920 public_header->connection_id_length = PACKET_4BYTE_CONNECTION_ID; |
912 public_header->guid = last_serialized_guid_; | 921 public_header->connection_id = last_serialized_connection_id_; |
913 break; | 922 break; |
914 case PACKET_PUBLIC_FLAGS_1BYTE_GUID: | 923 case PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID: |
915 if (!reader_->ReadBytes(&public_header->guid, PACKET_1BYTE_GUID)) { | 924 if (!reader_->ReadBytes(&public_header->connection_id, |
916 set_detailed_error("Unable to read GUID."); | 925 PACKET_1BYTE_CONNECTION_ID)) { |
| 926 set_detailed_error("Unable to read ConnectionId."); |
917 return false; | 927 return false; |
918 } | 928 } |
919 if ((public_header->guid & k1ByteGuidMask) != | 929 if ((public_header->connection_id & k1ByteConnectionIdMask) != |
920 (last_serialized_guid_ & k1ByteGuidMask)) { | 930 (last_serialized_connection_id_ & k1ByteConnectionIdMask)) { |
921 set_detailed_error( | 931 set_detailed_error("Truncated 1 byte ConnectionId does not match " |
922 "Truncated 1 byte GUID does not match previous guid."); | 932 "previous connection_id."); |
923 return false; | 933 return false; |
924 } | 934 } |
925 public_header->guid_length = PACKET_1BYTE_GUID; | 935 public_header->connection_id_length = PACKET_1BYTE_CONNECTION_ID; |
926 public_header->guid = last_serialized_guid_; | 936 public_header->connection_id = last_serialized_connection_id_; |
927 break; | 937 break; |
928 case PACKET_PUBLIC_FLAGS_0BYTE_GUID: | 938 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID: |
929 public_header->guid_length = PACKET_0BYTE_GUID; | 939 public_header->connection_id_length = PACKET_0BYTE_CONNECTION_ID; |
930 public_header->guid = last_serialized_guid_; | 940 public_header->connection_id = last_serialized_connection_id_; |
931 break; | 941 break; |
932 } | 942 } |
933 | 943 |
934 public_header->sequence_number_length = | 944 public_header->sequence_number_length = |
935 ReadSequenceNumberLength( | 945 ReadSequenceNumberLength( |
936 public_flags >> kPublicHeaderSequenceNumberShift); | 946 public_flags >> kPublicHeaderSequenceNumberShift); |
937 | 947 |
938 // Read the version only if the packet is from the client. | 948 // Read the version only if the packet is from the client. |
939 // version flag from the server means version negotiation packet. | 949 // version flag from the server means version negotiation packet. |
940 if (public_header->version_flag && is_server_) { | 950 if (public_header->version_flag && is_server_) { |
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 set_detailed_error("Unable to read stream_id."); | 1691 set_detailed_error("Unable to read stream_id."); |
1682 return false; | 1692 return false; |
1683 } | 1693 } |
1684 | 1694 |
1685 return true; | 1695 return true; |
1686 } | 1696 } |
1687 | 1697 |
1688 // static | 1698 // static |
1689 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( | 1699 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( |
1690 const QuicEncryptedPacket& encrypted, | 1700 const QuicEncryptedPacket& encrypted, |
1691 QuicGuidLength guid_length, | 1701 QuicConnectionIdLength connection_id_length, |
1692 bool includes_version, | 1702 bool includes_version, |
1693 QuicSequenceNumberLength sequence_number_length) { | 1703 QuicSequenceNumberLength sequence_number_length) { |
1694 return StringPiece(encrypted.data() + kStartOfHashData, | 1704 return StringPiece( |
1695 GetStartOfEncryptedData( | 1705 encrypted.data() + kStartOfHashData, GetStartOfEncryptedData( |
1696 guid_length, includes_version, sequence_number_length) | 1706 connection_id_length, includes_version, sequence_number_length) |
1697 - kStartOfHashData); | 1707 - kStartOfHashData); |
1698 } | 1708 } |
1699 | 1709 |
1700 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) { | 1710 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) { |
1701 DCHECK(alternative_decrypter_.get() == NULL); | 1711 DCHECK(alternative_decrypter_.get() == NULL); |
1702 decrypter_.reset(decrypter); | 1712 decrypter_.reset(decrypter); |
1703 } | 1713 } |
1704 | 1714 |
1705 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, | 1715 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, |
1706 bool latch_once_used) { | 1716 bool latch_once_used) { |
1707 alternative_decrypter_.reset(decrypter); | 1717 alternative_decrypter_.reset(decrypter); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1784 const QuicEncryptedPacket& packet) { | 1794 const QuicEncryptedPacket& packet) { |
1785 StringPiece encrypted; | 1795 StringPiece encrypted; |
1786 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { | 1796 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { |
1787 return false; | 1797 return false; |
1788 } | 1798 } |
1789 DCHECK(decrypter_.get() != NULL); | 1799 DCHECK(decrypter_.get() != NULL); |
1790 decrypted_.reset(decrypter_->DecryptPacket( | 1800 decrypted_.reset(decrypter_->DecryptPacket( |
1791 header.packet_sequence_number, | 1801 header.packet_sequence_number, |
1792 GetAssociatedDataFromEncryptedPacket( | 1802 GetAssociatedDataFromEncryptedPacket( |
1793 packet, | 1803 packet, |
1794 header.public_header.guid_length, | 1804 header.public_header.connection_id_length, |
1795 header.public_header.version_flag, | 1805 header.public_header.version_flag, |
1796 header.public_header.sequence_number_length), | 1806 header.public_header.sequence_number_length), |
1797 encrypted)); | 1807 encrypted)); |
1798 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { | 1808 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { |
1799 decrypted_.reset(alternative_decrypter_->DecryptPacket( | 1809 decrypted_.reset(alternative_decrypter_->DecryptPacket( |
1800 header.packet_sequence_number, | 1810 header.packet_sequence_number, |
1801 GetAssociatedDataFromEncryptedPacket( | 1811 GetAssociatedDataFromEncryptedPacket( |
1802 packet, | 1812 packet, |
1803 header.public_header.guid_length, | 1813 header.public_header.connection_id_length, |
1804 header.public_header.version_flag, | 1814 header.public_header.version_flag, |
1805 header.public_header.sequence_number_length), | 1815 header.public_header.sequence_number_length), |
1806 encrypted)); | 1816 encrypted)); |
1807 if (decrypted_.get() != NULL) { | 1817 if (decrypted_.get() != NULL) { |
1808 if (alternative_decrypter_latch_) { | 1818 if (alternative_decrypter_latch_) { |
1809 // Switch to the alternative decrypter and latch so that we cannot | 1819 // Switch to the alternative decrypter and latch so that we cannot |
1810 // switch back. | 1820 // switch back. |
1811 decrypter_.reset(alternative_decrypter_.release()); | 1821 decrypter_.reset(alternative_decrypter_.release()); |
1812 } else { | 1822 } else { |
1813 // Switch the alternative decrypter so that we use it first next time. | 1823 // Switch the alternative decrypter so that we use it first next time. |
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2386 | 2396 |
2387 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2397 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2388 DVLOG(1) << "Error detail: " << detailed_error_; | 2398 DVLOG(1) << "Error detail: " << detailed_error_; |
2389 set_error(error); | 2399 set_error(error); |
2390 visitor_->OnError(this); | 2400 visitor_->OnError(this); |
2391 reader_.reset(NULL); | 2401 reader_.reset(NULL); |
2392 return false; | 2402 return false; |
2393 } | 2403 } |
2394 | 2404 |
2395 } // namespace net | 2405 } // namespace net |
OLD | NEW |