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 |
11 #include <algorithm> | 11 #include <algorithm> |
12 #include <memory> | 12 #include <memory> |
13 | 13 |
14 #include "webrtc/api/fakemetricsobserver.h" | 14 #include "webrtc/api/fakemetricsobserver.h" |
15 #include "webrtc/base/checks.h" | 15 #include "webrtc/base/checks.h" |
16 #include "webrtc/base/dscp.h" | 16 #include "webrtc/base/dscp.h" |
17 #include "webrtc/base/fakeclock.h" | 17 #include "webrtc/base/fakeclock.h" |
18 #include "webrtc/base/fakenetwork.h" | 18 #include "webrtc/base/fakenetwork.h" |
19 #include "webrtc/base/firewallsocketserver.h" | 19 #include "webrtc/base/firewallsocketserver.h" |
20 #include "webrtc/base/gunit.h" | 20 #include "webrtc/base/gunit.h" |
21 #include "webrtc/base/helpers.h" | 21 #include "webrtc/base/helpers.h" |
22 #include "webrtc/base/logging.h" | 22 #include "webrtc/base/logging.h" |
23 #include "webrtc/base/natserver.h" | 23 #include "webrtc/base/natserver.h" |
24 #include "webrtc/base/natsocketfactory.h" | 24 #include "webrtc/base/natsocketfactory.h" |
25 #include "webrtc/base/physicalsocketserver.h" | 25 #include "webrtc/base/physicalsocketserver.h" |
| 26 #include "webrtc/base/ptr_util.h" |
26 #include "webrtc/base/socketaddress.h" | 27 #include "webrtc/base/socketaddress.h" |
27 #include "webrtc/base/ssladapter.h" | 28 #include "webrtc/base/ssladapter.h" |
28 #include "webrtc/base/thread.h" | 29 #include "webrtc/base/thread.h" |
29 #include "webrtc/base/virtualsocketserver.h" | 30 #include "webrtc/base/virtualsocketserver.h" |
| 31 #include "webrtc/p2p/base/fakeportallocator.h" |
30 #include "webrtc/p2p/base/icetransportinternal.h" | 32 #include "webrtc/p2p/base/icetransportinternal.h" |
31 #include "webrtc/p2p/base/fakeportallocator.h" | |
32 #include "webrtc/p2p/base/p2ptransportchannel.h" | 33 #include "webrtc/p2p/base/p2ptransportchannel.h" |
33 #include "webrtc/p2p/base/packettransportinternal.h" | 34 #include "webrtc/p2p/base/packettransportinternal.h" |
34 #include "webrtc/p2p/base/testrelayserver.h" | 35 #include "webrtc/p2p/base/testrelayserver.h" |
35 #include "webrtc/p2p/base/teststunserver.h" | 36 #include "webrtc/p2p/base/teststunserver.h" |
36 #include "webrtc/p2p/base/testturnserver.h" | 37 #include "webrtc/p2p/base/testturnserver.h" |
37 #include "webrtc/p2p/client/basicportallocator.h" | 38 #include "webrtc/p2p/client/basicportallocator.h" |
38 | 39 |
39 namespace { | 40 namespace { |
40 | 41 |
41 using rtc::SocketAddress; | 42 using rtc::SocketAddress; |
(...skipping 2928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2970 last_sent_packet_id_ = last_sent_packet_id; | 2971 last_sent_packet_id_ = last_sent_packet_id; |
2971 ++selected_candidate_pair_switches_; | 2972 ++selected_candidate_pair_switches_; |
2972 } | 2973 } |
2973 | 2974 |
2974 void ReceivePingOnConnection(Connection* conn, | 2975 void ReceivePingOnConnection(Connection* conn, |
2975 const std::string& remote_ufrag, | 2976 const std::string& remote_ufrag, |
2976 int priority, | 2977 int priority, |
2977 uint32_t nomination = 0) { | 2978 uint32_t nomination = 0) { |
2978 IceMessage msg; | 2979 IceMessage msg; |
2979 msg.SetType(STUN_BINDING_REQUEST); | 2980 msg.SetType(STUN_BINDING_REQUEST); |
2980 msg.AddAttribute(new StunByteStringAttribute( | 2981 msg.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>( |
2981 STUN_ATTR_USERNAME, | 2982 STUN_ATTR_USERNAME, |
2982 conn->local_candidate().username() + ":" + remote_ufrag)); | 2983 conn->local_candidate().username() + ":" + remote_ufrag)); |
2983 msg.AddAttribute(new StunUInt32Attribute(STUN_ATTR_PRIORITY, priority)); | 2984 msg.AddAttribute( |
| 2985 rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, priority)); |
2984 if (nomination != 0) { | 2986 if (nomination != 0) { |
2985 msg.AddAttribute( | 2987 msg.AddAttribute(rtc::MakeUnique<StunUInt32Attribute>( |
2986 new StunUInt32Attribute(STUN_ATTR_NOMINATION, nomination)); | 2988 STUN_ATTR_NOMINATION, nomination)); |
2987 } | 2989 } |
2988 msg.SetTransactionID(rtc::CreateRandomString(kStunTransactionIdLength)); | 2990 msg.SetTransactionID(rtc::CreateRandomString(kStunTransactionIdLength)); |
2989 msg.AddMessageIntegrity(conn->local_candidate().password()); | 2991 msg.AddMessageIntegrity(conn->local_candidate().password()); |
2990 msg.AddFingerprint(); | 2992 msg.AddFingerprint(); |
2991 rtc::ByteBufferWriter buf; | 2993 rtc::ByteBufferWriter buf; |
2992 msg.Write(&buf); | 2994 msg.Write(&buf); |
2993 conn->OnReadPacket(buf.Data(), buf.Length(), rtc::CreatePacketTime(0)); | 2995 conn->OnReadPacket(buf.Data(), buf.Length(), rtc::CreatePacketTime(0)); |
2994 } | 2996 } |
2995 | 2997 |
2996 void OnReadyToSend(rtc::PacketTransportInternal* transport) { | 2998 void OnReadyToSend(rtc::PacketTransportInternal* transport) { |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3173 ch.SetIceRole(ICEROLE_CONTROLLING); | 3175 ch.SetIceRole(ICEROLE_CONTROLLING); |
3174 ch.SetIceParameters(kIceParams[0]); | 3176 ch.SetIceParameters(kIceParams[0]); |
3175 ch.MaybeStartGathering(); | 3177 ch.MaybeStartGathering(); |
3176 EXPECT_EQ_WAIT(IceGatheringState::kIceGatheringComplete, ch.gathering_state(), | 3178 EXPECT_EQ_WAIT(IceGatheringState::kIceGatheringComplete, ch.gathering_state(), |
3177 kDefaultTimeout); | 3179 kDefaultTimeout); |
3178 | 3180 |
3179 // Simulate a binding request being received, creating a peer reflexive | 3181 // Simulate a binding request being received, creating a peer reflexive |
3180 // candidate pair while we still don't have remote ICE parameters. | 3182 // candidate pair while we still don't have remote ICE parameters. |
3181 IceMessage request; | 3183 IceMessage request; |
3182 request.SetType(STUN_BINDING_REQUEST); | 3184 request.SetType(STUN_BINDING_REQUEST); |
3183 request.AddAttribute( | 3185 request.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>( |
3184 new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 3186 STUN_ATTR_USERNAME, kIceUfrag[1])); |
3185 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; | 3187 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; |
3186 request.AddAttribute( | 3188 request.AddAttribute( |
3187 new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); | 3189 rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, prflx_priority)); |
3188 Port* port = GetPort(&ch); | 3190 Port* port = GetPort(&ch); |
3189 ASSERT_NE(nullptr, port); | 3191 ASSERT_NE(nullptr, port); |
3190 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, | 3192 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, |
3191 &request, kIceUfrag[1], false); | 3193 &request, kIceUfrag[1], false); |
3192 Connection* conn = GetConnectionTo(&ch, "1.1.1.1", 1); | 3194 Connection* conn = GetConnectionTo(&ch, "1.1.1.1", 1); |
3193 ASSERT_NE(nullptr, conn); | 3195 ASSERT_NE(nullptr, conn); |
3194 | 3196 |
3195 // Simulate waiting for a second (and change) and verify that no pings were | 3197 // Simulate waiting for a second (and change) and verify that no pings were |
3196 // sent, since we don't yet have remote ICE parameters. | 3198 // sent, since we don't yet have remote ICE parameters. |
3197 SIMULATED_WAIT(conn->num_pings_sent() > 0, 1025, clock); | 3199 SIMULATED_WAIT(conn->num_pings_sent() > 0, 1025, clock); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3342 // Wait for conn1 to be pruned. | 3344 // Wait for conn1 to be pruned. |
3343 EXPECT_TRUE_WAIT(conn1->pruned(), kMediumTimeout); | 3345 EXPECT_TRUE_WAIT(conn1->pruned(), kMediumTimeout); |
3344 // Destroy the connection to test SignalUnknownAddress. | 3346 // Destroy the connection to test SignalUnknownAddress. |
3345 conn1->Destroy(); | 3347 conn1->Destroy(); |
3346 EXPECT_TRUE_WAIT(GetConnectionTo(&ch, "1.1.1.1", 1) == nullptr, | 3348 EXPECT_TRUE_WAIT(GetConnectionTo(&ch, "1.1.1.1", 1) == nullptr, |
3347 kMediumTimeout); | 3349 kMediumTimeout); |
3348 | 3350 |
3349 // Create a minimal STUN message with prflx priority. | 3351 // Create a minimal STUN message with prflx priority. |
3350 IceMessage request; | 3352 IceMessage request; |
3351 request.SetType(STUN_BINDING_REQUEST); | 3353 request.SetType(STUN_BINDING_REQUEST); |
3352 request.AddAttribute( | 3354 request.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>( |
3353 new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 3355 STUN_ATTR_USERNAME, kIceUfrag[1])); |
3354 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; | 3356 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; |
3355 request.AddAttribute( | 3357 request.AddAttribute( |
3356 new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); | 3358 rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, prflx_priority)); |
3357 EXPECT_NE(prflx_priority, remote_priority); | 3359 EXPECT_NE(prflx_priority, remote_priority); |
3358 | 3360 |
3359 Port* port = GetPort(&ch); | 3361 Port* port = GetPort(&ch); |
3360 // conn1 should be resurrected with original priority. | 3362 // conn1 should be resurrected with original priority. |
3361 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, | 3363 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, |
3362 &request, kIceUfrag[1], false); | 3364 &request, kIceUfrag[1], false); |
3363 conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3365 conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
3364 ASSERT_TRUE(conn1 != nullptr); | 3366 ASSERT_TRUE(conn1 != nullptr); |
3365 EXPECT_EQ(conn1->remote_candidate().priority(), remote_priority); | 3367 EXPECT_EQ(conn1->remote_candidate().priority(), remote_priority); |
3366 | 3368 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3485 // appropriately. | 3487 // appropriately. |
3486 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) { | 3488 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) { |
3487 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3489 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3488 P2PTransportChannel ch("receiving state change", 1, &pa); | 3490 P2PTransportChannel ch("receiving state change", 1, &pa); |
3489 PrepareChannel(&ch); | 3491 PrepareChannel(&ch); |
3490 ch.SetIceRole(ICEROLE_CONTROLLED); | 3492 ch.SetIceRole(ICEROLE_CONTROLLED); |
3491 ch.MaybeStartGathering(); | 3493 ch.MaybeStartGathering(); |
3492 // A minimal STUN message with prflx priority. | 3494 // A minimal STUN message with prflx priority. |
3493 IceMessage request; | 3495 IceMessage request; |
3494 request.SetType(STUN_BINDING_REQUEST); | 3496 request.SetType(STUN_BINDING_REQUEST); |
3495 request.AddAttribute( | 3497 request.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>( |
3496 new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 3498 STUN_ATTR_USERNAME, kIceUfrag[1])); |
3497 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; | 3499 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; |
3498 request.AddAttribute( | 3500 request.AddAttribute( |
3499 new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); | 3501 rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, prflx_priority)); |
3500 TestUDPPort* port = static_cast<TestUDPPort*>(GetPort(&ch)); | 3502 TestUDPPort* port = static_cast<TestUDPPort*>(GetPort(&ch)); |
3501 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, | 3503 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, |
3502 &request, kIceUfrag[1], false); | 3504 &request, kIceUfrag[1], false); |
3503 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3505 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
3504 ASSERT_TRUE(conn1 != nullptr); | 3506 ASSERT_TRUE(conn1 != nullptr); |
3505 EXPECT_TRUE(port->sent_binding_response()); | 3507 EXPECT_TRUE(port->sent_binding_response()); |
3506 EXPECT_NE(conn1, ch.selected_connection()); | 3508 EXPECT_NE(conn1, ch.selected_connection()); |
3507 conn1->ReceivedPingResponse(LOW_RTT, "id"); | 3509 conn1->ReceivedPingResponse(LOW_RTT, "id"); |
3508 EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout); | 3510 EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout); |
3509 port->set_sent_binding_response(false); | 3511 port->set_sent_binding_response(false); |
(...skipping 17 matching lines...) Expand all Loading... |
3527 &request, kIceUfrag[1], false); | 3529 &request, kIceUfrag[1], false); |
3528 Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 3530 Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); |
3529 ASSERT_TRUE(conn3 != nullptr); | 3531 ASSERT_TRUE(conn3 != nullptr); |
3530 EXPECT_TRUE(port->sent_binding_response()); | 3532 EXPECT_TRUE(port->sent_binding_response()); |
3531 conn3->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. | 3533 conn3->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. |
3532 EXPECT_EQ(conn2, ch.selected_connection()); | 3534 EXPECT_EQ(conn2, ch.selected_connection()); |
3533 port->set_sent_binding_response(false); | 3535 port->set_sent_binding_response(false); |
3534 | 3536 |
3535 // However if the request contains use_candidate attribute, it will be | 3537 // However if the request contains use_candidate attribute, it will be |
3536 // selected as the selected connection. | 3538 // selected as the selected connection. |
3537 request.AddAttribute(new StunByteStringAttribute(STUN_ATTR_USE_CANDIDATE)); | 3539 request.AddAttribute( |
| 3540 rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_USE_CANDIDATE)); |
3538 port->SignalUnknownAddress(port, rtc::SocketAddress("4.4.4.4", 4), PROTO_UDP, | 3541 port->SignalUnknownAddress(port, rtc::SocketAddress("4.4.4.4", 4), PROTO_UDP, |
3539 &request, kIceUfrag[1], false); | 3542 &request, kIceUfrag[1], false); |
3540 Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4); | 3543 Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4); |
3541 ASSERT_TRUE(conn4 != nullptr); | 3544 ASSERT_TRUE(conn4 != nullptr); |
3542 EXPECT_TRUE(port->sent_binding_response()); | 3545 EXPECT_TRUE(port->sent_binding_response()); |
3543 // conn4 is not the selected connection yet because it is not writable. | 3546 // conn4 is not the selected connection yet because it is not writable. |
3544 EXPECT_EQ(conn2, ch.selected_connection()); | 3547 EXPECT_EQ(conn2, ch.selected_connection()); |
3545 conn4->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. | 3548 conn4->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. |
3546 EXPECT_EQ_WAIT(conn4, ch.selected_connection(), kDefaultTimeout); | 3549 EXPECT_EQ_WAIT(conn4, ch.selected_connection(), kDefaultTimeout); |
3547 | 3550 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3582 ASSERT_TRUE(conn2 != nullptr); | 3585 ASSERT_TRUE(conn2 != nullptr); |
3583 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Become writable and receiving. | 3586 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Become writable and receiving. |
3584 conn2->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 3587 conn2->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); |
3585 EXPECT_EQ(conn2, ch.selected_connection()); | 3588 EXPECT_EQ(conn2, ch.selected_connection()); |
3586 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. | 3589 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. |
3587 | 3590 |
3588 // Now another STUN message with an unknown address and use_candidate will | 3591 // Now another STUN message with an unknown address and use_candidate will |
3589 // nominate the selected connection. | 3592 // nominate the selected connection. |
3590 IceMessage request; | 3593 IceMessage request; |
3591 request.SetType(STUN_BINDING_REQUEST); | 3594 request.SetType(STUN_BINDING_REQUEST); |
3592 request.AddAttribute( | 3595 request.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>( |
3593 new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 3596 STUN_ATTR_USERNAME, kIceUfrag[1])); |
3594 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; | 3597 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; |
3595 request.AddAttribute( | 3598 request.AddAttribute( |
3596 new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); | 3599 rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, prflx_priority)); |
3597 request.AddAttribute(new StunByteStringAttribute(STUN_ATTR_USE_CANDIDATE)); | 3600 request.AddAttribute( |
| 3601 rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_USE_CANDIDATE)); |
3598 Port* port = GetPort(&ch); | 3602 Port* port = GetPort(&ch); |
3599 port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 3), PROTO_UDP, | 3603 port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 3), PROTO_UDP, |
3600 &request, kIceUfrag[1], false); | 3604 &request, kIceUfrag[1], false); |
3601 Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 3605 Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); |
3602 ASSERT_TRUE(conn3 != nullptr); | 3606 ASSERT_TRUE(conn3 != nullptr); |
3603 EXPECT_EQ(conn2, ch.selected_connection()); // Not writable yet. | 3607 EXPECT_EQ(conn2, ch.selected_connection()); // Not writable yet. |
3604 conn3->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. | 3608 conn3->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. |
3605 EXPECT_EQ_WAIT(conn3, ch.selected_connection(), kDefaultTimeout); | 3609 EXPECT_EQ_WAIT(conn3, ch.selected_connection(), kDefaultTimeout); |
3606 | 3610 |
3607 // Now another data packet will not switch the selected connection because the | 3611 // Now another data packet will not switch the selected connection because the |
(...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4325 | 4329 |
4326 // TCP Relay/Relay is the next. | 4330 // TCP Relay/Relay is the next. |
4327 VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, | 4331 VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, |
4328 TCP_PROTOCOL_NAME); | 4332 TCP_PROTOCOL_NAME); |
4329 | 4333 |
4330 // Finally, Local/Relay will be pinged. | 4334 // Finally, Local/Relay will be pinged. |
4331 VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); | 4335 VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); |
4332 } | 4336 } |
4333 | 4337 |
4334 } // namespace cricket { | 4338 } // namespace cricket { |
OLD | NEW |