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 // The entity that handles framing writes for a Quic client or server. | 5 // The entity that handles framing writes for a Quic client or server. |
6 // Each QuicSession will have a connection associated with it. | 6 // Each QuicSession will have a connection associated with it. |
7 // | 7 // |
8 // On the server side, the Dispatcher handles the raw reads, and hands off | 8 // On the server side, the Dispatcher handles the raw reads, and hands off |
9 // packets via ProcessUdpPacket for framing and processing. | 9 // packets via ProcessUdpPacket for framing and processing. |
10 // | 10 // |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 #include "net/quic/quic_sent_packet_manager.h" | 47 #include "net/quic/quic_sent_packet_manager.h" |
48 #include "net/quic/quic_time.h" | 48 #include "net/quic/quic_time.h" |
49 #include "net/quic/quic_types.h" | 49 #include "net/quic/quic_types.h" |
50 | 50 |
51 namespace net { | 51 namespace net { |
52 | 52 |
53 class QuicClock; | 53 class QuicClock; |
54 class QuicConfig; | 54 class QuicConfig; |
55 class QuicConnection; | 55 class QuicConnection; |
56 class QuicEncrypter; | 56 class QuicEncrypter; |
57 class QuicFecGroup; | |
58 class QuicRandom; | 57 class QuicRandom; |
59 | 58 |
60 namespace test { | 59 namespace test { |
61 class PacketSavingConnection; | 60 class PacketSavingConnection; |
62 class QuicConnectionPeer; | 61 class QuicConnectionPeer; |
63 } // namespace test | 62 } // namespace test |
64 | 63 |
65 // The initial number of packets between MTU probes. After each attempt the | 64 // The initial number of packets between MTU probes. After each attempt the |
66 // number is doubled. | 65 // number is doubled. |
67 const QuicPacketCount kPacketsBetweenMtuProbesBase = 100; | 66 const QuicPacketCount kPacketsBetweenMtuProbesBase = 100; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 // Called when a PathCloseFrame has been parsed. | 226 // Called when a PathCloseFrame has been parsed. |
228 virtual void OnPathCloseFrame(const QuicPathCloseFrame& frame) {} | 227 virtual void OnPathCloseFrame(const QuicPathCloseFrame& frame) {} |
229 | 228 |
230 // Called when a public reset packet has been received. | 229 // Called when a public reset packet has been received. |
231 virtual void OnPublicResetPacket(const QuicPublicResetPacket& packet) {} | 230 virtual void OnPublicResetPacket(const QuicPublicResetPacket& packet) {} |
232 | 231 |
233 // Called when a version negotiation packet has been received. | 232 // Called when a version negotiation packet has been received. |
234 virtual void OnVersionNegotiationPacket( | 233 virtual void OnVersionNegotiationPacket( |
235 const QuicVersionNegotiationPacket& packet) {} | 234 const QuicVersionNegotiationPacket& packet) {} |
236 | 235 |
237 // Called after a packet has been successfully parsed which results | |
238 // in the revival of a packet via FEC. | |
239 virtual void OnRevivedPacket(const QuicPacketHeader& revived_header, | |
240 base::StringPiece payload) {} | |
241 | |
242 // Called when the connection is closed. | 236 // Called when the connection is closed. |
243 virtual void OnConnectionClosed(QuicErrorCode error, | 237 virtual void OnConnectionClosed(QuicErrorCode error, |
244 ConnectionCloseSource source) {} | 238 ConnectionCloseSource source) {} |
245 | 239 |
246 // Called when the version negotiation is successful. | 240 // Called when the version negotiation is successful. |
247 virtual void OnSuccessfulVersionNegotiation(const QuicVersion& version) {} | 241 virtual void OnSuccessfulVersionNegotiation(const QuicVersion& version) {} |
248 | 242 |
249 // Called when a CachedNetworkParameters is sent to the client. | 243 // Called when a CachedNetworkParameters is sent to the client. |
250 virtual void OnSendConnectionState( | 244 virtual void OnSendConnectionState( |
251 const CachedNetworkParameters& cached_network_params) {} | 245 const CachedNetworkParameters& cached_network_params) {} |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 | 377 |
384 // Sends a GOAWAY frame. Does nothing if a GOAWAY frame has already been sent. | 378 // Sends a GOAWAY frame. Does nothing if a GOAWAY frame has already been sent. |
385 virtual void SendGoAway(QuicErrorCode error, | 379 virtual void SendGoAway(QuicErrorCode error, |
386 QuicStreamId last_good_stream_id, | 380 QuicStreamId last_good_stream_id, |
387 const std::string& reason); | 381 const std::string& reason); |
388 | 382 |
389 // Returns statistics tracked for this connection. | 383 // Returns statistics tracked for this connection. |
390 const QuicConnectionStats& GetStats(); | 384 const QuicConnectionStats& GetStats(); |
391 | 385 |
392 // Processes an incoming UDP packet (consisting of a QuicEncryptedPacket) from | 386 // Processes an incoming UDP packet (consisting of a QuicEncryptedPacket) from |
393 // the peer. If processing this packet permits a packet to be revived from | 387 // the peer. |
394 // its FEC group that packet will be revived and processed. | |
395 // In a client, the packet may be "stray" and have a different connection ID | 388 // In a client, the packet may be "stray" and have a different connection ID |
396 // than that of this connection. | 389 // than that of this connection. |
397 virtual void ProcessUdpPacket(const IPEndPoint& self_address, | 390 virtual void ProcessUdpPacket(const IPEndPoint& self_address, |
398 const IPEndPoint& peer_address, | 391 const IPEndPoint& peer_address, |
399 const QuicEncryptedPacket& packet); | 392 const QuicEncryptedPacket& packet); |
400 | 393 |
401 // QuicBlockedWriterInterface | 394 // QuicBlockedWriterInterface |
402 // Called when the underlying connection becomes writable to allow queued | 395 // Called when the underlying connection becomes writable to allow queued |
403 // writes to happen. | 396 // writes to happen. |
404 void OnCanWrite() override; | 397 void OnCanWrite() override; |
(...skipping 30 matching lines...) Expand all Loading... |
435 return framer_.supported_versions(); | 428 return framer_.supported_versions(); |
436 } | 429 } |
437 | 430 |
438 // From QuicFramerVisitorInterface | 431 // From QuicFramerVisitorInterface |
439 void OnError(QuicFramer* framer) override; | 432 void OnError(QuicFramer* framer) override; |
440 bool OnProtocolVersionMismatch(QuicVersion received_version) override; | 433 bool OnProtocolVersionMismatch(QuicVersion received_version) override; |
441 void OnPacket() override; | 434 void OnPacket() override; |
442 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override; | 435 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override; |
443 void OnVersionNegotiationPacket( | 436 void OnVersionNegotiationPacket( |
444 const QuicVersionNegotiationPacket& packet) override; | 437 const QuicVersionNegotiationPacket& packet) override; |
445 void OnRevivedPacket() override; | |
446 bool OnUnauthenticatedPublicHeader( | 438 bool OnUnauthenticatedPublicHeader( |
447 const QuicPacketPublicHeader& header) override; | 439 const QuicPacketPublicHeader& header) override; |
448 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override; | 440 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override; |
449 void OnDecryptedPacket(EncryptionLevel level) override; | 441 void OnDecryptedPacket(EncryptionLevel level) override; |
450 bool OnPacketHeader(const QuicPacketHeader& header) override; | 442 bool OnPacketHeader(const QuicPacketHeader& header) override; |
451 void OnFecProtectedPayload(base::StringPiece payload) override; | |
452 bool OnStreamFrame(const QuicStreamFrame& frame) override; | 443 bool OnStreamFrame(const QuicStreamFrame& frame) override; |
453 bool OnAckFrame(const QuicAckFrame& frame) override; | 444 bool OnAckFrame(const QuicAckFrame& frame) override; |
454 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override; | 445 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override; |
455 bool OnPingFrame(const QuicPingFrame& frame) override; | 446 bool OnPingFrame(const QuicPingFrame& frame) override; |
456 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override; | 447 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override; |
457 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override; | 448 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override; |
458 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override; | 449 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override; |
459 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override; | 450 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override; |
460 bool OnBlockedFrame(const QuicBlockedFrame& frame) override; | 451 bool OnBlockedFrame(const QuicBlockedFrame& frame) override; |
461 bool OnPathCloseFrame(const QuicPathCloseFrame& frame) override; | 452 bool OnPathCloseFrame(const QuicPathCloseFrame& frame) override; |
462 void OnFecData(base::StringPiece redundnancy) override; | |
463 void OnPacketComplete() override; | 453 void OnPacketComplete() override; |
464 | 454 |
465 // QuicPacketGenerator::DelegateInterface | 455 // QuicPacketGenerator::DelegateInterface |
466 bool ShouldGeneratePacket(HasRetransmittableData retransmittable, | 456 bool ShouldGeneratePacket(HasRetransmittableData retransmittable, |
467 IsHandshake handshake) override; | 457 IsHandshake handshake) override; |
468 void PopulateAckFrame(QuicAckFrame* ack) override; | 458 void PopulateAckFrame(QuicAckFrame* ack) override; |
469 void PopulateStopWaitingFrame(QuicStopWaitingFrame* stop_waiting) override; | 459 void PopulateStopWaitingFrame(QuicStopWaitingFrame* stop_waiting) override; |
470 | 460 |
471 // QuicPacketCreator::DelegateInterface | 461 // QuicPacketCreator::DelegateInterface |
472 void OnSerializedPacket(SerializedPacket* packet) override; | 462 void OnSerializedPacket(SerializedPacket* packet) override; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 bool goaway_sent() const { return goaway_sent_; } | 500 bool goaway_sent() const { return goaway_sent_; } |
511 | 501 |
512 bool goaway_received() const { return goaway_received_; } | 502 bool goaway_received() const { return goaway_received_; } |
513 | 503 |
514 // Must only be called on client connections. | 504 // Must only be called on client connections. |
515 const QuicVersionVector& server_supported_versions() const { | 505 const QuicVersionVector& server_supported_versions() const { |
516 DCHECK_EQ(Perspective::IS_CLIENT, perspective_); | 506 DCHECK_EQ(Perspective::IS_CLIENT, perspective_); |
517 return server_supported_versions_; | 507 return server_supported_versions_; |
518 } | 508 } |
519 | 509 |
520 size_t NumFecGroups() const { return group_map_.size(); } | |
521 | |
522 // Testing only. | 510 // Testing only. |
523 size_t NumQueuedPackets() const { return queued_packets_.size(); } | 511 size_t NumQueuedPackets() const { return queued_packets_.size(); } |
524 | 512 |
525 // Once called, any sent crypto packets to be saved as the | 513 // Once called, any sent crypto packets to be saved as the |
526 // termination packet, for use with stateless rejections. | 514 // termination packet, for use with stateless rejections. |
527 void EnableSavingCryptoPackets(); | 515 void EnableSavingCryptoPackets(); |
528 | 516 |
529 // Returns true if the underlying UDP socket is writable, there is | 517 // Returns true if the underlying UDP socket is writable, there is |
530 // no queued data and the connection is not congestion-control | 518 // no queued data and the connection is not congestion-control |
531 // blocked. | 519 // blocked. |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 // sent immediately after receiving an ACK. | 701 // sent immediately after receiving an ACK. |
714 void set_defer_send_in_response_to_packets(bool defer) { | 702 void set_defer_send_in_response_to_packets(bool defer) { |
715 defer_send_in_response_to_packets_ = defer; | 703 defer_send_in_response_to_packets_ = defer; |
716 } | 704 } |
717 | 705 |
718 private: | 706 private: |
719 friend class test::QuicConnectionPeer; | 707 friend class test::QuicConnectionPeer; |
720 friend class test::PacketSavingConnection; | 708 friend class test::PacketSavingConnection; |
721 | 709 |
722 typedef std::list<SerializedPacket> QueuedPacketList; | 710 typedef std::list<SerializedPacket> QueuedPacketList; |
723 typedef std::map<QuicFecGroupNumber, QuicFecGroup*> FecGroupMap; | |
724 | 711 |
725 // Writes the given packet to socket, encrypted with packet's | 712 // Writes the given packet to socket, encrypted with packet's |
726 // encryption_level. Returns true on successful write, and false if the writer | 713 // encryption_level. Returns true on successful write, and false if the writer |
727 // was blocked and the write needs to be tried again. Notifies the | 714 // was blocked and the write needs to be tried again. Notifies the |
728 // SentPacketManager when the write is successful and sets | 715 // SentPacketManager when the write is successful and sets |
729 // retransmittable frames to nullptr. | 716 // retransmittable frames to nullptr. |
730 // Saves the connection close packet for later transmission, even if the | 717 // Saves the connection close packet for later transmission, even if the |
731 // writer is write blocked. | 718 // writer is write blocked. |
732 bool WritePacket(SerializedPacket* packet); | 719 bool WritePacket(SerializedPacket* packet); |
733 | 720 |
(...skipping 30 matching lines...) Expand all Loading... |
764 // Returns true if the packet should be discarded and not sent. | 751 // Returns true if the packet should be discarded and not sent. |
765 bool ShouldDiscardPacket(const SerializedPacket& packet); | 752 bool ShouldDiscardPacket(const SerializedPacket& packet); |
766 | 753 |
767 // Queues |packet| in the hopes that it can be decrypted in the | 754 // Queues |packet| in the hopes that it can be decrypted in the |
768 // future, when a new key is installed. | 755 // future, when a new key is installed. |
769 void QueueUndecryptablePacket(const QuicEncryptedPacket& packet); | 756 void QueueUndecryptablePacket(const QuicEncryptedPacket& packet); |
770 | 757 |
771 // Attempts to process any queued undecryptable packets. | 758 // Attempts to process any queued undecryptable packets. |
772 void MaybeProcessUndecryptablePackets(); | 759 void MaybeProcessUndecryptablePackets(); |
773 | 760 |
774 // If a packet can be revived from the current FEC group, then | |
775 // revive and process the packet. | |
776 void MaybeProcessRevivedPacket(); | |
777 | |
778 void ProcessAckFrame(const QuicAckFrame& incoming_ack); | 761 void ProcessAckFrame(const QuicAckFrame& incoming_ack); |
779 | 762 |
780 void ProcessStopWaitingFrame(const QuicStopWaitingFrame& stop_waiting); | 763 void ProcessStopWaitingFrame(const QuicStopWaitingFrame& stop_waiting); |
781 | 764 |
782 // Sends any packets which are a response to the last packet, including both | 765 // Sends any packets which are a response to the last packet, including both |
783 // acks and pending writes if an ack opened the congestion window. | 766 // acks and pending writes if an ack opened the congestion window. |
784 void MaybeSendInResponseToPacket(); | 767 void MaybeSendInResponseToPacket(); |
785 | 768 |
786 // Queue an ack or set the ack alarm if needed. |was_missing| is true if | 769 // Queue an ack or set the ack alarm if needed. |was_missing| is true if |
787 // the most recently received packet was formerly missing. | 770 // the most recently received packet was formerly missing. |
788 void MaybeQueueAck(bool was_missing); | 771 void MaybeQueueAck(bool was_missing); |
789 | 772 |
790 // Gets the least unacked packet number, which is the next packet number | 773 // Gets the least unacked packet number, which is the next packet number |
791 // to be sent if there are no outstanding packets. | 774 // to be sent if there are no outstanding packets. |
792 QuicPacketNumber GetLeastUnacked() const; | 775 QuicPacketNumber GetLeastUnacked() const; |
793 | 776 |
794 // Get the FEC group associate with the last processed packet or nullptr, if | |
795 // the group has already been deleted. | |
796 QuicFecGroup* GetFecGroup(); | |
797 | |
798 // Closes any FEC groups protecting packets before |packet_number|. | |
799 void CloseFecGroupsBefore(QuicPacketNumber packet_number); | |
800 | |
801 // Sets the timeout alarm to the appropriate value, if any. | 777 // Sets the timeout alarm to the appropriate value, if any. |
802 void SetTimeoutAlarm(); | 778 void SetTimeoutAlarm(); |
803 | 779 |
804 // Sets the ping alarm to the appropriate value, if any. | 780 // Sets the ping alarm to the appropriate value, if any. |
805 void SetPingAlarm(); | 781 void SetPingAlarm(); |
806 | 782 |
807 // Sets the retransmission alarm based on SentPacketManager. | 783 // Sets the retransmission alarm based on SentPacketManager. |
808 void SetRetransmissionAlarm(); | 784 void SetRetransmissionAlarm(); |
809 | 785 |
810 // Sets the MTU discovery alarm if necessary. | 786 // Sets the MTU discovery alarm if necessary. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 IPEndPoint peer_address_; | 838 IPEndPoint peer_address_; |
863 | 839 |
864 // Used to store latest peer IP address for IP address migration. | 840 // Used to store latest peer IP address for IP address migration. |
865 IPAddress migrating_peer_ip_; | 841 IPAddress migrating_peer_ip_; |
866 // Used to store latest peer port to possibly migrate to later. | 842 // Used to store latest peer port to possibly migrate to later. |
867 uint16_t migrating_peer_port_; | 843 uint16_t migrating_peer_port_; |
868 | 844 |
869 // True if the last packet has gotten far enough in the framer to be | 845 // True if the last packet has gotten far enough in the framer to be |
870 // decrypted. | 846 // decrypted. |
871 bool last_packet_decrypted_; | 847 bool last_packet_decrypted_; |
872 bool last_packet_revived_; // True if the last packet was revived from FEC. | |
873 QuicByteCount last_size_; // Size of the last received packet. | 848 QuicByteCount last_size_; // Size of the last received packet. |
874 EncryptionLevel last_decrypted_packet_level_; | 849 EncryptionLevel last_decrypted_packet_level_; |
875 QuicPacketHeader last_header_; | 850 QuicPacketHeader last_header_; |
876 QuicStopWaitingFrame last_stop_waiting_frame_; | 851 QuicStopWaitingFrame last_stop_waiting_frame_; |
877 bool should_last_packet_instigate_acks_; | 852 bool should_last_packet_instigate_acks_; |
878 | 853 |
879 // Track some peer state so we can do less bookkeeping | 854 // Track some peer state so we can do less bookkeeping |
880 // Largest sequence sent by the peer which had an ack frame (latest ack info). | 855 // Largest sequence sent by the peer which had an ack frame (latest ack info). |
881 QuicPacketNumber largest_seen_packet_with_ack_; | 856 QuicPacketNumber largest_seen_packet_with_ack_; |
882 | 857 |
(...skipping 24 matching lines...) Expand all Loading... |
907 bool save_crypto_packets_as_termination_packets_; | 882 bool save_crypto_packets_as_termination_packets_; |
908 | 883 |
909 // Contains the connection close packets if the connection has been closed. | 884 // Contains the connection close packets if the connection has been closed. |
910 scoped_ptr<std::vector<QuicEncryptedPacket*>> termination_packets_; | 885 scoped_ptr<std::vector<QuicEncryptedPacket*>> termination_packets_; |
911 | 886 |
912 // When true, the connection does not send a close packet on idle timeout due | 887 // When true, the connection does not send a close packet on idle timeout due |
913 // to lack of network activity. | 888 // to lack of network activity. |
914 // This is particularly important on mobile, where connections are short. | 889 // This is particularly important on mobile, where connections are short. |
915 bool silent_close_enabled_; | 890 bool silent_close_enabled_; |
916 | 891 |
917 FecGroupMap group_map_; | |
918 | |
919 QuicReceivedPacketManager received_packet_manager_; | 892 QuicReceivedPacketManager received_packet_manager_; |
920 QuicSentEntropyManager sent_entropy_manager_; | 893 QuicSentEntropyManager sent_entropy_manager_; |
921 | 894 |
922 // Indicates whether an ack should be sent the next time we try to write. | 895 // Indicates whether an ack should be sent the next time we try to write. |
923 bool ack_queued_; | 896 bool ack_queued_; |
924 // How many retransmittable packets have arrived without sending an ack. | 897 // How many retransmittable packets have arrived without sending an ack. |
925 QuicPacketCount num_retransmittable_packets_received_since_last_ack_sent_; | 898 QuicPacketCount num_retransmittable_packets_received_since_last_ack_sent_; |
926 // Whether there were missing packets in the last sent ack. | 899 // Whether there were missing packets in the last sent ack. |
927 bool last_ack_had_missing_packets_; | 900 bool last_ack_had_missing_packets_; |
928 // How many consecutive packets have arrived without sending an ack. | 901 // How many consecutive packets have arrived without sending an ack. |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 | 1033 |
1061 // If true, multipath is enabled for this connection. | 1034 // If true, multipath is enabled for this connection. |
1062 bool multipath_enabled_; | 1035 bool multipath_enabled_; |
1063 | 1036 |
1064 DISALLOW_COPY_AND_ASSIGN(QuicConnection); | 1037 DISALLOW_COPY_AND_ASSIGN(QuicConnection); |
1065 }; | 1038 }; |
1066 | 1039 |
1067 } // namespace net | 1040 } // namespace net |
1068 | 1041 |
1069 #endif // NET_QUIC_QUIC_CONNECTION_H_ | 1042 #endif // NET_QUIC_QUIC_CONNECTION_H_ |
OLD | NEW |