| 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/core/quic_connection.h" | 5 #include "net/quic/core/quic_connection.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <ostream> | 9 #include <ostream> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 explicit TaggingEncrypter(uint8_t tag) : tag_(tag) {} | 83 explicit TaggingEncrypter(uint8_t tag) : tag_(tag) {} |
| 84 | 84 |
| 85 ~TaggingEncrypter() override {} | 85 ~TaggingEncrypter() override {} |
| 86 | 86 |
| 87 // QuicEncrypter interface. | 87 // QuicEncrypter interface. |
| 88 bool SetKey(StringPiece key) override { return true; } | 88 bool SetKey(StringPiece key) override { return true; } |
| 89 | 89 |
| 90 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 90 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
| 91 | 91 |
| 92 bool EncryptPacket(QuicVersion /*version*/, | 92 bool EncryptPacket(QuicVersion /*version*/, |
| 93 QuicPathId path_id, | |
| 94 QuicPacketNumber packet_number, | 93 QuicPacketNumber packet_number, |
| 95 StringPiece associated_data, | 94 StringPiece associated_data, |
| 96 StringPiece plaintext, | 95 StringPiece plaintext, |
| 97 char* output, | 96 char* output, |
| 98 size_t* output_length, | 97 size_t* output_length, |
| 99 size_t max_output_length) override { | 98 size_t max_output_length) override { |
| 100 const size_t len = plaintext.size() + kTagSize; | 99 const size_t len = plaintext.size() + kTagSize; |
| 101 if (max_output_length < len) { | 100 if (max_output_length < len) { |
| 102 return false; | 101 return false; |
| 103 } | 102 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 bool SetPreliminaryKey(StringPiece key) override { | 147 bool SetPreliminaryKey(StringPiece key) override { |
| 149 QUIC_BUG << "should not be called"; | 148 QUIC_BUG << "should not be called"; |
| 150 return false; | 149 return false; |
| 151 } | 150 } |
| 152 | 151 |
| 153 bool SetDiversificationNonce(const DiversificationNonce& key) override { | 152 bool SetDiversificationNonce(const DiversificationNonce& key) override { |
| 154 return true; | 153 return true; |
| 155 } | 154 } |
| 156 | 155 |
| 157 bool DecryptPacket(QuicVersion /*version*/, | 156 bool DecryptPacket(QuicVersion /*version*/, |
| 158 QuicPathId path_id, | |
| 159 QuicPacketNumber packet_number, | 157 QuicPacketNumber packet_number, |
| 160 StringPiece associated_data, | 158 StringPiece associated_data, |
| 161 StringPiece ciphertext, | 159 StringPiece ciphertext, |
| 162 char* output, | 160 char* output, |
| 163 size_t* output_length, | 161 size_t* output_length, |
| 164 size_t max_output_length) override { | 162 size_t max_output_length) override { |
| 165 if (ciphertext.size() < kTagSize) { | 163 if (ciphertext.size() < kTagSize) { |
| 166 return false; | 164 return false; |
| 167 } | 165 } |
| 168 if (!CheckTag(ciphertext, GetTag(ciphertext))) { | 166 if (!CheckTag(ciphertext, GetTag(ciphertext))) { |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 void SendPacket(EncryptionLevel level, | 490 void SendPacket(EncryptionLevel level, |
| 493 QuicPathId path_id, | 491 QuicPathId path_id, |
| 494 QuicPacketNumber packet_number, | 492 QuicPacketNumber packet_number, |
| 495 QuicPacket* packet, | 493 QuicPacket* packet, |
| 496 HasRetransmittableData retransmittable, | 494 HasRetransmittableData retransmittable, |
| 497 bool has_ack, | 495 bool has_ack, |
| 498 bool has_pending_frames) { | 496 bool has_pending_frames) { |
| 499 char buffer[kMaxPacketSize]; | 497 char buffer[kMaxPacketSize]; |
| 500 size_t encrypted_length = | 498 size_t encrypted_length = |
| 501 QuicConnectionPeer::GetFramer(this)->EncryptPayload( | 499 QuicConnectionPeer::GetFramer(this)->EncryptPayload( |
| 502 ENCRYPTION_NONE, path_id, packet_number, *packet, buffer, | 500 ENCRYPTION_NONE, packet_number, *packet, buffer, kMaxPacketSize); |
| 503 kMaxPacketSize); | |
| 504 delete packet; | 501 delete packet; |
| 505 SerializedPacket serialized_packet( | 502 SerializedPacket serialized_packet( |
| 506 kDefaultPathId, packet_number, PACKET_6BYTE_PACKET_NUMBER, buffer, | 503 kDefaultPathId, packet_number, PACKET_6BYTE_PACKET_NUMBER, buffer, |
| 507 encrypted_length, has_ack, has_pending_frames); | 504 encrypted_length, has_ack, has_pending_frames); |
| 508 if (retransmittable == HAS_RETRANSMITTABLE_DATA) { | 505 if (retransmittable == HAS_RETRANSMITTABLE_DATA) { |
| 509 serialized_packet.retransmittable_frames.push_back( | 506 serialized_packet.retransmittable_frames.push_back( |
| 510 QuicFrame(new QuicStreamFrame())); | 507 QuicFrame(new QuicStreamFrame())); |
| 511 } | 508 } |
| 512 OnSerializedPacket(&serialized_packet); | 509 OnSerializedPacket(&serialized_packet); |
| 513 } | 510 } |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 header.public_header.packet_number_length = packet_number_length_; | 829 header.public_header.packet_number_length = packet_number_length_; |
| 833 header.public_header.connection_id_length = connection_id_length_; | 830 header.public_header.connection_id_length = connection_id_length_; |
| 834 header.public_header.multipath_flag = path_id != kDefaultPathId; | 831 header.public_header.multipath_flag = path_id != kDefaultPathId; |
| 835 header.path_id = path_id; | 832 header.path_id = path_id; |
| 836 header.packet_number = number; | 833 header.packet_number = number; |
| 837 QuicFrames frames; | 834 QuicFrames frames; |
| 838 frames.push_back(frame); | 835 frames.push_back(frame); |
| 839 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); | 836 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); |
| 840 | 837 |
| 841 char buffer[kMaxPacketSize]; | 838 char buffer[kMaxPacketSize]; |
| 842 size_t encrypted_length = framer_.EncryptPayload( | 839 size_t encrypted_length = |
| 843 level, path_id, number, *packet, buffer, kMaxPacketSize); | 840 framer_.EncryptPayload(level, number, *packet, buffer, kMaxPacketSize); |
| 844 connection_.ProcessUdpPacket( | 841 connection_.ProcessUdpPacket( |
| 845 kSelfAddress, kPeerAddress, | 842 kSelfAddress, kPeerAddress, |
| 846 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 843 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 847 return encrypted_length; | 844 return encrypted_length; |
| 848 } | 845 } |
| 849 | 846 |
| 850 size_t ProcessDataPacket(QuicPathId path_id, QuicPacketNumber number) { | 847 size_t ProcessDataPacket(QuicPathId path_id, QuicPacketNumber number) { |
| 851 return ProcessDataPacketAtLevel(path_id, number, false, ENCRYPTION_NONE); | 848 return ProcessDataPacketAtLevel(path_id, number, false, ENCRYPTION_NONE); |
| 852 } | 849 } |
| 853 | 850 |
| 854 size_t ProcessDataPacketAtLevel(QuicPathId path_id, | 851 size_t ProcessDataPacketAtLevel(QuicPathId path_id, |
| 855 QuicPacketNumber number, | 852 QuicPacketNumber number, |
| 856 bool has_stop_waiting, | 853 bool has_stop_waiting, |
| 857 EncryptionLevel level) { | 854 EncryptionLevel level) { |
| 858 std::unique_ptr<QuicPacket> packet( | 855 std::unique_ptr<QuicPacket> packet( |
| 859 ConstructDataPacket(path_id, number, has_stop_waiting)); | 856 ConstructDataPacket(path_id, number, has_stop_waiting)); |
| 860 char buffer[kMaxPacketSize]; | 857 char buffer[kMaxPacketSize]; |
| 861 size_t encrypted_length = peer_framer_.EncryptPayload( | 858 size_t encrypted_length = peer_framer_.EncryptPayload( |
| 862 level, path_id, number, *packet, buffer, kMaxPacketSize); | 859 level, number, *packet, buffer, kMaxPacketSize); |
| 863 connection_.ProcessUdpPacket( | 860 connection_.ProcessUdpPacket( |
| 864 kSelfAddress, kPeerAddress, | 861 kSelfAddress, kPeerAddress, |
| 865 QuicReceivedPacket(buffer, encrypted_length, clock_.Now(), false)); | 862 QuicReceivedPacket(buffer, encrypted_length, clock_.Now(), false)); |
| 866 if (connection_.GetSendAlarm()->IsSet()) { | 863 if (connection_.GetSendAlarm()->IsSet()) { |
| 867 connection_.GetSendAlarm()->Fire(); | 864 connection_.GetSendAlarm()->Fire(); |
| 868 } | 865 } |
| 869 return encrypted_length; | 866 return encrypted_length; |
| 870 } | 867 } |
| 871 | 868 |
| 872 void ProcessClosePacket(QuicPathId path_id, QuicPacketNumber number) { | 869 void ProcessClosePacket(QuicPathId path_id, QuicPacketNumber number) { |
| 873 std::unique_ptr<QuicPacket> packet(ConstructClosePacket(number)); | 870 std::unique_ptr<QuicPacket> packet(ConstructClosePacket(number)); |
| 874 char buffer[kMaxPacketSize]; | 871 char buffer[kMaxPacketSize]; |
| 875 size_t encrypted_length = peer_framer_.EncryptPayload( | 872 size_t encrypted_length = peer_framer_.EncryptPayload( |
| 876 ENCRYPTION_NONE, path_id, number, *packet, buffer, kMaxPacketSize); | 873 ENCRYPTION_NONE, number, *packet, buffer, kMaxPacketSize); |
| 877 connection_.ProcessUdpPacket( | 874 connection_.ProcessUdpPacket( |
| 878 kSelfAddress, kPeerAddress, | 875 kSelfAddress, kPeerAddress, |
| 879 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 876 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 880 } | 877 } |
| 881 | 878 |
| 882 QuicByteCount SendStreamDataToPeer(QuicStreamId id, | 879 QuicByteCount SendStreamDataToPeer(QuicStreamId id, |
| 883 StringPiece data, | 880 StringPiece data, |
| 884 QuicStreamOffset offset, | 881 QuicStreamOffset offset, |
| 885 bool fin, | 882 bool fin, |
| 886 QuicPacketNumber* last_packet) { | 883 QuicPacketNumber* last_packet) { |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1209 header.path_id = kDefaultPathId; | 1206 header.path_id = kDefaultPathId; |
| 1210 header.packet_number = 1; | 1207 header.packet_number = 1; |
| 1211 | 1208 |
| 1212 QuicFrames frames; | 1209 QuicFrames frames; |
| 1213 QuicPaddingFrame padding; | 1210 QuicPaddingFrame padding; |
| 1214 frames.push_back(QuicFrame(&frame1_)); | 1211 frames.push_back(QuicFrame(&frame1_)); |
| 1215 frames.push_back(QuicFrame(padding)); | 1212 frames.push_back(QuicFrame(padding)); |
| 1216 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); | 1213 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); |
| 1217 char buffer[kMaxPacketSize]; | 1214 char buffer[kMaxPacketSize]; |
| 1218 size_t encrypted_length = peer_framer_.EncryptPayload( | 1215 size_t encrypted_length = peer_framer_.EncryptPayload( |
| 1219 ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize); | 1216 ENCRYPTION_NONE, 12, *packet, buffer, kMaxPacketSize); |
| 1220 EXPECT_EQ(kMaxPacketSize, encrypted_length); | 1217 EXPECT_EQ(kMaxPacketSize, encrypted_length); |
| 1221 | 1218 |
| 1222 framer_.set_version(version()); | 1219 framer_.set_version(version()); |
| 1223 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 1220 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
| 1224 connection_.ProcessUdpPacket( | 1221 connection_.ProcessUdpPacket( |
| 1225 kSelfAddress, kPeerAddress, | 1222 kSelfAddress, kPeerAddress, |
| 1226 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 1223 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 1227 | 1224 |
| 1228 EXPECT_EQ(kMaxPacketSize, connection_.max_packet_length()); | 1225 EXPECT_EQ(kMaxPacketSize, connection_.max_packet_length()); |
| 1229 } | 1226 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1243 header.path_id = kDefaultPathId; | 1240 header.path_id = kDefaultPathId; |
| 1244 header.packet_number = 1; | 1241 header.packet_number = 1; |
| 1245 | 1242 |
| 1246 QuicFrames frames; | 1243 QuicFrames frames; |
| 1247 QuicPaddingFrame padding; | 1244 QuicPaddingFrame padding; |
| 1248 frames.push_back(QuicFrame(&frame1_)); | 1245 frames.push_back(QuicFrame(&frame1_)); |
| 1249 frames.push_back(QuicFrame(padding)); | 1246 frames.push_back(QuicFrame(padding)); |
| 1250 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); | 1247 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); |
| 1251 char buffer[kMaxPacketSize]; | 1248 char buffer[kMaxPacketSize]; |
| 1252 size_t encrypted_length = peer_framer_.EncryptPayload( | 1249 size_t encrypted_length = peer_framer_.EncryptPayload( |
| 1253 ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize); | 1250 ENCRYPTION_NONE, 12, *packet, buffer, kMaxPacketSize); |
| 1254 EXPECT_EQ(kMaxPacketSize, encrypted_length); | 1251 EXPECT_EQ(kMaxPacketSize, encrypted_length); |
| 1255 | 1252 |
| 1256 framer_.set_version(version()); | 1253 framer_.set_version(version()); |
| 1257 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 1254 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
| 1258 connection_.ProcessUdpPacket( | 1255 connection_.ProcessUdpPacket( |
| 1259 kSelfAddress, kPeerAddress, | 1256 kSelfAddress, kPeerAddress, |
| 1260 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 1257 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 1261 | 1258 |
| 1262 // Here, the limit imposed by the writer is lower than the size of the packet | 1259 // Here, the limit imposed by the writer is lower than the size of the packet |
| 1263 // received, so the writer max packet size is used. | 1260 // received, so the writer max packet size is used. |
| (...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2035 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2032 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2036 connection_.GetRetransmissionAlarm()->Fire(); | 2033 connection_.GetRetransmissionAlarm()->Fire(); |
| 2037 EXPECT_EQ(1u, writer_->frame_count()); | 2034 EXPECT_EQ(1u, writer_->frame_count()); |
| 2038 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); | 2035 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2039 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); | 2036 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); |
| 2040 } | 2037 } |
| 2041 | 2038 |
| 2042 // Ensure that if the only data in flight is non-retransmittable, the | 2039 // Ensure that if the only data in flight is non-retransmittable, the |
| 2043 // retransmission alarm is not set. | 2040 // retransmission alarm is not set. |
| 2044 TEST_P(QuicConnectionTest, CancelRetransmissionAlarmAfterResetStream) { | 2041 TEST_P(QuicConnectionTest, CancelRetransmissionAlarmAfterResetStream) { |
| 2045 FLAGS_quic_reloadable_flag_quic_more_conservative_retransmission_alarm = true; | |
| 2046 QuicStreamId stream_id = 2; | 2042 QuicStreamId stream_id = 2; |
| 2047 QuicPacketNumber last_data_packet; | 2043 QuicPacketNumber last_data_packet; |
| 2048 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_data_packet); | 2044 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_data_packet); |
| 2049 | 2045 |
| 2050 // Cancel the stream. | 2046 // Cancel the stream. |
| 2051 const QuicPacketNumber rst_packet = last_data_packet + 1; | 2047 const QuicPacketNumber rst_packet = last_data_packet + 1; |
| 2052 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, rst_packet, _, _)).Times(1); | 2048 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, rst_packet, _, _)).Times(1); |
| 2053 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); | 2049 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); |
| 2054 | 2050 |
| 2055 // Ack the RST_STREAM frame (since it's retransmittable), but not the data | 2051 // Ack the RST_STREAM frame (since it's retransmittable), but not the data |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2280 | 2276 |
| 2281 // Ack the sent packet before the callback returns, which happens in | 2277 // Ack the sent packet before the callback returns, which happens in |
| 2282 // rare circumstances with write blocked sockets. | 2278 // rare circumstances with write blocked sockets. |
| 2283 QuicAckFrame ack = InitAckFrame(1); | 2279 QuicAckFrame ack = InitAckFrame(1); |
| 2284 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2280 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2285 ProcessAckPacket(&ack); | 2281 ProcessAckPacket(&ack); |
| 2286 | 2282 |
| 2287 writer_->SetWritable(); | 2283 writer_->SetWritable(); |
| 2288 connection_.OnCanWrite(); | 2284 connection_.OnCanWrite(); |
| 2289 // There is now a pending packet, but with no retransmittable frames. | 2285 // There is now a pending packet, but with no retransmittable frames. |
| 2290 EXPECT_EQ( | 2286 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2291 FLAGS_quic_reloadable_flag_quic_more_conservative_retransmission_alarm, | |
| 2292 !connection_.GetRetransmissionAlarm()->IsSet()); | |
| 2293 EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, | 2287 EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, |
| 2294 ack.path_id, 2)); | 2288 ack.path_id, 2)); |
| 2295 } | 2289 } |
| 2296 | 2290 |
| 2297 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { | 2291 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { |
| 2298 // Block the connection. | 2292 // Block the connection. |
| 2299 BlockOnNextWrite(); | 2293 BlockOnNextWrite(); |
| 2300 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 2294 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); |
| 2301 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 2295 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 2302 EXPECT_TRUE(writer_->IsWriteBlocked()); | 2296 EXPECT_TRUE(writer_->IsWriteBlocked()); |
| (...skipping 1191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3494 EXPECT_EQ(4u, connection_.sent_packet_manager().GetConsecutiveRtoCount()); | 3488 EXPECT_EQ(4u, connection_.sent_packet_manager().GetConsecutiveRtoCount()); |
| 3495 // This time, we should time out. | 3489 // This time, we should time out. |
| 3496 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_TOO_MANY_RTOS, _, | 3490 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_TOO_MANY_RTOS, _, |
| 3497 ConnectionCloseSource::FROM_SELF)); | 3491 ConnectionCloseSource::FROM_SELF)); |
| 3498 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 3492 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 3499 connection_.GetRetransmissionAlarm()->Fire(); | 3493 connection_.GetRetransmissionAlarm()->Fire(); |
| 3500 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); | 3494 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); |
| 3501 EXPECT_FALSE(connection_.connected()); | 3495 EXPECT_FALSE(connection_.connected()); |
| 3502 } | 3496 } |
| 3503 | 3497 |
| 3504 TEST_P(QuicConnectionTest, TimeoutAfter5ServerRTOs) { | |
| 3505 FLAGS_quic_reloadable_flag_quic_only_5rto_client_side = true; | |
| 3506 connection_.SetMaxTailLossProbes(2); | |
| 3507 set_perspective(Perspective::IS_SERVER); | |
| 3508 QuicFramerPeer::SetPerspective(QuicConnectionPeer::GetFramer(&connection_), | |
| 3509 Perspective::IS_SERVER); | |
| 3510 creator_->StopSendingVersion(); | |
| 3511 EXPECT_TRUE(connection_.connected()); | |
| 3512 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
| 3513 QuicConfig config; | |
| 3514 QuicTagVector connection_options; | |
| 3515 connection_options.push_back(k5RTO); | |
| 3516 config.SetConnectionOptionsToSend(connection_options); | |
| 3517 connection_.SetFromConfig(config); | |
| 3518 | |
| 3519 // Send stream data. | |
| 3520 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, kFin, nullptr); | |
| 3521 | |
| 3522 EXPECT_CALL(visitor_, OnPathDegrading()); | |
| 3523 // Fire the retransmission alarm 6 times, twice for TLP and 4 times for RTO. | |
| 3524 for (int i = 0; i < 6; ++i) { | |
| 3525 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | |
| 3526 connection_.GetRetransmissionAlarm()->Fire(); | |
| 3527 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); | |
| 3528 EXPECT_TRUE(connection_.connected()); | |
| 3529 } | |
| 3530 | |
| 3531 EXPECT_EQ(2u, connection_.sent_packet_manager().GetConsecutiveTlpCount()); | |
| 3532 EXPECT_EQ(4u, connection_.sent_packet_manager().GetConsecutiveRtoCount()); | |
| 3533 // The 5th RTO should not time out server side. | |
| 3534 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | |
| 3535 connection_.GetRetransmissionAlarm()->Fire(); | |
| 3536 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); | |
| 3537 EXPECT_TRUE(connection_.connected()); | |
| 3538 } | |
| 3539 | |
| 3540 TEST_P(QuicConnectionTest, SendScheduler) { | 3498 TEST_P(QuicConnectionTest, SendScheduler) { |
| 3541 // Test that if we send a packet without delay, it is not queued. | 3499 // Test that if we send a packet without delay, it is not queued. |
| 3542 QuicPacket* packet = ConstructDataPacket(kDefaultPathId, 1, !kHasStopWaiting); | 3500 QuicPacket* packet = ConstructDataPacket(kDefaultPathId, 1, !kHasStopWaiting); |
| 3543 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 3501 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 3544 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, | 3502 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, |
| 3545 HAS_RETRANSMITTABLE_DATA, false, false); | 3503 HAS_RETRANSMITTABLE_DATA, false, false); |
| 3546 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 3504 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 3547 } | 3505 } |
| 3548 | 3506 |
| 3549 TEST_P(QuicConnectionTest, FailToSendFirstPacket) { | 3507 TEST_P(QuicConnectionTest, FailToSendFirstPacket) { |
| (...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4325 QuicPacketHeader header; | 4283 QuicPacketHeader header; |
| 4326 header.public_header.connection_id = connection_id_; | 4284 header.public_header.connection_id = connection_id_; |
| 4327 header.public_header.version_flag = true; | 4285 header.public_header.version_flag = true; |
| 4328 header.path_id = kDefaultPathId; | 4286 header.path_id = kDefaultPathId; |
| 4329 header.packet_number = 12; | 4287 header.packet_number = 12; |
| 4330 | 4288 |
| 4331 QuicFrames frames; | 4289 QuicFrames frames; |
| 4332 frames.push_back(QuicFrame(&frame1_)); | 4290 frames.push_back(QuicFrame(&frame1_)); |
| 4333 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); | 4291 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); |
| 4334 char buffer[kMaxPacketSize]; | 4292 char buffer[kMaxPacketSize]; |
| 4335 size_t encrypted_length = framer_.EncryptPayload( | 4293 size_t encrypted_length = framer_.EncryptPayload(ENCRYPTION_NONE, 12, *packet, |
| 4336 ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize); | 4294 buffer, kMaxPacketSize); |
| 4337 | 4295 |
| 4338 framer_.set_version(version()); | 4296 framer_.set_version(version()); |
| 4339 connection_.ProcessUdpPacket( | 4297 connection_.ProcessUdpPacket( |
| 4340 kSelfAddress, kPeerAddress, | 4298 kSelfAddress, kPeerAddress, |
| 4341 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 4299 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 4342 EXPECT_TRUE(writer_->version_negotiation_packet() != nullptr); | 4300 EXPECT_TRUE(writer_->version_negotiation_packet() != nullptr); |
| 4343 | 4301 |
| 4344 size_t num_versions = arraysize(kSupportedQuicVersions); | 4302 size_t num_versions = arraysize(kSupportedQuicVersions); |
| 4345 ASSERT_EQ(num_versions, | 4303 ASSERT_EQ(num_versions, |
| 4346 writer_->version_negotiation_packet()->versions.size()); | 4304 writer_->version_negotiation_packet()->versions.size()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 4360 | 4318 |
| 4361 QuicPacketHeader header; | 4319 QuicPacketHeader header; |
| 4362 header.public_header.connection_id = connection_id_; | 4320 header.public_header.connection_id = connection_id_; |
| 4363 header.public_header.version_flag = true; | 4321 header.public_header.version_flag = true; |
| 4364 header.packet_number = 12; | 4322 header.packet_number = 12; |
| 4365 | 4323 |
| 4366 QuicFrames frames; | 4324 QuicFrames frames; |
| 4367 frames.push_back(QuicFrame(&frame1_)); | 4325 frames.push_back(QuicFrame(&frame1_)); |
| 4368 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); | 4326 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); |
| 4369 char buffer[kMaxPacketSize]; | 4327 char buffer[kMaxPacketSize]; |
| 4370 size_t encrypted_length = framer_.EncryptPayload( | 4328 size_t encrypted_length = framer_.EncryptPayload(ENCRYPTION_NONE, 12, *packet, |
| 4371 ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize); | 4329 buffer, kMaxPacketSize); |
| 4372 | 4330 |
| 4373 framer_.set_version(version()); | 4331 framer_.set_version(version()); |
| 4374 BlockOnNextWrite(); | 4332 BlockOnNextWrite(); |
| 4375 connection_.ProcessUdpPacket( | 4333 connection_.ProcessUdpPacket( |
| 4376 kSelfAddress, kPeerAddress, | 4334 kSelfAddress, kPeerAddress, |
| 4377 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 4335 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 4378 EXPECT_EQ(0u, writer_->last_packet_size()); | 4336 EXPECT_EQ(0u, writer_->last_packet_size()); |
| 4379 EXPECT_TRUE(connection_.HasQueuedData()); | 4337 EXPECT_TRUE(connection_.HasQueuedData()); |
| 4380 | 4338 |
| 4381 writer_->SetWritable(); | 4339 writer_->SetWritable(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 4402 | 4360 |
| 4403 QuicPacketHeader header; | 4361 QuicPacketHeader header; |
| 4404 header.public_header.connection_id = connection_id_; | 4362 header.public_header.connection_id = connection_id_; |
| 4405 header.public_header.version_flag = true; | 4363 header.public_header.version_flag = true; |
| 4406 header.packet_number = 12; | 4364 header.packet_number = 12; |
| 4407 | 4365 |
| 4408 QuicFrames frames; | 4366 QuicFrames frames; |
| 4409 frames.push_back(QuicFrame(&frame1_)); | 4367 frames.push_back(QuicFrame(&frame1_)); |
| 4410 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); | 4368 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); |
| 4411 char buffer[kMaxPacketSize]; | 4369 char buffer[kMaxPacketSize]; |
| 4412 size_t encryped_length = framer_.EncryptPayload( | 4370 size_t encryped_length = framer_.EncryptPayload(ENCRYPTION_NONE, 12, *packet, |
| 4413 ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize); | 4371 buffer, kMaxPacketSize); |
| 4414 | 4372 |
| 4415 framer_.set_version(version()); | 4373 framer_.set_version(version()); |
| 4416 set_perspective(Perspective::IS_SERVER); | 4374 set_perspective(Perspective::IS_SERVER); |
| 4417 BlockOnNextWrite(); | 4375 BlockOnNextWrite(); |
| 4418 writer_->set_is_write_blocked_data_buffered(true); | 4376 writer_->set_is_write_blocked_data_buffered(true); |
| 4419 connection_.ProcessUdpPacket( | 4377 connection_.ProcessUdpPacket( |
| 4420 kSelfAddress, kPeerAddress, | 4378 kSelfAddress, kPeerAddress, |
| 4421 QuicReceivedPacket(buffer, encryped_length, QuicTime::Zero(), false)); | 4379 QuicReceivedPacket(buffer, encryped_length, QuicTime::Zero(), false)); |
| 4422 EXPECT_EQ(0u, writer_->last_packet_size()); | 4380 EXPECT_EQ(0u, writer_->last_packet_size()); |
| 4423 EXPECT_FALSE(connection_.HasQueuedData()); | 4381 EXPECT_FALSE(connection_.HasQueuedData()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4441 QuicPacketHeader header; | 4399 QuicPacketHeader header; |
| 4442 header.public_header.connection_id = connection_id_; | 4400 header.public_header.connection_id = connection_id_; |
| 4443 header.path_id = kDefaultPathId; | 4401 header.path_id = kDefaultPathId; |
| 4444 header.packet_number = 12; | 4402 header.packet_number = 12; |
| 4445 header.public_header.version_flag = false; | 4403 header.public_header.version_flag = false; |
| 4446 QuicFrames frames; | 4404 QuicFrames frames; |
| 4447 frames.push_back(QuicFrame(&frame1_)); | 4405 frames.push_back(QuicFrame(&frame1_)); |
| 4448 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); | 4406 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); |
| 4449 char buffer[kMaxPacketSize]; | 4407 char buffer[kMaxPacketSize]; |
| 4450 size_t encrypted_length = peer_framer_.EncryptPayload( | 4408 size_t encrypted_length = peer_framer_.EncryptPayload( |
| 4451 ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize); | 4409 ENCRYPTION_NONE, 12, *packet, buffer, kMaxPacketSize); |
| 4452 ASSERT_NE(0u, encrypted_length); | 4410 ASSERT_NE(0u, encrypted_length); |
| 4453 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 4411 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
| 4454 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4412 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4455 connection_.ProcessUdpPacket( | 4413 connection_.ProcessUdpPacket( |
| 4456 kSelfAddress, kPeerAddress, | 4414 kSelfAddress, kPeerAddress, |
| 4457 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 4415 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 4458 | 4416 |
| 4459 ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket(creator_)); | 4417 ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket(creator_)); |
| 4460 } | 4418 } |
| 4461 | 4419 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4530 QuicConnectionCloseFrame qccf; | 4488 QuicConnectionCloseFrame qccf; |
| 4531 qccf.error_code = QUIC_PEER_GOING_AWAY; | 4489 qccf.error_code = QUIC_PEER_GOING_AWAY; |
| 4532 | 4490 |
| 4533 QuicFrames frames; | 4491 QuicFrames frames; |
| 4534 frames.push_back(QuicFrame(&frame1_)); | 4492 frames.push_back(QuicFrame(&frame1_)); |
| 4535 frames.push_back(QuicFrame(&qccf)); | 4493 frames.push_back(QuicFrame(&qccf)); |
| 4536 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); | 4494 std::unique_ptr<QuicPacket> packet(ConstructPacket(header, frames)); |
| 4537 EXPECT_TRUE(nullptr != packet.get()); | 4495 EXPECT_TRUE(nullptr != packet.get()); |
| 4538 char buffer[kMaxPacketSize]; | 4496 char buffer[kMaxPacketSize]; |
| 4539 size_t encrypted_length = peer_framer_.EncryptPayload( | 4497 size_t encrypted_length = peer_framer_.EncryptPayload( |
| 4540 ENCRYPTION_NONE, kDefaultPathId, 1, *packet, buffer, kMaxPacketSize); | 4498 ENCRYPTION_NONE, 1, *packet, buffer, kMaxPacketSize); |
| 4541 | 4499 |
| 4542 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, _, | 4500 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, _, |
| 4543 ConnectionCloseSource::FROM_PEER)); | 4501 ConnectionCloseSource::FROM_PEER)); |
| 4544 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 4502 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
| 4545 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4503 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4546 | 4504 |
| 4547 connection_.ProcessUdpPacket( | 4505 connection_.ProcessUdpPacket( |
| 4548 kSelfAddress, kPeerAddress, | 4506 kSelfAddress, kPeerAddress, |
| 4549 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 4507 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 4550 } | 4508 } |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5115 error_details, ConnectionCloseSource::FROM_PEER)); | 5073 error_details, ConnectionCloseSource::FROM_PEER)); |
| 5116 connection_.set_perspective(Perspective::IS_CLIENT); | 5074 connection_.set_perspective(Perspective::IS_CLIENT); |
| 5117 connection_.CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, | 5075 connection_.CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, |
| 5118 error_details, | 5076 error_details, |
| 5119 ConnectionCloseBehavior::SILENT_CLOSE); | 5077 ConnectionCloseBehavior::SILENT_CLOSE); |
| 5120 } | 5078 } |
| 5121 | 5079 |
| 5122 } // namespace | 5080 } // namespace |
| 5123 } // namespace test | 5081 } // namespace test |
| 5124 } // namespace net | 5082 } // namespace net |
| OLD | NEW |