| 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 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 case STREAM_FRAME: | 375 case STREAM_FRAME: |
| 376 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, | 376 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, |
| 377 &writer)) { | 377 &writer)) { |
| 378 QUIC_BUG << "AppendStreamFrame failed"; | 378 QUIC_BUG << "AppendStreamFrame failed"; |
| 379 return 0; | 379 return 0; |
| 380 } | 380 } |
| 381 break; | 381 break; |
| 382 case ACK_FRAME: | 382 case ACK_FRAME: |
| 383 if (quic_version_ <= QUIC_VERSION_33) { | 383 if (quic_version_ <= QUIC_VERSION_33) { |
| 384 if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) { | 384 if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) { |
| 385 QUIC_BUG << "AppendAckFrameAndTypeByte failed"; | 385 QUIC_BUG << "AppendAckFrameAndTypeByte failed" |
| 386 << " header: " << header |
| 387 << " ack_fame: " << *frame.ack_frame; |
| 386 return 0; | 388 return 0; |
| 387 } | 389 } |
| 388 } else { | 390 } else { |
| 389 if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) { | 391 if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) { |
| 390 QUIC_BUG << "AppendNewAckFrameAndTypeByte failed"; | 392 QUIC_BUG << "AppendNewAckFrameAndTypeByte failed"; |
| 391 return 0; | 393 return 0; |
| 392 } | 394 } |
| 393 } | 395 } |
| 394 break; | 396 break; |
| 395 case STOP_WAITING_FRAME: | 397 case STOP_WAITING_FRAME: |
| (...skipping 1785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2181 type_byte <<= kQuicSequenceNumberLengthShift; | 2183 type_byte <<= kQuicSequenceNumberLengthShift; |
| 2182 type_byte |= GetSequenceNumberFlags(largest_observed_length); | 2184 type_byte |= GetSequenceNumberFlags(largest_observed_length); |
| 2183 | 2185 |
| 2184 // Missing packet number length. | 2186 // Missing packet number length. |
| 2185 type_byte <<= kQuicSequenceNumberLengthShift; | 2187 type_byte <<= kQuicSequenceNumberLengthShift; |
| 2186 type_byte |= GetSequenceNumberFlags(missing_packet_number_length); | 2188 type_byte |= GetSequenceNumberFlags(missing_packet_number_length); |
| 2187 | 2189 |
| 2188 type_byte |= kQuicFrameTypeAckMask; | 2190 type_byte |= kQuicFrameTypeAckMask; |
| 2189 | 2191 |
| 2190 if (!writer->WriteUInt8(type_byte)) { | 2192 if (!writer->WriteUInt8(type_byte)) { |
| 2193 QUIC_BUG << "type byte failed"; |
| 2191 return false; | 2194 return false; |
| 2192 } | 2195 } |
| 2193 | 2196 |
| 2194 QuicPacketEntropyHash ack_entropy_hash = frame.entropy_hash; | 2197 QuicPacketEntropyHash ack_entropy_hash = frame.entropy_hash; |
| 2195 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); | 2198 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); |
| 2196 if (truncated) { | 2199 if (truncated) { |
| 2197 // Skip the nack ranges which the truncated ack won't include and set | 2200 // Skip the nack ranges which the truncated ack won't include and set |
| 2198 // a correct largest observed for the truncated ack. | 2201 // a correct largest observed for the truncated ack. |
| 2199 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); | 2202 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); |
| 2200 ++i) { | 2203 ++i) { |
| 2201 ++ack_iter; | 2204 ++ack_iter; |
| 2202 } | 2205 } |
| 2203 // If the last range is followed by acks, include them. | 2206 // If the last range is followed by acks, include them. |
| 2204 // If the last range is followed by another range, specify the end of the | 2207 // If the last range is followed by another range, specify the end of the |
| 2205 // range as the largest_observed. | 2208 // range as the largest_observed. |
| 2206 ack_largest_observed = ack_iter->first - 1; | 2209 ack_largest_observed = ack_iter->first - 1; |
| 2207 // Also update the entropy so it matches the largest observed. | 2210 // Also update the entropy so it matches the largest observed. |
| 2208 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); | 2211 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); |
| 2209 ++ack_iter; | 2212 ++ack_iter; |
| 2210 } | 2213 } |
| 2211 | 2214 |
| 2212 if (!writer->WriteUInt8(ack_entropy_hash)) { | 2215 if (!writer->WriteUInt8(ack_entropy_hash)) { |
| 2216 QUIC_BUG << "hash failed."; |
| 2213 return false; | 2217 return false; |
| 2214 } | 2218 } |
| 2215 | 2219 |
| 2216 if (!AppendPacketSequenceNumber(largest_observed_length, ack_largest_observed, | 2220 if (!AppendPacketSequenceNumber(largest_observed_length, ack_largest_observed, |
| 2217 writer)) { | 2221 writer)) { |
| 2222 QUIC_BUG << "AppendPacketSequenceNumber failed. " |
| 2223 << "largest_observed_length: " << largest_observed_length |
| 2224 << " ack_largest_observed: " << ack_largest_observed; |
| 2218 return false; | 2225 return false; |
| 2219 } | 2226 } |
| 2220 | 2227 |
| 2221 uint64_t ack_delay_time_us = kUFloat16MaxValue; | 2228 uint64_t ack_delay_time_us = kUFloat16MaxValue; |
| 2222 if (!frame.ack_delay_time.IsInfinite()) { | 2229 if (!frame.ack_delay_time.IsInfinite()) { |
| 2223 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); | 2230 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); |
| 2224 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); | 2231 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); |
| 2225 } | 2232 } |
| 2226 | 2233 |
| 2227 if (!writer->WriteUFloat16(ack_delay_time_us)) { | 2234 if (!writer->WriteUFloat16(ack_delay_time_us)) { |
| 2235 QUIC_BUG << "ack delay time failed."; |
| 2228 return false; | 2236 return false; |
| 2229 } | 2237 } |
| 2230 | 2238 |
| 2231 // Timestamp goes at the end of the required fields. | 2239 // Timestamp goes at the end of the required fields. |
| 2232 if (!truncated) { | 2240 if (!truncated) { |
| 2233 if (!AppendTimestampToAckFrame(frame, writer)) { | 2241 if (!AppendTimestampToAckFrame(frame, writer)) { |
| 2242 QUIC_BUG << "AppendTimestampToAckFrame failed"; |
| 2234 return false; | 2243 return false; |
| 2235 } | 2244 } |
| 2236 } | 2245 } |
| 2237 | 2246 |
| 2238 if (ack_info.nack_ranges.empty()) { | 2247 if (ack_info.nack_ranges.empty()) { |
| 2239 return true; | 2248 return true; |
| 2240 } | 2249 } |
| 2241 | 2250 |
| 2242 const uint8_t num_missing_ranges = | 2251 const uint8_t num_missing_ranges = |
| 2243 static_cast<uint8_t>(min(ack_info.nack_ranges.size(), max_num_ranges)); | 2252 static_cast<uint8_t>(min(ack_info.nack_ranges.size(), max_num_ranges)); |
| 2244 if (!writer->WriteBytes(&num_missing_ranges, 1)) { | 2253 if (!writer->WriteBytes(&num_missing_ranges, 1)) { |
| 2254 QUIC_BUG << "num_missing_ranges failed: " |
| 2255 << static_cast<uint32_t>(num_missing_ranges); |
| 2245 return false; | 2256 return false; |
| 2246 } | 2257 } |
| 2247 | 2258 |
| 2248 int num_ranges_written = 0; | 2259 int num_ranges_written = 0; |
| 2249 QuicPacketNumber last_sequence_written = ack_largest_observed; | 2260 QuicPacketNumber last_sequence_written = ack_largest_observed; |
| 2250 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { | 2261 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { |
| 2251 // Calculate the delta to the last number in the range. | 2262 // Calculate the delta to the last number in the range. |
| 2252 QuicPacketNumber missing_delta = | 2263 QuicPacketNumber missing_delta = |
| 2253 last_sequence_written - (ack_iter->first + ack_iter->second); | 2264 last_sequence_written - (ack_iter->first + ack_iter->second); |
| 2254 if (!AppendPacketSequenceNumber(missing_packet_number_length, missing_delta, | 2265 if (!AppendPacketSequenceNumber(missing_packet_number_length, missing_delta, |
| 2255 writer)) { | 2266 writer)) { |
| 2267 QUIC_BUG << "AppendPacketSequenceNumber failed: " |
| 2268 << "missing_packet_number_length: " |
| 2269 << missing_packet_number_length << " missing_delta " |
| 2270 << missing_delta; |
| 2256 return false; | 2271 return false; |
| 2257 } | 2272 } |
| 2258 if (!AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, | 2273 if (!AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, |
| 2259 ack_iter->second, writer)) { | 2274 ack_iter->second, writer)) { |
| 2275 QUIC_BUG << "AppendPacketSequenceNumber failed"; |
| 2260 return false; | 2276 return false; |
| 2261 } | 2277 } |
| 2262 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2278 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
| 2263 last_sequence_written = ack_iter->first - 1; | 2279 last_sequence_written = ack_iter->first - 1; |
| 2264 ++num_ranges_written; | 2280 ++num_ranges_written; |
| 2265 } | 2281 } |
| 2266 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2282 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 2267 | 2283 |
| 2268 if (quic_version_ > QUIC_VERSION_31) { | 2284 if (quic_version_ > QUIC_VERSION_31) { |
| 2269 return true; | 2285 return true; |
| 2270 } | 2286 } |
| 2271 | 2287 |
| 2272 // Append revived packets. | 2288 // Append revived packets. |
| 2273 // FEC is not supported. | 2289 // FEC is not supported. |
| 2274 uint8_t num_revived_packets = 0; | 2290 uint8_t num_revived_packets = 0; |
| 2275 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2291 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
| 2292 QUIC_BUG << "num_revived_packets failed: " << num_revived_packets; |
| 2276 return false; | 2293 return false; |
| 2277 } | 2294 } |
| 2278 | 2295 |
| 2279 return true; | 2296 return true; |
| 2280 } | 2297 } |
| 2281 | 2298 |
| 2282 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, | 2299 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, |
| 2283 QuicDataWriter* writer) { | 2300 QuicDataWriter* writer) { |
| 2284 NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); | 2301 NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); |
| 2285 QuicPacketNumber largest_acked = frame.largest_observed; | 2302 QuicPacketNumber largest_acked = frame.largest_observed; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2566 | 2583 |
| 2567 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2584 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2568 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2585 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
| 2569 << " detail: " << detailed_error_; | 2586 << " detail: " << detailed_error_; |
| 2570 set_error(error); | 2587 set_error(error); |
| 2571 visitor_->OnError(this); | 2588 visitor_->OnError(this); |
| 2572 return false; | 2589 return false; |
| 2573 } | 2590 } |
| 2574 | 2591 |
| 2575 } // namespace net | 2592 } // namespace net |
| OLD | NEW |