| 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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 case PACKET_FLAGS_2BYTE_SEQUENCE: | 125 case PACKET_FLAGS_2BYTE_SEQUENCE: |
| 126 return PACKET_2BYTE_SEQUENCE_NUMBER; | 126 return PACKET_2BYTE_SEQUENCE_NUMBER; |
| 127 case PACKET_FLAGS_1BYTE_SEQUENCE: | 127 case PACKET_FLAGS_1BYTE_SEQUENCE: |
| 128 return PACKET_1BYTE_SEQUENCE_NUMBER; | 128 return PACKET_1BYTE_SEQUENCE_NUMBER; |
| 129 default: | 129 default: |
| 130 LOG(DFATAL) << "Unreachable case statement."; | 130 LOG(DFATAL) << "Unreachable case statement."; |
| 131 return PACKET_6BYTE_SEQUENCE_NUMBER; | 131 return PACKET_6BYTE_SEQUENCE_NUMBER; |
| 132 } | 132 } |
| 133 } | 133 } |
| 134 | 134 |
| 135 bool CanTruncate( | 135 bool CanTruncate(QuicVersion version, |
| 136 QuicVersion version, const QuicFrame& frame, size_t free_bytes) { | 136 const QuicFrame& frame, |
| 137 size_t free_bytes) { |
| 137 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) && | 138 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) && |
| 138 free_bytes >= | 139 free_bytes >= |
| 139 QuicFramer::GetMinAckFrameSize(version, | 140 QuicFramer::GetMinAckFrameSize(version, |
| 140 PACKET_6BYTE_SEQUENCE_NUMBER, | 141 PACKET_6BYTE_SEQUENCE_NUMBER, |
| 141 PACKET_6BYTE_SEQUENCE_NUMBER)) { | 142 PACKET_6BYTE_SEQUENCE_NUMBER)) { |
| 142 return true; | 143 return true; |
| 143 } | 144 } |
| 144 return false; | 145 return false; |
| 145 } | 146 } |
| 146 | 147 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 167 supported_versions_(supported_versions), | 168 supported_versions_(supported_versions), |
| 168 decrypter_level_(ENCRYPTION_NONE), | 169 decrypter_level_(ENCRYPTION_NONE), |
| 169 alternative_decrypter_level_(ENCRYPTION_NONE), | 170 alternative_decrypter_level_(ENCRYPTION_NONE), |
| 170 alternative_decrypter_latch_(false), | 171 alternative_decrypter_latch_(false), |
| 171 is_server_(is_server), | 172 is_server_(is_server), |
| 172 validate_flags_(true), | 173 validate_flags_(true), |
| 173 creation_time_(creation_time) { | 174 creation_time_(creation_time) { |
| 174 DCHECK(!supported_versions.empty()); | 175 DCHECK(!supported_versions.empty()); |
| 175 quic_version_ = supported_versions_[0]; | 176 quic_version_ = supported_versions_[0]; |
| 176 decrypter_.reset(QuicDecrypter::Create(kNULL)); | 177 decrypter_.reset(QuicDecrypter::Create(kNULL)); |
| 177 encrypter_[ENCRYPTION_NONE].reset( | 178 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); |
| 178 QuicEncrypter::Create(kNULL)); | |
| 179 } | 179 } |
| 180 | 180 |
| 181 QuicFramer::~QuicFramer() {} | 181 QuicFramer::~QuicFramer() { |
| 182 } |
| 182 | 183 |
| 183 // static | 184 // static |
| 184 size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version, | 185 size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version, |
| 185 QuicStreamId stream_id, | 186 QuicStreamId stream_id, |
| 186 QuicStreamOffset offset, | 187 QuicStreamOffset offset, |
| 187 bool last_frame_in_packet, | 188 bool last_frame_in_packet, |
| 188 InFecGroup is_in_fec_group) { | 189 InFecGroup is_in_fec_group) { |
| 189 bool no_stream_frame_length = last_frame_in_packet && | 190 bool no_stream_frame_length = |
| 190 is_in_fec_group == NOT_IN_FEC_GROUP; | 191 last_frame_in_packet && is_in_fec_group == NOT_IN_FEC_GROUP; |
| 191 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + | 192 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + |
| 192 GetStreamOffsetSize(offset) + | 193 GetStreamOffsetSize(offset) + |
| 193 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); | 194 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); |
| 194 } | 195 } |
| 195 | 196 |
| 196 // static | 197 // static |
| 197 size_t QuicFramer::GetMinAckFrameSize( | 198 size_t QuicFramer::GetMinAckFrameSize( |
| 198 QuicVersion version, | 199 QuicVersion version, |
| 199 QuicSequenceNumberLength sequence_number_length, | 200 QuicSequenceNumberLength sequence_number_length, |
| 200 QuicSequenceNumberLength largest_observed_length) { | 201 QuicSequenceNumberLength largest_observed_length) { |
| 201 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 202 return kQuicFrameTypeSize + kQuicEntropyHashSize + sequence_number_length + |
| 202 sequence_number_length + kQuicEntropyHashSize + | 203 kQuicEntropyHashSize + largest_observed_length + |
| 203 largest_observed_length + kQuicDeltaTimeLargestObservedSize; | 204 kQuicDeltaTimeLargestObservedSize; |
| 204 } | 205 } |
| 205 | 206 |
| 206 // static | 207 // static |
| 207 size_t QuicFramer::GetStopWaitingFrameSize( | 208 size_t QuicFramer::GetStopWaitingFrameSize( |
| 208 QuicSequenceNumberLength sequence_number_length) { | 209 QuicSequenceNumberLength sequence_number_length) { |
| 209 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 210 return kQuicFrameTypeSize + kQuicEntropyHashSize + sequence_number_length; |
| 210 sequence_number_length; | |
| 211 } | 211 } |
| 212 | 212 |
| 213 // static | 213 // static |
| 214 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) { | 214 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) { |
| 215 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + | 215 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize + |
| 216 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + | 216 kQuicErrorCodeSize + kQuicErrorDetailsLengthSize; |
| 217 kQuicErrorDetailsLengthSize; | |
| 218 } | 217 } |
| 219 | 218 |
| 220 // static | 219 // static |
| 221 size_t QuicFramer::GetMinConnectionCloseFrameSize() { | 220 size_t QuicFramer::GetMinConnectionCloseFrameSize() { |
| 222 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize; | 221 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize; |
| 223 } | 222 } |
| 224 | 223 |
| 225 // static | 224 // static |
| 226 size_t QuicFramer::GetMinGoAwayFrameSize() { | 225 size_t QuicFramer::GetMinGoAwayFrameSize() { |
| 227 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + | 226 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + |
| 228 kQuicMaxStreamIdSize; | 227 kQuicMaxStreamIdSize; |
| 229 } | 228 } |
| 230 | 229 |
| 231 // static | 230 // static |
| 232 size_t QuicFramer::GetWindowUpdateFrameSize() { | 231 size_t QuicFramer::GetWindowUpdateFrameSize() { |
| 233 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; | 232 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; |
| 234 } | 233 } |
| 235 | 234 |
| 236 // static | 235 // static |
| 237 size_t QuicFramer::GetBlockedFrameSize() { | 236 size_t QuicFramer::GetBlockedFrameSize() { |
| 238 return kQuicFrameTypeSize + kQuicMaxStreamIdSize; | 237 return kQuicFrameTypeSize + kQuicMaxStreamIdSize; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 265 return i; | 264 return i; |
| 266 } | 265 } |
| 267 } | 266 } |
| 268 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; | 267 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; |
| 269 return 8; | 268 return 8; |
| 270 } | 269 } |
| 271 | 270 |
| 272 // static | 271 // static |
| 273 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { | 272 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { |
| 274 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + | 273 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + |
| 275 number_versions * kQuicVersionSize; | 274 number_versions * kQuicVersionSize; |
| 276 } | 275 } |
| 277 | 276 |
| 278 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { | 277 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { |
| 279 for (size_t i = 0; i < supported_versions_.size(); ++i) { | 278 for (size_t i = 0; i < supported_versions_.size(); ++i) { |
| 280 if (version == supported_versions_[i]) { | 279 if (version == supported_versions_[i]) { |
| 281 return true; | 280 return true; |
| 282 } | 281 } |
| 283 } | 282 } |
| 284 return false; | 283 return false; |
| 285 } | 284 } |
| 286 | 285 |
| 287 size_t QuicFramer::GetSerializedFrameLength( | 286 size_t QuicFramer::GetSerializedFrameLength( |
| 288 const QuicFrame& frame, | 287 const QuicFrame& frame, |
| 289 size_t free_bytes, | 288 size_t free_bytes, |
| 290 bool first_frame, | 289 bool first_frame, |
| 291 bool last_frame, | 290 bool last_frame, |
| 292 InFecGroup is_in_fec_group, | 291 InFecGroup is_in_fec_group, |
| 293 QuicSequenceNumberLength sequence_number_length) { | 292 QuicSequenceNumberLength sequence_number_length) { |
| 294 if (frame.type == PADDING_FRAME) { | 293 if (frame.type == PADDING_FRAME) { |
| 295 // PADDING implies end of packet. | 294 // PADDING implies end of packet. |
| 296 return free_bytes; | 295 return free_bytes; |
| 297 } | 296 } |
| 298 size_t frame_len = | 297 size_t frame_len = ComputeFrameLength( |
| 299 ComputeFrameLength(frame, last_frame, is_in_fec_group, | 298 frame, last_frame, is_in_fec_group, sequence_number_length); |
| 300 sequence_number_length); | |
| 301 if (frame_len > free_bytes) { | 299 if (frame_len > free_bytes) { |
| 302 // Only truncate the first frame in a packet, so if subsequent ones go | 300 // Only truncate the first frame in a packet, so if subsequent ones go |
| 303 // over, stop including more frames. | 301 // over, stop including more frames. |
| 304 if (!first_frame) { | 302 if (!first_frame) { |
| 305 return 0; | 303 return 0; |
| 306 } | 304 } |
| 307 if (CanTruncate(quic_version_, frame, free_bytes)) { | 305 if (CanTruncate(quic_version_, frame, free_bytes)) { |
| 308 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 306 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
| 309 // Note that we may not use every byte of the writer in this case. | 307 // Note that we may not use every byte of the writer in this case. |
| 310 DVLOG(1) << "Truncating large frame"; | 308 DVLOG(1) << "Truncating large frame"; |
| 311 return free_bytes; | 309 return free_bytes; |
| 312 } else if (!FLAGS_quic_allow_oversized_packets_for_test) { | 310 } else if (!FLAGS_quic_allow_oversized_packets_for_test) { |
| 313 return 0; | 311 return 0; |
| 314 } | 312 } |
| 315 } | 313 } |
| 316 return frame_len; | 314 return frame_len; |
| 317 } | 315 } |
| 318 | 316 |
| 319 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) { } | 317 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) { |
| 318 } |
| 320 | 319 |
| 321 QuicFramer::AckFrameInfo::~AckFrameInfo() { } | 320 QuicFramer::AckFrameInfo::~AckFrameInfo() { |
| 321 } |
| 322 | 322 |
| 323 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | 323 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( |
| 324 const QuicPacketHeader& header) const { | 324 const QuicPacketHeader& header) const { |
| 325 return header.entropy_flag << (header.packet_sequence_number % 8); | 325 return header.entropy_flag << (header.packet_sequence_number % 8); |
| 326 } | 326 } |
| 327 | 327 |
| 328 // Test only. | 328 // Test only. |
| 329 SerializedPacket QuicFramer::BuildUnsizedDataPacket( | 329 SerializedPacket QuicFramer::BuildUnsizedDataPacket( |
| 330 const QuicPacketHeader& header, | 330 const QuicPacketHeader& header, |
| 331 const QuicFrames& frames) { | 331 const QuicFrames& frames) { |
| 332 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); | 332 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); |
| 333 size_t packet_size = GetPacketHeaderSize(header); | 333 size_t packet_size = GetPacketHeaderSize(header); |
| 334 for (size_t i = 0; i < frames.size(); ++i) { | 334 for (size_t i = 0; i < frames.size(); ++i) { |
| 335 DCHECK_LE(packet_size, max_plaintext_size); | 335 DCHECK_LE(packet_size, max_plaintext_size); |
| 336 bool first_frame = i == 0; | 336 bool first_frame = i == 0; |
| 337 bool last_frame = i == frames.size() - 1; | 337 bool last_frame = i == frames.size() - 1; |
| 338 const size_t frame_size = GetSerializedFrameLength( | 338 const size_t frame_size = |
| 339 frames[i], max_plaintext_size - packet_size, first_frame, last_frame, | 339 GetSerializedFrameLength(frames[i], |
| 340 header.is_in_fec_group, | 340 max_plaintext_size - packet_size, |
| 341 header.public_header.sequence_number_length); | 341 first_frame, |
| 342 last_frame, |
| 343 header.is_in_fec_group, |
| 344 header.public_header.sequence_number_length); |
| 342 DCHECK(frame_size); | 345 DCHECK(frame_size); |
| 343 packet_size += frame_size; | 346 packet_size += frame_size; |
| 344 } | 347 } |
| 345 return BuildDataPacket(header, frames, packet_size); | 348 return BuildDataPacket(header, frames, packet_size); |
| 346 } | 349 } |
| 347 | 350 |
| 348 SerializedPacket QuicFramer::BuildDataPacket( | 351 SerializedPacket QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
| 349 const QuicPacketHeader& header, | 352 const QuicFrames& frames, |
| 350 const QuicFrames& frames, | 353 size_t packet_size) { |
| 351 size_t packet_size) { | |
| 352 QuicDataWriter writer(packet_size); | 354 QuicDataWriter writer(packet_size); |
| 353 const SerializedPacket kNoPacket( | 355 const SerializedPacket kNoPacket( |
| 354 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 356 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); |
| 355 if (!AppendPacketHeader(header, &writer)) { | 357 if (!AppendPacketHeader(header, &writer)) { |
| 356 LOG(DFATAL) << "AppendPacketHeader failed"; | 358 LOG(DFATAL) << "AppendPacketHeader failed"; |
| 357 return kNoPacket; | 359 return kNoPacket; |
| 358 } | 360 } |
| 359 | 361 |
| 360 for (size_t i = 0; i < frames.size(); ++i) { | 362 for (size_t i = 0; i < frames.size(); ++i) { |
| 361 const QuicFrame& frame = frames[i]; | 363 const QuicFrame& frame = frames[i]; |
| 362 | 364 |
| 363 // Determine if we should write stream frame length in header. | 365 // Determine if we should write stream frame length in header. |
| 364 const bool no_stream_frame_length = | 366 const bool no_stream_frame_length = |
| 365 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && | 367 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && |
| 366 (i == frames.size() - 1); | 368 (i == frames.size() - 1); |
| 367 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { | 369 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { |
| 368 LOG(DFATAL) << "AppendTypeByte failed"; | 370 LOG(DFATAL) << "AppendTypeByte failed"; |
| 369 return kNoPacket; | 371 return kNoPacket; |
| 370 } | 372 } |
| 371 | 373 |
| 372 switch (frame.type) { | 374 switch (frame.type) { |
| 373 case PADDING_FRAME: | 375 case PADDING_FRAME: |
| 374 writer.WritePadding(); | 376 writer.WritePadding(); |
| 375 break; | 377 break; |
| 376 case STREAM_FRAME: | 378 case STREAM_FRAME: |
| 377 if (!AppendStreamFrame( | 379 if (!AppendStreamFrame( |
| 378 *frame.stream_frame, no_stream_frame_length, &writer)) { | 380 *frame.stream_frame, no_stream_frame_length, &writer)) { |
| 379 LOG(DFATAL) << "AppendStreamFrame failed"; | 381 LOG(DFATAL) << "AppendStreamFrame failed"; |
| 380 return kNoPacket; | 382 return kNoPacket; |
| 381 } | 383 } |
| 382 break; | 384 break; |
| 383 case ACK_FRAME: | 385 case ACK_FRAME: |
| 384 if (!AppendAckFrameAndTypeByte( | 386 if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) { |
| 385 header, *frame.ack_frame, &writer)) { | |
| 386 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; | 387 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; |
| 387 return kNoPacket; | 388 return kNoPacket; |
| 388 } | 389 } |
| 389 break; | 390 break; |
| 390 case CONGESTION_FEEDBACK_FRAME: | 391 case CONGESTION_FEEDBACK_FRAME: |
| 391 if (!AppendCongestionFeedbackFrame( | 392 if (!AppendCongestionFeedbackFrame(*frame.congestion_feedback_frame, |
| 392 *frame.congestion_feedback_frame, &writer)) { | 393 &writer)) { |
| 393 LOG(DFATAL) << "AppendCongestionFeedbackFrame failed"; | 394 LOG(DFATAL) << "AppendCongestionFeedbackFrame failed"; |
| 394 return kNoPacket; | 395 return kNoPacket; |
| 395 } | 396 } |
| 396 break; | 397 break; |
| 397 case STOP_WAITING_FRAME: | 398 case STOP_WAITING_FRAME: |
| 398 if (quic_version_ <= QUIC_VERSION_15) { | 399 if (quic_version_ <= QUIC_VERSION_15) { |
| 399 LOG(DFATAL) << "Attempt to add a StopWaitingFrame in " | 400 LOG(DFATAL) << "Attempt to add a StopWaitingFrame in " |
| 400 << QuicVersionToString(quic_version_); | 401 << QuicVersionToString(quic_version_); |
| 401 return kNoPacket; | 402 return kNoPacket; |
| 402 } | 403 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 414 } | 415 } |
| 415 // Ping has no payload. | 416 // Ping has no payload. |
| 416 break; | 417 break; |
| 417 case RST_STREAM_FRAME: | 418 case RST_STREAM_FRAME: |
| 418 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { | 419 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { |
| 419 LOG(DFATAL) << "AppendRstStreamFrame failed"; | 420 LOG(DFATAL) << "AppendRstStreamFrame failed"; |
| 420 return kNoPacket; | 421 return kNoPacket; |
| 421 } | 422 } |
| 422 break; | 423 break; |
| 423 case CONNECTION_CLOSE_FRAME: | 424 case CONNECTION_CLOSE_FRAME: |
| 424 if (!AppendConnectionCloseFrame( | 425 if (!AppendConnectionCloseFrame(*frame.connection_close_frame, |
| 425 *frame.connection_close_frame, &writer)) { | 426 &writer)) { |
| 426 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; | 427 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; |
| 427 return kNoPacket; | 428 return kNoPacket; |
| 428 } | 429 } |
| 429 break; | 430 break; |
| 430 case GOAWAY_FRAME: | 431 case GOAWAY_FRAME: |
| 431 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { | 432 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { |
| 432 LOG(DFATAL) << "AppendGoAwayFrame failed"; | 433 LOG(DFATAL) << "AppendGoAwayFrame failed"; |
| 433 return kNoPacket; | 434 return kNoPacket; |
| 434 } | 435 } |
| 435 break; | 436 break; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 450 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; | 451 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; |
| 451 return kNoPacket; | 452 return kNoPacket; |
| 452 } | 453 } |
| 453 } | 454 } |
| 454 | 455 |
| 455 // Save the length before writing, because take clears it. | 456 // Save the length before writing, because take clears it. |
| 456 const size_t len = writer.length(); | 457 const size_t len = writer.length(); |
| 457 // Less than or equal because truncated acks end up with max_plaintex_size | 458 // Less than or equal because truncated acks end up with max_plaintex_size |
| 458 // length, even though they're typically slightly shorter. | 459 // length, even though they're typically slightly shorter. |
| 459 DCHECK_LE(len, packet_size); | 460 DCHECK_LE(len, packet_size); |
| 460 QuicPacket* packet = QuicPacket::NewDataPacket( | 461 QuicPacket* packet = |
| 461 writer.take(), len, true, header.public_header.connection_id_length, | 462 QuicPacket::NewDataPacket(writer.take(), |
| 462 header.public_header.version_flag, | 463 len, |
| 463 header.public_header.sequence_number_length); | 464 true, |
| 465 header.public_header.connection_id_length, |
| 466 header.public_header.version_flag, |
| 467 header.public_header.sequence_number_length); |
| 464 | 468 |
| 465 if (fec_builder_) { | 469 if (fec_builder_) { |
| 466 fec_builder_->OnBuiltFecProtectedPayload(header, | 470 fec_builder_->OnBuiltFecProtectedPayload(header, |
| 467 packet->FecProtectedData()); | 471 packet->FecProtectedData()); |
| 468 } | 472 } |
| 469 | 473 |
| 470 return SerializedPacket(header.packet_sequence_number, | 474 return SerializedPacket(header.packet_sequence_number, |
| 471 header.public_header.sequence_number_length, packet, | 475 header.public_header.sequence_number_length, |
| 472 GetPacketEntropyHash(header), NULL); | 476 packet, |
| 477 GetPacketEntropyHash(header), |
| 478 NULL); |
| 473 } | 479 } |
| 474 | 480 |
| 475 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header, | 481 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header, |
| 476 const QuicFecData& fec) { | 482 const QuicFecData& fec) { |
| 477 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); | 483 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); |
| 478 DCHECK_NE(0u, header.fec_group); | 484 DCHECK_NE(0u, header.fec_group); |
| 479 size_t len = GetPacketHeaderSize(header); | 485 size_t len = GetPacketHeaderSize(header); |
| 480 len += fec.redundancy.length(); | 486 len += fec.redundancy.length(); |
| 481 | 487 |
| 482 QuicDataWriter writer(len); | 488 QuicDataWriter writer(len); |
| 483 const SerializedPacket kNoPacket( | 489 const SerializedPacket kNoPacket( |
| 484 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 490 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); |
| 485 if (!AppendPacketHeader(header, &writer)) { | 491 if (!AppendPacketHeader(header, &writer)) { |
| 486 LOG(DFATAL) << "AppendPacketHeader failed"; | 492 LOG(DFATAL) << "AppendPacketHeader failed"; |
| 487 return kNoPacket; | 493 return kNoPacket; |
| 488 } | 494 } |
| 489 | 495 |
| 490 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 496 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
| 491 LOG(DFATAL) << "Failed to add FEC"; | 497 LOG(DFATAL) << "Failed to add FEC"; |
| 492 return kNoPacket; | 498 return kNoPacket; |
| 493 } | 499 } |
| 494 | 500 |
| 495 return SerializedPacket( | 501 return SerializedPacket( |
| 496 header.packet_sequence_number, | 502 header.packet_sequence_number, |
| 497 header.public_header.sequence_number_length, | 503 header.public_header.sequence_number_length, |
| 498 QuicPacket::NewFecPacket(writer.take(), len, true, | 504 QuicPacket::NewFecPacket(writer.take(), |
| 505 len, |
| 506 true, |
| 499 header.public_header.connection_id_length, | 507 header.public_header.connection_id_length, |
| 500 header.public_header.version_flag, | 508 header.public_header.version_flag, |
| 501 header.public_header.sequence_number_length), | 509 header.public_header.sequence_number_length), |
| 502 GetPacketEntropyHash(header), NULL); | 510 GetPacketEntropyHash(header), |
| 511 NULL); |
| 503 } | 512 } |
| 504 | 513 |
| 505 // static | 514 // static |
| 506 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( | 515 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( |
| 507 const QuicPublicResetPacket& packet) { | 516 const QuicPublicResetPacket& packet) { |
| 508 DCHECK(packet.public_header.reset_flag); | 517 DCHECK(packet.public_header.reset_flag); |
| 509 | 518 |
| 510 CryptoHandshakeMessage reset; | 519 CryptoHandshakeMessage reset; |
| 511 reset.set_tag(kPRST); | 520 reset.set_tag(kPRST); |
| 512 reset.SetValue(kRNON, packet.nonce_proof); | 521 reset.SetValue(kRNON, packet.nonce_proof); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 620 set_detailed_error("Unable to read supported version in negotiation."); | 629 set_detailed_error("Unable to read supported version in negotiation."); |
| 621 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); | 630 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); |
| 622 } | 631 } |
| 623 public_header->versions.push_back(QuicTagToQuicVersion(version)); | 632 public_header->versions.push_back(QuicTagToQuicVersion(version)); |
| 624 } while (!reader_->IsDoneReading()); | 633 } while (!reader_->IsDoneReading()); |
| 625 | 634 |
| 626 visitor_->OnVersionNegotiationPacket(*public_header); | 635 visitor_->OnVersionNegotiationPacket(*public_header); |
| 627 return true; | 636 return true; |
| 628 } | 637 } |
| 629 | 638 |
| 630 bool QuicFramer::ProcessDataPacket( | 639 bool QuicFramer::ProcessDataPacket(const QuicPacketPublicHeader& public_header, |
| 631 const QuicPacketPublicHeader& public_header, | 640 const QuicEncryptedPacket& packet) { |
| 632 const QuicEncryptedPacket& packet) { | |
| 633 QuicPacketHeader header(public_header); | 641 QuicPacketHeader header(public_header); |
| 634 if (!ProcessPacketHeader(&header, packet)) { | 642 if (!ProcessPacketHeader(&header, packet)) { |
| 635 DLOG(WARNING) << "Unable to process data packet header."; | 643 DLOG(WARNING) << "Unable to process data packet header."; |
| 636 return false; | 644 return false; |
| 637 } | 645 } |
| 638 | 646 |
| 639 if (!visitor_->OnPacketHeader(header)) { | 647 if (!visitor_->OnPacketHeader(header)) { |
| 640 // The visitor suppresses further processing of the packet. | 648 // The visitor suppresses further processing of the packet. |
| 641 return true; | 649 return true; |
| 642 } | 650 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 if (reset->GetUint64(kRSEQ, &packet.rejected_sequence_number) != | 700 if (reset->GetUint64(kRSEQ, &packet.rejected_sequence_number) != |
| 693 QUIC_NO_ERROR) { | 701 QUIC_NO_ERROR) { |
| 694 set_detailed_error("Unable to read rejected sequence number."); | 702 set_detailed_error("Unable to read rejected sequence number."); |
| 695 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); | 703 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); |
| 696 } | 704 } |
| 697 | 705 |
| 698 StringPiece address; | 706 StringPiece address; |
| 699 if (reset->GetStringPiece(kCADR, &address)) { | 707 if (reset->GetStringPiece(kCADR, &address)) { |
| 700 QuicSocketAddressCoder address_coder; | 708 QuicSocketAddressCoder address_coder; |
| 701 if (address_coder.Decode(address.data(), address.length())) { | 709 if (address_coder.Decode(address.data(), address.length())) { |
| 702 packet.client_address = IPEndPoint(address_coder.ip(), | 710 packet.client_address = |
| 703 address_coder.port()); | 711 IPEndPoint(address_coder.ip(), address_coder.port()); |
| 704 } | 712 } |
| 705 } | 713 } |
| 706 | 714 |
| 707 visitor_->OnPublicResetPacket(packet); | 715 visitor_->OnPublicResetPacket(packet); |
| 708 return true; | 716 return true; |
| 709 } | 717 } |
| 710 | 718 |
| 711 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header, | 719 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header, |
| 712 StringPiece payload) { | 720 StringPiece payload) { |
| 713 DCHECK(!reader_.get()); | 721 DCHECK(!reader_.get()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 744 uint8 public_flags = 0; | 752 uint8 public_flags = 0; |
| 745 if (header.public_header.reset_flag) { | 753 if (header.public_header.reset_flag) { |
| 746 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 754 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
| 747 } | 755 } |
| 748 if (header.public_header.version_flag) { | 756 if (header.public_header.version_flag) { |
| 749 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 757 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
| 750 } | 758 } |
| 751 | 759 |
| 752 public_flags |= | 760 public_flags |= |
| 753 GetSequenceNumberFlags(header.public_header.sequence_number_length) | 761 GetSequenceNumberFlags(header.public_header.sequence_number_length) |
| 754 << kPublicHeaderSequenceNumberShift; | 762 << kPublicHeaderSequenceNumberShift; |
| 755 | 763 |
| 756 switch (header.public_header.connection_id_length) { | 764 switch (header.public_header.connection_id_length) { |
| 757 case PACKET_0BYTE_CONNECTION_ID: | 765 case PACKET_0BYTE_CONNECTION_ID: |
| 758 if (!writer->WriteUInt8( | 766 if (!writer->WriteUInt8(public_flags | |
| 759 public_flags | PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { | 767 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { |
| 760 return false; | 768 return false; |
| 761 } | 769 } |
| 762 break; | 770 break; |
| 763 case PACKET_1BYTE_CONNECTION_ID: | 771 case PACKET_1BYTE_CONNECTION_ID: |
| 764 if (!writer->WriteUInt8( | 772 if (!writer->WriteUInt8(public_flags | |
| 765 public_flags | PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID)) { | 773 PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID)) { |
| 766 return false; | 774 return false; |
| 767 } | 775 } |
| 768 if (!writer->WriteUInt8( | 776 if (!writer->WriteUInt8(header.public_header.connection_id & |
| 769 header.public_header.connection_id & k1ByteConnectionIdMask)) { | 777 k1ByteConnectionIdMask)) { |
| 770 return false; | 778 return false; |
| 771 } | 779 } |
| 772 break; | 780 break; |
| 773 case PACKET_4BYTE_CONNECTION_ID: | 781 case PACKET_4BYTE_CONNECTION_ID: |
| 774 if (!writer->WriteUInt8( | 782 if (!writer->WriteUInt8(public_flags | |
| 775 public_flags | PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID)) { | 783 PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID)) { |
| 776 return false; | 784 return false; |
| 777 } | 785 } |
| 778 if (!writer->WriteUInt32( | 786 if (!writer->WriteUInt32(header.public_header.connection_id & |
| 779 header.public_header.connection_id & k4ByteConnectionIdMask)) { | 787 k4ByteConnectionIdMask)) { |
| 780 return false; | 788 return false; |
| 781 } | 789 } |
| 782 break; | 790 break; |
| 783 case PACKET_8BYTE_CONNECTION_ID: | 791 case PACKET_8BYTE_CONNECTION_ID: |
| 784 if (!writer->WriteUInt8( | 792 if (!writer->WriteUInt8(public_flags | |
| 785 public_flags | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID)) { | 793 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID)) { |
| 786 return false; | 794 return false; |
| 787 } | 795 } |
| 788 if (!writer->WriteUInt64(header.public_header.connection_id)) { | 796 if (!writer->WriteUInt64(header.public_header.connection_id)) { |
| 789 return false; | 797 return false; |
| 790 } | 798 } |
| 791 break; | 799 break; |
| 792 } | 800 } |
| 793 last_serialized_connection_id_ = header.public_header.connection_id; | 801 last_serialized_connection_id_ = header.public_header.connection_id; |
| 794 | 802 |
| 795 if (header.public_header.version_flag) { | 803 if (header.public_header.version_flag) { |
| 796 DCHECK(!is_server_); | 804 DCHECK(!is_server_); |
| 797 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); | 805 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); |
| 798 } | 806 } |
| 799 | 807 |
| 800 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, | 808 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, |
| 801 header.packet_sequence_number, writer)) { | 809 header.packet_sequence_number, |
| 810 writer)) { |
| 802 return false; | 811 return false; |
| 803 } | 812 } |
| 804 | 813 |
| 805 uint8 private_flags = 0; | 814 uint8 private_flags = 0; |
| 806 if (header.entropy_flag) { | 815 if (header.entropy_flag) { |
| 807 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY; | 816 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY; |
| 808 } | 817 } |
| 809 if (header.is_in_fec_group == IN_FEC_GROUP) { | 818 if (header.is_in_fec_group == IN_FEC_GROUP) { |
| 810 private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP; | 819 private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP; |
| 811 } | 820 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 837 QuicSequenceNumberLength sequence_number_length, | 846 QuicSequenceNumberLength sequence_number_length, |
| 838 QuicPacketSequenceNumber packet_sequence_number) const { | 847 QuicPacketSequenceNumber packet_sequence_number) const { |
| 839 // The new sequence number might have wrapped to the next epoch, or | 848 // The new sequence number might have wrapped to the next epoch, or |
| 840 // it might have reverse wrapped to the previous epoch, or it might | 849 // it might have reverse wrapped to the previous epoch, or it might |
| 841 // remain in the same epoch. Select the sequence number closest to the | 850 // remain in the same epoch. Select the sequence number closest to the |
| 842 // next expected sequence number, the previous sequence number plus 1. | 851 // next expected sequence number, the previous sequence number plus 1. |
| 843 | 852 |
| 844 // epoch_delta is the delta between epochs the sequence number was serialized | 853 // epoch_delta is the delta between epochs the sequence number was serialized |
| 845 // with, so the correct value is likely the same epoch as the last sequence | 854 // with, so the correct value is likely the same epoch as the last sequence |
| 846 // number or an adjacent epoch. | 855 // number or an adjacent epoch. |
| 847 const QuicPacketSequenceNumber epoch_delta = | 856 const QuicPacketSequenceNumber epoch_delta = GG_UINT64_C(1) |
| 848 GG_UINT64_C(1) << (8 * sequence_number_length); | 857 << (8 * sequence_number_length); |
| 849 QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1; | 858 QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1; |
| 850 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1); | 859 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1); |
| 851 QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta; | 860 QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta; |
| 852 QuicPacketSequenceNumber next_epoch = epoch + epoch_delta; | 861 QuicPacketSequenceNumber next_epoch = epoch + epoch_delta; |
| 853 | 862 |
| 854 return ClosestTo(next_sequence_number, | 863 return ClosestTo(next_sequence_number, |
| 855 epoch + packet_sequence_number, | 864 epoch + packet_sequence_number, |
| 856 ClosestTo(next_sequence_number, | 865 ClosestTo(next_sequence_number, |
| 857 prev_epoch + packet_sequence_number, | 866 prev_epoch + packet_sequence_number, |
| 858 next_epoch + packet_sequence_number)); | 867 next_epoch + packet_sequence_number)); |
| 859 } | 868 } |
| 860 | 869 |
| 861 bool QuicFramer::ProcessPublicHeader( | 870 bool QuicFramer::ProcessPublicHeader(QuicPacketPublicHeader* public_header) { |
| 862 QuicPacketPublicHeader* public_header) { | |
| 863 uint8 public_flags; | 871 uint8 public_flags; |
| 864 if (!reader_->ReadBytes(&public_flags, 1)) { | 872 if (!reader_->ReadBytes(&public_flags, 1)) { |
| 865 set_detailed_error("Unable to read public flags."); | 873 set_detailed_error("Unable to read public flags."); |
| 866 return false; | 874 return false; |
| 867 } | 875 } |
| 868 | 876 |
| 869 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; | 877 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; |
| 870 public_header->version_flag = | 878 public_header->version_flag = |
| 871 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; | 879 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; |
| 872 | 880 |
| 873 if (validate_flags_ && | 881 if (validate_flags_ && !public_header->version_flag && |
| 874 !public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 882 public_flags > PACKET_PUBLIC_FLAGS_MAX) { |
| 875 set_detailed_error("Illegal public flags value."); | 883 set_detailed_error("Illegal public flags value."); |
| 876 return false; | 884 return false; |
| 877 } | 885 } |
| 878 | 886 |
| 879 if (public_header->reset_flag && public_header->version_flag) { | 887 if (public_header->reset_flag && public_header->version_flag) { |
| 880 set_detailed_error("Got version flag in reset packet"); | 888 set_detailed_error("Got version flag in reset packet"); |
| 881 return false; | 889 return false; |
| 882 } | 890 } |
| 883 | 891 |
| 884 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { | 892 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { |
| 885 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID: | 893 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID: |
| 886 if (!reader_->ReadUInt64(&public_header->connection_id)) { | 894 if (!reader_->ReadUInt64(&public_header->connection_id)) { |
| 887 set_detailed_error("Unable to read ConnectionId."); | 895 set_detailed_error("Unable to read ConnectionId."); |
| 888 return false; | 896 return false; |
| 889 } | 897 } |
| 890 public_header->connection_id_length = PACKET_8BYTE_CONNECTION_ID; | 898 public_header->connection_id_length = PACKET_8BYTE_CONNECTION_ID; |
| 891 break; | 899 break; |
| 892 case PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID: | 900 case PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID: |
| 893 // If the connection_id is truncated, expect to read the last serialized | 901 // If the connection_id is truncated, expect to read the last serialized |
| 894 // connection_id. | 902 // connection_id. |
| 895 if (!reader_->ReadBytes(&public_header->connection_id, | 903 if (!reader_->ReadBytes(&public_header->connection_id, |
| 896 PACKET_4BYTE_CONNECTION_ID)) { | 904 PACKET_4BYTE_CONNECTION_ID)) { |
| 897 set_detailed_error("Unable to read ConnectionId."); | 905 set_detailed_error("Unable to read ConnectionId."); |
| 898 return false; | 906 return false; |
| 899 } | 907 } |
| 900 if ((public_header->connection_id & k4ByteConnectionIdMask) != | 908 if ((public_header->connection_id & k4ByteConnectionIdMask) != |
| 901 (last_serialized_connection_id_ & k4ByteConnectionIdMask)) { | 909 (last_serialized_connection_id_ & k4ByteConnectionIdMask)) { |
| 902 set_detailed_error("Truncated 4 byte ConnectionId does not match " | 910 set_detailed_error( |
| 903 "previous connection_id."); | 911 "Truncated 4 byte ConnectionId does not match " |
| 912 "previous connection_id."); |
| 904 return false; | 913 return false; |
| 905 } | 914 } |
| 906 public_header->connection_id_length = PACKET_4BYTE_CONNECTION_ID; | 915 public_header->connection_id_length = PACKET_4BYTE_CONNECTION_ID; |
| 907 public_header->connection_id = last_serialized_connection_id_; | 916 public_header->connection_id = last_serialized_connection_id_; |
| 908 break; | 917 break; |
| 909 case PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID: | 918 case PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID: |
| 910 if (!reader_->ReadBytes(&public_header->connection_id, | 919 if (!reader_->ReadBytes(&public_header->connection_id, |
| 911 PACKET_1BYTE_CONNECTION_ID)) { | 920 PACKET_1BYTE_CONNECTION_ID)) { |
| 912 set_detailed_error("Unable to read ConnectionId."); | 921 set_detailed_error("Unable to read ConnectionId."); |
| 913 return false; | 922 return false; |
| 914 } | 923 } |
| 915 if ((public_header->connection_id & k1ByteConnectionIdMask) != | 924 if ((public_header->connection_id & k1ByteConnectionIdMask) != |
| 916 (last_serialized_connection_id_ & k1ByteConnectionIdMask)) { | 925 (last_serialized_connection_id_ & k1ByteConnectionIdMask)) { |
| 917 set_detailed_error("Truncated 1 byte ConnectionId does not match " | 926 set_detailed_error( |
| 918 "previous connection_id."); | 927 "Truncated 1 byte ConnectionId does not match " |
| 928 "previous connection_id."); |
| 919 return false; | 929 return false; |
| 920 } | 930 } |
| 921 public_header->connection_id_length = PACKET_1BYTE_CONNECTION_ID; | 931 public_header->connection_id_length = PACKET_1BYTE_CONNECTION_ID; |
| 922 public_header->connection_id = last_serialized_connection_id_; | 932 public_header->connection_id = last_serialized_connection_id_; |
| 923 break; | 933 break; |
| 924 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID: | 934 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID: |
| 925 public_header->connection_id_length = PACKET_0BYTE_CONNECTION_ID; | 935 public_header->connection_id_length = PACKET_0BYTE_CONNECTION_ID; |
| 926 public_header->connection_id = last_serialized_connection_id_; | 936 public_header->connection_id = last_serialized_connection_id_; |
| 927 break; | 937 break; |
| 928 } | 938 } |
| 929 | 939 |
| 930 public_header->sequence_number_length = | 940 public_header->sequence_number_length = ReadSequenceNumberLength( |
| 931 ReadSequenceNumberLength( | 941 public_flags >> kPublicHeaderSequenceNumberShift); |
| 932 public_flags >> kPublicHeaderSequenceNumberShift); | |
| 933 | 942 |
| 934 // Read the version only if the packet is from the client. | 943 // Read the version only if the packet is from the client. |
| 935 // version flag from the server means version negotiation packet. | 944 // version flag from the server means version negotiation packet. |
| 936 if (public_header->version_flag && is_server_) { | 945 if (public_header->version_flag && is_server_) { |
| 937 QuicTag version_tag; | 946 QuicTag version_tag; |
| 938 if (!reader_->ReadUInt32(&version_tag)) { | 947 if (!reader_->ReadUInt32(&version_tag)) { |
| 939 set_detailed_error("Unable to read protocol version."); | 948 set_detailed_error("Unable to read protocol version."); |
| 940 return false; | 949 return false; |
| 941 } | 950 } |
| 942 | 951 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 953 return true; | 962 return true; |
| 954 } | 963 } |
| 955 | 964 |
| 956 // static | 965 // static |
| 957 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( | 966 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( |
| 958 QuicPacketSequenceNumber sequence_number) { | 967 QuicPacketSequenceNumber sequence_number) { |
| 959 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { | 968 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { |
| 960 return PACKET_1BYTE_SEQUENCE_NUMBER; | 969 return PACKET_1BYTE_SEQUENCE_NUMBER; |
| 961 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { | 970 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { |
| 962 return PACKET_2BYTE_SEQUENCE_NUMBER; | 971 return PACKET_2BYTE_SEQUENCE_NUMBER; |
| 963 } else if (sequence_number < | 972 } else if (sequence_number < GG_UINT64_C(1) |
| 964 GG_UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { | 973 << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { |
| 965 return PACKET_4BYTE_SEQUENCE_NUMBER; | 974 return PACKET_4BYTE_SEQUENCE_NUMBER; |
| 966 } else { | 975 } else { |
| 967 return PACKET_6BYTE_SEQUENCE_NUMBER; | 976 return PACKET_6BYTE_SEQUENCE_NUMBER; |
| 968 } | 977 } |
| 969 } | 978 } |
| 970 | 979 |
| 971 // static | 980 // static |
| 972 uint8 QuicFramer::GetSequenceNumberFlags( | 981 uint8 QuicFramer::GetSequenceNumberFlags( |
| 973 QuicSequenceNumberLength sequence_number_length) { | 982 QuicSequenceNumberLength sequence_number_length) { |
| 974 switch (sequence_number_length) { | 983 switch (sequence_number_length) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 998 size_t cur_range_length = 0; | 1007 size_t cur_range_length = 0; |
| 999 SequenceNumberSet::const_iterator iter = | 1008 SequenceNumberSet::const_iterator iter = |
| 1000 received_info.missing_packets.begin(); | 1009 received_info.missing_packets.begin(); |
| 1001 QuicPacketSequenceNumber last_missing = *iter; | 1010 QuicPacketSequenceNumber last_missing = *iter; |
| 1002 ++iter; | 1011 ++iter; |
| 1003 for (; iter != received_info.missing_packets.end(); ++iter) { | 1012 for (; iter != received_info.missing_packets.end(); ++iter) { |
| 1004 if (cur_range_length != numeric_limits<uint8>::max() && | 1013 if (cur_range_length != numeric_limits<uint8>::max() && |
| 1005 *iter == (last_missing + 1)) { | 1014 *iter == (last_missing + 1)) { |
| 1006 ++cur_range_length; | 1015 ++cur_range_length; |
| 1007 } else { | 1016 } else { |
| 1008 ack_info.nack_ranges[last_missing - cur_range_length] | 1017 ack_info.nack_ranges[last_missing - cur_range_length] = |
| 1009 = cur_range_length; | 1018 cur_range_length; |
| 1010 cur_range_length = 0; | 1019 cur_range_length = 0; |
| 1011 } | 1020 } |
| 1012 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); | 1021 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); |
| 1013 last_missing = *iter; | 1022 last_missing = *iter; |
| 1014 } | 1023 } |
| 1015 // Include the last nack range. | 1024 // Include the last nack range. |
| 1016 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; | 1025 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; |
| 1017 // Include the range to the largest observed. | 1026 // Include the range to the largest observed. |
| 1018 ack_info.max_delta = max(ack_info.max_delta, | 1027 ack_info.max_delta = |
| 1019 received_info.largest_observed - last_missing); | 1028 max(ack_info.max_delta, received_info.largest_observed - last_missing); |
| 1020 } | 1029 } |
| 1021 return ack_info; | 1030 return ack_info; |
| 1022 } | 1031 } |
| 1023 | 1032 |
| 1024 bool QuicFramer::ProcessPacketHeader( | 1033 bool QuicFramer::ProcessPacketHeader(QuicPacketHeader* header, |
| 1025 QuicPacketHeader* header, | 1034 const QuicEncryptedPacket& packet) { |
| 1026 const QuicEncryptedPacket& packet) { | |
| 1027 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, | 1035 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, |
| 1028 &header->packet_sequence_number)) { | 1036 &header->packet_sequence_number)) { |
| 1029 set_detailed_error("Unable to read sequence number."); | 1037 set_detailed_error("Unable to read sequence number."); |
| 1030 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1038 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1031 } | 1039 } |
| 1032 | 1040 |
| 1033 if (header->packet_sequence_number == 0u) { | 1041 if (header->packet_sequence_number == 0u) { |
| 1034 set_detailed_error("Packet sequence numbers cannot be 0."); | 1042 set_detailed_error("Packet sequence numbers cannot be 0."); |
| 1035 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1043 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1036 } | 1044 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1059 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; | 1067 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; |
| 1060 | 1068 |
| 1061 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) { | 1069 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) { |
| 1062 header->is_in_fec_group = IN_FEC_GROUP; | 1070 header->is_in_fec_group = IN_FEC_GROUP; |
| 1063 uint8 first_fec_protected_packet_offset; | 1071 uint8 first_fec_protected_packet_offset; |
| 1064 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { | 1072 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { |
| 1065 set_detailed_error("Unable to read first fec protected packet offset."); | 1073 set_detailed_error("Unable to read first fec protected packet offset."); |
| 1066 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1074 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1067 } | 1075 } |
| 1068 if (first_fec_protected_packet_offset >= header->packet_sequence_number) { | 1076 if (first_fec_protected_packet_offset >= header->packet_sequence_number) { |
| 1069 set_detailed_error("First fec protected packet offset must be less " | 1077 set_detailed_error( |
| 1070 "than the sequence number."); | 1078 "First fec protected packet offset must be less " |
| 1079 "than the sequence number."); |
| 1071 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1080 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1072 } | 1081 } |
| 1073 header->fec_group = | 1082 header->fec_group = |
| 1074 header->packet_sequence_number - first_fec_protected_packet_offset; | 1083 header->packet_sequence_number - first_fec_protected_packet_offset; |
| 1075 } | 1084 } |
| 1076 | 1085 |
| 1077 header->entropy_hash = GetPacketEntropyHash(*header); | 1086 header->entropy_hash = GetPacketEntropyHash(*header); |
| 1078 // Set the last sequence number after we have decrypted the packet | 1087 // Set the last sequence number after we have decrypted the packet |
| 1079 // so we are confident is not attacker controlled. | 1088 // so we are confident is not attacker controlled. |
| 1080 last_sequence_number_ = header->packet_sequence_number; | 1089 last_sequence_number_ = header->packet_sequence_number; |
| 1081 return true; | 1090 return true; |
| 1082 } | 1091 } |
| 1083 | 1092 |
| 1084 bool QuicFramer::ProcessPacketSequenceNumber( | 1093 bool QuicFramer::ProcessPacketSequenceNumber( |
| 1085 QuicSequenceNumberLength sequence_number_length, | 1094 QuicSequenceNumberLength sequence_number_length, |
| 1086 QuicPacketSequenceNumber* sequence_number) { | 1095 QuicPacketSequenceNumber* sequence_number) { |
| 1087 QuicPacketSequenceNumber wire_sequence_number = 0u; | 1096 QuicPacketSequenceNumber wire_sequence_number = 0u; |
| 1088 if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) { | 1097 if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) { |
| 1089 return false; | 1098 return false; |
| 1090 } | 1099 } |
| 1091 | 1100 |
| 1092 // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers | 1101 // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers |
| 1093 // in case the first guess is incorrect. | 1102 // in case the first guess is incorrect. |
| 1094 *sequence_number = | 1103 *sequence_number = CalculatePacketSequenceNumberFromWire( |
| 1095 CalculatePacketSequenceNumberFromWire(sequence_number_length, | 1104 sequence_number_length, wire_sequence_number); |
| 1096 wire_sequence_number); | |
| 1097 return true; | 1105 return true; |
| 1098 } | 1106 } |
| 1099 | 1107 |
| 1100 bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) { | 1108 bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) { |
| 1101 if (reader_->IsDoneReading()) { | 1109 if (reader_->IsDoneReading()) { |
| 1102 set_detailed_error("Packet has no frames."); | 1110 set_detailed_error("Packet has no frames."); |
| 1103 return RaiseError(QUIC_MISSING_PAYLOAD); | 1111 return RaiseError(QUIC_MISSING_PAYLOAD); |
| 1104 } | 1112 } |
| 1105 while (!reader_->IsDoneReading()) { | 1113 while (!reader_->IsDoneReading()) { |
| 1106 uint8 frame_type; | 1114 uint8 frame_type; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 DVLOG(1) << "Visitor asked to stop further processing."; | 1156 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1149 // Returning true since there was no parsing error. | 1157 // Returning true since there was no parsing error. |
| 1150 return true; | 1158 return true; |
| 1151 } | 1159 } |
| 1152 continue; | 1160 continue; |
| 1153 } | 1161 } |
| 1154 | 1162 |
| 1155 // This was a special frame type that did not match any | 1163 // This was a special frame type that did not match any |
| 1156 // of the known ones. Error. | 1164 // of the known ones. Error. |
| 1157 set_detailed_error("Illegal frame type."); | 1165 set_detailed_error("Illegal frame type."); |
| 1158 DLOG(WARNING) << "Illegal frame type: " | 1166 DLOG(WARNING) << "Illegal frame type: " << static_cast<int>(frame_type); |
| 1159 << static_cast<int>(frame_type); | |
| 1160 return RaiseError(QUIC_INVALID_FRAME_DATA); | 1167 return RaiseError(QUIC_INVALID_FRAME_DATA); |
| 1161 } | 1168 } |
| 1162 | 1169 |
| 1163 switch (frame_type) { | 1170 switch (frame_type) { |
| 1164 case PADDING_FRAME: | 1171 case PADDING_FRAME: |
| 1165 // We're done with the packet. | 1172 // We're done with the packet. |
| 1166 return true; | 1173 return true; |
| 1167 | 1174 |
| 1168 case RST_STREAM_FRAME: { | 1175 case RST_STREAM_FRAME: { |
| 1169 QuicRstStreamFrame frame; | 1176 QuicRstStreamFrame frame; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1259 if (!visitor_->OnPingFrame(ping_frame)) { | 1266 if (!visitor_->OnPingFrame(ping_frame)) { |
| 1260 DVLOG(1) << "Visitor asked to stop further processing."; | 1267 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1261 // Returning true since there was no parsing error. | 1268 // Returning true since there was no parsing error. |
| 1262 return true; | 1269 return true; |
| 1263 } | 1270 } |
| 1264 continue; | 1271 continue; |
| 1265 } | 1272 } |
| 1266 | 1273 |
| 1267 default: | 1274 default: |
| 1268 set_detailed_error("Illegal frame type."); | 1275 set_detailed_error("Illegal frame type."); |
| 1269 DLOG(WARNING) << "Illegal frame type: " | 1276 DLOG(WARNING) << "Illegal frame type: " << static_cast<int>(frame_type); |
| 1270 << static_cast<int>(frame_type); | |
| 1271 return RaiseError(QUIC_INVALID_FRAME_DATA); | 1277 return RaiseError(QUIC_INVALID_FRAME_DATA); |
| 1272 } | 1278 } |
| 1273 } | 1279 } |
| 1274 | 1280 |
| 1275 return true; | 1281 return true; |
| 1276 } | 1282 } |
| 1277 | 1283 |
| 1278 bool QuicFramer::ProcessStreamFrame(uint8 frame_type, | 1284 bool QuicFramer::ProcessStreamFrame(uint8 frame_type, QuicStreamFrame* frame) { |
| 1279 QuicStreamFrame* frame) { | |
| 1280 uint8 stream_flags = frame_type; | 1285 uint8 stream_flags = frame_type; |
| 1281 | 1286 |
| 1282 stream_flags &= ~kQuicFrameTypeStreamMask; | 1287 stream_flags &= ~kQuicFrameTypeStreamMask; |
| 1283 | 1288 |
| 1284 // Read from right to left: StreamID, Offset, Data Length, Fin. | 1289 // Read from right to left: StreamID, Offset, Data Length, Fin. |
| 1285 const uint8 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1; | 1290 const uint8 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1; |
| 1286 stream_flags >>= kQuicStreamIdShift; | 1291 stream_flags >>= kQuicStreamIdShift; |
| 1287 | 1292 |
| 1288 uint8 offset_length = (stream_flags & kQuicStreamOffsetMask); | 1293 uint8 offset_length = (stream_flags & kQuicStreamOffsetMask); |
| 1289 // There is no encoding for 1 byte, only 0 and 2 through 8. | 1294 // There is no encoding for 1 byte, only 0 and 2 through 8. |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1457 return true; | 1462 return true; |
| 1458 } | 1463 } |
| 1459 | 1464 |
| 1460 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( | 1465 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( |
| 1461 QuicCongestionFeedbackFrame* frame) { | 1466 QuicCongestionFeedbackFrame* frame) { |
| 1462 uint8 feedback_type; | 1467 uint8 feedback_type; |
| 1463 if (!reader_->ReadBytes(&feedback_type, 1)) { | 1468 if (!reader_->ReadBytes(&feedback_type, 1)) { |
| 1464 set_detailed_error("Unable to read congestion feedback type."); | 1469 set_detailed_error("Unable to read congestion feedback type."); |
| 1465 return false; | 1470 return false; |
| 1466 } | 1471 } |
| 1467 frame->type = | 1472 frame->type = static_cast<CongestionFeedbackType>(feedback_type); |
| 1468 static_cast<CongestionFeedbackType>(feedback_type); | |
| 1469 | 1473 |
| 1470 switch (frame->type) { | 1474 switch (frame->type) { |
| 1471 case kInterArrival: { | 1475 case kInterArrival: { |
| 1472 CongestionFeedbackMessageInterArrival* inter_arrival = | 1476 CongestionFeedbackMessageInterArrival* inter_arrival = |
| 1473 &frame->inter_arrival; | 1477 &frame->inter_arrival; |
| 1474 uint8 num_received_packets; | 1478 uint8 num_received_packets; |
| 1475 if (!reader_->ReadBytes(&num_received_packets, 1)) { | 1479 if (!reader_->ReadBytes(&num_received_packets, 1)) { |
| 1476 set_detailed_error("Unable to read num received packets."); | 1480 set_detailed_error("Unable to read num received packets."); |
| 1477 return false; | 1481 return false; |
| 1478 } | 1482 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1505 } | 1509 } |
| 1506 | 1510 |
| 1507 int32 time_delta_us; | 1511 int32 time_delta_us; |
| 1508 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { | 1512 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { |
| 1509 set_detailed_error( | 1513 set_detailed_error( |
| 1510 "Unable to read time delta in received packets."); | 1514 "Unable to read time delta in received packets."); |
| 1511 return false; | 1515 return false; |
| 1512 } | 1516 } |
| 1513 QuicPacketSequenceNumber packet = smallest_received + sequence_delta; | 1517 QuicPacketSequenceNumber packet = smallest_received + sequence_delta; |
| 1514 inter_arrival->received_packet_times.insert( | 1518 inter_arrival->received_packet_times.insert( |
| 1515 make_pair(packet, time_received.Add( | 1519 make_pair(packet, |
| 1516 QuicTime::Delta::FromMicroseconds(time_delta_us)))); | 1520 time_received.Add( |
| 1521 QuicTime::Delta::FromMicroseconds(time_delta_us)))); |
| 1517 } | 1522 } |
| 1518 } | 1523 } |
| 1519 break; | 1524 break; |
| 1520 } | 1525 } |
| 1521 case kFixRate: { | 1526 case kFixRate: { |
| 1522 uint32 bitrate = 0; | 1527 uint32 bitrate = 0; |
| 1523 if (!reader_->ReadUInt32(&bitrate)) { | 1528 if (!reader_->ReadUInt32(&bitrate)) { |
| 1524 set_detailed_error("Unable to read bitrate."); | 1529 set_detailed_error("Unable to read bitrate."); |
| 1525 return false; | 1530 return false; |
| 1526 } | 1531 } |
| 1527 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate); | 1532 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate); |
| 1528 break; | 1533 break; |
| 1529 } | 1534 } |
| 1530 case kTCP: { | 1535 case kTCP: { |
| 1531 CongestionFeedbackMessageTCP* tcp = &frame->tcp; | 1536 CongestionFeedbackMessageTCP* tcp = &frame->tcp; |
| 1532 // TODO(ianswett): Remove receive window, since it's constant. | 1537 // TODO(ianswett): Remove receive window, since it's constant. |
| 1533 uint16 receive_window = 0; | 1538 uint16 receive_window = 0; |
| 1534 if (!reader_->ReadUInt16(&receive_window)) { | 1539 if (!reader_->ReadUInt16(&receive_window)) { |
| 1535 set_detailed_error("Unable to read receive window."); | 1540 set_detailed_error("Unable to read receive window."); |
| 1536 return false; | 1541 return false; |
| 1537 } | 1542 } |
| 1538 // Simple bit packing, don't send the 4 least significant bits. | 1543 // Simple bit packing, don't send the 4 least significant bits. |
| 1539 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; | 1544 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; |
| 1540 break; | 1545 break; |
| 1541 } | 1546 } |
| 1542 default: | 1547 default: |
| 1543 set_detailed_error("Illegal congestion feedback type."); | 1548 set_detailed_error("Illegal congestion feedback type."); |
| 1544 DLOG(WARNING) << "Illegal congestion feedback type: " | 1549 DLOG(WARNING) << "Illegal congestion feedback type: " << frame->type; |
| 1545 << frame->type; | |
| 1546 return RaiseError(QUIC_INVALID_FRAME_DATA); | 1550 return RaiseError(QUIC_INVALID_FRAME_DATA); |
| 1547 } | 1551 } |
| 1548 | 1552 |
| 1549 return true; | 1553 return true; |
| 1550 } | 1554 } |
| 1551 | 1555 |
| 1552 bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) { | 1556 bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) { |
| 1553 if (!reader_->ReadUInt32(&frame->stream_id)) { | 1557 if (!reader_->ReadUInt32(&frame->stream_id)) { |
| 1554 set_detailed_error("Unable to read stream_id."); | 1558 set_detailed_error("Unable to read stream_id."); |
| 1555 return false; | 1559 return false; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1584 return true; | 1588 return true; |
| 1585 } | 1589 } |
| 1586 | 1590 |
| 1587 bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) { | 1591 bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) { |
| 1588 uint32 error_code; | 1592 uint32 error_code; |
| 1589 if (!reader_->ReadUInt32(&error_code)) { | 1593 if (!reader_->ReadUInt32(&error_code)) { |
| 1590 set_detailed_error("Unable to read connection close error code."); | 1594 set_detailed_error("Unable to read connection close error code."); |
| 1591 return false; | 1595 return false; |
| 1592 } | 1596 } |
| 1593 | 1597 |
| 1594 if (error_code >= QUIC_LAST_ERROR || | 1598 if (error_code >= QUIC_LAST_ERROR || error_code < QUIC_NO_ERROR) { |
| 1595 error_code < QUIC_NO_ERROR) { | |
| 1596 set_detailed_error("Invalid error code."); | 1599 set_detailed_error("Invalid error code."); |
| 1597 return false; | 1600 return false; |
| 1598 } | 1601 } |
| 1599 | 1602 |
| 1600 frame->error_code = static_cast<QuicErrorCode>(error_code); | 1603 frame->error_code = static_cast<QuicErrorCode>(error_code); |
| 1601 | 1604 |
| 1602 StringPiece error_details; | 1605 StringPiece error_details; |
| 1603 if (!reader_->ReadStringPiece16(&error_details)) { | 1606 if (!reader_->ReadStringPiece16(&error_details)) { |
| 1604 set_detailed_error("Unable to read connection close error details."); | 1607 set_detailed_error("Unable to read connection close error details."); |
| 1605 return false; | 1608 return false; |
| 1606 } | 1609 } |
| 1607 frame->error_details = error_details.as_string(); | 1610 frame->error_details = error_details.as_string(); |
| 1608 | 1611 |
| 1609 return true; | 1612 return true; |
| 1610 } | 1613 } |
| 1611 | 1614 |
| 1612 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) { | 1615 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) { |
| 1613 uint32 error_code; | 1616 uint32 error_code; |
| 1614 if (!reader_->ReadUInt32(&error_code)) { | 1617 if (!reader_->ReadUInt32(&error_code)) { |
| 1615 set_detailed_error("Unable to read go away error code."); | 1618 set_detailed_error("Unable to read go away error code."); |
| 1616 return false; | 1619 return false; |
| 1617 } | 1620 } |
| 1618 frame->error_code = static_cast<QuicErrorCode>(error_code); | 1621 frame->error_code = static_cast<QuicErrorCode>(error_code); |
| 1619 | 1622 |
| 1620 if (error_code >= QUIC_LAST_ERROR || | 1623 if (error_code >= QUIC_LAST_ERROR || error_code < QUIC_NO_ERROR) { |
| 1621 error_code < QUIC_NO_ERROR) { | |
| 1622 set_detailed_error("Invalid error code."); | 1624 set_detailed_error("Invalid error code."); |
| 1623 return false; | 1625 return false; |
| 1624 } | 1626 } |
| 1625 | 1627 |
| 1626 uint32 stream_id; | 1628 uint32 stream_id; |
| 1627 if (!reader_->ReadUInt32(&stream_id)) { | 1629 if (!reader_->ReadUInt32(&stream_id)) { |
| 1628 set_detailed_error("Unable to read last good stream id."); | 1630 set_detailed_error("Unable to read last good stream id."); |
| 1629 return false; | 1631 return false; |
| 1630 } | 1632 } |
| 1631 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id); | 1633 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1663 return true; | 1665 return true; |
| 1664 } | 1666 } |
| 1665 | 1667 |
| 1666 // static | 1668 // static |
| 1667 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( | 1669 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 1668 const QuicEncryptedPacket& encrypted, | 1670 const QuicEncryptedPacket& encrypted, |
| 1669 QuicConnectionIdLength connection_id_length, | 1671 QuicConnectionIdLength connection_id_length, |
| 1670 bool includes_version, | 1672 bool includes_version, |
| 1671 QuicSequenceNumberLength sequence_number_length) { | 1673 QuicSequenceNumberLength sequence_number_length) { |
| 1672 return StringPiece( | 1674 return StringPiece( |
| 1673 encrypted.data() + kStartOfHashData, GetStartOfEncryptedData( | 1675 encrypted.data() + kStartOfHashData, |
| 1674 connection_id_length, includes_version, sequence_number_length) | 1676 GetStartOfEncryptedData( |
| 1675 - kStartOfHashData); | 1677 connection_id_length, includes_version, sequence_number_length) - |
| 1678 kStartOfHashData); |
| 1676 } | 1679 } |
| 1677 | 1680 |
| 1678 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter, | 1681 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter, EncryptionLevel level) { |
| 1679 EncryptionLevel level) { | |
| 1680 DCHECK(alternative_decrypter_.get() == NULL); | 1682 DCHECK(alternative_decrypter_.get() == NULL); |
| 1681 DCHECK_GE(level, decrypter_level_); | 1683 DCHECK_GE(level, decrypter_level_); |
| 1682 decrypter_.reset(decrypter); | 1684 decrypter_.reset(decrypter); |
| 1683 decrypter_level_ = level; | 1685 decrypter_level_ = level; |
| 1684 } | 1686 } |
| 1685 | 1687 |
| 1686 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, | 1688 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, |
| 1687 EncryptionLevel level, | 1689 EncryptionLevel level, |
| 1688 bool latch_once_used) { | 1690 bool latch_once_used) { |
| 1689 alternative_decrypter_.reset(decrypter); | 1691 alternative_decrypter_.reset(decrypter); |
| 1690 alternative_decrypter_level_ = level; | 1692 alternative_decrypter_level_ = level; |
| 1691 alternative_decrypter_latch_ = latch_once_used; | 1693 alternative_decrypter_latch_ = latch_once_used; |
| 1692 } | 1694 } |
| 1693 | 1695 |
| 1694 const QuicDecrypter* QuicFramer::decrypter() const { | 1696 const QuicDecrypter* QuicFramer::decrypter() const { |
| 1695 return decrypter_.get(); | 1697 return decrypter_.get(); |
| 1696 } | 1698 } |
| 1697 | 1699 |
| 1698 const QuicDecrypter* QuicFramer::alternative_decrypter() const { | 1700 const QuicDecrypter* QuicFramer::alternative_decrypter() const { |
| 1699 return alternative_decrypter_.get(); | 1701 return alternative_decrypter_.get(); |
| 1700 } | 1702 } |
| 1701 | 1703 |
| 1702 void QuicFramer::SetEncrypter(EncryptionLevel level, | 1704 void QuicFramer::SetEncrypter(EncryptionLevel level, QuicEncrypter* encrypter) { |
| 1703 QuicEncrypter* encrypter) { | |
| 1704 DCHECK_GE(level, 0); | 1705 DCHECK_GE(level, 0); |
| 1705 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); | 1706 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); |
| 1706 encrypter_[level].reset(encrypter); | 1707 encrypter_[level].reset(encrypter); |
| 1707 } | 1708 } |
| 1708 | 1709 |
| 1709 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { | 1710 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { |
| 1710 DCHECK_GE(level, 0); | 1711 DCHECK_GE(level, 0); |
| 1711 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); | 1712 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); |
| 1712 DCHECK(encrypter_[level].get() != NULL); | 1713 DCHECK(encrypter_[level].get() != NULL); |
| 1713 return encrypter_[level].get(); | 1714 return encrypter_[level].get(); |
| 1714 } | 1715 } |
| 1715 | 1716 |
| 1716 QuicEncryptedPacket* QuicFramer::EncryptPacket( | 1717 QuicEncryptedPacket* QuicFramer::EncryptPacket( |
| 1717 EncryptionLevel level, | 1718 EncryptionLevel level, |
| 1718 QuicPacketSequenceNumber packet_sequence_number, | 1719 QuicPacketSequenceNumber packet_sequence_number, |
| 1719 const QuicPacket& packet) { | 1720 const QuicPacket& packet) { |
| 1720 DCHECK(encrypter_[level].get() != NULL); | 1721 DCHECK(encrypter_[level].get() != NULL); |
| 1721 | 1722 |
| 1722 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( | 1723 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( |
| 1723 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); | 1724 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); |
| 1724 if (out.get() == NULL) { | 1725 if (out.get() == NULL) { |
| 1725 RaiseError(QUIC_ENCRYPTION_FAILURE); | 1726 RaiseError(QUIC_ENCRYPTION_FAILURE); |
| 1726 return NULL; | 1727 return NULL; |
| 1727 } | 1728 } |
| 1728 StringPiece header_data = packet.BeforePlaintext(); | 1729 StringPiece header_data = packet.BeforePlaintext(); |
| 1729 size_t len = header_data.length() + out->length(); | 1730 size_t len = header_data.length() + out->length(); |
| 1730 char* buffer = new char[len]; | 1731 char* buffer = new char[len]; |
| 1731 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). | 1732 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). |
| 1732 memcpy(buffer, header_data.data(), header_data.length()); | 1733 memcpy(buffer, header_data.data(), header_data.length()); |
| 1733 memcpy(buffer + header_data.length(), out->data(), out->length()); | 1734 memcpy(buffer + header_data.length(), out->data(), out->length()); |
| 1734 return new QuicEncryptedPacket(buffer, len, true); | 1735 return new QuicEncryptedPacket(buffer, len, true); |
| 1735 } | 1736 } |
| 1736 | 1737 |
| 1737 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { | 1738 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { |
| 1738 // In order to keep the code simple, we don't have the current encryption | 1739 // In order to keep the code simple, we don't have the current encryption |
| 1739 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. | 1740 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1759 } | 1760 } |
| 1760 DCHECK(decrypter_.get() != NULL); | 1761 DCHECK(decrypter_.get() != NULL); |
| 1761 decrypted_.reset(decrypter_->DecryptPacket( | 1762 decrypted_.reset(decrypter_->DecryptPacket( |
| 1762 header.packet_sequence_number, | 1763 header.packet_sequence_number, |
| 1763 GetAssociatedDataFromEncryptedPacket( | 1764 GetAssociatedDataFromEncryptedPacket( |
| 1764 packet, | 1765 packet, |
| 1765 header.public_header.connection_id_length, | 1766 header.public_header.connection_id_length, |
| 1766 header.public_header.version_flag, | 1767 header.public_header.version_flag, |
| 1767 header.public_header.sequence_number_length), | 1768 header.public_header.sequence_number_length), |
| 1768 encrypted)); | 1769 encrypted)); |
| 1769 if (decrypted_.get() != NULL) { | 1770 if (decrypted_.get() != NULL) { |
| 1770 visitor_->OnDecryptedPacket(decrypter_level_); | 1771 visitor_->OnDecryptedPacket(decrypter_level_); |
| 1771 } else if (alternative_decrypter_.get() != NULL) { | 1772 } else if (alternative_decrypter_.get() != NULL) { |
| 1772 decrypted_.reset(alternative_decrypter_->DecryptPacket( | 1773 decrypted_.reset(alternative_decrypter_->DecryptPacket( |
| 1773 header.packet_sequence_number, | 1774 header.packet_sequence_number, |
| 1774 GetAssociatedDataFromEncryptedPacket( | 1775 GetAssociatedDataFromEncryptedPacket( |
| 1775 packet, | 1776 packet, |
| 1776 header.public_header.connection_id_length, | 1777 header.public_header.connection_id_length, |
| 1777 header.public_header.version_flag, | 1778 header.public_header.version_flag, |
| 1778 header.public_header.sequence_number_length), | 1779 header.public_header.sequence_number_length), |
| 1779 encrypted)); | 1780 encrypted)); |
| 1780 if (decrypted_.get() != NULL) { | 1781 if (decrypted_.get() != NULL) { |
| 1781 visitor_->OnDecryptedPacket(alternative_decrypter_level_); | 1782 visitor_->OnDecryptedPacket(alternative_decrypter_level_); |
| 1782 if (alternative_decrypter_latch_) { | 1783 if (alternative_decrypter_latch_) { |
| 1783 // Switch to the alternative decrypter and latch so that we cannot | 1784 // Switch to the alternative decrypter and latch so that we cannot |
| 1784 // switch back. | 1785 // switch back. |
| 1785 decrypter_.reset(alternative_decrypter_.release()); | 1786 decrypter_.reset(alternative_decrypter_.release()); |
| 1786 decrypter_level_ = alternative_decrypter_level_; | 1787 decrypter_level_ = alternative_decrypter_level_; |
| 1787 alternative_decrypter_level_ = ENCRYPTION_NONE; | 1788 alternative_decrypter_level_ = ENCRYPTION_NONE; |
| 1788 } else { | 1789 } else { |
| 1789 // Switch the alternative decrypter so that we use it first next time. | 1790 // Switch the alternative decrypter so that we use it first next time. |
| 1790 decrypter_.swap(alternative_decrypter_); | 1791 decrypter_.swap(alternative_decrypter_); |
| 1791 EncryptionLevel level = alternative_decrypter_level_; | 1792 EncryptionLevel level = alternative_decrypter_level_; |
| 1792 alternative_decrypter_level_ = decrypter_level_; | 1793 alternative_decrypter_level_ = decrypter_level_; |
| 1793 decrypter_level_ = level; | 1794 decrypter_level_ = level; |
| 1794 } | 1795 } |
| 1795 } | 1796 } |
| 1796 } | 1797 } |
| 1797 | 1798 |
| 1798 if (decrypted_.get() == NULL) { | 1799 if (decrypted_.get() == NULL) { |
| 1799 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" | 1800 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" |
| 1800 << header.packet_sequence_number; | 1801 << header.packet_sequence_number; |
| 1801 return false; | 1802 return false; |
| 1802 } | 1803 } |
| 1803 | 1804 |
| 1804 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); | 1805 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); |
| 1805 return true; | 1806 return true; |
| 1806 } | 1807 } |
| 1807 | 1808 |
| 1808 size_t QuicFramer::GetAckFrameSize( | 1809 size_t QuicFramer::GetAckFrameSize( |
| 1809 const QuicAckFrame& ack, | 1810 const QuicAckFrame& ack, |
| 1810 QuicSequenceNumberLength sequence_number_length) { | 1811 QuicSequenceNumberLength sequence_number_length) { |
| 1811 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1812 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1812 QuicSequenceNumberLength largest_observed_length = | 1813 QuicSequenceNumberLength largest_observed_length = |
| 1813 GetMinSequenceNumberLength(ack.received_info.largest_observed); | 1814 GetMinSequenceNumberLength(ack.received_info.largest_observed); |
| 1814 QuicSequenceNumberLength missing_sequence_number_length = | 1815 QuicSequenceNumberLength missing_sequence_number_length = |
| 1815 GetMinSequenceNumberLength(ack_info.max_delta); | 1816 GetMinSequenceNumberLength(ack_info.max_delta); |
| 1816 | 1817 |
| 1817 size_t ack_size = GetMinAckFrameSize(quic_version_, | 1818 size_t ack_size = GetMinAckFrameSize( |
| 1818 sequence_number_length, | 1819 quic_version_, sequence_number_length, largest_observed_length); |
| 1819 largest_observed_length); | |
| 1820 if (!ack_info.nack_ranges.empty()) { | 1820 if (!ack_info.nack_ranges.empty()) { |
| 1821 ack_size += kNumberOfMissingPacketsSize + kNumberOfRevivedPacketsSize; | 1821 ack_size += kNumberOfMissingPacketsSize + kNumberOfRevivedPacketsSize; |
| 1822 ack_size += ack_info.nack_ranges.size() * | 1822 ack_size += ack_info.nack_ranges.size() * |
| 1823 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 1823 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
| 1824 ack_size += | 1824 ack_size += |
| 1825 ack.received_info.revived_packets.size() * largest_observed_length; | 1825 ack.received_info.revived_packets.size() * largest_observed_length; |
| 1826 } | 1826 } |
| 1827 return ack_size; | 1827 return ack_size; |
| 1828 } | 1828 } |
| 1829 | 1829 |
| 1830 size_t QuicFramer::ComputeFrameLength( | 1830 size_t QuicFramer::ComputeFrameLength( |
| 1831 const QuicFrame& frame, | 1831 const QuicFrame& frame, |
| 1832 bool last_frame_in_packet, | 1832 bool last_frame_in_packet, |
| 1833 InFecGroup is_in_fec_group, | 1833 InFecGroup is_in_fec_group, |
| 1834 QuicSequenceNumberLength sequence_number_length) { | 1834 QuicSequenceNumberLength sequence_number_length) { |
| 1835 switch (frame.type) { | 1835 switch (frame.type) { |
| 1836 case STREAM_FRAME: | 1836 case STREAM_FRAME: |
| 1837 return GetMinStreamFrameSize(quic_version_, | 1837 return GetMinStreamFrameSize(quic_version_, |
| 1838 frame.stream_frame->stream_id, | 1838 frame.stream_frame->stream_id, |
| 1839 frame.stream_frame->offset, | 1839 frame.stream_frame->offset, |
| 1840 last_frame_in_packet, | 1840 last_frame_in_packet, |
| 1841 is_in_fec_group) + | 1841 is_in_fec_group) + |
| 1842 frame.stream_frame->data.TotalBufferSize(); | 1842 frame.stream_frame->data.TotalBufferSize(); |
| 1843 case ACK_FRAME: { | 1843 case ACK_FRAME: { |
| 1844 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); | 1844 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); |
| 1845 } | 1845 } |
| 1846 case CONGESTION_FEEDBACK_FRAME: { | 1846 case CONGESTION_FEEDBACK_FRAME: { |
| 1847 size_t len = kQuicFrameTypeSize; | 1847 size_t len = kQuicFrameTypeSize; |
| 1848 const QuicCongestionFeedbackFrame& congestion_feedback = | 1848 const QuicCongestionFeedbackFrame& congestion_feedback = |
| 1849 *frame.congestion_feedback_frame; | 1849 *frame.congestion_feedback_frame; |
| 1850 len += 1; // Congestion feedback type. | 1850 len += 1; // Congestion feedback type. |
| 1851 | 1851 |
| 1852 switch (congestion_feedback.type) { | 1852 switch (congestion_feedback.type) { |
| 1853 case kInterArrival: { | 1853 case kInterArrival: { |
| 1854 const CongestionFeedbackMessageInterArrival& inter_arrival = | 1854 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| 1855 congestion_feedback.inter_arrival; | 1855 congestion_feedback.inter_arrival; |
| 1856 len += 1; // Number received packets. | 1856 len += 1; // Number received packets. |
| 1857 if (inter_arrival.received_packet_times.size() > 0) { | 1857 if (inter_arrival.received_packet_times.size() > 0) { |
| 1858 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. | 1858 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. |
| 1859 len += 8; // Time. | 1859 len += 8; // Time. |
| 1860 // 2 bytes per sequence number delta plus 4 bytes per delta time. | 1860 // 2 bytes per sequence number delta plus 4 bytes per delta time. |
| 1861 len += PACKET_6BYTE_SEQUENCE_NUMBER * | 1861 len += PACKET_6BYTE_SEQUENCE_NUMBER * |
| 1862 (inter_arrival.received_packet_times.size() - 1); | 1862 (inter_arrival.received_packet_times.size() - 1); |
| 1863 } | 1863 } |
| 1864 break; | 1864 break; |
| 1865 } | 1865 } |
| 1866 case kFixRate: | 1866 case kFixRate: |
| 1867 len += 4; // Bitrate. | 1867 len += 4; // Bitrate. |
| 1868 break; | 1868 break; |
| 1869 case kTCP: | 1869 case kTCP: |
| 1870 len += 2; // Receive window. | 1870 len += 2; // Receive window. |
| 1871 break; | 1871 break; |
| 1872 default: | 1872 default: |
| 1873 set_detailed_error("Illegal feedback type."); | 1873 set_detailed_error("Illegal feedback type."); |
| 1874 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; | 1874 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; |
| 1875 break; | 1875 break; |
| 1876 } | 1876 } |
| 1877 return len; | 1877 return len; |
| 1878 } | 1878 } |
| 1879 case STOP_WAITING_FRAME: | 1879 case STOP_WAITING_FRAME: |
| 1880 return GetStopWaitingFrameSize(sequence_number_length); | 1880 return GetStopWaitingFrameSize(sequence_number_length); |
| 1881 case PING_FRAME: | 1881 case PING_FRAME: |
| 1882 // Ping has no payload. | 1882 // Ping has no payload. |
| 1883 return kQuicFrameTypeSize; | 1883 return kQuicFrameTypeSize; |
| 1884 case RST_STREAM_FRAME: | 1884 case RST_STREAM_FRAME: |
| 1885 return GetMinRstStreamFrameSize(quic_version_) + | 1885 return GetMinRstStreamFrameSize(quic_version_) + |
| 1886 frame.rst_stream_frame->error_details.size(); | 1886 frame.rst_stream_frame->error_details.size(); |
| 1887 case CONNECTION_CLOSE_FRAME: | 1887 case CONNECTION_CLOSE_FRAME: |
| 1888 return GetMinConnectionCloseFrameSize() + | 1888 return GetMinConnectionCloseFrameSize() + |
| 1889 frame.connection_close_frame->error_details.size(); | 1889 frame.connection_close_frame->error_details.size(); |
| 1890 case GOAWAY_FRAME: | 1890 case GOAWAY_FRAME: |
| 1891 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); | 1891 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); |
| 1892 case WINDOW_UPDATE_FRAME: | 1892 case WINDOW_UPDATE_FRAME: |
| 1893 return GetWindowUpdateFrameSize(); | 1893 return GetWindowUpdateFrameSize(); |
| 1894 case BLOCKED_FRAME: | 1894 case BLOCKED_FRAME: |
| 1895 return GetBlockedFrameSize(); | 1895 return GetBlockedFrameSize(); |
| 1896 case PADDING_FRAME: | 1896 case PADDING_FRAME: |
| 1897 DCHECK(false); | 1897 DCHECK(false); |
| 1898 return 0; | 1898 return 0; |
| 1899 case NUM_FRAME_TYPES: | 1899 case NUM_FRAME_TYPES: |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1913 switch (frame.type) { | 1913 switch (frame.type) { |
| 1914 case STREAM_FRAME: { | 1914 case STREAM_FRAME: { |
| 1915 if (frame.stream_frame == NULL) { | 1915 if (frame.stream_frame == NULL) { |
| 1916 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame."; | 1916 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame."; |
| 1917 } | 1917 } |
| 1918 // Fin bit. | 1918 // Fin bit. |
| 1919 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; | 1919 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; |
| 1920 | 1920 |
| 1921 // Data Length bit. | 1921 // Data Length bit. |
| 1922 type_byte <<= kQuicStreamDataLengthShift; | 1922 type_byte <<= kQuicStreamDataLengthShift; |
| 1923 type_byte |= no_stream_frame_length ? 0: kQuicStreamDataLengthMask; | 1923 type_byte |= no_stream_frame_length ? 0 : kQuicStreamDataLengthMask; |
| 1924 | 1924 |
| 1925 // Offset 3 bits. | 1925 // Offset 3 bits. |
| 1926 type_byte <<= kQuicStreamOffsetShift; | 1926 type_byte <<= kQuicStreamOffsetShift; |
| 1927 const size_t offset_len = GetStreamOffsetSize(frame.stream_frame->offset); | 1927 const size_t offset_len = GetStreamOffsetSize(frame.stream_frame->offset); |
| 1928 if (offset_len > 0) { | 1928 if (offset_len > 0) { |
| 1929 type_byte |= offset_len - 1; | 1929 type_byte |= offset_len - 1; |
| 1930 } | 1930 } |
| 1931 | 1931 |
| 1932 // stream id 2 bits. | 1932 // stream id 2 bits. |
| 1933 type_byte <<= kQuicStreamIdShift; | 1933 type_byte <<= kQuicStreamIdShift; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1955 QuicSequenceNumberLength sequence_number_length, | 1955 QuicSequenceNumberLength sequence_number_length, |
| 1956 QuicPacketSequenceNumber packet_sequence_number, | 1956 QuicPacketSequenceNumber packet_sequence_number, |
| 1957 QuicDataWriter* writer) { | 1957 QuicDataWriter* writer) { |
| 1958 // Ensure the entire sequence number can be written. | 1958 // Ensure the entire sequence number can be written. |
| 1959 if (writer->capacity() - writer->length() < | 1959 if (writer->capacity() - writer->length() < |
| 1960 static_cast<size_t>(sequence_number_length)) { | 1960 static_cast<size_t>(sequence_number_length)) { |
| 1961 return false; | 1961 return false; |
| 1962 } | 1962 } |
| 1963 switch (sequence_number_length) { | 1963 switch (sequence_number_length) { |
| 1964 case PACKET_1BYTE_SEQUENCE_NUMBER: | 1964 case PACKET_1BYTE_SEQUENCE_NUMBER: |
| 1965 return writer->WriteUInt8( | 1965 return writer->WriteUInt8(packet_sequence_number & |
| 1966 packet_sequence_number & k1ByteSequenceNumberMask); | 1966 k1ByteSequenceNumberMask); |
| 1967 break; | 1967 break; |
| 1968 case PACKET_2BYTE_SEQUENCE_NUMBER: | 1968 case PACKET_2BYTE_SEQUENCE_NUMBER: |
| 1969 return writer->WriteUInt16( | 1969 return writer->WriteUInt16(packet_sequence_number & |
| 1970 packet_sequence_number & k2ByteSequenceNumberMask); | 1970 k2ByteSequenceNumberMask); |
| 1971 break; | 1971 break; |
| 1972 case PACKET_4BYTE_SEQUENCE_NUMBER: | 1972 case PACKET_4BYTE_SEQUENCE_NUMBER: |
| 1973 return writer->WriteUInt32( | 1973 return writer->WriteUInt32(packet_sequence_number & |
| 1974 packet_sequence_number & k4ByteSequenceNumberMask); | 1974 k4ByteSequenceNumberMask); |
| 1975 break; | 1975 break; |
| 1976 case PACKET_6BYTE_SEQUENCE_NUMBER: | 1976 case PACKET_6BYTE_SEQUENCE_NUMBER: |
| 1977 return writer->WriteUInt48( | 1977 return writer->WriteUInt48(packet_sequence_number & |
| 1978 packet_sequence_number & k6ByteSequenceNumberMask); | 1978 k6ByteSequenceNumberMask); |
| 1979 break; | 1979 break; |
| 1980 default: | 1980 default: |
| 1981 DCHECK(false) << "sequence_number_length: " << sequence_number_length; | 1981 DCHECK(false) << "sequence_number_length: " << sequence_number_length; |
| 1982 return false; | 1982 return false; |
| 1983 } | 1983 } |
| 1984 } | 1984 } |
| 1985 | 1985 |
| 1986 bool QuicFramer::AppendStreamFrame( | 1986 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, |
| 1987 const QuicStreamFrame& frame, | 1987 bool no_stream_frame_length, |
| 1988 bool no_stream_frame_length, | 1988 QuicDataWriter* writer) { |
| 1989 QuicDataWriter* writer) { | |
| 1990 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1989 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { |
| 1991 LOG(DFATAL) << "Writing stream id size failed."; | 1990 LOG(DFATAL) << "Writing stream id size failed."; |
| 1992 return false; | 1991 return false; |
| 1993 } | 1992 } |
| 1994 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1993 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { |
| 1995 LOG(DFATAL) << "Writing offset size failed."; | 1994 LOG(DFATAL) << "Writing offset size failed."; |
| 1996 return false; | 1995 return false; |
| 1997 } | 1996 } |
| 1998 if (!no_stream_frame_length) { | 1997 if (!no_stream_frame_length) { |
| 1999 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { | 1998 if (!writer->WriteUInt16(frame.data.TotalBufferSize())) { |
| 2000 LOG(DFATAL) << "Writing stream frame length failed"; | 1999 LOG(DFATAL) << "Writing stream frame length failed"; |
| 2001 return false; | 2000 return false; |
| 2002 } | 2001 } |
| 2003 } | 2002 } |
| 2004 | 2003 |
| 2005 if (!writer->WriteIOVector(frame.data)) { | 2004 if (!writer->WriteIOVector(frame.data)) { |
| 2006 LOG(DFATAL) << "Writing frame data failed."; | 2005 LOG(DFATAL) << "Writing frame data failed."; |
| 2007 return false; | 2006 return false; |
| 2008 } | 2007 } |
| 2009 return true; | 2008 return true; |
| 2010 } | 2009 } |
| 2011 | 2010 |
| 2012 // static | 2011 // static |
| 2013 void QuicFramer::set_version(const QuicVersion version) { | 2012 void QuicFramer::set_version(const QuicVersion version) { |
| 2014 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 2013 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
| 2015 quic_version_ = version; | 2014 quic_version_ = version; |
| 2016 } | 2015 } |
| 2017 | 2016 |
| 2018 bool QuicFramer::AppendAckFrameAndTypeByte( | 2017 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicPacketHeader& header, |
| 2019 const QuicPacketHeader& header, | 2018 const QuicAckFrame& frame, |
| 2020 const QuicAckFrame& frame, | 2019 QuicDataWriter* writer) { |
| 2021 QuicDataWriter* writer) { | |
| 2022 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 2020 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
| 2023 QuicPacketSequenceNumber ack_largest_observed = | 2021 QuicPacketSequenceNumber ack_largest_observed = |
| 2024 frame.received_info.largest_observed; | 2022 frame.received_info.largest_observed; |
| 2025 QuicSequenceNumberLength largest_observed_length = | 2023 QuicSequenceNumberLength largest_observed_length = |
| 2026 GetMinSequenceNumberLength(ack_largest_observed); | 2024 GetMinSequenceNumberLength(ack_largest_observed); |
| 2027 QuicSequenceNumberLength missing_sequence_number_length = | 2025 QuicSequenceNumberLength missing_sequence_number_length = |
| 2028 GetMinSequenceNumberLength(ack_info.max_delta); | 2026 GetMinSequenceNumberLength(ack_info.max_delta); |
| 2029 // Determine whether we need to truncate ranges. | 2027 // Determine whether we need to truncate ranges. |
| 2030 size_t available_range_bytes = writer->capacity() - writer->length() - | 2028 size_t available_range_bytes = |
| 2029 writer->capacity() - writer->length() - |
| 2031 GetMinAckFrameSize(quic_version_, | 2030 GetMinAckFrameSize(quic_version_, |
| 2032 header.public_header.sequence_number_length, | 2031 header.public_header.sequence_number_length, |
| 2033 largest_observed_length) - kNumberOfRevivedPacketsSize; | 2032 largest_observed_length) - |
| 2034 size_t max_num_ranges = available_range_bytes / | 2033 kNumberOfRevivedPacketsSize; |
| 2034 size_t max_num_ranges = |
| 2035 available_range_bytes / |
| 2035 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 2036 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
| 2036 max_num_ranges = | 2037 max_num_ranges = |
| 2037 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); | 2038 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); |
| 2038 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | 2039 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; |
| 2039 DVLOG_IF(1, truncated) << "Truncating ack from " | 2040 DVLOG_IF(1, truncated) << "Truncating ack from " |
| 2040 << ack_info.nack_ranges.size() << " ranges to " | 2041 << ack_info.nack_ranges.size() << " ranges to " |
| 2041 << max_num_ranges; | 2042 << max_num_ranges; |
| 2042 | 2043 |
| 2043 // Write out the type byte by setting the low order bits and doing shifts | 2044 // Write out the type byte by setting the low order bits and doing shifts |
| 2044 // to make room for the next bit flags to be set. | 2045 // to make room for the next bit flags to be set. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2085 ack_largest_observed = ack_iter->first - 1; | 2086 ack_largest_observed = ack_iter->first - 1; |
| 2086 // Also update the entropy so it matches the largest observed. | 2087 // Also update the entropy so it matches the largest observed. |
| 2087 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); | 2088 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); |
| 2088 ++ack_iter; | 2089 ++ack_iter; |
| 2089 } | 2090 } |
| 2090 | 2091 |
| 2091 if (!writer->WriteUInt8(ack_entropy_hash)) { | 2092 if (!writer->WriteUInt8(ack_entropy_hash)) { |
| 2092 return false; | 2093 return false; |
| 2093 } | 2094 } |
| 2094 | 2095 |
| 2095 if (!AppendPacketSequenceNumber(largest_observed_length, | 2096 if (!AppendPacketSequenceNumber( |
| 2096 ack_largest_observed, writer)) { | 2097 largest_observed_length, ack_largest_observed, writer)) { |
| 2097 return false; | 2098 return false; |
| 2098 } | 2099 } |
| 2099 | 2100 |
| 2100 uint64 delta_time_largest_observed_us = kUFloat16MaxValue; | 2101 uint64 delta_time_largest_observed_us = kUFloat16MaxValue; |
| 2101 if (!received_info.delta_time_largest_observed.IsInfinite()) { | 2102 if (!received_info.delta_time_largest_observed.IsInfinite()) { |
| 2102 DCHECK_LE(0u, | 2103 DCHECK_LE(0u, |
| 2103 frame.received_info.delta_time_largest_observed.ToMicroseconds()); | 2104 frame.received_info.delta_time_largest_observed.ToMicroseconds()); |
| 2104 delta_time_largest_observed_us = | 2105 delta_time_largest_observed_us = |
| 2105 received_info.delta_time_largest_observed.ToMicroseconds(); | 2106 received_info.delta_time_largest_observed.ToMicroseconds(); |
| 2106 } | 2107 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2118 if (!writer->WriteBytes(&num_missing_ranges, 1)) { | 2119 if (!writer->WriteBytes(&num_missing_ranges, 1)) { |
| 2119 return false; | 2120 return false; |
| 2120 } | 2121 } |
| 2121 | 2122 |
| 2122 int num_ranges_written = 0; | 2123 int num_ranges_written = 0; |
| 2123 QuicPacketSequenceNumber last_sequence_written = ack_largest_observed; | 2124 QuicPacketSequenceNumber last_sequence_written = ack_largest_observed; |
| 2124 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { | 2125 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { |
| 2125 // Calculate the delta to the last number in the range. | 2126 // Calculate the delta to the last number in the range. |
| 2126 QuicPacketSequenceNumber missing_delta = | 2127 QuicPacketSequenceNumber missing_delta = |
| 2127 last_sequence_written - (ack_iter->first + ack_iter->second); | 2128 last_sequence_written - (ack_iter->first + ack_iter->second); |
| 2128 if (!AppendPacketSequenceNumber(missing_sequence_number_length, | 2129 if (!AppendPacketSequenceNumber( |
| 2129 missing_delta, writer)) { | 2130 missing_sequence_number_length, missing_delta, writer)) { |
| 2130 return false; | 2131 return false; |
| 2131 } | 2132 } |
| 2132 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, | 2133 if (!AppendPacketSequenceNumber( |
| 2133 ack_iter->second, writer)) { | 2134 PACKET_1BYTE_SEQUENCE_NUMBER, ack_iter->second, writer)) { |
| 2134 return false; | 2135 return false; |
| 2135 } | 2136 } |
| 2136 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2137 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
| 2137 last_sequence_written = ack_iter->first - 1; | 2138 last_sequence_written = ack_iter->first - 1; |
| 2138 ++num_ranges_written; | 2139 ++num_ranges_written; |
| 2139 } | 2140 } |
| 2140 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2141 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 2141 | 2142 |
| 2142 // Append revived packets. | 2143 // Append revived packets. |
| 2143 // If not all the revived packets fit, only mention the ones that do. | 2144 // If not all the revived packets fit, only mention the ones that do. |
| 2144 uint8 num_revived_packets = | 2145 uint8 num_revived_packets = |
| 2145 min(received_info.revived_packets.size(), | 2146 min(received_info.revived_packets.size(), |
| 2146 static_cast<size_t>(numeric_limits<uint8>::max())); | 2147 static_cast<size_t>(numeric_limits<uint8>::max())); |
| 2147 num_revived_packets = min( | 2148 num_revived_packets = |
| 2148 static_cast<size_t>(num_revived_packets), | 2149 min(static_cast<size_t>(num_revived_packets), |
| 2149 (writer->capacity() - writer->length()) / largest_observed_length); | 2150 (writer->capacity() - writer->length()) / largest_observed_length); |
| 2150 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2151 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
| 2151 return false; | 2152 return false; |
| 2152 } | 2153 } |
| 2153 | 2154 |
| 2154 SequenceNumberSet::const_iterator iter = | 2155 SequenceNumberSet::const_iterator iter = |
| 2155 received_info.revived_packets.begin(); | 2156 received_info.revived_packets.begin(); |
| 2156 for (int i = 0; i < num_revived_packets; ++i, ++iter) { | 2157 for (int i = 0; i < num_revived_packets; ++i, ++iter) { |
| 2157 LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter)); | 2158 LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter)); |
| 2158 if (!AppendPacketSequenceNumber(largest_observed_length, | 2159 if (!AppendPacketSequenceNumber(largest_observed_length, *iter, writer)) { |
| 2159 *iter, writer)) { | |
| 2160 return false; | 2160 return false; |
| 2161 } | 2161 } |
| 2162 } | 2162 } |
| 2163 | 2163 |
| 2164 return true; | 2164 return true; |
| 2165 } | 2165 } |
| 2166 | 2166 |
| 2167 bool QuicFramer::AppendCongestionFeedbackFrame( | 2167 bool QuicFramer::AppendCongestionFeedbackFrame( |
| 2168 const QuicCongestionFeedbackFrame& frame, | 2168 const QuicCongestionFeedbackFrame& frame, |
| 2169 QuicDataWriter* writer) { | 2169 QuicDataWriter* writer) { |
| 2170 if (!writer->WriteBytes(&frame.type, 1)) { | 2170 if (!writer->WriteBytes(&frame.type, 1)) { |
| 2171 return false; | 2171 return false; |
| 2172 } | 2172 } |
| 2173 | 2173 |
| 2174 switch (frame.type) { | 2174 switch (frame.type) { |
| 2175 case kInterArrival: { | 2175 case kInterArrival: { |
| 2176 const CongestionFeedbackMessageInterArrival& inter_arrival = | 2176 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| 2177 frame.inter_arrival; | 2177 frame.inter_arrival; |
| 2178 DCHECK_GE(numeric_limits<uint8>::max(), | 2178 DCHECK_GE(numeric_limits<uint8>::max(), |
| 2179 inter_arrival.received_packet_times.size()); | 2179 inter_arrival.received_packet_times.size()); |
| 2180 if (inter_arrival.received_packet_times.size() > | 2180 if (inter_arrival.received_packet_times.size() > |
| 2181 numeric_limits<uint8>::max()) { | 2181 numeric_limits<uint8>::max()) { |
| 2182 return false; | 2182 return false; |
| 2183 } | 2183 } |
| 2184 // TODO(ianswett): Make num_received_packets a varint. | 2184 // TODO(ianswett): Make num_received_packets a varint. |
| 2185 uint8 num_received_packets = | 2185 uint8 num_received_packets = inter_arrival.received_packet_times.size(); |
| 2186 inter_arrival.received_packet_times.size(); | |
| 2187 if (!writer->WriteBytes(&num_received_packets, 1)) { | 2186 if (!writer->WriteBytes(&num_received_packets, 1)) { |
| 2188 return false; | 2187 return false; |
| 2189 } | 2188 } |
| 2190 if (num_received_packets > 0) { | 2189 if (num_received_packets > 0) { |
| 2191 TimeMap::const_iterator it = | 2190 TimeMap::const_iterator it = |
| 2192 inter_arrival.received_packet_times.begin(); | 2191 inter_arrival.received_packet_times.begin(); |
| 2193 | 2192 |
| 2194 QuicPacketSequenceNumber lowest_sequence = it->first; | 2193 QuicPacketSequenceNumber lowest_sequence = it->first; |
| 2195 if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER, | 2194 if (!AppendPacketSequenceNumber( |
| 2196 lowest_sequence, writer)) { | 2195 PACKET_6BYTE_SEQUENCE_NUMBER, lowest_sequence, writer)) { |
| 2197 return false; | 2196 return false; |
| 2198 } | 2197 } |
| 2199 | 2198 |
| 2200 QuicTime lowest_time = it->second; | 2199 QuicTime lowest_time = it->second; |
| 2201 if (!writer->WriteUInt64( | 2200 if (!writer->WriteUInt64( |
| 2202 lowest_time.Subtract(creation_time_).ToMicroseconds())) { | 2201 lowest_time.Subtract(creation_time_).ToMicroseconds())) { |
| 2203 return false; | 2202 return false; |
| 2204 } | 2203 } |
| 2205 | 2204 |
| 2206 for (++it; it != inter_arrival.received_packet_times.end(); ++it) { | 2205 for (++it; it != inter_arrival.received_packet_times.end(); ++it) { |
| 2207 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence; | 2206 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence; |
| 2208 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta); | 2207 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta); |
| 2209 if (sequence_delta > numeric_limits<uint16>::max()) { | 2208 if (sequence_delta > numeric_limits<uint16>::max()) { |
| 2210 return false; | 2209 return false; |
| 2211 } | 2210 } |
| 2212 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) { | 2211 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) { |
| 2213 return false; | 2212 return false; |
| 2214 } | 2213 } |
| 2215 | 2214 |
| 2216 int32 time_delta_us = | 2215 int32 time_delta_us = |
| 2217 it->second.Subtract(lowest_time).ToMicroseconds(); | 2216 it->second.Subtract(lowest_time).ToMicroseconds(); |
| 2218 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { | 2217 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { |
| 2219 return false; | 2218 return false; |
| 2220 } | 2219 } |
| 2221 } | 2220 } |
| 2222 } | 2221 } |
| 2223 break; | 2222 break; |
| 2224 } | 2223 } |
| 2225 case kFixRate: { | 2224 case kFixRate: { |
| 2226 const CongestionFeedbackMessageFixRate& fix_rate = | 2225 const CongestionFeedbackMessageFixRate& fix_rate = frame.fix_rate; |
| 2227 frame.fix_rate; | |
| 2228 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { | 2226 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { |
| 2229 return false; | 2227 return false; |
| 2230 } | 2228 } |
| 2231 break; | 2229 break; |
| 2232 } | 2230 } |
| 2233 case kTCP: { | 2231 case kTCP: { |
| 2234 const CongestionFeedbackMessageTCP& tcp = frame.tcp; | 2232 const CongestionFeedbackMessageTCP& tcp = frame.tcp; |
| 2235 DCHECK_LE(tcp.receive_window, 1u << 20); | 2233 DCHECK_LE(tcp.receive_window, 1u << 20); |
| 2236 // Simple bit packing, don't send the 4 least significant bits. | 2234 // Simple bit packing, don't send the 4 least significant bits. |
| 2237 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); | 2235 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); |
| 2238 if (!writer->WriteUInt16(receive_window)) { | 2236 if (!writer->WriteUInt16(receive_window)) { |
| 2239 return false; | 2237 return false; |
| 2240 } | 2238 } |
| 2241 break; | 2239 break; |
| 2242 } | 2240 } |
| 2243 default: | 2241 default: |
| 2244 return false; | 2242 return false; |
| 2245 } | 2243 } |
| 2246 | 2244 |
| 2247 return true; | 2245 return true; |
| 2248 } | 2246 } |
| 2249 | 2247 |
| 2250 bool QuicFramer::AppendStopWaitingFrame( | 2248 bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header, |
| 2251 const QuicPacketHeader& header, | 2249 const QuicStopWaitingFrame& frame, |
| 2252 const QuicStopWaitingFrame& frame, | 2250 QuicDataWriter* writer) { |
| 2253 QuicDataWriter* writer) { | |
| 2254 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); | 2251 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); |
| 2255 const QuicPacketSequenceNumber least_unacked_delta = | 2252 const QuicPacketSequenceNumber least_unacked_delta = |
| 2256 header.packet_sequence_number - frame.least_unacked; | 2253 header.packet_sequence_number - frame.least_unacked; |
| 2257 const QuicPacketSequenceNumber length_shift = | 2254 const QuicPacketSequenceNumber length_shift = |
| 2258 header.public_header.sequence_number_length * 8; | 2255 header.public_header.sequence_number_length * 8; |
| 2259 if (!writer->WriteUInt8(frame.entropy_hash)) { | 2256 if (!writer->WriteUInt8(frame.entropy_hash)) { |
| 2260 LOG(DFATAL) << " hash failed"; | 2257 LOG(DFATAL) << " hash failed"; |
| 2261 return false; | 2258 return false; |
| 2262 } | 2259 } |
| 2263 | 2260 |
| 2264 if (least_unacked_delta >> length_shift > 0) { | 2261 if (least_unacked_delta >> length_shift > 0) { |
| 2265 LOG(DFATAL) << "sequence_number_length " | 2262 LOG(DFATAL) << "sequence_number_length " |
| 2266 << header.public_header.sequence_number_length | 2263 << header.public_header.sequence_number_length |
| 2267 << " is too small for least_unacked_delta: " | 2264 << " is too small for least_unacked_delta: " |
| 2268 << least_unacked_delta; | 2265 << least_unacked_delta; |
| 2269 return false; | 2266 return false; |
| 2270 } | 2267 } |
| 2271 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, | 2268 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, |
| 2272 least_unacked_delta, writer)) { | 2269 least_unacked_delta, |
| 2270 writer)) { |
| 2273 LOG(DFATAL) << " seq failed: " | 2271 LOG(DFATAL) << " seq failed: " |
| 2274 << header.public_header.sequence_number_length; | 2272 << header.public_header.sequence_number_length; |
| 2275 return false; | 2273 return false; |
| 2276 } | 2274 } |
| 2277 | 2275 |
| 2278 return true; | 2276 return true; |
| 2279 } | 2277 } |
| 2280 | 2278 |
| 2281 bool QuicFramer::AppendRstStreamFrame( | 2279 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, |
| 2282 const QuicRstStreamFrame& frame, | 2280 QuicDataWriter* writer) { |
| 2283 QuicDataWriter* writer) { | |
| 2284 if (!writer->WriteUInt32(frame.stream_id)) { | 2281 if (!writer->WriteUInt32(frame.stream_id)) { |
| 2285 return false; | 2282 return false; |
| 2286 } | 2283 } |
| 2287 | 2284 |
| 2288 if (!writer->WriteUInt64(frame.byte_offset)) { | 2285 if (!writer->WriteUInt64(frame.byte_offset)) { |
| 2289 return false; | 2286 return false; |
| 2290 } | 2287 } |
| 2291 | 2288 |
| 2292 uint32 error_code = static_cast<uint32>(frame.error_code); | 2289 uint32 error_code = static_cast<uint32>(frame.error_code); |
| 2293 if (!writer->WriteUInt32(error_code)) { | 2290 if (!writer->WriteUInt32(error_code)) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2352 | 2349 |
| 2353 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2350 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2354 DVLOG(1) << "Error detail: " << detailed_error_; | 2351 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2355 set_error(error); | 2352 set_error(error); |
| 2356 visitor_->OnError(this); | 2353 visitor_->OnError(this); |
| 2357 reader_.reset(NULL); | 2354 reader_.reset(NULL); |
| 2358 return false; | 2355 return false; |
| 2359 } | 2356 } |
| 2360 | 2357 |
| 2361 } // namespace net | 2358 } // namespace net |
| OLD | NEW |