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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
12 #include "net/quic/crypto/crypto_framer.h" | 12 #include "net/quic/crypto/crypto_framer.h" |
13 #include "net/quic/crypto/crypto_handshake_message.h" | 13 #include "net/quic/crypto/crypto_handshake_message.h" |
14 #include "net/quic/crypto/crypto_protocol.h" | 14 #include "net/quic/crypto/crypto_protocol.h" |
15 #include "net/quic/crypto/quic_decrypter.h" | 15 #include "net/quic/crypto/quic_decrypter.h" |
16 #include "net/quic/crypto/quic_encrypter.h" | 16 #include "net/quic/crypto/quic_encrypter.h" |
| 17 #include "net/quic/quic_bug_tracker.h" |
17 #include "net/quic/quic_data_reader.h" | 18 #include "net/quic/quic_data_reader.h" |
18 #include "net/quic/quic_data_writer.h" | 19 #include "net/quic/quic_data_writer.h" |
19 #include "net/quic/quic_flags.h" | 20 #include "net/quic/quic_flags.h" |
20 #include "net/quic/quic_socket_address_coder.h" | 21 #include "net/quic/quic_socket_address_coder.h" |
21 #include "net/quic/quic_utils.h" | 22 #include "net/quic/quic_utils.h" |
22 | 23 |
23 using base::StringPiece; | 24 using base::StringPiece; |
24 using std::map; | 25 using std::map; |
25 using std::max; | 26 using std::max; |
26 using std::min; | 27 using std::min; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 switch (flags & PACKET_FLAGS_6BYTE_PACKET) { | 117 switch (flags & PACKET_FLAGS_6BYTE_PACKET) { |
117 case PACKET_FLAGS_6BYTE_PACKET: | 118 case PACKET_FLAGS_6BYTE_PACKET: |
118 return PACKET_6BYTE_PACKET_NUMBER; | 119 return PACKET_6BYTE_PACKET_NUMBER; |
119 case PACKET_FLAGS_4BYTE_PACKET: | 120 case PACKET_FLAGS_4BYTE_PACKET: |
120 return PACKET_4BYTE_PACKET_NUMBER; | 121 return PACKET_4BYTE_PACKET_NUMBER; |
121 case PACKET_FLAGS_2BYTE_PACKET: | 122 case PACKET_FLAGS_2BYTE_PACKET: |
122 return PACKET_2BYTE_PACKET_NUMBER; | 123 return PACKET_2BYTE_PACKET_NUMBER; |
123 case PACKET_FLAGS_1BYTE_PACKET: | 124 case PACKET_FLAGS_1BYTE_PACKET: |
124 return PACKET_1BYTE_PACKET_NUMBER; | 125 return PACKET_1BYTE_PACKET_NUMBER; |
125 default: | 126 default: |
126 LOG(DFATAL) << "Unreachable case statement."; | 127 QUIC_BUG << "Unreachable case statement."; |
127 return PACKET_6BYTE_PACKET_NUMBER; | 128 return PACKET_6BYTE_PACKET_NUMBER; |
128 } | 129 } |
129 } | 130 } |
130 | 131 |
131 } // namespace | 132 } // namespace |
132 | 133 |
133 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 134 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
134 QuicTime creation_time, | 135 QuicTime creation_time, |
135 Perspective perspective) | 136 Perspective perspective) |
136 : visitor_(nullptr), | 137 : visitor_(nullptr), |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 | 216 |
216 // static | 217 // static |
217 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) { | 218 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) { |
218 // Sizes are 1 through 4 bytes. | 219 // Sizes are 1 through 4 bytes. |
219 for (int i = 1; i <= 4; ++i) { | 220 for (int i = 1; i <= 4; ++i) { |
220 stream_id >>= 8; | 221 stream_id >>= 8; |
221 if (stream_id == 0) { | 222 if (stream_id == 0) { |
222 return i; | 223 return i; |
223 } | 224 } |
224 } | 225 } |
225 LOG(DFATAL) << "Failed to determine StreamIDSize."; | 226 QUIC_BUG << "Failed to determine StreamIDSize."; |
226 return 4; | 227 return 4; |
227 } | 228 } |
228 | 229 |
229 // static | 230 // static |
230 size_t QuicFramer::GetStreamOffsetSize(QuicStreamOffset offset) { | 231 size_t QuicFramer::GetStreamOffsetSize(QuicStreamOffset offset) { |
231 // 0 is a special case. | 232 // 0 is a special case. |
232 if (offset == 0) { | 233 if (offset == 0) { |
233 return 0; | 234 return 0; |
234 } | 235 } |
235 // 2 through 8 are the remaining sizes. | 236 // 2 through 8 are the remaining sizes. |
236 offset >>= 8; | 237 offset >>= 8; |
237 for (int i = 2; i <= 8; ++i) { | 238 for (int i = 2; i <= 8; ++i) { |
238 offset >>= 8; | 239 offset >>= 8; |
239 if (offset == 0) { | 240 if (offset == 0) { |
240 return i; | 241 return i; |
241 } | 242 } |
242 } | 243 } |
243 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; | 244 QUIC_BUG << "Failed to determine StreamOffsetSize."; |
244 return 8; | 245 return 8; |
245 } | 246 } |
246 | 247 |
247 // static | 248 // static |
248 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { | 249 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { |
249 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + | 250 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + |
250 number_versions * kQuicVersionSize; | 251 number_versions * kQuicVersionSize; |
251 } | 252 } |
252 | 253 |
253 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { | 254 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { |
254 for (size_t i = 0; i < supported_versions_.size(); ++i) { | 255 for (size_t i = 0; i < supported_versions_.size(); ++i) { |
255 if (version == supported_versions_[i]) { | 256 if (version == supported_versions_[i]) { |
256 return true; | 257 return true; |
257 } | 258 } |
258 } | 259 } |
259 return false; | 260 return false; |
260 } | 261 } |
261 | 262 |
262 size_t QuicFramer::GetSerializedFrameLength( | 263 size_t QuicFramer::GetSerializedFrameLength( |
263 const QuicFrame& frame, | 264 const QuicFrame& frame, |
264 size_t free_bytes, | 265 size_t free_bytes, |
265 bool first_frame, | 266 bool first_frame, |
266 bool last_frame, | 267 bool last_frame, |
267 InFecGroup is_in_fec_group, | 268 InFecGroup is_in_fec_group, |
268 QuicPacketNumberLength packet_number_length) { | 269 QuicPacketNumberLength packet_number_length) { |
269 // Prevent a rare crash reported in b/19458523. | 270 // Prevent a rare crash reported in b/19458523. |
270 if ((frame.type == STREAM_FRAME || frame.type == ACK_FRAME) && | 271 if ((frame.type == STREAM_FRAME || frame.type == ACK_FRAME) && |
271 frame.stream_frame == nullptr) { | 272 frame.stream_frame == nullptr) { |
272 LOG(DFATAL) << "Cannot compute the length of a null frame. " | 273 QUIC_BUG << "Cannot compute the length of a null frame. " |
273 << "type:" << frame.type << "free_bytes:" << free_bytes | 274 << "type:" << frame.type << "free_bytes:" << free_bytes |
274 << " first_frame:" << first_frame | 275 << " first_frame:" << first_frame << " last_frame:" << last_frame |
275 << " last_frame:" << last_frame | 276 << " is_in_fec:" << is_in_fec_group |
276 << " is_in_fec:" << is_in_fec_group | 277 << " seq num length:" << packet_number_length; |
277 << " seq num length:" << packet_number_length; | |
278 set_error(QUIC_INTERNAL_ERROR); | 278 set_error(QUIC_INTERNAL_ERROR); |
279 visitor_->OnError(this); | 279 visitor_->OnError(this); |
280 return 0; | 280 return 0; |
281 } | 281 } |
282 if (frame.type == PADDING_FRAME) { | 282 if (frame.type == PADDING_FRAME) { |
283 // PADDING implies end of packet. | 283 // PADDING implies end of packet. |
284 return free_bytes; | 284 return free_bytes; |
285 } | 285 } |
286 size_t frame_len = ComputeFrameLength(frame, last_frame, is_in_fec_group, | 286 size_t frame_len = ComputeFrameLength(frame, last_frame, is_in_fec_group, |
287 packet_number_length); | 287 packet_number_length); |
(...skipping 27 matching lines...) Expand all Loading... |
315 const QuicPacketHeader& header) { | 315 const QuicPacketHeader& header) { |
316 return header.entropy_flag << (header.packet_number % 8); | 316 return header.entropy_flag << (header.packet_number % 8); |
317 } | 317 } |
318 | 318 |
319 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | 319 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
320 const QuicFrames& frames, | 320 const QuicFrames& frames, |
321 char* buffer, | 321 char* buffer, |
322 size_t packet_length) { | 322 size_t packet_length) { |
323 QuicDataWriter writer(packet_length, buffer); | 323 QuicDataWriter writer(packet_length, buffer); |
324 if (!AppendPacketHeader(header, &writer)) { | 324 if (!AppendPacketHeader(header, &writer)) { |
325 LOG(DFATAL) << "AppendPacketHeader failed"; | 325 QUIC_BUG << "AppendPacketHeader failed"; |
326 return 0; | 326 return 0; |
327 } | 327 } |
328 | 328 |
329 size_t i = 0; | 329 size_t i = 0; |
330 for (const QuicFrame& frame : frames) { | 330 for (const QuicFrame& frame : frames) { |
331 // Determine if we should write stream frame length in header. | 331 // Determine if we should write stream frame length in header. |
332 const bool no_stream_frame_length = | 332 const bool no_stream_frame_length = |
333 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && | 333 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && |
334 (i == frames.size() - 1); | 334 (i == frames.size() - 1); |
335 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { | 335 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { |
336 LOG(DFATAL) << "AppendTypeByte failed"; | 336 QUIC_BUG << "AppendTypeByte failed"; |
337 return 0; | 337 return 0; |
338 } | 338 } |
339 | 339 |
340 switch (frame.type) { | 340 switch (frame.type) { |
341 case PADDING_FRAME: | 341 case PADDING_FRAME: |
342 writer.WritePadding(); | 342 writer.WritePadding(); |
343 break; | 343 break; |
344 case STREAM_FRAME: | 344 case STREAM_FRAME: |
345 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, | 345 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, |
346 &writer)) { | 346 &writer)) { |
347 LOG(DFATAL) << "AppendStreamFrame failed"; | 347 QUIC_BUG << "AppendStreamFrame failed"; |
348 return 0; | 348 return 0; |
349 } | 349 } |
350 break; | 350 break; |
351 case ACK_FRAME: | 351 case ACK_FRAME: |
352 if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) { | 352 if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) { |
353 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; | 353 QUIC_BUG << "AppendAckFrameAndTypeByte failed"; |
354 return 0; | 354 return 0; |
355 } | 355 } |
356 break; | 356 break; |
357 case STOP_WAITING_FRAME: | 357 case STOP_WAITING_FRAME: |
358 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, | 358 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, |
359 &writer)) { | 359 &writer)) { |
360 LOG(DFATAL) << "AppendStopWaitingFrame failed"; | 360 QUIC_BUG << "AppendStopWaitingFrame failed"; |
361 return 0; | 361 return 0; |
362 } | 362 } |
363 break; | 363 break; |
364 case MTU_DISCOVERY_FRAME: | 364 case MTU_DISCOVERY_FRAME: |
365 // MTU discovery frames are serialized as ping frames. | 365 // MTU discovery frames are serialized as ping frames. |
366 case PING_FRAME: | 366 case PING_FRAME: |
367 // Ping has no payload. | 367 // Ping has no payload. |
368 break; | 368 break; |
369 case RST_STREAM_FRAME: | 369 case RST_STREAM_FRAME: |
370 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { | 370 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { |
371 LOG(DFATAL) << "AppendRstStreamFrame failed"; | 371 QUIC_BUG << "AppendRstStreamFrame failed"; |
372 return 0; | 372 return 0; |
373 } | 373 } |
374 break; | 374 break; |
375 case CONNECTION_CLOSE_FRAME: | 375 case CONNECTION_CLOSE_FRAME: |
376 if (!AppendConnectionCloseFrame(*frame.connection_close_frame, | 376 if (!AppendConnectionCloseFrame(*frame.connection_close_frame, |
377 &writer)) { | 377 &writer)) { |
378 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; | 378 QUIC_BUG << "AppendConnectionCloseFrame failed"; |
379 return 0; | 379 return 0; |
380 } | 380 } |
381 break; | 381 break; |
382 case GOAWAY_FRAME: | 382 case GOAWAY_FRAME: |
383 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { | 383 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { |
384 LOG(DFATAL) << "AppendGoAwayFrame failed"; | 384 QUIC_BUG << "AppendGoAwayFrame failed"; |
385 return 0; | 385 return 0; |
386 } | 386 } |
387 break; | 387 break; |
388 case WINDOW_UPDATE_FRAME: | 388 case WINDOW_UPDATE_FRAME: |
389 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) { | 389 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) { |
390 LOG(DFATAL) << "AppendWindowUpdateFrame failed"; | 390 QUIC_BUG << "AppendWindowUpdateFrame failed"; |
391 return 0; | 391 return 0; |
392 } | 392 } |
393 break; | 393 break; |
394 case BLOCKED_FRAME: | 394 case BLOCKED_FRAME: |
395 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { | 395 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { |
396 LOG(DFATAL) << "AppendBlockedFrame failed"; | 396 QUIC_BUG << "AppendBlockedFrame failed"; |
397 return 0; | 397 return 0; |
398 } | 398 } |
399 break; | 399 break; |
400 default: | 400 default: |
401 RaiseError(QUIC_INVALID_FRAME_DATA); | 401 RaiseError(QUIC_INVALID_FRAME_DATA); |
402 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; | 402 QUIC_BUG << "QUIC_INVALID_FRAME_DATA"; |
403 return 0; | 403 return 0; |
404 } | 404 } |
405 ++i; | 405 ++i; |
406 } | 406 } |
407 | 407 |
408 return writer.length(); | 408 return writer.length(); |
409 } | 409 } |
410 | 410 |
411 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header, | 411 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header, |
412 StringPiece redundancy) { | 412 StringPiece redundancy) { |
413 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); | 413 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); |
414 DCHECK_NE(0u, header.fec_group); | 414 DCHECK_NE(0u, header.fec_group); |
415 size_t len = GetPacketHeaderSize(header); | 415 size_t len = GetPacketHeaderSize(header); |
416 len += redundancy.length(); | 416 len += redundancy.length(); |
417 | 417 |
418 scoped_ptr<char[]> buffer(new char[len]); | 418 scoped_ptr<char[]> buffer(new char[len]); |
419 QuicDataWriter writer(len, buffer.get()); | 419 QuicDataWriter writer(len, buffer.get()); |
420 if (!AppendPacketHeader(header, &writer)) { | 420 if (!AppendPacketHeader(header, &writer)) { |
421 LOG(DFATAL) << "AppendPacketHeader failed"; | 421 QUIC_BUG << "AppendPacketHeader failed"; |
422 return nullptr; | 422 return nullptr; |
423 } | 423 } |
424 | 424 |
425 if (!writer.WriteBytes(redundancy.data(), redundancy.length())) { | 425 if (!writer.WriteBytes(redundancy.data(), redundancy.length())) { |
426 LOG(DFATAL) << "Failed to add FEC"; | 426 QUIC_BUG << "Failed to add FEC"; |
427 return nullptr; | 427 return nullptr; |
428 } | 428 } |
429 | 429 |
430 return new QuicPacket(buffer.release(), len, true, | 430 return new QuicPacket(buffer.release(), len, true, |
431 header.public_header.connection_id_length, | 431 header.public_header.connection_id_length, |
432 header.public_header.version_flag, | 432 header.public_header.version_flag, |
433 header.public_header.packet_number_length); | 433 header.public_header.packet_number_length); |
434 } | 434 } |
435 | 435 |
436 // static | 436 // static |
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
993 switch (packet_number_length) { | 993 switch (packet_number_length) { |
994 case PACKET_1BYTE_PACKET_NUMBER: | 994 case PACKET_1BYTE_PACKET_NUMBER: |
995 return PACKET_FLAGS_1BYTE_PACKET; | 995 return PACKET_FLAGS_1BYTE_PACKET; |
996 case PACKET_2BYTE_PACKET_NUMBER: | 996 case PACKET_2BYTE_PACKET_NUMBER: |
997 return PACKET_FLAGS_2BYTE_PACKET; | 997 return PACKET_FLAGS_2BYTE_PACKET; |
998 case PACKET_4BYTE_PACKET_NUMBER: | 998 case PACKET_4BYTE_PACKET_NUMBER: |
999 return PACKET_FLAGS_4BYTE_PACKET; | 999 return PACKET_FLAGS_4BYTE_PACKET; |
1000 case PACKET_6BYTE_PACKET_NUMBER: | 1000 case PACKET_6BYTE_PACKET_NUMBER: |
1001 return PACKET_FLAGS_6BYTE_PACKET; | 1001 return PACKET_FLAGS_6BYTE_PACKET; |
1002 default: | 1002 default: |
1003 LOG(DFATAL) << "Unreachable case statement."; | 1003 QUIC_BUG << "Unreachable case statement."; |
1004 return PACKET_FLAGS_6BYTE_PACKET; | 1004 return PACKET_FLAGS_6BYTE_PACKET; |
1005 } | 1005 } |
1006 } | 1006 } |
1007 | 1007 |
1008 // static | 1008 // static |
1009 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( | 1009 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( |
1010 const QuicAckFrame& frame) { | 1010 const QuicAckFrame& frame) { |
1011 AckFrameInfo ack_info; | 1011 AckFrameInfo ack_info; |
1012 if (frame.missing_packets.Empty()) { | 1012 if (frame.missing_packets.Empty()) { |
1013 return ack_info; | 1013 return ack_info; |
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1852 return 0; | 1852 return 0; |
1853 } | 1853 } |
1854 | 1854 |
1855 bool QuicFramer::AppendTypeByte(const QuicFrame& frame, | 1855 bool QuicFramer::AppendTypeByte(const QuicFrame& frame, |
1856 bool no_stream_frame_length, | 1856 bool no_stream_frame_length, |
1857 QuicDataWriter* writer) { | 1857 QuicDataWriter* writer) { |
1858 uint8_t type_byte = 0; | 1858 uint8_t type_byte = 0; |
1859 switch (frame.type) { | 1859 switch (frame.type) { |
1860 case STREAM_FRAME: { | 1860 case STREAM_FRAME: { |
1861 if (frame.stream_frame == nullptr) { | 1861 if (frame.stream_frame == nullptr) { |
1862 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame."; | 1862 QUIC_BUG << "Failed to append STREAM frame with no stream_frame."; |
1863 } | 1863 } |
1864 // Fin bit. | 1864 // Fin bit. |
1865 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; | 1865 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; |
1866 | 1866 |
1867 // Data Length bit. | 1867 // Data Length bit. |
1868 type_byte <<= kQuicStreamDataLengthShift; | 1868 type_byte <<= kQuicStreamDataLengthShift; |
1869 type_byte |= no_stream_frame_length ? 0 : kQuicStreamDataLengthMask; | 1869 type_byte |= no_stream_frame_length ? 0 : kQuicStreamDataLengthMask; |
1870 | 1870 |
1871 // Offset 3 bits. | 1871 // Offset 3 bits. |
1872 type_byte <<= kQuicStreamOffsetShift; | 1872 type_byte <<= kQuicStreamOffsetShift; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1920 default: | 1920 default: |
1921 DCHECK(false) << "packet_number_length: " << packet_number_length; | 1921 DCHECK(false) << "packet_number_length: " << packet_number_length; |
1922 return false; | 1922 return false; |
1923 } | 1923 } |
1924 } | 1924 } |
1925 | 1925 |
1926 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, | 1926 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, |
1927 bool no_stream_frame_length, | 1927 bool no_stream_frame_length, |
1928 QuicDataWriter* writer) { | 1928 QuicDataWriter* writer) { |
1929 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1929 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { |
1930 LOG(DFATAL) << "Writing stream id size failed."; | 1930 QUIC_BUG << "Writing stream id size failed."; |
1931 return false; | 1931 return false; |
1932 } | 1932 } |
1933 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1933 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { |
1934 LOG(DFATAL) << "Writing offset size failed."; | 1934 QUIC_BUG << "Writing offset size failed."; |
1935 return false; | 1935 return false; |
1936 } | 1936 } |
1937 if (!no_stream_frame_length) { | 1937 if (!no_stream_frame_length) { |
1938 if ((frame.frame_length > numeric_limits<uint16_t>::max()) || | 1938 if ((frame.frame_length > numeric_limits<uint16_t>::max()) || |
1939 !writer->WriteUInt16(static_cast<uint16_t>(frame.frame_length))) { | 1939 !writer->WriteUInt16(static_cast<uint16_t>(frame.frame_length))) { |
1940 LOG(DFATAL) << "Writing stream frame length failed"; | 1940 QUIC_BUG << "Writing stream frame length failed"; |
1941 return false; | 1941 return false; |
1942 } | 1942 } |
1943 } | 1943 } |
1944 | 1944 |
1945 if (!writer->WriteBytes(frame.frame_buffer, frame.frame_length)) { | 1945 if (!writer->WriteBytes(frame.frame_buffer, frame.frame_length)) { |
1946 LOG(DFATAL) << "Writing frame data failed."; | 1946 QUIC_BUG << "Writing frame data failed."; |
1947 return false; | 1947 return false; |
1948 } | 1948 } |
1949 return true; | 1949 return true; |
1950 } | 1950 } |
1951 | 1951 |
1952 void QuicFramer::set_version(const QuicVersion version) { | 1952 void QuicFramer::set_version(const QuicVersion version) { |
1953 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1953 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
1954 quic_version_ = version; | 1954 quic_version_ = version; |
1955 } | 1955 } |
1956 | 1956 |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2163 | 2163 |
2164 bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header, | 2164 bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header, |
2165 const QuicStopWaitingFrame& frame, | 2165 const QuicStopWaitingFrame& frame, |
2166 QuicDataWriter* writer) { | 2166 QuicDataWriter* writer) { |
2167 DCHECK_GE(header.packet_number, frame.least_unacked); | 2167 DCHECK_GE(header.packet_number, frame.least_unacked); |
2168 const QuicPacketNumber least_unacked_delta = | 2168 const QuicPacketNumber least_unacked_delta = |
2169 header.packet_number - frame.least_unacked; | 2169 header.packet_number - frame.least_unacked; |
2170 const QuicPacketNumber length_shift = | 2170 const QuicPacketNumber length_shift = |
2171 header.public_header.packet_number_length * 8; | 2171 header.public_header.packet_number_length * 8; |
2172 if (!writer->WriteUInt8(frame.entropy_hash)) { | 2172 if (!writer->WriteUInt8(frame.entropy_hash)) { |
2173 LOG(DFATAL) << " hash failed"; | 2173 QUIC_BUG << " hash failed"; |
2174 return false; | 2174 return false; |
2175 } | 2175 } |
2176 | 2176 |
2177 if (least_unacked_delta >> length_shift > 0) { | 2177 if (least_unacked_delta >> length_shift > 0) { |
2178 LOG(DFATAL) << "packet_number_length " | 2178 QUIC_BUG << "packet_number_length " |
2179 << header.public_header.packet_number_length | 2179 << header.public_header.packet_number_length |
2180 << " is too small for least_unacked_delta: " | 2180 << " is too small for least_unacked_delta: " |
2181 << least_unacked_delta; | 2181 << least_unacked_delta; |
2182 return false; | 2182 return false; |
2183 } | 2183 } |
2184 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 2184 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, |
2185 least_unacked_delta, writer)) { | 2185 least_unacked_delta, writer)) { |
2186 LOG(DFATAL) << " seq failed: " << header.public_header.packet_number_length; | 2186 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; |
2187 return false; | 2187 return false; |
2188 } | 2188 } |
2189 | 2189 |
2190 return true; | 2190 return true; |
2191 } | 2191 } |
2192 | 2192 |
2193 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, | 2193 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, |
2194 QuicDataWriter* writer) { | 2194 QuicDataWriter* writer) { |
2195 if (!writer->WriteUInt32(frame.stream_id)) { | 2195 if (!writer->WriteUInt32(frame.stream_id)) { |
2196 return false; | 2196 return false; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2260 | 2260 |
2261 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2261 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2262 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2262 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
2263 << " detail: " << detailed_error_; | 2263 << " detail: " << detailed_error_; |
2264 set_error(error); | 2264 set_error(error); |
2265 visitor_->OnError(this); | 2265 visitor_->OnError(this); |
2266 return false; | 2266 return false; |
2267 } | 2267 } |
2268 | 2268 |
2269 } // namespace net | 2269 } // namespace net |
OLD | NEW |