| 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 |