| 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 "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 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 visitor_->OnPacket(); | 475 visitor_->OnPacket(); |
| 476 | 476 |
| 477 // First parse the public header. | 477 // First parse the public header. |
| 478 QuicPacketPublicHeader public_header; | 478 QuicPacketPublicHeader public_header; |
| 479 if (!ProcessPublicHeader(&public_header)) { | 479 if (!ProcessPublicHeader(&public_header)) { |
| 480 DLOG(WARNING) << "Unable to process public header."; | 480 DLOG(WARNING) << "Unable to process public header."; |
| 481 DCHECK_NE("", detailed_error_); | 481 DCHECK_NE("", detailed_error_); |
| 482 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 482 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 483 } | 483 } |
| 484 | 484 |
| 485 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { |
| 486 // The visitor suppresses further processing of the packet. |
| 487 reader_.reset(NULL); |
| 488 return true; |
| 489 } |
| 490 |
| 485 if (is_server_ && public_header.version_flag && | 491 if (is_server_ && public_header.version_flag && |
| 486 public_header.versions[0] != quic_version_) { | 492 public_header.versions[0] != quic_version_) { |
| 487 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { | 493 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { |
| 488 reader_.reset(NULL); | 494 reader_.reset(NULL); |
| 489 return true; | 495 return true; |
| 490 } | 496 } |
| 491 } | 497 } |
| 492 | 498 |
| 493 bool rv; | 499 bool rv; |
| 494 if (!is_server_ && public_header.version_flag) { | 500 if (!is_server_ && public_header.version_flag) { |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 806 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 812 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { |
| 807 set_detailed_error("Illegal public flags value."); | 813 set_detailed_error("Illegal public flags value."); |
| 808 return false; | 814 return false; |
| 809 } | 815 } |
| 810 public_header->versions.push_back(version); | 816 public_header->versions.push_back(version); |
| 811 } | 817 } |
| 812 return true; | 818 return true; |
| 813 } | 819 } |
| 814 | 820 |
| 815 // static | 821 // static |
| 816 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet, | |
| 817 QuicGuid* guid) { | |
| 818 QuicDataReader reader(packet.data(), packet.length()); | |
| 819 uint8 public_flags; | |
| 820 if (!reader.ReadBytes(&public_flags, 1)) { | |
| 821 return false; | |
| 822 } | |
| 823 // Ensure it's an 8 byte guid. | |
| 824 if ((public_flags & PACKET_PUBLIC_FLAGS_8BYTE_GUID) != | |
| 825 PACKET_PUBLIC_FLAGS_8BYTE_GUID) { | |
| 826 return false; | |
| 827 } | |
| 828 | |
| 829 return reader.ReadUInt64(guid); | |
| 830 } | |
| 831 | |
| 832 // static | |
| 833 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( | 822 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( |
| 834 QuicPacketSequenceNumber sequence_number) { | 823 QuicPacketSequenceNumber sequence_number) { |
| 835 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { | 824 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { |
| 836 return PACKET_1BYTE_SEQUENCE_NUMBER; | 825 return PACKET_1BYTE_SEQUENCE_NUMBER; |
| 837 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { | 826 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { |
| 838 return PACKET_2BYTE_SEQUENCE_NUMBER; | 827 return PACKET_2BYTE_SEQUENCE_NUMBER; |
| 839 } else if (sequence_number < | 828 } else if (sequence_number < |
| 840 GG_UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { | 829 GG_UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { |
| 841 return PACKET_4BYTE_SEQUENCE_NUMBER; | 830 return PACKET_4BYTE_SEQUENCE_NUMBER; |
| 842 } else { | 831 } else { |
| (...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1761 } | 1750 } |
| 1762 } | 1751 } |
| 1763 | 1752 |
| 1764 if (!writer->WriteIOVector(frame.data)) { | 1753 if (!writer->WriteIOVector(frame.data)) { |
| 1765 return false; | 1754 return false; |
| 1766 } | 1755 } |
| 1767 return true; | 1756 return true; |
| 1768 } | 1757 } |
| 1769 | 1758 |
| 1770 // static | 1759 // static |
| 1771 bool QuicFramer::HasVersionFlag(const QuicEncryptedPacket& packet) { | |
| 1772 return packet.length() > 0 && | |
| 1773 (packet.data()[0] & PACKET_PUBLIC_FLAGS_VERSION) != 0; | |
| 1774 } | |
| 1775 | |
| 1776 void QuicFramer::set_version(const QuicVersion version) { | 1760 void QuicFramer::set_version(const QuicVersion version) { |
| 1777 DCHECK(IsSupportedVersion(version)); | 1761 DCHECK(IsSupportedVersion(version)); |
| 1778 quic_version_ = version; | 1762 quic_version_ = version; |
| 1779 } | 1763 } |
| 1780 | 1764 |
| 1781 bool QuicFramer::AppendAckFramePayloadAndTypeByte( | 1765 bool QuicFramer::AppendAckFramePayloadAndTypeByte( |
| 1782 const QuicPacketHeader& header, | 1766 const QuicPacketHeader& header, |
| 1783 const QuicAckFrame& frame, | 1767 const QuicAckFrame& frame, |
| 1784 QuicDataWriter* writer) { | 1768 QuicDataWriter* writer) { |
| 1785 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 1769 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2052 | 2036 |
| 2053 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2037 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2054 DVLOG(1) << "Error detail: " << detailed_error_; | 2038 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2055 set_error(error); | 2039 set_error(error); |
| 2056 visitor_->OnError(this); | 2040 visitor_->OnError(this); |
| 2057 reader_.reset(NULL); | 2041 reader_.reset(NULL); |
| 2058 return false; | 2042 return false; |
| 2059 } | 2043 } |
| 2060 | 2044 |
| 2061 } // namespace net | 2045 } // namespace net |
| OLD | NEW |