| 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_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
| 6 | 6 |
| 7 #include <cstdint> | 7 #include <cstdint> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 } | 499 } |
| 500 | 500 |
| 501 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 501 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
| 502 QuicDataReader reader(packet.data(), packet.length()); | 502 QuicDataReader reader(packet.data(), packet.length()); |
| 503 | 503 |
| 504 visitor_->OnPacket(); | 504 visitor_->OnPacket(); |
| 505 | 505 |
| 506 // First parse the public header. | 506 // First parse the public header. |
| 507 QuicPacketPublicHeader public_header; | 507 QuicPacketPublicHeader public_header; |
| 508 if (!ProcessPublicHeader(&reader, &public_header)) { | 508 if (!ProcessPublicHeader(&reader, &public_header)) { |
| 509 DVLOG(1) << ENDPOINT << "Unable to process public header."; | 509 DCHECK_NE("", detailed_error_); |
| 510 DVLOG(1) << ENDPOINT |
| 511 << "Unable to process public header. Error: " << detailed_error_; |
| 510 DCHECK_NE("", detailed_error_); | 512 DCHECK_NE("", detailed_error_); |
| 511 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 513 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 512 } | 514 } |
| 513 | 515 |
| 514 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { | 516 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { |
| 515 // The visitor suppresses further processing of the packet. | 517 // The visitor suppresses further processing of the packet. |
| 516 return true; | 518 return true; |
| 517 } | 519 } |
| 518 | 520 |
| 519 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && | 521 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 return true; | 568 return true; |
| 567 } | 569 } |
| 568 | 570 |
| 569 bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader, | 571 bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader, |
| 570 const QuicPacketPublicHeader& public_header, | 572 const QuicPacketPublicHeader& public_header, |
| 571 const QuicEncryptedPacket& packet, | 573 const QuicEncryptedPacket& packet, |
| 572 char* decrypted_buffer, | 574 char* decrypted_buffer, |
| 573 size_t buffer_length) { | 575 size_t buffer_length) { |
| 574 QuicPacketHeader header(public_header); | 576 QuicPacketHeader header(public_header); |
| 575 if (!ProcessUnauthenticatedHeader(encrypted_reader, &header)) { | 577 if (!ProcessUnauthenticatedHeader(encrypted_reader, &header)) { |
| 578 DCHECK_NE("", detailed_error_); |
| 576 DVLOG(1) << ENDPOINT | 579 DVLOG(1) << ENDPOINT |
| 577 << "Unable to process packet header. Stopping parsing."; | 580 << "Unable to process packet header. Stopping parsing. Error: " |
| 581 << detailed_error_; |
| 578 return false; | 582 return false; |
| 579 } | 583 } |
| 580 | 584 |
| 581 size_t decrypted_length = 0; | 585 size_t decrypted_length = 0; |
| 582 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, | 586 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, |
| 583 buffer_length, &decrypted_length)) { | 587 buffer_length, &decrypted_length)) { |
| 584 set_detailed_error("Unable to decrypt payload."); | 588 set_detailed_error("Unable to decrypt payload."); |
| 585 return RaiseError(QUIC_DECRYPTION_FAILURE); | 589 return RaiseError(QUIC_DECRYPTION_FAILURE); |
| 586 } | 590 } |
| 587 | 591 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 598 | 602 |
| 599 if (packet.length() > kMaxPacketSize) { | 603 if (packet.length() > kMaxPacketSize) { |
| 600 // If the packet has gotten this far, it should not be too large. | 604 // If the packet has gotten this far, it should not be too large. |
| 601 QUIC_BUG << "Packet too large:" << packet.length(); | 605 QUIC_BUG << "Packet too large:" << packet.length(); |
| 602 return RaiseError(QUIC_PACKET_TOO_LARGE); | 606 return RaiseError(QUIC_PACKET_TOO_LARGE); |
| 603 } | 607 } |
| 604 | 608 |
| 605 // Handle the payload. | 609 // Handle the payload. |
| 606 if (!ProcessFrameData(&reader, header)) { | 610 if (!ProcessFrameData(&reader, header)) { |
| 607 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. | 611 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. |
| 608 DLOG(WARNING) << ENDPOINT << "Unable to process frame data."; | 612 DCHECK_NE("", detailed_error_); |
| 613 DLOG(WARNING) << ENDPOINT |
| 614 << "Unable to process frame data. Error: " << detailed_error_; |
| 609 return false; | 615 return false; |
| 610 } | 616 } |
| 611 | 617 |
| 612 visitor_->OnPacketComplete(); | 618 visitor_->OnPacketComplete(); |
| 613 return true; | 619 return true; |
| 614 } | 620 } |
| 615 | 621 |
| 616 bool QuicFramer::ProcessPublicResetPacket( | 622 bool QuicFramer::ProcessPublicResetPacket( |
| 617 QuicDataReader* reader, | 623 QuicDataReader* reader, |
| 618 const QuicPacketPublicHeader& public_header) { | 624 const QuicPacketPublicHeader& public_header) { |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 if (header->public_header.multipath_flag && | 964 if (header->public_header.multipath_flag && |
| 959 !ProcessPathId(encrypted_reader, &header->path_id)) { | 965 !ProcessPathId(encrypted_reader, &header->path_id)) { |
| 960 set_detailed_error("Unable to read path id."); | 966 set_detailed_error("Unable to read path id."); |
| 961 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 967 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 962 } | 968 } |
| 963 | 969 |
| 964 QuicPacketNumber base_packet_number = largest_packet_number_; | 970 QuicPacketNumber base_packet_number = largest_packet_number_; |
| 965 if (header->public_header.multipath_flag && | 971 if (header->public_header.multipath_flag && |
| 966 !IsValidPath(header->path_id, &base_packet_number)) { | 972 !IsValidPath(header->path_id, &base_packet_number)) { |
| 967 // Stop processing because path is closed. | 973 // Stop processing because path is closed. |
| 974 set_detailed_error("Path is closed."); |
| 968 return false; | 975 return false; |
| 969 } | 976 } |
| 970 | 977 |
| 971 if (!ProcessPacketSequenceNumber( | 978 if (!ProcessPacketSequenceNumber( |
| 972 encrypted_reader, header->public_header.packet_number_length, | 979 encrypted_reader, header->public_header.packet_number_length, |
| 973 base_packet_number, &header->packet_number)) { | 980 base_packet_number, &header->packet_number)) { |
| 974 set_detailed_error("Unable to read packet number."); | 981 set_detailed_error("Unable to read packet number."); |
| 975 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 982 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 976 } | 983 } |
| 977 | 984 |
| 978 if (header->packet_number == 0u) { | 985 if (header->packet_number == 0u) { |
| 979 set_detailed_error("packet numbers cannot be 0."); | 986 set_detailed_error("packet numbers cannot be 0."); |
| 980 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 987 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 981 } | 988 } |
| 982 | 989 |
| 983 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 990 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
| 991 set_detailed_error( |
| 992 "Visitor asked to stop processing of unauthenticated header."); |
| 984 return false; | 993 return false; |
| 985 } | 994 } |
| 986 return true; | 995 return true; |
| 987 } | 996 } |
| 988 | 997 |
| 989 bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { | 998 bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { |
| 990 if (!reader->ReadBytes(path_id, 1)) { | 999 if (!reader->ReadBytes(path_id, 1)) { |
| 991 return false; | 1000 return false; |
| 992 } | 1001 } |
| 993 | 1002 |
| (...skipping 1199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2193 | 2202 |
| 2194 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2203 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2195 DVLOG(1) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) | 2204 DVLOG(1) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
| 2196 << " detail: " << detailed_error_; | 2205 << " detail: " << detailed_error_; |
| 2197 set_error(error); | 2206 set_error(error); |
| 2198 visitor_->OnError(this); | 2207 visitor_->OnError(this); |
| 2199 return false; | 2208 return false; |
| 2200 } | 2209 } |
| 2201 | 2210 |
| 2202 } // namespace net | 2211 } // namespace net |
| OLD | NEW |