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 |