OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 1966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1977 } | 1977 } |
1978 | 1978 |
1979 void OnSelectedCandidatePairChanged( | 1979 void OnSelectedCandidatePairChanged( |
1980 cricket::TransportChannel* transport_channel, | 1980 cricket::TransportChannel* transport_channel, |
1981 cricket::CandidatePairInterface* selected_candidate_pair, | 1981 cricket::CandidatePairInterface* selected_candidate_pair, |
1982 int last_sent_packet_id) { | 1982 int last_sent_packet_id) { |
1983 last_selected_candidate_pair_ = selected_candidate_pair; | 1983 last_selected_candidate_pair_ = selected_candidate_pair; |
1984 last_sent_packet_id_ = last_sent_packet_id; | 1984 last_sent_packet_id_ = last_sent_packet_id; |
1985 } | 1985 } |
1986 | 1986 |
| 1987 void ReceivePingOnConnection(cricket::Connection* conn, |
| 1988 const std::string& remote_ufrag, |
| 1989 int priority) { |
| 1990 cricket::IceMessage msg; |
| 1991 msg.SetType(cricket::STUN_BINDING_REQUEST); |
| 1992 msg.AddAttribute(new cricket::StunByteStringAttribute( |
| 1993 cricket::STUN_ATTR_USERNAME, |
| 1994 conn->local_candidate().username() + ":" + remote_ufrag)); |
| 1995 msg.AddAttribute(new cricket::StunUInt32Attribute( |
| 1996 cricket::STUN_ATTR_PRIORITY, priority)); |
| 1997 msg.SetTransactionID( |
| 1998 rtc::CreateRandomString(cricket::kStunTransactionIdLength)); |
| 1999 msg.AddMessageIntegrity(conn->local_candidate().password()); |
| 2000 msg.AddFingerprint(); |
| 2001 rtc::ByteBufferWriter buf; |
| 2002 msg.Write(&buf); |
| 2003 conn->OnReadPacket(buf.Data(), buf.Length(), rtc::CreatePacketTime(0)); |
| 2004 } |
| 2005 |
1987 void OnReadyToSend(cricket::TransportChannel* channel) { | 2006 void OnReadyToSend(cricket::TransportChannel* channel) { |
1988 channel_ready_to_send_ = true; | 2007 channel_ready_to_send_ = true; |
1989 } | 2008 } |
1990 void OnChannelStateChanged(cricket::TransportChannelImpl* channel) { | 2009 void OnChannelStateChanged(cricket::TransportChannelImpl* channel) { |
1991 channel_state_ = channel->GetState(); | 2010 channel_state_ = channel->GetState(); |
1992 } | 2011 } |
1993 | 2012 |
1994 cricket::CandidatePairInterface* last_selected_candidate_pair() { | 2013 cricket::CandidatePairInterface* last_selected_candidate_pair() { |
1995 return last_selected_candidate_pair_; | 2014 return last_selected_candidate_pair_; |
1996 } | 2015 } |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2446 EXPECT_EQ(conn3, ch.best_connection()); | 2465 EXPECT_EQ(conn3, ch.best_connection()); |
2447 | 2466 |
2448 // Now another data packet will not switch the best connection because the | 2467 // Now another data packet will not switch the best connection because the |
2449 // best connection was nominated by the controlling side. | 2468 // best connection was nominated by the controlling side. |
2450 conn2->ReceivedPing(); | 2469 conn2->ReceivedPing(); |
2451 conn2->ReceivedPingResponse(); | 2470 conn2->ReceivedPingResponse(); |
2452 conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 2471 conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); |
2453 EXPECT_EQ(conn3, ch.best_connection()); | 2472 EXPECT_EQ(conn3, ch.best_connection()); |
2454 } | 2473 } |
2455 | 2474 |
| 2475 // Test that if a new remote candidate has the same address and port with |
| 2476 // an old one, it will be used to create a new connection. |
| 2477 TEST_F(P2PTransportChannelPingTest, TestAddRemoteCandidateWithAddressReuse) { |
| 2478 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
| 2479 cricket::P2PTransportChannel ch("candidate reuse", 1, &pa); |
| 2480 PrepareChannel(&ch); |
| 2481 ch.Connect(); |
| 2482 ch.MaybeStartGathering(); |
| 2483 const std::string host_address = "1.1.1.1"; |
| 2484 const int port_num = 1; |
| 2485 |
| 2486 // kIceUfrag[1] is the current generation ufrag. |
| 2487 cricket::Candidate candidate = |
| 2488 CreateHostCandidate(host_address, port_num, 1, kIceUfrag[1]); |
| 2489 ch.AddRemoteCandidate(candidate); |
| 2490 cricket::Connection* conn1 = WaitForConnectionTo(&ch, host_address, port_num); |
| 2491 ASSERT_TRUE(conn1 != nullptr); |
| 2492 EXPECT_EQ(0u, conn1->remote_candidate().generation()); |
| 2493 |
| 2494 // Simply adding the same candidate again won't create a new connection. |
| 2495 ch.AddRemoteCandidate(candidate); |
| 2496 cricket::Connection* conn2 = GetConnectionTo(&ch, host_address, port_num); |
| 2497 EXPECT_EQ(conn1, conn2); |
| 2498 |
| 2499 // Update the ufrag of the candidate and add it again. |
| 2500 candidate.set_username(kIceUfrag[2]); |
| 2501 ch.AddRemoteCandidate(candidate); |
| 2502 conn2 = GetConnectionTo(&ch, host_address, port_num); |
| 2503 EXPECT_NE(conn1, conn2); |
| 2504 EXPECT_EQ(kIceUfrag[2], conn2->remote_candidate().username()); |
| 2505 EXPECT_EQ(1u, conn2->remote_candidate().generation()); |
| 2506 |
| 2507 // Verify that a ping with the new ufrag can be received on the new |
| 2508 // connection. |
| 2509 EXPECT_EQ(0, conn2->last_ping_received()); |
| 2510 ReceivePingOnConnection(conn2, kIceUfrag[2], 1 /* priority */); |
| 2511 EXPECT_TRUE(conn2->last_ping_received() > 0); |
| 2512 } |
| 2513 |
2456 // When the current best connection is strong, lower-priority connections will | 2514 // When the current best connection is strong, lower-priority connections will |
2457 // be pruned. Otherwise, lower-priority connections are kept. | 2515 // be pruned. Otherwise, lower-priority connections are kept. |
2458 TEST_F(P2PTransportChannelPingTest, TestDontPruneWhenWeak) { | 2516 TEST_F(P2PTransportChannelPingTest, TestDontPruneWhenWeak) { |
2459 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 2517 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
2460 cricket::P2PTransportChannel ch("test channel", 1, &pa); | 2518 cricket::P2PTransportChannel ch("test channel", 1, &pa); |
2461 PrepareChannel(&ch); | 2519 PrepareChannel(&ch); |
2462 ch.SetIceRole(cricket::ICEROLE_CONTROLLED); | 2520 ch.SetIceRole(cricket::ICEROLE_CONTROLLED); |
2463 ch.Connect(); | 2521 ch.Connect(); |
2464 ch.MaybeStartGathering(); | 2522 ch.MaybeStartGathering(); |
2465 ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1)); | 2523 ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1)); |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2857 | 2915 |
2858 // TCP Relay/Relay is the next. | 2916 // TCP Relay/Relay is the next. |
2859 VerifyNextPingableConnection(cricket::RELAY_PORT_TYPE, | 2917 VerifyNextPingableConnection(cricket::RELAY_PORT_TYPE, |
2860 cricket::RELAY_PORT_TYPE, | 2918 cricket::RELAY_PORT_TYPE, |
2861 cricket::TCP_PROTOCOL_NAME); | 2919 cricket::TCP_PROTOCOL_NAME); |
2862 | 2920 |
2863 // Finally, Local/Relay will be pinged. | 2921 // Finally, Local/Relay will be pinged. |
2864 VerifyNextPingableConnection(cricket::LOCAL_PORT_TYPE, | 2922 VerifyNextPingableConnection(cricket::LOCAL_PORT_TYPE, |
2865 cricket::RELAY_PORT_TYPE); | 2923 cricket::RELAY_PORT_TYPE); |
2866 } | 2924 } |
OLD | NEW |