| 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_stream_sequencer.h" | 5 #include "net/quic/quic_stream_sequencer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 num_early_frames_received_(0), | 35 num_early_frames_received_(0), |
| 36 clock_(clock), | 36 clock_(clock), |
| 37 ignore_read_data_(false) {} | 37 ignore_read_data_(false) {} |
| 38 | 38 |
| 39 QuicStreamSequencer::~QuicStreamSequencer() {} | 39 QuicStreamSequencer::~QuicStreamSequencer() {} |
| 40 | 40 |
| 41 void QuicStreamSequencer::OnStreamFrame(const QuicStreamFrame& frame) { | 41 void QuicStreamSequencer::OnStreamFrame(const QuicStreamFrame& frame) { |
| 42 ++num_frames_received_; | 42 ++num_frames_received_; |
| 43 const QuicStreamOffset byte_offset = frame.offset; | 43 const QuicStreamOffset byte_offset = frame.offset; |
| 44 const size_t data_len = frame.frame_length; | 44 const size_t data_len = frame.frame_length; |
| 45 bool consolidate_errors = FLAGS_quic_consolidate_onstreamframe_errors; | |
| 46 if (!consolidate_errors && data_len == 0 && !frame.fin) { | |
| 47 // Stream frames must have data or a fin flag. | |
| 48 LOG(WARNING) << "QUIC_INVALID_STREAM_FRAM: Empty stream frame " | |
| 49 "without FIN set."; | |
| 50 stream_->CloseConnectionWithDetails(QUIC_EMPTY_STREAM_FRAME_NO_FIN, | |
| 51 "Empty stream frame without FIN set."); | |
| 52 return; | |
| 53 } | |
| 54 | 45 |
| 55 if (frame.fin) { | 46 if (frame.fin) { |
| 56 CloseStreamAtOffset(frame.offset + data_len); | 47 CloseStreamAtOffset(frame.offset + data_len); |
| 57 if (data_len == 0) { | 48 if (data_len == 0) { |
| 58 return; | 49 return; |
| 59 } | 50 } |
| 60 } | 51 } |
| 61 size_t bytes_written; | 52 size_t bytes_written; |
| 62 string error_details; | 53 string error_details; |
| 63 QuicErrorCode result = buffered_frames_.OnStreamData( | 54 QuicErrorCode result = buffered_frames_.OnStreamData( |
| 64 byte_offset, StringPiece(frame.frame_buffer, frame.frame_length), | 55 byte_offset, StringPiece(frame.frame_buffer, frame.frame_length), |
| 65 clock_->ApproximateNow(), &bytes_written, &error_details); | 56 clock_->ApproximateNow(), &bytes_written, &error_details); |
| 66 if (!consolidate_errors) { | 57 if (result != QUIC_NO_ERROR) { |
| 67 if (result == QUIC_OVERLAPPING_STREAM_DATA) { | 58 DLOG(WARNING) << QuicUtils::ErrorToString(result); |
| 68 LOG(WARNING) << "QUIC_INVALID_STREAM_FRAME: Stream frame " | 59 DLOG(WARNING) << error_details; |
| 69 "overlaps with buffered data."; | 60 stream_->CloseConnectionWithDetails(result, error_details); |
| 70 stream_->CloseConnectionWithDetails( | 61 return; |
| 71 QUIC_EMPTY_STREAM_FRAME_NO_FIN, | |
| 72 "Stream frame overlaps with buffered data."); | |
| 73 return; | |
| 74 } | |
| 75 } else { | |
| 76 if (result != QUIC_NO_ERROR) { | |
| 77 LOG(WARNING) << QuicUtils::ErrorToString(result) << ": " << error_details; | |
| 78 stream_->CloseConnectionWithDetails(result, error_details); | |
| 79 return; | |
| 80 } | |
| 81 } | 62 } |
| 82 | 63 |
| 83 if ((consolidate_errors || result == QUIC_NO_ERROR) && bytes_written == 0) { | 64 if (bytes_written == 0) { |
| 84 ++num_duplicate_frames_received_; | 65 ++num_duplicate_frames_received_; |
| 85 // Silently ignore duplicates. | 66 // Silently ignore duplicates. |
| 86 return; | 67 return; |
| 87 } | 68 } |
| 88 | 69 |
| 89 if (byte_offset > buffered_frames_.BytesConsumed()) { | 70 if (byte_offset > buffered_frames_.BytesConsumed()) { |
| 90 ++num_early_frames_received_; | 71 ++num_early_frames_received_; |
| 91 } | 72 } |
| 92 | 73 |
| 93 if (blocked_) { | 74 if (blocked_) { |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 | 190 |
| 210 size_t QuicStreamSequencer::NumBytesBuffered() const { | 191 size_t QuicStreamSequencer::NumBytesBuffered() const { |
| 211 return buffered_frames_.BytesBuffered(); | 192 return buffered_frames_.BytesBuffered(); |
| 212 } | 193 } |
| 213 | 194 |
| 214 QuicStreamOffset QuicStreamSequencer::NumBytesConsumed() const { | 195 QuicStreamOffset QuicStreamSequencer::NumBytesConsumed() const { |
| 215 return buffered_frames_.BytesConsumed(); | 196 return buffered_frames_.BytesConsumed(); |
| 216 } | 197 } |
| 217 | 198 |
| 218 } // namespace net | 199 } // namespace net |
| OLD | NEW |