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 <cstdint> | 7 #include <cstdint> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 frame.stream_frame == nullptr) { | 271 frame.stream_frame == nullptr) { |
272 QUIC_BUG << "Cannot compute the length of a null frame. " | 272 QUIC_BUG << "Cannot compute the length of a null frame. " |
273 << "type:" << frame.type << "free_bytes:" << free_bytes | 273 << "type:" << frame.type << "free_bytes:" << free_bytes |
274 << " first_frame:" << first_frame << " last_frame:" << last_frame | 274 << " first_frame:" << first_frame << " last_frame:" << last_frame |
275 << " seq num length:" << packet_number_length; | 275 << " seq num length:" << packet_number_length; |
276 set_error(QUIC_INTERNAL_ERROR); | 276 set_error(QUIC_INTERNAL_ERROR); |
277 visitor_->OnError(this); | 277 visitor_->OnError(this); |
278 return 0; | 278 return 0; |
279 } | 279 } |
280 if (frame.type == PADDING_FRAME) { | 280 if (frame.type == PADDING_FRAME) { |
281 // PADDING implies end of packet. | 281 if (frame.padding_frame.num_padding_bytes == -1) { |
282 return free_bytes; | 282 // Full padding to the end of the packet. |
| 283 return free_bytes; |
| 284 } else { |
| 285 // Lite padding. |
| 286 return free_bytes < |
| 287 static_cast<size_t>(frame.padding_frame.num_padding_bytes) |
| 288 ? free_bytes |
| 289 : frame.padding_frame.num_padding_bytes; |
| 290 } |
283 } | 291 } |
| 292 |
284 size_t frame_len = | 293 size_t frame_len = |
285 ComputeFrameLength(frame, last_frame, packet_number_length); | 294 ComputeFrameLength(frame, last_frame, packet_number_length); |
286 if (frame_len <= free_bytes) { | 295 if (frame_len <= free_bytes) { |
287 // Frame fits within packet. Note that acks may be truncated. | 296 // Frame fits within packet. Note that acks may be truncated. |
288 return frame_len; | 297 return frame_len; |
289 } | 298 } |
290 // Only truncate the first frame in a packet, so if subsequent ones go | 299 // Only truncate the first frame in a packet, so if subsequent ones go |
291 // over, stop including more frames. | 300 // over, stop including more frames. |
292 if (!first_frame) { | 301 if (!first_frame) { |
293 return 0; | 302 return 0; |
(...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1094 } | 1103 } |
1095 | 1104 |
1096 // This was a special frame type that did not match any | 1105 // This was a special frame type that did not match any |
1097 // of the known ones. Error. | 1106 // of the known ones. Error. |
1098 set_detailed_error("Illegal frame type."); | 1107 set_detailed_error("Illegal frame type."); |
1099 DLOG(WARNING) << "Illegal frame type: " << static_cast<int>(frame_type); | 1108 DLOG(WARNING) << "Illegal frame type: " << static_cast<int>(frame_type); |
1100 return RaiseError(QUIC_INVALID_FRAME_DATA); | 1109 return RaiseError(QUIC_INVALID_FRAME_DATA); |
1101 } | 1110 } |
1102 | 1111 |
1103 switch (frame_type) { | 1112 switch (frame_type) { |
1104 case PADDING_FRAME: | 1113 case PADDING_FRAME: { |
| 1114 QuicPaddingFrame frame(reader->BytesRemaining()); |
| 1115 if (!visitor_->OnPaddingFrame(frame)) { |
| 1116 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1117 } |
1105 // We're done with the packet. | 1118 // We're done with the packet. |
1106 return true; | 1119 return true; |
| 1120 } |
1107 | 1121 |
1108 case RST_STREAM_FRAME: { | 1122 case RST_STREAM_FRAME: { |
1109 QuicRstStreamFrame frame; | 1123 QuicRstStreamFrame frame; |
1110 if (!ProcessRstStreamFrame(reader, &frame)) { | 1124 if (!ProcessRstStreamFrame(reader, &frame)) { |
1111 return RaiseError(QUIC_INVALID_RST_STREAM_DATA); | 1125 return RaiseError(QUIC_INVALID_RST_STREAM_DATA); |
1112 } | 1126 } |
1113 if (!visitor_->OnRstStreamFrame(frame)) { | 1127 if (!visitor_->OnRstStreamFrame(frame)) { |
1114 DVLOG(1) << "Visitor asked to stop further processing."; | 1128 DVLOG(1) << "Visitor asked to stop further processing."; |
1115 // Returning true since there was no parsing error. | 1129 // Returning true since there was no parsing error. |
1116 return true; | 1130 return true; |
(...skipping 1132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2249 | 2263 |
2250 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2264 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2251 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2265 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
2252 << " detail: " << detailed_error_; | 2266 << " detail: " << detailed_error_; |
2253 set_error(error); | 2267 set_error(error); |
2254 visitor_->OnError(this); | 2268 visitor_->OnError(this); |
2255 return false; | 2269 return false; |
2256 } | 2270 } |
2257 | 2271 |
2258 } // namespace net | 2272 } // namespace net |
OLD | NEW |