Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(223)

Side by Side Diff: net/quic/quic_framer.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "net/quic/crypto/crypto_protocol.h" 11 #include "net/quic/crypto/crypto_protocol.h"
12 #include "net/quic/crypto/quic_decrypter.h" 12 #include "net/quic/crypto/quic_decrypter.h"
13 #include "net/quic/crypto/quic_encrypter.h" 13 #include "net/quic/crypto/quic_encrypter.h"
14 #include "net/quic/quic_data_reader.h" 14 #include "net/quic/quic_data_reader.h"
15 #include "net/quic/quic_data_writer.h" 15 #include "net/quic/quic_data_writer.h"
16 #include "net/quic/quic_flags.h" 16 #include "net/quic/quic_flags.h"
17 #include "net/quic/quic_socket_address_coder.h" 17 #include "net/quic/quic_socket_address_coder.h"
18 18
19 using base::StringPiece; 19 using base::StringPiece;
20 using std::make_pair;
21 using std::map; 20 using std::map;
22 using std::max; 21 using std::max;
23 using std::min; 22 using std::min;
24 using std::numeric_limits; 23 using std::numeric_limits;
25 using std::string; 24 using std::string;
26 25
27 namespace net { 26 namespace net {
28 27
29 namespace { 28 namespace {
30 29
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 return 0; 302 return 0;
304 } 303 }
305 LOG(DFATAL) << "Packet size too small to fit frame."; 304 LOG(DFATAL) << "Packet size too small to fit frame.";
306 return frame_len; 305 return frame_len;
307 } 306 }
308 307
309 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {} 308 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {}
310 309
311 QuicFramer::AckFrameInfo::~AckFrameInfo() {} 310 QuicFramer::AckFrameInfo::~AckFrameInfo() {}
312 311
312 // static
313 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( 313 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
314 const QuicPacketHeader& header) const { 314 const QuicPacketHeader& header) {
315 return header.entropy_flag << (header.packet_sequence_number % 8); 315 return header.entropy_flag << (header.packet_sequence_number % 8);
316 } 316 }
317 317
318 SerializedPacket QuicFramer::BuildDataPacket( 318 QuicPacket* QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
319 const QuicPacketHeader& header, 319 const QuicFrames& frames,
320 const QuicFrames& frames, 320 char* buffer,
321 size_t packet_size) { 321 size_t packet_length) {
322 QuicDataWriter writer(packet_size); 322 QuicDataWriter writer(packet_length, buffer);
323 const SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0,
324 nullptr);
325 if (!AppendPacketHeader(header, &writer)) { 323 if (!AppendPacketHeader(header, &writer)) {
326 LOG(DFATAL) << "AppendPacketHeader failed"; 324 LOG(DFATAL) << "AppendPacketHeader failed";
327 return kNoPacket; 325 return nullptr;
328 } 326 }
329 327
330 for (size_t i = 0; i < frames.size(); ++i) { 328 size_t i = 0;
331 const QuicFrame& frame = frames[i]; 329 for (const QuicFrame& frame : frames) {
332
333 // Determine if we should write stream frame length in header. 330 // Determine if we should write stream frame length in header.
334 const bool no_stream_frame_length = 331 const bool no_stream_frame_length =
335 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && 332 (header.is_in_fec_group == NOT_IN_FEC_GROUP) &&
336 (i == frames.size() - 1); 333 (i == frames.size() - 1);
337 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { 334 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) {
338 LOG(DFATAL) << "AppendTypeByte failed"; 335 LOG(DFATAL) << "AppendTypeByte failed";
339 return kNoPacket; 336 return nullptr;
340 } 337 }
341 338
342 switch (frame.type) { 339 switch (frame.type) {
343 case PADDING_FRAME: 340 case PADDING_FRAME:
344 writer.WritePadding(); 341 writer.WritePadding();
345 break; 342 break;
346 case STREAM_FRAME: 343 case STREAM_FRAME:
347 if (!AppendStreamFrame( 344 if (!AppendStreamFrame(
348 *frame.stream_frame, no_stream_frame_length, &writer)) { 345 *frame.stream_frame, no_stream_frame_length, &writer)) {
349 LOG(DFATAL) << "AppendStreamFrame failed"; 346 LOG(DFATAL) << "AppendStreamFrame failed";
350 return kNoPacket; 347 return nullptr;
351 } 348 }
352 break; 349 break;
353 case ACK_FRAME: 350 case ACK_FRAME:
354 if (!AppendAckFrameAndTypeByte( 351 if (!AppendAckFrameAndTypeByte(
355 header, *frame.ack_frame, &writer)) { 352 header, *frame.ack_frame, &writer)) {
356 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; 353 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed";
357 return kNoPacket; 354 return nullptr;
358 } 355 }
359 break; 356 break;
360 case STOP_WAITING_FRAME: 357 case STOP_WAITING_FRAME:
361 if (!AppendStopWaitingFrame( 358 if (!AppendStopWaitingFrame(
362 header, *frame.stop_waiting_frame, &writer)) { 359 header, *frame.stop_waiting_frame, &writer)) {
363 LOG(DFATAL) << "AppendStopWaitingFrame failed"; 360 LOG(DFATAL) << "AppendStopWaitingFrame failed";
364 return kNoPacket; 361 return nullptr;
365 } 362 }
366 break; 363 break;
367 case PING_FRAME: 364 case PING_FRAME:
368 // Ping has no payload. 365 // Ping has no payload.
369 break; 366 break;
370 case RST_STREAM_FRAME: 367 case RST_STREAM_FRAME:
371 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { 368 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) {
372 LOG(DFATAL) << "AppendRstStreamFrame failed"; 369 LOG(DFATAL) << "AppendRstStreamFrame failed";
373 return kNoPacket; 370 return nullptr;
374 } 371 }
375 break; 372 break;
376 case CONNECTION_CLOSE_FRAME: 373 case CONNECTION_CLOSE_FRAME:
377 if (!AppendConnectionCloseFrame( 374 if (!AppendConnectionCloseFrame(
378 *frame.connection_close_frame, &writer)) { 375 *frame.connection_close_frame, &writer)) {
379 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; 376 LOG(DFATAL) << "AppendConnectionCloseFrame failed";
380 return kNoPacket; 377 return nullptr;
381 } 378 }
382 break; 379 break;
383 case GOAWAY_FRAME: 380 case GOAWAY_FRAME:
384 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { 381 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) {
385 LOG(DFATAL) << "AppendGoAwayFrame failed"; 382 LOG(DFATAL) << "AppendGoAwayFrame failed";
386 return kNoPacket; 383 return nullptr;
387 } 384 }
388 break; 385 break;
389 case WINDOW_UPDATE_FRAME: 386 case WINDOW_UPDATE_FRAME:
390 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) { 387 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) {
391 LOG(DFATAL) << "AppendWindowUpdateFrame failed"; 388 LOG(DFATAL) << "AppendWindowUpdateFrame failed";
392 return kNoPacket; 389 return nullptr;
393 } 390 }
394 break; 391 break;
395 case BLOCKED_FRAME: 392 case BLOCKED_FRAME:
396 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { 393 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) {
397 LOG(DFATAL) << "AppendBlockedFrame failed"; 394 LOG(DFATAL) << "AppendBlockedFrame failed";
398 return kNoPacket; 395 return nullptr;
399 } 396 }
400 break; 397 break;
401 default: 398 default:
402 RaiseError(QUIC_INVALID_FRAME_DATA); 399 RaiseError(QUIC_INVALID_FRAME_DATA);
403 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; 400 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA";
404 return kNoPacket; 401 return nullptr;
405 } 402 }
403 ++i;
406 } 404 }
407 405
408 // Save the length before writing, because take clears it. 406 QuicPacket* packet =
409 const size_t len = writer.length(); 407 new QuicPacket(writer.data(), writer.length(), false,
410 // Less than or equal because truncated acks end up with max_plaintex_size 408 header.public_header.connection_id_length,
411 // length, even though they're typically slightly shorter. 409 header.public_header.version_flag,
412 DCHECK_LE(len, packet_size); 410 header.public_header.sequence_number_length);
413 QuicPacket* packet = QuicPacket::NewDataPacket(
414 writer.take(), len, true, header.public_header.connection_id_length,
415 header.public_header.version_flag,
416 header.public_header.sequence_number_length);
417 411
418 if (fec_builder_) { 412 if (fec_builder_) {
419 fec_builder_->OnBuiltFecProtectedPayload(header, 413 fec_builder_->OnBuiltFecProtectedPayload(header,
420 packet->FecProtectedData()); 414 packet->FecProtectedData());
421 } 415 }
422 416
423 return SerializedPacket(header.packet_sequence_number, 417 return packet;
424 header.public_header.sequence_number_length, packet,
425 GetPacketEntropyHash(header), nullptr);
426 } 418 }
427 419
428 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header, 420 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header,
429 const QuicFecData& fec) { 421 const QuicFecData& fec) {
430 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); 422 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group);
431 DCHECK_NE(0u, header.fec_group); 423 DCHECK_NE(0u, header.fec_group);
432 size_t len = GetPacketHeaderSize(header); 424 size_t len = GetPacketHeaderSize(header);
433 len += fec.redundancy.length(); 425 len += fec.redundancy.length();
434 426
435 QuicDataWriter writer(len); 427 scoped_ptr<char[]> buffer(new char[len]);
436 const SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, 428 QuicDataWriter writer(len, buffer.get());
437 nullptr);
438 if (!AppendPacketHeader(header, &writer)) { 429 if (!AppendPacketHeader(header, &writer)) {
439 LOG(DFATAL) << "AppendPacketHeader failed"; 430 LOG(DFATAL) << "AppendPacketHeader failed";
440 return kNoPacket; 431 return nullptr;
441 } 432 }
442 433
443 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { 434 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
444 LOG(DFATAL) << "Failed to add FEC"; 435 LOG(DFATAL) << "Failed to add FEC";
445 return kNoPacket; 436 return nullptr;
446 } 437 }
447 438
448 return SerializedPacket( 439 return new QuicPacket(buffer.release(), len, true,
449 header.packet_sequence_number, 440 header.public_header.connection_id_length,
450 header.public_header.sequence_number_length, 441 header.public_header.version_flag,
451 QuicPacket::NewFecPacket(writer.take(), len, true, 442 header.public_header.sequence_number_length);
452 header.public_header.connection_id_length,
453 header.public_header.version_flag,
454 header.public_header.sequence_number_length),
455 GetPacketEntropyHash(header), nullptr);
456 } 443 }
457 444
458 // static 445 // static
459 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( 446 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket(
460 const QuicPublicResetPacket& packet) { 447 const QuicPublicResetPacket& packet) {
461 DCHECK(packet.public_header.reset_flag); 448 DCHECK(packet.public_header.reset_flag);
462 449
463 CryptoHandshakeMessage reset; 450 CryptoHandshakeMessage reset;
464 reset.set_tag(kPRST); 451 reset.set_tag(kPRST);
465 reset.SetValue(kRNON, packet.nonce_proof); 452 reset.SetValue(kRNON, packet.nonce_proof);
466 reset.SetValue(kRSEQ, packet.rejected_sequence_number); 453 reset.SetValue(kRSEQ, packet.rejected_sequence_number);
467 if (!packet.client_address.address().empty()) { 454 if (!packet.client_address.address().empty()) {
468 // packet.client_address is non-empty. 455 // packet.client_address is non-empty.
469 QuicSocketAddressCoder address_coder(packet.client_address); 456 QuicSocketAddressCoder address_coder(packet.client_address);
470 string serialized_address = address_coder.Encode(); 457 string serialized_address = address_coder.Encode();
471 if (serialized_address.empty()) { 458 if (serialized_address.empty()) {
472 return nullptr; 459 return nullptr;
473 } 460 }
474 reset.SetStringPiece(kCADR, serialized_address); 461 reset.SetStringPiece(kCADR, serialized_address);
475 } 462 }
476 const QuicData& reset_serialized = reset.GetSerialized(); 463 const QuicData& reset_serialized = reset.GetSerialized();
477 464
478 size_t len = 465 size_t len =
479 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); 466 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length();
480 QuicDataWriter writer(len); 467 scoped_ptr<char[]> buffer(new char[len]);
468 QuicDataWriter writer(len, buffer.get());
481 469
482 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | 470 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST |
483 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); 471 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
484 if (!writer.WriteUInt8(flags)) { 472 if (!writer.WriteUInt8(flags)) {
485 return nullptr; 473 return nullptr;
486 } 474 }
487 475
488 if (!writer.WriteUInt64(packet.public_header.connection_id)) { 476 if (!writer.WriteUInt64(packet.public_header.connection_id)) {
489 return nullptr; 477 return nullptr;
490 } 478 }
491 479
492 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { 480 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
493 return nullptr; 481 return nullptr;
494 } 482 }
495 483
496 return new QuicEncryptedPacket(writer.take(), len, true); 484 return new QuicEncryptedPacket(buffer.release(), len, true);
497 } 485 }
498 486
499 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( 487 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket(
500 const QuicPacketPublicHeader& header, 488 const QuicPacketPublicHeader& header,
501 const QuicVersionVector& supported_versions) { 489 const QuicVersionVector& supported_versions) {
502 DCHECK(header.version_flag); 490 DCHECK(header.version_flag);
503 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); 491 size_t len = GetVersionNegotiationPacketSize(supported_versions.size());
504 QuicDataWriter writer(len); 492 scoped_ptr<char[]> buffer(new char[len]);
493 QuicDataWriter writer(len, buffer.get());
505 494
506 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | 495 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION |
507 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); 496 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
508 if (!writer.WriteUInt8(flags)) { 497 if (!writer.WriteUInt8(flags)) {
509 return nullptr; 498 return nullptr;
510 } 499 }
511 500
512 if (!writer.WriteUInt64(header.connection_id)) { 501 if (!writer.WriteUInt64(header.connection_id)) {
513 return nullptr; 502 return nullptr;
514 } 503 }
515 504
516 for (size_t i = 0; i < supported_versions.size(); ++i) { 505 for (size_t i = 0; i < supported_versions.size(); ++i) {
517 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { 506 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) {
518 return nullptr; 507 return nullptr;
519 } 508 }
520 } 509 }
521 510
522 return new QuicEncryptedPacket(writer.take(), len, true); 511 return new QuicEncryptedPacket(buffer.release(), len, true);
523 } 512 }
524 513
525 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { 514 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
526 DCHECK(!reader_.get()); 515 DCHECK(!reader_.get());
527 reader_.reset(new QuicDataReader(packet.data(), packet.length())); 516 reader_.reset(new QuicDataReader(packet.data(), packet.length()));
528 517
529 visitor_->OnPacket(); 518 visitor_->OnPacket();
530 519
531 // First parse the public header. 520 // First parse the public header.
532 QuicPacketPublicHeader public_header; 521 QuicPacketPublicHeader public_header;
(...skipping 15 matching lines...) Expand all
548 reader_.reset(nullptr); 537 reader_.reset(nullptr);
549 return true; 538 return true;
550 } 539 }
551 } 540 }
552 541
553 bool rv; 542 bool rv;
554 if (!is_server_ && public_header.version_flag) { 543 if (!is_server_ && public_header.version_flag) {
555 rv = ProcessVersionNegotiationPacket(&public_header); 544 rv = ProcessVersionNegotiationPacket(&public_header);
556 } else if (public_header.reset_flag) { 545 } else if (public_header.reset_flag) {
557 rv = ProcessPublicResetPacket(public_header); 546 rv = ProcessPublicResetPacket(public_header);
547 } else if (packet.length() <= kMaxPacketSize) {
548 char buffer[kMaxPacketSize];
549 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize);
558 } else { 550 } else {
559 rv = ProcessDataPacket(public_header, packet); 551 scoped_ptr<char[]> large_buffer(new char[packet.length()]);
552 rv = ProcessDataPacket(public_header, packet, large_buffer.get(),
553 packet.length());
554 LOG_IF(DFATAL, rv) << "QUIC should never successfully process packets "
555 << "larger than kMaxPacketSize. packet size:"
556 << packet.length();
560 } 557 }
561 558
562 reader_.reset(nullptr); 559 reader_.reset(nullptr);
563 return rv; 560 return rv;
564 } 561 }
565 562
566 bool QuicFramer::ProcessVersionNegotiationPacket( 563 bool QuicFramer::ProcessVersionNegotiationPacket(
567 QuicPacketPublicHeader* public_header) { 564 QuicPacketPublicHeader* public_header) {
568 DCHECK(!is_server_); 565 DCHECK(!is_server_);
569 // Try reading at least once to raise error if the packet is invalid. 566 // Try reading at least once to raise error if the packet is invalid.
570 do { 567 do {
571 QuicTag version; 568 QuicTag version;
572 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { 569 if (!reader_->ReadBytes(&version, kQuicVersionSize)) {
573 set_detailed_error("Unable to read supported version in negotiation."); 570 set_detailed_error("Unable to read supported version in negotiation.");
574 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); 571 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
575 } 572 }
576 public_header->versions.push_back(QuicTagToQuicVersion(version)); 573 public_header->versions.push_back(QuicTagToQuicVersion(version));
577 } while (!reader_->IsDoneReading()); 574 } while (!reader_->IsDoneReading());
578 575
579 visitor_->OnVersionNegotiationPacket(*public_header); 576 visitor_->OnVersionNegotiationPacket(*public_header);
580 return true; 577 return true;
581 } 578 }
582 579
583 bool QuicFramer::ProcessDataPacket( 580 bool QuicFramer::ProcessDataPacket(const QuicPacketPublicHeader& public_header,
584 const QuicPacketPublicHeader& public_header, 581 const QuicEncryptedPacket& packet,
585 const QuicEncryptedPacket& packet) { 582 char* decrypted_buffer,
583 size_t buffer_length) {
586 QuicPacketHeader header(public_header); 584 QuicPacketHeader header(public_header);
587 if (!ProcessPacketHeader(&header, packet)) { 585 if (!ProcessPacketHeader(&header, packet, decrypted_buffer, buffer_length)) {
588 DLOG(WARNING) << "Unable to process data packet header."; 586 DLOG(WARNING) << "Unable to process data packet header.";
589 return false; 587 return false;
590 } 588 }
591 589
592 if (!visitor_->OnPacketHeader(header)) { 590 if (!visitor_->OnPacketHeader(header)) {
593 // The visitor suppresses further processing of the packet. 591 // The visitor suppresses further processing of the packet.
594 return true; 592 return true;
595 } 593 }
596 594
597 if (packet.length() > kMaxPacketSize) { 595 if (packet.length() > kMaxPacketSize) {
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
991 } 989 }
992 // Include the last nack range. 990 // Include the last nack range.
993 ack_info.nack_ranges[last_missing - cur_range_length] = 991 ack_info.nack_ranges[last_missing - cur_range_length] =
994 static_cast<uint8>(cur_range_length); 992 static_cast<uint8>(cur_range_length);
995 // Include the range to the largest observed. 993 // Include the range to the largest observed.
996 ack_info.max_delta = 994 ack_info.max_delta =
997 max(ack_info.max_delta, frame.largest_observed - last_missing); 995 max(ack_info.max_delta, frame.largest_observed - last_missing);
998 return ack_info; 996 return ack_info;
999 } 997 }
1000 998
1001 bool QuicFramer::ProcessPacketHeader( 999 bool QuicFramer::ProcessPacketHeader(QuicPacketHeader* header,
1002 QuicPacketHeader* header, 1000 const QuicEncryptedPacket& packet,
1003 const QuicEncryptedPacket& packet) { 1001 char* decrypted_buffer,
1002 size_t buffer_length) {
1004 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, 1003 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length,
1005 &header->packet_sequence_number)) { 1004 &header->packet_sequence_number)) {
1006 set_detailed_error("Unable to read sequence number."); 1005 set_detailed_error("Unable to read sequence number.");
1007 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1006 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1008 } 1007 }
1009 1008
1010 if (header->packet_sequence_number == 0u) { 1009 if (header->packet_sequence_number == 0u) {
1011 set_detailed_error("Packet sequence numbers cannot be 0."); 1010 set_detailed_error("Packet sequence numbers cannot be 0.");
1012 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1011 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1013 } 1012 }
1014 1013
1015 if (!visitor_->OnUnauthenticatedHeader(*header)) { 1014 if (!visitor_->OnUnauthenticatedHeader(*header)) {
1016 return false; 1015 return false;
1017 } 1016 }
1018 1017
1019 if (!DecryptPayload(*header, packet)) { 1018 if (!DecryptPayload(*header, packet, decrypted_buffer, buffer_length)) {
1020 set_detailed_error("Unable to decrypt payload."); 1019 set_detailed_error("Unable to decrypt payload.");
1021 return RaiseError(QUIC_DECRYPTION_FAILURE); 1020 return RaiseError(QUIC_DECRYPTION_FAILURE);
1022 } 1021 }
1023 1022
1024 uint8 private_flags; 1023 uint8 private_flags;
1025 if (!reader_->ReadBytes(&private_flags, 1)) { 1024 if (!reader_->ReadBytes(&private_flags, 1)) {
1026 set_detailed_error("Unable to read private flags."); 1025 set_detailed_error("Unable to read private flags.");
1027 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1026 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1028 } 1027 }
1029 1028
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1400 // Time delta from the framer creation. 1399 // Time delta from the framer creation.
1401 uint32 time_delta_us; 1400 uint32 time_delta_us;
1402 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { 1401 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
1403 set_detailed_error("Unable to read time delta in received packets."); 1402 set_detailed_error("Unable to read time delta in received packets.");
1404 return false; 1403 return false;
1405 } 1404 }
1406 1405
1407 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); 1406 last_timestamp_ = CalculateTimestampFromWire(time_delta_us);
1408 1407
1409 ack_frame->received_packet_times.push_back( 1408 ack_frame->received_packet_times.push_back(
1410 make_pair(seq_num, creation_time_.Add(last_timestamp_))); 1409 std::make_pair(seq_num, creation_time_.Add(last_timestamp_)));
1411 1410
1412 for (uint8 i = 1; i < num_received_packets; ++i) { 1411 for (uint8 i = 1; i < num_received_packets; ++i) {
1413 if (!reader_->ReadBytes(&delta_from_largest_observed, 1412 if (!reader_->ReadBytes(&delta_from_largest_observed,
1414 PACKET_1BYTE_SEQUENCE_NUMBER)) { 1413 PACKET_1BYTE_SEQUENCE_NUMBER)) {
1415 set_detailed_error( 1414 set_detailed_error(
1416 "Unable to read sequence delta in received packets."); 1415 "Unable to read sequence delta in received packets.");
1417 return false; 1416 return false;
1418 } 1417 }
1419 seq_num = ack_frame->largest_observed - delta_from_largest_observed; 1418 seq_num = ack_frame->largest_observed - delta_from_largest_observed;
1420 1419
1421 // Time delta from the previous timestamp. 1420 // Time delta from the previous timestamp.
1422 uint64 incremental_time_delta_us; 1421 uint64 incremental_time_delta_us;
1423 if (!reader_->ReadUFloat16(&incremental_time_delta_us)) { 1422 if (!reader_->ReadUFloat16(&incremental_time_delta_us)) {
1424 set_detailed_error( 1423 set_detailed_error(
1425 "Unable to read incremental time delta in received packets."); 1424 "Unable to read incremental time delta in received packets.");
1426 return false; 1425 return false;
1427 } 1426 }
1428 1427
1429 last_timestamp_ = last_timestamp_.Add( 1428 last_timestamp_ = last_timestamp_.Add(
1430 QuicTime::Delta::FromMicroseconds(incremental_time_delta_us)); 1429 QuicTime::Delta::FromMicroseconds(incremental_time_delta_us));
1431 ack_frame->received_packet_times.push_back( 1430 ack_frame->received_packet_times.push_back(
1432 make_pair(seq_num, creation_time_.Add(last_timestamp_))); 1431 std::make_pair(seq_num, creation_time_.Add(last_timestamp_)));
1433 } 1432 }
1434 } 1433 }
1435 } 1434 }
1436 return true; 1435 return true;
1437 } 1436 }
1438 1437
1439 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, 1438 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header,
1440 QuicStopWaitingFrame* stop_waiting) { 1439 QuicStopWaitingFrame* stop_waiting) {
1441 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { 1440 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) {
1442 set_detailed_error("Unable to read entropy hash for sent packets."); 1441 set_detailed_error("Unable to read entropy hash for sent packets.");
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1616 DCHECK(encrypter_[level].get() != nullptr); 1615 DCHECK(encrypter_[level].get() != nullptr);
1617 return encrypter_[level].get(); 1616 return encrypter_[level].get();
1618 } 1617 }
1619 1618
1620 QuicEncryptedPacket* QuicFramer::EncryptPacket( 1619 QuicEncryptedPacket* QuicFramer::EncryptPacket(
1621 EncryptionLevel level, 1620 EncryptionLevel level,
1622 QuicPacketSequenceNumber packet_sequence_number, 1621 QuicPacketSequenceNumber packet_sequence_number,
1623 const QuicPacket& packet) { 1622 const QuicPacket& packet) {
1624 DCHECK(encrypter_[level].get() != nullptr); 1623 DCHECK(encrypter_[level].get() != nullptr);
1625 1624
1626 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( 1625 // Allocate a large enough buffer for the header and the encrypted data.
1627 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); 1626 const size_t encrypted_len =
1628 if (out.get() == nullptr) { 1627 encrypter_[level]->GetCiphertextSize(packet.Plaintext().length());
1628 StringPiece header_data = packet.BeforePlaintext();
1629 const size_t len = header_data.length() + encrypted_len;
1630 // TODO(ianswett): Consider allocating this on the stack in the typical case.
1631 char* buffer = new char[len];
1632 // Copy in the header, because the encrypter only populates the encrypted
1633 // plaintext content.
1634 memcpy(buffer, header_data.data(), header_data.length());
1635 // Encrypt the plaintext into the buffer.
1636 size_t output_length = 0;
1637 if (!encrypter_[level]->EncryptPacket(
1638 packet_sequence_number, packet.AssociatedData(), packet.Plaintext(),
1639 buffer + header_data.length(), &output_length, encrypted_len)) {
1629 RaiseError(QUIC_ENCRYPTION_FAILURE); 1640 RaiseError(QUIC_ENCRYPTION_FAILURE);
1630 return nullptr; 1641 return nullptr;
1631 } 1642 }
1632 StringPiece header_data = packet.BeforePlaintext(); 1643
1633 size_t len = header_data.length() + out->length(); 1644 return new QuicEncryptedPacket(buffer, header_data.length() + output_length,
1634 char* buffer = new char[len]; 1645 true);
1635 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt().
1636 memcpy(buffer, header_data.data(), header_data.length());
1637 memcpy(buffer + header_data.length(), out->data(), out->length());
1638 return new QuicEncryptedPacket(buffer, len, true);
1639 } 1646 }
1640 1647
1641 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { 1648 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
1642 // In order to keep the code simple, we don't have the current encryption 1649 // In order to keep the code simple, we don't have the current encryption
1643 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. 1650 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12.
1644 size_t min_plaintext_size = ciphertext_size; 1651 size_t min_plaintext_size = ciphertext_size;
1645 1652
1646 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { 1653 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) {
1647 if (encrypter_[i].get() != nullptr) { 1654 if (encrypter_[i].get() != nullptr) {
1648 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); 1655 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
1649 if (size < min_plaintext_size) { 1656 if (size < min_plaintext_size) {
1650 min_plaintext_size = size; 1657 min_plaintext_size = size;
1651 } 1658 }
1652 } 1659 }
1653 } 1660 }
1654 1661
1655 return min_plaintext_size; 1662 return min_plaintext_size;
1656 } 1663 }
1657 1664
1658 bool QuicFramer::DecryptPayload(const QuicPacketHeader& header, 1665 bool QuicFramer::DecryptPayload(const QuicPacketHeader& header,
1659 const QuicEncryptedPacket& packet) { 1666 const QuicEncryptedPacket& packet,
1660 StringPiece encrypted; 1667 char* decrypted_buffer,
1661 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { 1668 size_t buffer_length) {
1662 return false; 1669 StringPiece encrypted = reader_->ReadRemainingPayload();
1663 }
1664 DCHECK(decrypter_.get() != nullptr); 1670 DCHECK(decrypter_.get() != nullptr);
1665 decrypted_.reset(decrypter_->DecryptPacket( 1671 const StringPiece& associated_data = GetAssociatedDataFromEncryptedPacket(
1666 header.packet_sequence_number, 1672 packet, header.public_header.connection_id_length,
1667 GetAssociatedDataFromEncryptedPacket( 1673 header.public_header.version_flag,
1668 packet, 1674 header.public_header.sequence_number_length);
1669 header.public_header.connection_id_length, 1675 size_t decrypted_length = 0;
1670 header.public_header.version_flag, 1676 bool success = decrypter_->DecryptPacket(
1671 header.public_header.sequence_number_length), 1677 header.packet_sequence_number, associated_data, encrypted,
1672 encrypted)); 1678 decrypted_buffer, &decrypted_length, buffer_length);
1673 if (decrypted_.get() != nullptr) { 1679 if (success) {
1674 visitor_->OnDecryptedPacket(decrypter_level_); 1680 visitor_->OnDecryptedPacket(decrypter_level_);
1675 } else if (alternative_decrypter_.get() != nullptr) { 1681 } else if (alternative_decrypter_.get() != nullptr) {
1676 decrypted_.reset(alternative_decrypter_->DecryptPacket( 1682 success = alternative_decrypter_->DecryptPacket(
1677 header.packet_sequence_number, 1683 header.packet_sequence_number, associated_data, encrypted,
1678 GetAssociatedDataFromEncryptedPacket( 1684 decrypted_buffer, &decrypted_length, buffer_length);
1679 packet, 1685 if (success) {
1680 header.public_header.connection_id_length,
1681 header.public_header.version_flag,
1682 header.public_header.sequence_number_length),
1683 encrypted));
1684 if (decrypted_.get() != nullptr) {
1685 visitor_->OnDecryptedPacket(alternative_decrypter_level_); 1686 visitor_->OnDecryptedPacket(alternative_decrypter_level_);
1686 if (alternative_decrypter_latch_) { 1687 if (alternative_decrypter_latch_) {
1687 // Switch to the alternative decrypter and latch so that we cannot 1688 // Switch to the alternative decrypter and latch so that we cannot
1688 // switch back. 1689 // switch back.
1689 decrypter_.reset(alternative_decrypter_.release()); 1690 decrypter_.reset(alternative_decrypter_.release());
1690 decrypter_level_ = alternative_decrypter_level_; 1691 decrypter_level_ = alternative_decrypter_level_;
1691 alternative_decrypter_level_ = ENCRYPTION_NONE; 1692 alternative_decrypter_level_ = ENCRYPTION_NONE;
1692 } else { 1693 } else {
1693 // Switch the alternative decrypter so that we use it first next time. 1694 // Switch the alternative decrypter so that we use it first next time.
1694 decrypter_.swap(alternative_decrypter_); 1695 decrypter_.swap(alternative_decrypter_);
1695 EncryptionLevel level = alternative_decrypter_level_; 1696 EncryptionLevel level = alternative_decrypter_level_;
1696 alternative_decrypter_level_ = decrypter_level_; 1697 alternative_decrypter_level_ = decrypter_level_;
1697 decrypter_level_ = level; 1698 decrypter_level_ = level;
1698 } 1699 }
1699 } 1700 }
1700 } 1701 }
1701 1702
1702 if (decrypted_.get() == nullptr) { 1703 if (!success) {
1703 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" 1704 DLOG(WARNING) << "DecryptPacket failed for sequence_number:"
1704 << header.packet_sequence_number; 1705 << header.packet_sequence_number;
1705 return false; 1706 return false;
1706 } 1707 }
1707 1708
1708 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); 1709 reader_.reset(new QuicDataReader(decrypted_buffer, decrypted_length));
1709 return true; 1710 return true;
1710 } 1711 }
1711 1712
1712 size_t QuicFramer::GetAckFrameSize( 1713 size_t QuicFramer::GetAckFrameSize(
1713 const QuicAckFrame& ack, 1714 const QuicAckFrame& ack,
1714 QuicSequenceNumberLength sequence_number_length) { 1715 QuicSequenceNumberLength sequence_number_length) {
1715 AckFrameInfo ack_info = GetAckFrameInfo(ack); 1716 AckFrameInfo ack_info = GetAckFrameInfo(ack);
1716 QuicSequenceNumberLength largest_observed_length = 1717 QuicSequenceNumberLength largest_observed_length =
1717 GetMinSequenceNumberLength(ack.largest_observed); 1718 GetMinSequenceNumberLength(ack.largest_observed);
1718 QuicSequenceNumberLength missing_sequence_number_length = 1719 QuicSequenceNumberLength missing_sequence_number_length =
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
2212 2213
2213 bool QuicFramer::RaiseError(QuicErrorCode error) { 2214 bool QuicFramer::RaiseError(QuicErrorCode error) {
2214 DVLOG(1) << "Error detail: " << detailed_error_; 2215 DVLOG(1) << "Error detail: " << detailed_error_;
2215 set_error(error); 2216 set_error(error);
2216 visitor_->OnError(this); 2217 visitor_->OnError(this);
2217 reader_.reset(nullptr); 2218 reader_.reset(nullptr);
2218 return false; 2219 return false;
2219 } 2220 }
2220 2221
2221 } // namespace net 2222 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698