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 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + | 191 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + |
192 GetStreamOffsetSize(offset) + | 192 GetStreamOffsetSize(offset) + |
193 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); | 193 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); |
194 } | 194 } |
195 | 195 |
196 // static | 196 // static |
197 size_t QuicFramer::GetMinAckFrameSize( | 197 size_t QuicFramer::GetMinAckFrameSize( |
198 QuicVersion version, | 198 QuicVersion version, |
199 QuicSequenceNumberLength sequence_number_length, | 199 QuicSequenceNumberLength sequence_number_length, |
200 QuicSequenceNumberLength largest_observed_length) { | 200 QuicSequenceNumberLength largest_observed_length) { |
201 size_t len = kQuicFrameTypeSize + kQuicEntropyHashSize + | 201 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
202 largest_observed_length + kQuicDeltaTimeLargestObservedSize; | 202 largest_observed_length + kQuicDeltaTimeLargestObservedSize; |
203 if (version <= QUIC_VERSION_15) { | |
204 len += sequence_number_length + kQuicEntropyHashSize; | |
205 } | |
206 return len; | |
207 } | 203 } |
208 | 204 |
209 // static | 205 // static |
210 size_t QuicFramer::GetStopWaitingFrameSize( | 206 size_t QuicFramer::GetStopWaitingFrameSize( |
211 QuicSequenceNumberLength sequence_number_length) { | 207 QuicSequenceNumberLength sequence_number_length) { |
212 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 208 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
213 sequence_number_length; | 209 sequence_number_length; |
214 } | 210 } |
215 | 211 |
216 // static | 212 // static |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 } | 371 } |
376 break; | 372 break; |
377 case CONGESTION_FEEDBACK_FRAME: | 373 case CONGESTION_FEEDBACK_FRAME: |
378 if (!AppendCongestionFeedbackFrame( | 374 if (!AppendCongestionFeedbackFrame( |
379 *frame.congestion_feedback_frame, &writer)) { | 375 *frame.congestion_feedback_frame, &writer)) { |
380 LOG(DFATAL) << "AppendCongestionFeedbackFrame failed"; | 376 LOG(DFATAL) << "AppendCongestionFeedbackFrame failed"; |
381 return kNoPacket; | 377 return kNoPacket; |
382 } | 378 } |
383 break; | 379 break; |
384 case STOP_WAITING_FRAME: | 380 case STOP_WAITING_FRAME: |
385 if (quic_version_ <= QUIC_VERSION_15) { | |
386 LOG(DFATAL) << "Attempt to add a StopWaitingFrame in " | |
387 << QuicVersionToString(quic_version_); | |
388 return kNoPacket; | |
389 } | |
390 if (!AppendStopWaitingFrame( | 381 if (!AppendStopWaitingFrame( |
391 header, *frame.stop_waiting_frame, &writer)) { | 382 header, *frame.stop_waiting_frame, &writer)) { |
392 LOG(DFATAL) << "AppendStopWaitingFrame failed"; | 383 LOG(DFATAL) << "AppendStopWaitingFrame failed"; |
393 return kNoPacket; | 384 return kNoPacket; |
394 } | 385 } |
395 break; | 386 break; |
396 case PING_FRAME: | 387 case PING_FRAME: |
397 if (quic_version_ <= QUIC_VERSION_16) { | 388 if (quic_version_ <= QUIC_VERSION_16) { |
398 LOG(DFATAL) << "Attempt to add a PingFrame in " | 389 LOG(DFATAL) << "Attempt to add a PingFrame in " |
399 << QuicVersionToString(quic_version_); | 390 << QuicVersionToString(quic_version_); |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1212 } | 1203 } |
1213 if (!visitor_->OnBlockedFrame(blocked_frame)) { | 1204 if (!visitor_->OnBlockedFrame(blocked_frame)) { |
1214 DVLOG(1) << "Visitor asked to stop further processing."; | 1205 DVLOG(1) << "Visitor asked to stop further processing."; |
1215 // Returning true since there was no parsing error. | 1206 // Returning true since there was no parsing error. |
1216 return true; | 1207 return true; |
1217 } | 1208 } |
1218 continue; | 1209 continue; |
1219 } | 1210 } |
1220 | 1211 |
1221 case STOP_WAITING_FRAME: { | 1212 case STOP_WAITING_FRAME: { |
1222 if (quic_version_ <= QUIC_VERSION_15) { | |
1223 LOG(DFATAL) << "Trying to read a StopWaiting in " | |
1224 << QuicVersionToString(quic_version_); | |
1225 return RaiseError(QUIC_INTERNAL_ERROR); | |
1226 } | |
1227 QuicStopWaitingFrame stop_waiting_frame; | 1213 QuicStopWaitingFrame stop_waiting_frame; |
1228 if (!ProcessStopWaitingFrame(header, &stop_waiting_frame)) { | 1214 if (!ProcessStopWaitingFrame(header, &stop_waiting_frame)) { |
1229 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA); | 1215 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA); |
1230 } | 1216 } |
1231 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) { | 1217 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) { |
1232 DVLOG(1) << "Visitor asked to stop further processing."; | 1218 DVLOG(1) << "Visitor asked to stop further processing."; |
1233 // Returning true since there was no parsing error. | 1219 // Returning true since there was no parsing error. |
1234 return true; | 1220 return true; |
1235 } | 1221 } |
1236 continue; | 1222 continue; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1314 if (!frame_data.empty()) { | 1300 if (!frame_data.empty()) { |
1315 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); | 1301 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); |
1316 } | 1302 } |
1317 | 1303 |
1318 return true; | 1304 return true; |
1319 } | 1305 } |
1320 | 1306 |
1321 bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header, | 1307 bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header, |
1322 uint8 frame_type, | 1308 uint8 frame_type, |
1323 QuicAckFrame* frame) { | 1309 QuicAckFrame* frame) { |
1324 if (quic_version_ <= QUIC_VERSION_15) { | |
1325 if (!ProcessStopWaitingFrame(header, &frame->sent_info)) { | |
1326 return false; | |
1327 } | |
1328 } | |
1329 if (!ProcessReceivedInfo(frame_type, &frame->received_info)) { | 1310 if (!ProcessReceivedInfo(frame_type, &frame->received_info)) { |
1330 return false; | 1311 return false; |
1331 } | 1312 } |
1332 return true; | 1313 return true; |
1333 } | 1314 } |
1334 | 1315 |
1335 bool QuicFramer::ProcessReceivedInfo(uint8 frame_type, | 1316 bool QuicFramer::ProcessReceivedInfo(uint8 frame_type, |
1336 ReceivedPacketInfo* received_info) { | 1317 ReceivedPacketInfo* received_info) { |
1337 // Determine the three lengths from the frame type: largest observed length, | 1318 // Determine the three lengths from the frame type: largest observed length, |
1338 // missing sequence number length, and missing range length. | 1319 // missing sequence number length, and missing range length. |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2042 // Missing sequence number length. | 2023 // Missing sequence number length. |
2043 type_byte <<= kQuicSequenceNumberLengthShift; | 2024 type_byte <<= kQuicSequenceNumberLengthShift; |
2044 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); | 2025 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); |
2045 | 2026 |
2046 type_byte |= kQuicFrameTypeAckMask; | 2027 type_byte |= kQuicFrameTypeAckMask; |
2047 | 2028 |
2048 if (!writer->WriteUInt8(type_byte)) { | 2029 if (!writer->WriteUInt8(type_byte)) { |
2049 return false; | 2030 return false; |
2050 } | 2031 } |
2051 | 2032 |
2052 if (quic_version_ <= QUIC_VERSION_15) { | |
2053 if (!AppendStopWaitingFrame(header, frame.sent_info, writer)) { | |
2054 return false; | |
2055 } | |
2056 } | |
2057 | |
2058 const ReceivedPacketInfo& received_info = frame.received_info; | 2033 const ReceivedPacketInfo& received_info = frame.received_info; |
2059 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash; | 2034 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash; |
2060 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); | 2035 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); |
2061 if (truncated) { | 2036 if (truncated) { |
2062 // Skip the nack ranges which the truncated ack won't include and set | 2037 // Skip the nack ranges which the truncated ack won't include and set |
2063 // a correct largest observed for the truncated ack. | 2038 // a correct largest observed for the truncated ack. |
2064 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); | 2039 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); |
2065 ++i) { | 2040 ++i) { |
2066 ++ack_iter; | 2041 ++ack_iter; |
2067 } | 2042 } |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2337 | 2312 |
2338 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2313 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2339 DVLOG(1) << "Error detail: " << detailed_error_; | 2314 DVLOG(1) << "Error detail: " << detailed_error_; |
2340 set_error(error); | 2315 set_error(error); |
2341 visitor_->OnError(this); | 2316 visitor_->OnError(this); |
2342 reader_.reset(NULL); | 2317 reader_.reset(NULL); |
2343 return false; | 2318 return false; |
2344 } | 2319 } |
2345 | 2320 |
2346 } // namespace net | 2321 } // namespace net |
OLD | NEW |