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_connection.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 #include <sys/types.h> | 8 #include <sys/types.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 received_packet_manager_(&stats_), | 236 received_packet_manager_(&stats_), |
237 ack_queued_(false), | 237 ack_queued_(false), |
238 num_packets_received_since_last_ack_sent_(0), | 238 num_packets_received_since_last_ack_sent_(0), |
239 stop_waiting_count_(0), | 239 stop_waiting_count_(0), |
240 ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), | 240 ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), |
241 retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))), | 241 retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))), |
242 send_alarm_(helper->CreateAlarm(new SendAlarm(this))), | 242 send_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
243 resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), | 243 resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
244 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), | 244 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), |
245 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), | 245 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), |
| 246 visitor_(nullptr), |
| 247 debug_visitor_(nullptr), |
246 packet_generator_(connection_id_, &framer_, random_generator_, this), | 248 packet_generator_(connection_id_, &framer_, random_generator_, this), |
247 fec_alarm_(helper->CreateAlarm(new FecAlarm(&packet_generator_))), | 249 fec_alarm_(helper->CreateAlarm(new FecAlarm(&packet_generator_))), |
248 idle_network_timeout_(QuicTime::Delta::Infinite()), | 250 idle_network_timeout_(QuicTime::Delta::Infinite()), |
249 overall_connection_timeout_(QuicTime::Delta::Infinite()), | 251 overall_connection_timeout_(QuicTime::Delta::Infinite()), |
250 time_of_last_received_packet_(clock_->ApproximateNow()), | 252 time_of_last_received_packet_(clock_->ApproximateNow()), |
251 time_of_last_sent_new_packet_(clock_->ApproximateNow()), | 253 time_of_last_sent_new_packet_(clock_->ApproximateNow()), |
252 sequence_number_of_last_sent_packet_(0), | 254 sequence_number_of_last_sent_packet_(0), |
253 sent_packet_manager_( | 255 sent_packet_manager_( |
254 is_server, | 256 is_server, |
255 clock_, | 257 clock_, |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 last_window_update_frames_.empty() && | 369 last_window_update_frames_.empty() && |
368 last_blocked_frames_.empty() && | 370 last_blocked_frames_.empty() && |
369 last_ping_frames_.empty() && | 371 last_ping_frames_.empty() && |
370 last_close_frames_.empty()); | 372 last_close_frames_.empty()); |
371 last_packet_decrypted_ = false; | 373 last_packet_decrypted_ = false; |
372 last_packet_revived_ = false; | 374 last_packet_revived_ = false; |
373 } | 375 } |
374 | 376 |
375 void QuicConnection::OnPublicResetPacket( | 377 void QuicConnection::OnPublicResetPacket( |
376 const QuicPublicResetPacket& packet) { | 378 const QuicPublicResetPacket& packet) { |
377 if (debug_visitor_.get() != nullptr) { | 379 if (debug_visitor_ != nullptr) { |
378 debug_visitor_->OnPublicResetPacket(packet); | 380 debug_visitor_->OnPublicResetPacket(packet); |
379 } | 381 } |
380 CloseConnection(QUIC_PUBLIC_RESET, true); | 382 CloseConnection(QUIC_PUBLIC_RESET, true); |
381 | 383 |
382 DVLOG(1) << ENDPOINT << "Connection " << connection_id() | 384 DVLOG(1) << ENDPOINT << "Connection " << connection_id() |
383 << " closed via QUIC_PUBLIC_RESET from peer."; | 385 << " closed via QUIC_PUBLIC_RESET from peer."; |
384 } | 386 } |
385 | 387 |
386 bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) { | 388 bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) { |
387 DVLOG(1) << ENDPOINT << "Received packet with mismatched version " | 389 DVLOG(1) << ENDPOINT << "Received packet with mismatched version " |
388 << received_version; | 390 << received_version; |
389 // TODO(satyamshekhar): Implement no server state in this mode. | 391 // TODO(satyamshekhar): Implement no server state in this mode. |
390 if (!is_server_) { | 392 if (!is_server_) { |
391 LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. " | 393 LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. " |
392 << "Closing connection."; | 394 << "Closing connection."; |
393 CloseConnection(QUIC_INTERNAL_ERROR, false); | 395 CloseConnection(QUIC_INTERNAL_ERROR, false); |
394 return false; | 396 return false; |
395 } | 397 } |
396 DCHECK_NE(version(), received_version); | 398 DCHECK_NE(version(), received_version); |
397 | 399 |
398 if (debug_visitor_.get() != nullptr) { | 400 if (debug_visitor_ != nullptr) { |
399 debug_visitor_->OnProtocolVersionMismatch(received_version); | 401 debug_visitor_->OnProtocolVersionMismatch(received_version); |
400 } | 402 } |
401 | 403 |
402 switch (version_negotiation_state_) { | 404 switch (version_negotiation_state_) { |
403 case START_NEGOTIATION: | 405 case START_NEGOTIATION: |
404 if (!framer_.IsSupportedVersion(received_version)) { | 406 if (!framer_.IsSupportedVersion(received_version)) { |
405 SendVersionNegotiationPacket(); | 407 SendVersionNegotiationPacket(); |
406 version_negotiation_state_ = NEGOTIATION_IN_PROGRESS; | 408 version_negotiation_state_ = NEGOTIATION_IN_PROGRESS; |
407 return false; | 409 return false; |
408 } | 410 } |
(...skipping 10 matching lines...) Expand all Loading... |
419 // Might be old packets that were sent by the client before the version | 421 // Might be old packets that were sent by the client before the version |
420 // was negotiated. Drop these. | 422 // was negotiated. Drop these. |
421 return false; | 423 return false; |
422 | 424 |
423 default: | 425 default: |
424 DCHECK(false); | 426 DCHECK(false); |
425 } | 427 } |
426 | 428 |
427 version_negotiation_state_ = NEGOTIATED_VERSION; | 429 version_negotiation_state_ = NEGOTIATED_VERSION; |
428 visitor_->OnSuccessfulVersionNegotiation(received_version); | 430 visitor_->OnSuccessfulVersionNegotiation(received_version); |
429 if (debug_visitor_.get() != nullptr) { | 431 if (debug_visitor_ != nullptr) { |
430 debug_visitor_->OnSuccessfulVersionNegotiation(received_version); | 432 debug_visitor_->OnSuccessfulVersionNegotiation(received_version); |
431 } | 433 } |
432 DVLOG(1) << ENDPOINT << "version negotiated " << received_version; | 434 DVLOG(1) << ENDPOINT << "version negotiated " << received_version; |
433 | 435 |
434 // Store the new version. | 436 // Store the new version. |
435 framer_.set_version(received_version); | 437 framer_.set_version(received_version); |
436 | 438 |
437 // TODO(satyamshekhar): Store the sequence number of this packet and close the | 439 // TODO(satyamshekhar): Store the sequence number of this packet and close the |
438 // connection if we ever received a packet with incorrect version and whose | 440 // connection if we ever received a packet with incorrect version and whose |
439 // sequence number is greater. | 441 // sequence number is greater. |
440 return true; | 442 return true; |
441 } | 443 } |
442 | 444 |
443 // Handles version negotiation for client connection. | 445 // Handles version negotiation for client connection. |
444 void QuicConnection::OnVersionNegotiationPacket( | 446 void QuicConnection::OnVersionNegotiationPacket( |
445 const QuicVersionNegotiationPacket& packet) { | 447 const QuicVersionNegotiationPacket& packet) { |
446 if (is_server_) { | 448 if (is_server_) { |
447 LOG(DFATAL) << ENDPOINT << "Framer parsed VersionNegotiationPacket." | 449 LOG(DFATAL) << ENDPOINT << "Framer parsed VersionNegotiationPacket." |
448 << " Closing connection."; | 450 << " Closing connection."; |
449 CloseConnection(QUIC_INTERNAL_ERROR, false); | 451 CloseConnection(QUIC_INTERNAL_ERROR, false); |
450 return; | 452 return; |
451 } | 453 } |
452 if (debug_visitor_.get() != nullptr) { | 454 if (debug_visitor_ != nullptr) { |
453 debug_visitor_->OnVersionNegotiationPacket(packet); | 455 debug_visitor_->OnVersionNegotiationPacket(packet); |
454 } | 456 } |
455 | 457 |
456 if (version_negotiation_state_ != START_NEGOTIATION) { | 458 if (version_negotiation_state_ != START_NEGOTIATION) { |
457 // Possibly a duplicate version negotiation packet. | 459 // Possibly a duplicate version negotiation packet. |
458 return; | 460 return; |
459 } | 461 } |
460 | 462 |
461 if (std::find(packet.versions.begin(), | 463 if (std::find(packet.versions.begin(), |
462 packet.versions.end(), version()) != | 464 packet.versions.end(), version()) != |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 last_packet_decrypted_ = true; | 500 last_packet_decrypted_ = true; |
499 // If this packet was foward-secure encrypted and the forward-secure encrypter | 501 // If this packet was foward-secure encrypted and the forward-secure encrypter |
500 // is not being used, start using it. | 502 // is not being used, start using it. |
501 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && | 503 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && |
502 has_forward_secure_encrypter_ && level == ENCRYPTION_FORWARD_SECURE) { | 504 has_forward_secure_encrypter_ && level == ENCRYPTION_FORWARD_SECURE) { |
503 SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); | 505 SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); |
504 } | 506 } |
505 } | 507 } |
506 | 508 |
507 bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { | 509 bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { |
508 if (debug_visitor_.get() != nullptr) { | 510 if (debug_visitor_ != nullptr) { |
509 debug_visitor_->OnPacketHeader(header); | 511 debug_visitor_->OnPacketHeader(header); |
510 } | 512 } |
511 | 513 |
512 if (!ProcessValidatedPacket()) { | 514 if (!ProcessValidatedPacket()) { |
513 return false; | 515 return false; |
514 } | 516 } |
515 | 517 |
516 // Will be decrement below if we fall through to return true; | 518 // Will be decrement below if we fall through to return true; |
517 ++stats_.packets_dropped; | 519 ++stats_.packets_dropped; |
518 | 520 |
519 if (header.public_header.connection_id != connection_id_) { | 521 if (header.public_header.connection_id != connection_id_) { |
520 DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected ConnectionId: " | 522 DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected ConnectionId: " |
521 << header.public_header.connection_id << " instead of " | 523 << header.public_header.connection_id << " instead of " |
522 << connection_id_; | 524 << connection_id_; |
523 if (debug_visitor_.get() != nullptr) { | 525 if (debug_visitor_ != nullptr) { |
524 debug_visitor_->OnIncorrectConnectionId( | 526 debug_visitor_->OnIncorrectConnectionId( |
525 header.public_header.connection_id); | 527 header.public_header.connection_id); |
526 } | 528 } |
527 return false; | 529 return false; |
528 } | 530 } |
529 | 531 |
530 if (!Near(header.packet_sequence_number, | 532 if (!Near(header.packet_sequence_number, |
531 last_header_.packet_sequence_number)) { | 533 last_header_.packet_sequence_number)) { |
532 DVLOG(1) << ENDPOINT << "Packet " << header.packet_sequence_number | 534 DVLOG(1) << ENDPOINT << "Packet " << header.packet_sequence_number |
533 << " out of bounds. Discarding"; | 535 << " out of bounds. Discarding"; |
534 SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER, | 536 SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER, |
535 "Packet sequence number out of bounds"); | 537 "Packet sequence number out of bounds"); |
536 return false; | 538 return false; |
537 } | 539 } |
538 | 540 |
539 // If this packet has already been seen, or that the sender | 541 // If this packet has already been seen, or that the sender |
540 // has told us will not be retransmitted, then stop processing the packet. | 542 // has told us will not be retransmitted, then stop processing the packet. |
541 if (!received_packet_manager_.IsAwaitingPacket( | 543 if (!received_packet_manager_.IsAwaitingPacket( |
542 header.packet_sequence_number)) { | 544 header.packet_sequence_number)) { |
543 DVLOG(1) << ENDPOINT << "Packet " << header.packet_sequence_number | 545 DVLOG(1) << ENDPOINT << "Packet " << header.packet_sequence_number |
544 << " no longer being waited for. Discarding."; | 546 << " no longer being waited for. Discarding."; |
545 if (debug_visitor_.get() != nullptr) { | 547 if (debug_visitor_ != nullptr) { |
546 debug_visitor_->OnDuplicatePacket(header.packet_sequence_number); | 548 debug_visitor_->OnDuplicatePacket(header.packet_sequence_number); |
547 } | 549 } |
548 return false; | 550 return false; |
549 } | 551 } |
550 | 552 |
551 if (version_negotiation_state_ != NEGOTIATED_VERSION) { | 553 if (version_negotiation_state_ != NEGOTIATED_VERSION) { |
552 if (is_server_) { | 554 if (is_server_) { |
553 if (!header.public_header.version_flag) { | 555 if (!header.public_header.version_flag) { |
554 DLOG(WARNING) << ENDPOINT << "Packet " << header.packet_sequence_number | 556 DLOG(WARNING) << ENDPOINT << "Packet " << header.packet_sequence_number |
555 << " without version flag before version negotiated."; | 557 << " without version flag before version negotiated."; |
556 // Packets should have the version flag till version negotiation is | 558 // Packets should have the version flag till version negotiation is |
557 // done. | 559 // done. |
558 CloseConnection(QUIC_INVALID_VERSION, false); | 560 CloseConnection(QUIC_INVALID_VERSION, false); |
559 return false; | 561 return false; |
560 } else { | 562 } else { |
561 DCHECK_EQ(1u, header.public_header.versions.size()); | 563 DCHECK_EQ(1u, header.public_header.versions.size()); |
562 DCHECK_EQ(header.public_header.versions[0], version()); | 564 DCHECK_EQ(header.public_header.versions[0], version()); |
563 version_negotiation_state_ = NEGOTIATED_VERSION; | 565 version_negotiation_state_ = NEGOTIATED_VERSION; |
564 visitor_->OnSuccessfulVersionNegotiation(version()); | 566 visitor_->OnSuccessfulVersionNegotiation(version()); |
565 if (debug_visitor_.get() != nullptr) { | 567 if (debug_visitor_ != nullptr) { |
566 debug_visitor_->OnSuccessfulVersionNegotiation(version()); | 568 debug_visitor_->OnSuccessfulVersionNegotiation(version()); |
567 } | 569 } |
568 } | 570 } |
569 } else { | 571 } else { |
570 DCHECK(!header.public_header.version_flag); | 572 DCHECK(!header.public_header.version_flag); |
571 // If the client gets a packet without the version flag from the server | 573 // If the client gets a packet without the version flag from the server |
572 // it should stop sending version since the version negotiation is done. | 574 // it should stop sending version since the version negotiation is done. |
573 packet_generator_.StopSendingVersion(); | 575 packet_generator_.StopSendingVersion(); |
574 version_negotiation_state_ = NEGOTIATED_VERSION; | 576 version_negotiation_state_ = NEGOTIATED_VERSION; |
575 visitor_->OnSuccessfulVersionNegotiation(version()); | 577 visitor_->OnSuccessfulVersionNegotiation(version()); |
576 if (debug_visitor_.get() != nullptr) { | 578 if (debug_visitor_ != nullptr) { |
577 debug_visitor_->OnSuccessfulVersionNegotiation(version()); | 579 debug_visitor_->OnSuccessfulVersionNegotiation(version()); |
578 } | 580 } |
579 } | 581 } |
580 } | 582 } |
581 | 583 |
582 DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_); | 584 DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_); |
583 | 585 |
584 --stats_.packets_dropped; | 586 --stats_.packets_dropped; |
585 DVLOG(1) << ENDPOINT << "Received packet header: " << header; | 587 DVLOG(1) << ENDPOINT << "Received packet header: " << header; |
586 last_header_ = header; | 588 last_header_ = header; |
587 DCHECK(connected_); | 589 DCHECK(connected_); |
588 return true; | 590 return true; |
589 } | 591 } |
590 | 592 |
591 void QuicConnection::OnFecProtectedPayload(StringPiece payload) { | 593 void QuicConnection::OnFecProtectedPayload(StringPiece payload) { |
592 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group); | 594 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group); |
593 DCHECK_NE(0u, last_header_.fec_group); | 595 DCHECK_NE(0u, last_header_.fec_group); |
594 QuicFecGroup* group = GetFecGroup(); | 596 QuicFecGroup* group = GetFecGroup(); |
595 if (group != nullptr) { | 597 if (group != nullptr) { |
596 group->Update(last_decrypted_packet_level_, last_header_, payload); | 598 group->Update(last_decrypted_packet_level_, last_header_, payload); |
597 } | 599 } |
598 } | 600 } |
599 | 601 |
600 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { | 602 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { |
601 DCHECK(connected_); | 603 DCHECK(connected_); |
602 if (debug_visitor_.get() != nullptr) { | 604 if (debug_visitor_ != nullptr) { |
603 debug_visitor_->OnStreamFrame(frame); | 605 debug_visitor_->OnStreamFrame(frame); |
604 } | 606 } |
605 if (frame.stream_id != kCryptoStreamId && | 607 if (frame.stream_id != kCryptoStreamId && |
606 last_decrypted_packet_level_ == ENCRYPTION_NONE) { | 608 last_decrypted_packet_level_ == ENCRYPTION_NONE) { |
607 DLOG(WARNING) << ENDPOINT | 609 DLOG(WARNING) << ENDPOINT |
608 << "Received an unencrypted data frame: closing connection"; | 610 << "Received an unencrypted data frame: closing connection"; |
609 SendConnectionClose(QUIC_UNENCRYPTED_STREAM_DATA); | 611 SendConnectionClose(QUIC_UNENCRYPTED_STREAM_DATA); |
610 return false; | 612 return false; |
611 } | 613 } |
612 last_stream_frames_.push_back(frame); | 614 last_stream_frames_.push_back(frame); |
613 return true; | 615 return true; |
614 } | 616 } |
615 | 617 |
616 bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { | 618 bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { |
617 DCHECK(connected_); | 619 DCHECK(connected_); |
618 if (debug_visitor_.get() != nullptr) { | 620 if (debug_visitor_ != nullptr) { |
619 debug_visitor_->OnAckFrame(incoming_ack); | 621 debug_visitor_->OnAckFrame(incoming_ack); |
620 } | 622 } |
621 DVLOG(1) << ENDPOINT << "OnAckFrame: " << incoming_ack; | 623 DVLOG(1) << ENDPOINT << "OnAckFrame: " << incoming_ack; |
622 | 624 |
623 if (last_header_.packet_sequence_number <= largest_seen_packet_with_ack_) { | 625 if (last_header_.packet_sequence_number <= largest_seen_packet_with_ack_) { |
624 DVLOG(1) << ENDPOINT << "Received an old ack frame: ignoring"; | 626 DVLOG(1) << ENDPOINT << "Received an old ack frame: ignoring"; |
625 return true; | 627 return true; |
626 } | 628 } |
627 | 629 |
628 if (!ValidateAckFrame(incoming_ack)) { | 630 if (!ValidateAckFrame(incoming_ack)) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 largest_seen_packet_with_stop_waiting_) { | 668 largest_seen_packet_with_stop_waiting_) { |
667 DVLOG(1) << ENDPOINT << "Received an old stop waiting frame: ignoring"; | 669 DVLOG(1) << ENDPOINT << "Received an old stop waiting frame: ignoring"; |
668 return true; | 670 return true; |
669 } | 671 } |
670 | 672 |
671 if (!ValidateStopWaitingFrame(frame)) { | 673 if (!ValidateStopWaitingFrame(frame)) { |
672 SendConnectionClose(QUIC_INVALID_STOP_WAITING_DATA); | 674 SendConnectionClose(QUIC_INVALID_STOP_WAITING_DATA); |
673 return false; | 675 return false; |
674 } | 676 } |
675 | 677 |
676 if (debug_visitor_.get() != nullptr) { | 678 if (debug_visitor_ != nullptr) { |
677 debug_visitor_->OnStopWaitingFrame(frame); | 679 debug_visitor_->OnStopWaitingFrame(frame); |
678 } | 680 } |
679 | 681 |
680 last_stop_waiting_frames_.push_back(frame); | 682 last_stop_waiting_frames_.push_back(frame); |
681 return connected_; | 683 return connected_; |
682 } | 684 } |
683 | 685 |
684 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { | 686 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { |
685 DCHECK(connected_); | 687 DCHECK(connected_); |
686 if (debug_visitor_.get() != nullptr) { | 688 if (debug_visitor_ != nullptr) { |
687 debug_visitor_->OnPingFrame(frame); | 689 debug_visitor_->OnPingFrame(frame); |
688 } | 690 } |
689 last_ping_frames_.push_back(frame); | 691 last_ping_frames_.push_back(frame); |
690 return true; | 692 return true; |
691 } | 693 } |
692 | 694 |
693 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { | 695 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
694 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { | 696 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { |
695 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" | 697 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" |
696 << incoming_ack.largest_observed << " vs " | 698 << incoming_ack.largest_observed << " vs " |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 DCHECK_NE(0u, last_header_.fec_group); | 777 DCHECK_NE(0u, last_header_.fec_group); |
776 QuicFecGroup* group = GetFecGroup(); | 778 QuicFecGroup* group = GetFecGroup(); |
777 if (group != nullptr) { | 779 if (group != nullptr) { |
778 group->UpdateFec(last_decrypted_packet_level_, | 780 group->UpdateFec(last_decrypted_packet_level_, |
779 last_header_.packet_sequence_number, fec); | 781 last_header_.packet_sequence_number, fec); |
780 } | 782 } |
781 } | 783 } |
782 | 784 |
783 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { | 785 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { |
784 DCHECK(connected_); | 786 DCHECK(connected_); |
785 if (debug_visitor_.get() != nullptr) { | 787 if (debug_visitor_ != nullptr) { |
786 debug_visitor_->OnRstStreamFrame(frame); | 788 debug_visitor_->OnRstStreamFrame(frame); |
787 } | 789 } |
788 DVLOG(1) << ENDPOINT << "Stream reset with error " | 790 DVLOG(1) << ENDPOINT << "Stream reset with error " |
789 << QuicUtils::StreamErrorToString(frame.error_code); | 791 << QuicUtils::StreamErrorToString(frame.error_code); |
790 last_rst_frames_.push_back(frame); | 792 last_rst_frames_.push_back(frame); |
791 return connected_; | 793 return connected_; |
792 } | 794 } |
793 | 795 |
794 bool QuicConnection::OnConnectionCloseFrame( | 796 bool QuicConnection::OnConnectionCloseFrame( |
795 const QuicConnectionCloseFrame& frame) { | 797 const QuicConnectionCloseFrame& frame) { |
796 DCHECK(connected_); | 798 DCHECK(connected_); |
797 if (debug_visitor_.get() != nullptr) { | 799 if (debug_visitor_ != nullptr) { |
798 debug_visitor_->OnConnectionCloseFrame(frame); | 800 debug_visitor_->OnConnectionCloseFrame(frame); |
799 } | 801 } |
800 DVLOG(1) << ENDPOINT << "Connection " << connection_id() | 802 DVLOG(1) << ENDPOINT << "Connection " << connection_id() |
801 << " closed with error " | 803 << " closed with error " |
802 << QuicUtils::ErrorToString(frame.error_code) | 804 << QuicUtils::ErrorToString(frame.error_code) |
803 << " " << frame.error_details; | 805 << " " << frame.error_details; |
804 last_close_frames_.push_back(frame); | 806 last_close_frames_.push_back(frame); |
805 return connected_; | 807 return connected_; |
806 } | 808 } |
807 | 809 |
808 bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) { | 810 bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) { |
809 DCHECK(connected_); | 811 DCHECK(connected_); |
810 if (debug_visitor_.get() != nullptr) { | 812 if (debug_visitor_ != nullptr) { |
811 debug_visitor_->OnGoAwayFrame(frame); | 813 debug_visitor_->OnGoAwayFrame(frame); |
812 } | 814 } |
813 DVLOG(1) << ENDPOINT << "Go away received with error " | 815 DVLOG(1) << ENDPOINT << "Go away received with error " |
814 << QuicUtils::ErrorToString(frame.error_code) | 816 << QuicUtils::ErrorToString(frame.error_code) |
815 << " and reason:" << frame.reason_phrase; | 817 << " and reason:" << frame.reason_phrase; |
816 last_goaway_frames_.push_back(frame); | 818 last_goaway_frames_.push_back(frame); |
817 return connected_; | 819 return connected_; |
818 } | 820 } |
819 | 821 |
820 bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) { | 822 bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) { |
821 DCHECK(connected_); | 823 DCHECK(connected_); |
822 if (debug_visitor_.get() != nullptr) { | 824 if (debug_visitor_ != nullptr) { |
823 debug_visitor_->OnWindowUpdateFrame(frame); | 825 debug_visitor_->OnWindowUpdateFrame(frame); |
824 } | 826 } |
825 DVLOG(1) << ENDPOINT << "WindowUpdate received for stream: " | 827 DVLOG(1) << ENDPOINT << "WindowUpdate received for stream: " |
826 << frame.stream_id << " with byte offset: " << frame.byte_offset; | 828 << frame.stream_id << " with byte offset: " << frame.byte_offset; |
827 last_window_update_frames_.push_back(frame); | 829 last_window_update_frames_.push_back(frame); |
828 return connected_; | 830 return connected_; |
829 } | 831 } |
830 | 832 |
831 bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) { | 833 bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) { |
832 DCHECK(connected_); | 834 DCHECK(connected_); |
833 if (debug_visitor_.get() != nullptr) { | 835 if (debug_visitor_ != nullptr) { |
834 debug_visitor_->OnBlockedFrame(frame); | 836 debug_visitor_->OnBlockedFrame(frame); |
835 } | 837 } |
836 DVLOG(1) << ENDPOINT << "Blocked frame received for stream: " | 838 DVLOG(1) << ENDPOINT << "Blocked frame received for stream: " |
837 << frame.stream_id; | 839 << frame.stream_id; |
838 last_blocked_frames_.push_back(frame); | 840 last_blocked_frames_.push_back(frame); |
839 return connected_; | 841 return connected_; |
840 } | 842 } |
841 | 843 |
842 void QuicConnection::OnPacketComplete() { | 844 void QuicConnection::OnPacketComplete() { |
843 // Don't do anything if this packet closed the connection. | 845 // Don't do anything if this packet closed the connection. |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 stats_.max_packet_size = packet_generator_.max_packet_length(); | 1147 stats_.max_packet_size = packet_generator_.max_packet_length(); |
1146 return stats_; | 1148 return stats_; |
1147 } | 1149 } |
1148 | 1150 |
1149 void QuicConnection::ProcessUdpPacket(const IPEndPoint& self_address, | 1151 void QuicConnection::ProcessUdpPacket(const IPEndPoint& self_address, |
1150 const IPEndPoint& peer_address, | 1152 const IPEndPoint& peer_address, |
1151 const QuicEncryptedPacket& packet) { | 1153 const QuicEncryptedPacket& packet) { |
1152 if (!connected_) { | 1154 if (!connected_) { |
1153 return; | 1155 return; |
1154 } | 1156 } |
1155 if (debug_visitor_.get() != nullptr) { | 1157 if (debug_visitor_ != nullptr) { |
1156 debug_visitor_->OnPacketReceived(self_address, peer_address, packet); | 1158 debug_visitor_->OnPacketReceived(self_address, peer_address, packet); |
1157 } | 1159 } |
1158 last_size_ = packet.length(); | 1160 last_size_ = packet.length(); |
1159 | 1161 |
1160 CheckForAddressMigration(self_address, peer_address); | 1162 CheckForAddressMigration(self_address, peer_address); |
1161 | 1163 |
1162 stats_.bytes_received += packet.length(); | 1164 stats_.bytes_received += packet.length(); |
1163 ++stats_.packets_received; | 1165 ++stats_.packets_received; |
1164 | 1166 |
1165 if (!framer_.ProcessPacket(packet)) { | 1167 if (!framer_.ProcessPacket(packet)) { |
1166 // If we are unable to decrypt this packet, it might be | 1168 // If we are unable to decrypt this packet, it might be |
1167 // because the CHLO or SHLO packet was lost. | 1169 // because the CHLO or SHLO packet was lost. |
1168 if (framer_.error() == QUIC_DECRYPTION_FAILURE) { | 1170 if (framer_.error() == QUIC_DECRYPTION_FAILURE) { |
1169 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && | 1171 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && |
1170 undecryptable_packets_.size() < max_undecryptable_packets_) { | 1172 undecryptable_packets_.size() < max_undecryptable_packets_) { |
1171 QueueUndecryptablePacket(packet); | 1173 QueueUndecryptablePacket(packet); |
1172 } else if (debug_visitor_.get() != nullptr) { | 1174 } else if (debug_visitor_ != nullptr) { |
1173 debug_visitor_->OnUndecryptablePacket(); | 1175 debug_visitor_->OnUndecryptablePacket(); |
1174 } | 1176 } |
1175 } | 1177 } |
1176 DVLOG(1) << ENDPOINT << "Unable to process packet. Last packet processed: " | 1178 DVLOG(1) << ENDPOINT << "Unable to process packet. Last packet processed: " |
1177 << last_header_.packet_sequence_number; | 1179 << last_header_.packet_sequence_number; |
1178 return; | 1180 return; |
1179 } | 1181 } |
1180 | 1182 |
1181 ++stats_.packets_processed; | 1183 ++stats_.packets_processed; |
1182 MaybeProcessUndecryptablePackets(); | 1184 MaybeProcessUndecryptablePackets(); |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 if (!FLAGS_quic_record_send_time_before_write) { | 1472 if (!FLAGS_quic_record_send_time_before_write) { |
1471 packet_send_time = clock_->Now(); | 1473 packet_send_time = clock_->Now(); |
1472 } | 1474 } |
1473 if (!packet_send_time.IsInitialized()) { | 1475 if (!packet_send_time.IsInitialized()) { |
1474 // TODO(jokulik): This is only needed because of the two code paths for | 1476 // TODO(jokulik): This is only needed because of the two code paths for |
1475 // initializing packet_send_time. Once "quic_record_send_time_before_write" | 1477 // initializing packet_send_time. Once "quic_record_send_time_before_write" |
1476 // is deprecated, this check can be removed. | 1478 // is deprecated, this check can be removed. |
1477 LOG(DFATAL) << "The packet send time should never be zero. " | 1479 LOG(DFATAL) << "The packet send time should never be zero. " |
1478 << "This is a programming bug, please report it."; | 1480 << "This is a programming bug, please report it."; |
1479 } | 1481 } |
1480 if (result.status != WRITE_STATUS_ERROR && debug_visitor_.get() != nullptr) { | 1482 if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) { |
1481 // Pass the write result to the visitor. | 1483 // Pass the write result to the visitor. |
1482 debug_visitor_->OnPacketSent(packet->serialized_packet, | 1484 debug_visitor_->OnPacketSent(packet->serialized_packet, |
1483 packet->original_sequence_number, | 1485 packet->original_sequence_number, |
1484 packet->encryption_level, | 1486 packet->encryption_level, |
1485 packet->transmission_type, | 1487 packet->transmission_type, |
1486 *encrypted, | 1488 *encrypted, |
1487 packet_send_time); | 1489 packet_send_time); |
1488 } | 1490 } |
1489 if (packet->transmission_type == NOT_RETRANSMISSION) { | 1491 if (packet->transmission_type == NOT_RETRANSMISSION) { |
1490 time_of_last_sent_new_packet_ = packet_send_time; | 1492 time_of_last_sent_new_packet_ = packet_send_time; |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1756 DVLOG(1) << ENDPOINT << "Processed undecryptable packet!"; | 1758 DVLOG(1) << ENDPOINT << "Processed undecryptable packet!"; |
1757 ++stats_.packets_processed; | 1759 ++stats_.packets_processed; |
1758 delete packet; | 1760 delete packet; |
1759 undecryptable_packets_.pop_front(); | 1761 undecryptable_packets_.pop_front(); |
1760 } | 1762 } |
1761 | 1763 |
1762 // Once forward secure encryption is in use, there will be no | 1764 // Once forward secure encryption is in use, there will be no |
1763 // new keys installed and hence any undecryptable packets will | 1765 // new keys installed and hence any undecryptable packets will |
1764 // never be able to be decrypted. | 1766 // never be able to be decrypted. |
1765 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE) { | 1767 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE) { |
1766 if (debug_visitor_.get() != nullptr) { | 1768 if (debug_visitor_ != nullptr) { |
1767 // TODO(rtenneti): perhaps more efficient to pass the number of | 1769 // TODO(rtenneti): perhaps more efficient to pass the number of |
1768 // undecryptable packets as the argument to OnUndecryptablePacket so that | 1770 // undecryptable packets as the argument to OnUndecryptablePacket so that |
1769 // we just need to call OnUndecryptablePacket once? | 1771 // we just need to call OnUndecryptablePacket once? |
1770 for (size_t i = 0; i < undecryptable_packets_.size(); ++i) { | 1772 for (size_t i = 0; i < undecryptable_packets_.size(); ++i) { |
1771 debug_visitor_->OnUndecryptablePacket(); | 1773 debug_visitor_->OnUndecryptablePacket(); |
1772 } | 1774 } |
1773 } | 1775 } |
1774 STLDeleteElements(&undecryptable_packets_); | 1776 STLDeleteElements(&undecryptable_packets_); |
1775 } | 1777 } |
1776 } | 1778 } |
(...skipping 15 matching lines...) Expand all Loading... |
1792 last_header_.public_header.sequence_number_length; | 1794 last_header_.public_header.sequence_number_length; |
1793 revived_header.fec_flag = false; | 1795 revived_header.fec_flag = false; |
1794 revived_header.is_in_fec_group = NOT_IN_FEC_GROUP; | 1796 revived_header.is_in_fec_group = NOT_IN_FEC_GROUP; |
1795 revived_header.fec_group = 0; | 1797 revived_header.fec_group = 0; |
1796 group_map_.erase(last_header_.fec_group); | 1798 group_map_.erase(last_header_.fec_group); |
1797 last_decrypted_packet_level_ = group->effective_encryption_level(); | 1799 last_decrypted_packet_level_ = group->effective_encryption_level(); |
1798 DCHECK_LT(last_decrypted_packet_level_, NUM_ENCRYPTION_LEVELS); | 1800 DCHECK_LT(last_decrypted_packet_level_, NUM_ENCRYPTION_LEVELS); |
1799 delete group; | 1801 delete group; |
1800 | 1802 |
1801 last_packet_revived_ = true; | 1803 last_packet_revived_ = true; |
1802 if (debug_visitor_.get() != nullptr) { | 1804 if (debug_visitor_ != nullptr) { |
1803 debug_visitor_->OnRevivedPacket(revived_header, | 1805 debug_visitor_->OnRevivedPacket(revived_header, |
1804 StringPiece(revived_payload, len)); | 1806 StringPiece(revived_payload, len)); |
1805 } | 1807 } |
1806 | 1808 |
1807 ++stats_.packets_revived; | 1809 ++stats_.packets_revived; |
1808 framer_.ProcessRevivedPacket(&revived_header, | 1810 framer_.ProcessRevivedPacket(&revived_header, |
1809 StringPiece(revived_payload, len)); | 1811 StringPiece(revived_payload, len)); |
1810 } | 1812 } |
1811 | 1813 |
1812 QuicFecGroup* QuicConnection::GetFecGroup() { | 1814 QuicFecGroup* QuicConnection::GetFecGroup() { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1866 packet_generator_.FlushAllQueuedFrames(); | 1868 packet_generator_.FlushAllQueuedFrames(); |
1867 } | 1869 } |
1868 | 1870 |
1869 void QuicConnection::CloseConnection(QuicErrorCode error, bool from_peer) { | 1871 void QuicConnection::CloseConnection(QuicErrorCode error, bool from_peer) { |
1870 if (!connected_) { | 1872 if (!connected_) { |
1871 DLOG(DFATAL) << "Error: attempt to close an already closed connection" | 1873 DLOG(DFATAL) << "Error: attempt to close an already closed connection" |
1872 << base::debug::StackTrace().ToString(); | 1874 << base::debug::StackTrace().ToString(); |
1873 return; | 1875 return; |
1874 } | 1876 } |
1875 connected_ = false; | 1877 connected_ = false; |
1876 if (debug_visitor_.get() != nullptr) { | 1878 if (debug_visitor_ != nullptr) { |
1877 debug_visitor_->OnConnectionClosed(error, from_peer); | 1879 debug_visitor_->OnConnectionClosed(error, from_peer); |
1878 } | 1880 } |
1879 visitor_->OnConnectionClosed(error, from_peer); | 1881 visitor_->OnConnectionClosed(error, from_peer); |
1880 // Cancel the alarms so they don't trigger any action now that the | 1882 // Cancel the alarms so they don't trigger any action now that the |
1881 // connection is closed. | 1883 // connection is closed. |
1882 ack_alarm_->Cancel(); | 1884 ack_alarm_->Cancel(); |
1883 ping_alarm_->Cancel(); | 1885 ping_alarm_->Cancel(); |
1884 fec_alarm_->Cancel(); | 1886 fec_alarm_->Cancel(); |
1885 resume_writes_alarm_->Cancel(); | 1887 resume_writes_alarm_->Cancel(); |
1886 retransmission_alarm_->Cancel(); | 1888 retransmission_alarm_->Cancel(); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2096 } | 2098 } |
2097 for (const QuicFrame& frame : retransmittable_frames->frames()) { | 2099 for (const QuicFrame& frame : retransmittable_frames->frames()) { |
2098 if (frame.type == CONNECTION_CLOSE_FRAME) { | 2100 if (frame.type == CONNECTION_CLOSE_FRAME) { |
2099 return true; | 2101 return true; |
2100 } | 2102 } |
2101 } | 2103 } |
2102 return false; | 2104 return false; |
2103 } | 2105 } |
2104 | 2106 |
2105 } // namespace net | 2107 } // namespace net |
OLD | NEW |