test_nr_socket_unittest.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  4. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. // Original author: bcampen@mozilla.com
  6. extern "C" {
  7. #include "stun_msg.h" // for NR_STUN_MAX_MESSAGE_SIZE
  8. #include "stun_util.h"
  9. #include "nr_api.h"
  10. #include "async_wait.h"
  11. #include "nr_socket.h"
  12. #include "nr_socket_local.h"
  13. #include "stun_hint.h"
  14. #include "local_addr.h"
  15. #include "registry.h"
  16. }
  17. #include "test_nr_socket.h"
  18. #include "nsCOMPtr.h"
  19. #include "nsNetCID.h"
  20. #include "nsServiceManagerUtils.h"
  21. #include "nsAutoPtr.h"
  22. #include "runnable_utils.h"
  23. #include <vector>
  24. #define GTEST_HAS_RTTI 0
  25. #include "gtest/gtest.h"
  26. #include "gtest_utils.h"
  27. #define DATA_BUF_SIZE 1024
  28. namespace mozilla {
  29. class TestNrSocketTest : public MtransportTest {
  30. public:
  31. TestNrSocketTest() :
  32. MtransportTest(),
  33. wait_done_for_main_(false),
  34. sts_(),
  35. public_addrs_(),
  36. private_addrs_(),
  37. nats_() {
  38. }
  39. void SetUp() override {
  40. MtransportTest::SetUp();
  41. // Get the transport service as a dispatch target
  42. nsresult rv;
  43. sts_ = do_GetService(NS_SOCKETTRANSPORTSERVICE_CONTRACTID, &rv);
  44. EXPECT_TRUE(NS_SUCCEEDED(rv)) << "Failed to get STS: " << (int)rv;
  45. }
  46. void TearDown() override {
  47. sts_->Dispatch(WrapRunnable(this, &TestNrSocketTest::TearDown_s),
  48. NS_DISPATCH_SYNC);
  49. MtransportTest::TearDown();
  50. }
  51. void TearDown_s() {
  52. public_addrs_.clear();
  53. private_addrs_.clear();
  54. nats_.clear();
  55. sts_ = nullptr;
  56. }
  57. RefPtr<TestNrSocket> CreateTestNrSocket_s(const char *ip_str,
  58. int proto,
  59. TestNat *nat) {
  60. // If no nat is supplied, we create a default NAT which is disabled. This
  61. // is how we simulate a non-natted socket.
  62. RefPtr<TestNrSocket> sock(new TestNrSocket(nat ? nat : new TestNat));
  63. nr_transport_addr address;
  64. nr_str_port_to_transport_addr(ip_str, 0, proto, &address);
  65. int r = sock->create(&address);
  66. if (r) {
  67. return nullptr;
  68. }
  69. return sock;
  70. }
  71. void CreatePublicAddrs(size_t count,
  72. const char *ip_str = "127.0.0.1",
  73. int proto = IPPROTO_UDP) {
  74. sts_->Dispatch(
  75. WrapRunnable(this,
  76. &TestNrSocketTest::CreatePublicAddrs_s,
  77. count,
  78. ip_str,
  79. proto),
  80. NS_DISPATCH_SYNC);
  81. }
  82. void CreatePublicAddrs_s(size_t count, const char* ip_str, int proto) {
  83. while (count--) {
  84. auto sock = CreateTestNrSocket_s(ip_str, proto, nullptr);
  85. ASSERT_TRUE(sock) << "Failed to create socket";
  86. public_addrs_.push_back(sock);
  87. }
  88. }
  89. RefPtr<TestNat> CreatePrivateAddrs(size_t size,
  90. const char* ip_str = "127.0.0.1",
  91. int proto = IPPROTO_UDP) {
  92. RefPtr<TestNat> result;
  93. sts_->Dispatch(
  94. WrapRunnableRet(&result,
  95. this,
  96. &TestNrSocketTest::CreatePrivateAddrs_s,
  97. size,
  98. ip_str,
  99. proto),
  100. NS_DISPATCH_SYNC);
  101. return result;
  102. }
  103. RefPtr<TestNat> CreatePrivateAddrs_s(size_t count,
  104. const char* ip_str,
  105. int proto) {
  106. RefPtr<TestNat> nat(new TestNat);
  107. while (count--) {
  108. auto sock = CreateTestNrSocket_s(ip_str, proto, nat);
  109. if (!sock) {
  110. EXPECT_TRUE(false) << "Failed to create socket";
  111. break;
  112. }
  113. private_addrs_.push_back(sock);
  114. }
  115. nat->enabled_ = true;
  116. nats_.push_back(nat);
  117. return nat;
  118. }
  119. bool CheckConnectivityVia(
  120. TestNrSocket *from,
  121. TestNrSocket *to,
  122. const nr_transport_addr &via,
  123. nr_transport_addr *sender_external_address = nullptr) {
  124. MOZ_ASSERT(from);
  125. if (!WaitForWriteable(from)) {
  126. return false;
  127. }
  128. int result = 0;
  129. sts_->Dispatch(WrapRunnableRet(&result,
  130. this,
  131. &TestNrSocketTest::SendData_s,
  132. from,
  133. via),
  134. NS_DISPATCH_SYNC);
  135. if (result) {
  136. return false;
  137. }
  138. if (!WaitForReadable(to)) {
  139. return false;
  140. }
  141. nr_transport_addr dummy_outparam;
  142. if (!sender_external_address) {
  143. sender_external_address = &dummy_outparam;
  144. }
  145. MOZ_ASSERT(to);
  146. sts_->Dispatch(WrapRunnableRet(&result,
  147. this,
  148. &TestNrSocketTest::RecvData_s,
  149. to,
  150. sender_external_address),
  151. NS_DISPATCH_SYNC);
  152. return !result;
  153. }
  154. bool CheckConnectivity(
  155. TestNrSocket *from,
  156. TestNrSocket *to,
  157. nr_transport_addr *sender_external_address = nullptr) {
  158. nr_transport_addr destination_address;
  159. int r = GetAddress(to, &destination_address);
  160. if (r) {
  161. return false;
  162. }
  163. return CheckConnectivityVia(from,
  164. to,
  165. destination_address,
  166. sender_external_address);
  167. }
  168. bool CheckTcpConnectivity(TestNrSocket *from, TestNrSocket *to) {
  169. NrSocketBase *accepted_sock;
  170. if (!Connect(from, to, &accepted_sock)) {
  171. std::cerr << "Connect failed" << std::endl;
  172. return false;
  173. }
  174. // write on |from|, recv on |accepted_sock|
  175. if (!WaitForWriteable(from)) {
  176. std::cerr << __LINE__ << "WaitForWriteable (1) failed" << std::endl;
  177. return false;
  178. }
  179. int r;
  180. sts_->Dispatch(WrapRunnableRet(&r,
  181. this,
  182. &TestNrSocketTest::SendDataTcp_s,
  183. from),
  184. NS_DISPATCH_SYNC);
  185. if (r) {
  186. std::cerr << "SendDataTcp_s (1) failed" << std::endl;
  187. return false;
  188. }
  189. if (!WaitForReadable(accepted_sock)) {
  190. std::cerr << __LINE__ << "WaitForReadable (1) failed" << std::endl;
  191. return false;
  192. }
  193. sts_->Dispatch(WrapRunnableRet(&r,
  194. this,
  195. &TestNrSocketTest::RecvDataTcp_s,
  196. accepted_sock),
  197. NS_DISPATCH_SYNC);
  198. if (r) {
  199. std::cerr << "RecvDataTcp_s (1) failed" << std::endl;
  200. return false;
  201. }
  202. if (!WaitForWriteable(accepted_sock)) {
  203. std::cerr << __LINE__ << "WaitForWriteable (2) failed" << std::endl;
  204. return false;
  205. }
  206. sts_->Dispatch(WrapRunnableRet(&r,
  207. this,
  208. &TestNrSocketTest::SendDataTcp_s,
  209. accepted_sock),
  210. NS_DISPATCH_SYNC);
  211. if (r) {
  212. std::cerr << "SendDataTcp_s (2) failed" << std::endl;
  213. return false;
  214. }
  215. if (!WaitForReadable(from)) {
  216. std::cerr << __LINE__ << "WaitForReadable (2) failed" << std::endl;
  217. return false;
  218. }
  219. sts_->Dispatch(WrapRunnableRet(&r,
  220. this,
  221. &TestNrSocketTest::RecvDataTcp_s,
  222. from),
  223. NS_DISPATCH_SYNC);
  224. if (r) {
  225. std::cerr << "RecvDataTcp_s (2) failed" << std::endl;
  226. return false;
  227. }
  228. return true;
  229. }
  230. int GetAddress(TestNrSocket *sock, nr_transport_addr_ *address) {
  231. MOZ_ASSERT(sock);
  232. MOZ_ASSERT(address);
  233. int r;
  234. sts_->Dispatch(WrapRunnableRet(&r,
  235. this,
  236. &TestNrSocketTest::GetAddress_s,
  237. sock,
  238. address),
  239. NS_DISPATCH_SYNC);
  240. return r;
  241. }
  242. int GetAddress_s(TestNrSocket *sock, nr_transport_addr *address) {
  243. return sock->getaddr(address);
  244. }
  245. int SendData_s(TestNrSocket *from, const nr_transport_addr &to) {
  246. // It is up to caller to ensure that |from| is writeable.
  247. const char buf[] = "foobajooba";
  248. return from->sendto(buf, sizeof(buf), 0,
  249. // TODO(bug 1170299): Remove const_cast when no longer necessary
  250. const_cast<nr_transport_addr*>(&to));
  251. }
  252. int SendDataTcp_s(NrSocketBase *from) {
  253. // It is up to caller to ensure that |from| is writeable.
  254. const char buf[] = "foobajooba";
  255. size_t written;
  256. return from->write(buf, sizeof(buf), &written);
  257. }
  258. int RecvData_s(TestNrSocket *to, nr_transport_addr *from) {
  259. // It is up to caller to ensure that |to| is readable
  260. char buf[DATA_BUF_SIZE];
  261. size_t len;
  262. // Maybe check that data matches?
  263. int r = to->recvfrom(buf, sizeof(buf), &len, 0, from);
  264. if (!r && (len == 0)) {
  265. r = R_INTERNAL;
  266. }
  267. return r;
  268. }
  269. int RecvDataTcp_s(NrSocketBase *to) {
  270. // It is up to caller to ensure that |to| is readable
  271. char buf[DATA_BUF_SIZE];
  272. size_t len;
  273. // Maybe check that data matches?
  274. int r = to->read(buf, sizeof(buf), &len);
  275. if (!r && (len == 0)) {
  276. r = R_INTERNAL;
  277. }
  278. return r;
  279. }
  280. int Listen_s(TestNrSocket *to) {
  281. // listen on |to|
  282. int r = to->listen(1);
  283. if (r) {
  284. return r;
  285. }
  286. return 0;
  287. }
  288. int Connect_s(TestNrSocket *from, TestNrSocket *to) {
  289. // connect on |from|
  290. nr_transport_addr destination_address;
  291. int r = to->getaddr(&destination_address);
  292. if (r) {
  293. return r;
  294. }
  295. r = from->connect(&destination_address);
  296. if (r) {
  297. return r;
  298. }
  299. return 0;
  300. }
  301. int Accept_s(TestNrSocket *to, NrSocketBase **accepted_sock) {
  302. nr_socket *sock;
  303. nr_transport_addr source_address;
  304. int r = to->accept(&source_address, &sock);
  305. if (r) {
  306. return r;
  307. }
  308. *accepted_sock = reinterpret_cast<NrSocketBase*>(sock->obj);
  309. return 0;
  310. }
  311. bool Connect(TestNrSocket *from,
  312. TestNrSocket *to,
  313. NrSocketBase **accepted_sock) {
  314. int r;
  315. sts_->Dispatch(WrapRunnableRet(&r,
  316. this,
  317. &TestNrSocketTest::Listen_s,
  318. to),
  319. NS_DISPATCH_SYNC);
  320. if (r) {
  321. std::cerr << "Listen_s failed: " << r << std::endl;
  322. return false;
  323. }
  324. sts_->Dispatch(WrapRunnableRet(&r,
  325. this,
  326. &TestNrSocketTest::Connect_s,
  327. from,
  328. to),
  329. NS_DISPATCH_SYNC);
  330. if (r && r != R_WOULDBLOCK) {
  331. std::cerr << "Connect_s failed: " << r << std::endl;
  332. return false;
  333. }
  334. if (!WaitForReadable(to)) {
  335. std::cerr << "WaitForReadable failed" << std::endl;
  336. return false;
  337. }
  338. sts_->Dispatch(WrapRunnableRet(&r,
  339. this,
  340. &TestNrSocketTest::Accept_s,
  341. to,
  342. accepted_sock),
  343. NS_DISPATCH_SYNC);
  344. if (r) {
  345. std::cerr << "Accept_s failed: " << r << std::endl;
  346. return false;
  347. }
  348. return true;
  349. }
  350. bool WaitForSocketState(NrSocketBase *sock, int state) {
  351. MOZ_ASSERT(sock);
  352. sts_->Dispatch(WrapRunnable(this,
  353. &TestNrSocketTest::WaitForSocketState_s,
  354. sock,
  355. state),
  356. NS_DISPATCH_SYNC);
  357. bool res;
  358. WAIT_(wait_done_for_main_, 500, res);
  359. wait_done_for_main_ = false;
  360. if (!res) {
  361. sts_->Dispatch(WrapRunnable(this,
  362. &TestNrSocketTest::CancelWait_s,
  363. sock,
  364. state),
  365. NS_DISPATCH_SYNC);
  366. }
  367. return res;
  368. }
  369. void WaitForSocketState_s(NrSocketBase *sock, int state) {
  370. NR_ASYNC_WAIT(sock, state, &WaitDone, this);
  371. }
  372. void CancelWait_s(NrSocketBase *sock, int state) {
  373. sock->cancel(state);
  374. }
  375. bool WaitForReadable(NrSocketBase *sock) {
  376. return WaitForSocketState(sock, NR_ASYNC_WAIT_READ);
  377. }
  378. bool WaitForWriteable(NrSocketBase *sock) {
  379. return WaitForSocketState(sock, NR_ASYNC_WAIT_WRITE);
  380. }
  381. static void WaitDone(void *sock, int how, void *test_fixture) {
  382. TestNrSocketTest *test = static_cast<TestNrSocketTest*>(test_fixture);
  383. test->wait_done_for_main_ = true;
  384. }
  385. // Simple busywait boolean for the test cases to spin on.
  386. Atomic<bool> wait_done_for_main_;
  387. nsCOMPtr<nsIEventTarget> sts_;
  388. std::vector<RefPtr<TestNrSocket>> public_addrs_;
  389. std::vector<RefPtr<TestNrSocket>> private_addrs_;
  390. std::vector<RefPtr<TestNat>> nats_;
  391. };
  392. } // namespace mozilla
  393. using mozilla::TestNrSocketTest;
  394. using mozilla::TestNat;
  395. TEST_F(TestNrSocketTest, PublicConnectivity) {
  396. CreatePublicAddrs(2);
  397. ASSERT_TRUE(CheckConnectivity(public_addrs_[0], public_addrs_[1]));
  398. ASSERT_TRUE(CheckConnectivity(public_addrs_[1], public_addrs_[0]));
  399. ASSERT_TRUE(CheckConnectivity(public_addrs_[0], public_addrs_[0]));
  400. ASSERT_TRUE(CheckConnectivity(public_addrs_[1], public_addrs_[1]));
  401. }
  402. TEST_F(TestNrSocketTest, PrivateConnectivity) {
  403. RefPtr<TestNat> nat(CreatePrivateAddrs(2));
  404. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  405. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  406. ASSERT_TRUE(CheckConnectivity(private_addrs_[0], private_addrs_[1]));
  407. ASSERT_TRUE(CheckConnectivity(private_addrs_[1], private_addrs_[0]));
  408. ASSERT_TRUE(CheckConnectivity(private_addrs_[0], private_addrs_[0]));
  409. ASSERT_TRUE(CheckConnectivity(private_addrs_[1], private_addrs_[1]));
  410. }
  411. TEST_F(TestNrSocketTest, NoConnectivityWithoutPinhole) {
  412. RefPtr<TestNat> nat(CreatePrivateAddrs(1));
  413. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  414. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  415. CreatePublicAddrs(1);
  416. ASSERT_FALSE(CheckConnectivity(public_addrs_[0], private_addrs_[0]));
  417. }
  418. TEST_F(TestNrSocketTest, NoConnectivityBetweenSubnets) {
  419. RefPtr<TestNat> nat1(CreatePrivateAddrs(1));
  420. nat1->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  421. nat1->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  422. RefPtr<TestNat> nat2(CreatePrivateAddrs(1));
  423. nat2->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  424. nat2->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  425. ASSERT_FALSE(CheckConnectivity(private_addrs_[0], private_addrs_[1]));
  426. ASSERT_FALSE(CheckConnectivity(private_addrs_[1], private_addrs_[0]));
  427. ASSERT_TRUE(CheckConnectivity(private_addrs_[0], private_addrs_[0]));
  428. ASSERT_TRUE(CheckConnectivity(private_addrs_[1], private_addrs_[1]));
  429. }
  430. TEST_F(TestNrSocketTest, FullConeAcceptIngress) {
  431. RefPtr<TestNat> nat(CreatePrivateAddrs(1));
  432. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  433. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  434. CreatePublicAddrs(2);
  435. nr_transport_addr sender_external_address;
  436. // Open pinhole to public IP 0
  437. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  438. public_addrs_[0],
  439. &sender_external_address));
  440. // Verify that return traffic works
  441. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[0],
  442. private_addrs_[0],
  443. sender_external_address));
  444. // Verify that other public IP can use the pinhole
  445. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[1],
  446. private_addrs_[0],
  447. sender_external_address));
  448. }
  449. TEST_F(TestNrSocketTest, FullConeOnePinhole) {
  450. RefPtr<TestNat> nat(CreatePrivateAddrs(1));
  451. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  452. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  453. CreatePublicAddrs(2);
  454. nr_transport_addr sender_external_address;
  455. // Open pinhole to public IP 0
  456. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  457. public_addrs_[0],
  458. &sender_external_address));
  459. // Verify that return traffic works
  460. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[0],
  461. private_addrs_[0],
  462. sender_external_address));
  463. // Send traffic to other public IP, verify that it uses the same pinhole
  464. nr_transport_addr sender_external_address2;
  465. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  466. public_addrs_[1],
  467. &sender_external_address2));
  468. ASSERT_FALSE(nr_transport_addr_cmp(&sender_external_address,
  469. &sender_external_address2,
  470. NR_TRANSPORT_ADDR_CMP_MODE_ALL))
  471. << "addr1: " << sender_external_address.as_string << " addr2: "
  472. << sender_external_address2.as_string;
  473. }
  474. // OS 10.6 doesn't seem to allow us to open ports on 127.0.0.2, and while linux
  475. // does allow this, it has other behavior (see below) that prevents this test
  476. // from working.
  477. TEST_F(TestNrSocketTest, DISABLED_AddressRestrictedCone) {
  478. RefPtr<TestNat> nat(CreatePrivateAddrs(1));
  479. nat->filtering_type_ = TestNat::ADDRESS_DEPENDENT;
  480. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  481. CreatePublicAddrs(2, "127.0.0.1");
  482. CreatePublicAddrs(1, "127.0.0.2");
  483. nr_transport_addr sender_external_address;
  484. // Open pinhole to public IP 0
  485. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  486. public_addrs_[0],
  487. &sender_external_address));
  488. // Verify that return traffic works
  489. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[0],
  490. private_addrs_[0],
  491. sender_external_address));
  492. // Verify that another address on the same host can use the pinhole
  493. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[1],
  494. private_addrs_[0],
  495. sender_external_address));
  496. // Linux has a tendency to monkey around with source addresses, doing
  497. // stuff like substituting 127.0.0.1 for packets sent by 127.0.0.2, and even
  498. // going as far as substituting localhost for a packet sent from a real IP
  499. // address when the destination is localhost. The only way to make this test
  500. // work on linux is to have two real IP addresses.
  501. #ifndef __linux__
  502. // Verify that an address on a different host can't use the pinhole
  503. ASSERT_FALSE(CheckConnectivityVia(public_addrs_[2],
  504. private_addrs_[0],
  505. sender_external_address));
  506. #endif
  507. // Send traffic to other public IP, verify that it uses the same pinhole
  508. nr_transport_addr sender_external_address2;
  509. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  510. public_addrs_[1],
  511. &sender_external_address2));
  512. ASSERT_FALSE(nr_transport_addr_cmp(&sender_external_address,
  513. &sender_external_address2,
  514. NR_TRANSPORT_ADDR_CMP_MODE_ALL))
  515. << "addr1: " << sender_external_address.as_string << " addr2: "
  516. << sender_external_address2.as_string;
  517. // Verify that the other public IP can now use the pinhole
  518. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[1],
  519. private_addrs_[0],
  520. sender_external_address2));
  521. // Send traffic to other public IP, verify that it uses the same pinhole
  522. nr_transport_addr sender_external_address3;
  523. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  524. public_addrs_[2],
  525. &sender_external_address3));
  526. ASSERT_FALSE(nr_transport_addr_cmp(&sender_external_address,
  527. &sender_external_address3,
  528. NR_TRANSPORT_ADDR_CMP_MODE_ALL))
  529. << "addr1: " << sender_external_address.as_string << " addr2: "
  530. << sender_external_address3.as_string;
  531. // Verify that the other public IP can now use the pinhole
  532. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[2],
  533. private_addrs_[0],
  534. sender_external_address3));
  535. }
  536. TEST_F(TestNrSocketTest, RestrictedCone) {
  537. RefPtr<TestNat> nat(CreatePrivateAddrs(1));
  538. nat->filtering_type_ = TestNat::PORT_DEPENDENT;
  539. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  540. CreatePublicAddrs(2);
  541. nr_transport_addr sender_external_address;
  542. // Open pinhole to public IP 0
  543. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  544. public_addrs_[0],
  545. &sender_external_address));
  546. // Verify that return traffic works
  547. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[0],
  548. private_addrs_[0],
  549. sender_external_address));
  550. // Verify that other public IP cannot use the pinhole
  551. ASSERT_FALSE(CheckConnectivityVia(public_addrs_[1],
  552. private_addrs_[0],
  553. sender_external_address));
  554. // Send traffic to other public IP, verify that it uses the same pinhole
  555. nr_transport_addr sender_external_address2;
  556. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  557. public_addrs_[1],
  558. &sender_external_address2));
  559. ASSERT_FALSE(nr_transport_addr_cmp(&sender_external_address,
  560. &sender_external_address2,
  561. NR_TRANSPORT_ADDR_CMP_MODE_ALL))
  562. << "addr1: " << sender_external_address.as_string << " addr2: "
  563. << sender_external_address2.as_string;
  564. // Verify that the other public IP can now use the pinhole
  565. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[1],
  566. private_addrs_[0],
  567. sender_external_address2));
  568. }
  569. TEST_F(TestNrSocketTest, PortDependentMappingFullCone) {
  570. RefPtr<TestNat> nat(CreatePrivateAddrs(1));
  571. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  572. nat->mapping_type_ = TestNat::PORT_DEPENDENT;
  573. CreatePublicAddrs(2);
  574. nr_transport_addr sender_external_address0;
  575. // Open pinhole to public IP 0
  576. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  577. public_addrs_[0],
  578. &sender_external_address0));
  579. // Verify that return traffic works
  580. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[0],
  581. private_addrs_[0],
  582. sender_external_address0));
  583. // Verify that other public IP can use the pinhole
  584. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[1],
  585. private_addrs_[0],
  586. sender_external_address0));
  587. // Send traffic to other public IP, verify that it uses a different pinhole
  588. nr_transport_addr sender_external_address1;
  589. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  590. public_addrs_[1],
  591. &sender_external_address1));
  592. ASSERT_TRUE(nr_transport_addr_cmp(&sender_external_address0,
  593. &sender_external_address1,
  594. NR_TRANSPORT_ADDR_CMP_MODE_ALL))
  595. << "addr1: " << sender_external_address0.as_string << " addr2: "
  596. << sender_external_address1.as_string;
  597. // Verify that return traffic works
  598. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[1],
  599. private_addrs_[0],
  600. sender_external_address1));
  601. // Verify that other public IP can use the original pinhole
  602. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[0],
  603. private_addrs_[0],
  604. sender_external_address1));
  605. }
  606. TEST_F(TestNrSocketTest, Symmetric) {
  607. RefPtr<TestNat> nat(CreatePrivateAddrs(1));
  608. nat->filtering_type_ = TestNat::PORT_DEPENDENT;
  609. nat->mapping_type_ = TestNat::PORT_DEPENDENT;
  610. CreatePublicAddrs(2);
  611. nr_transport_addr sender_external_address;
  612. // Open pinhole to public IP 0
  613. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  614. public_addrs_[0],
  615. &sender_external_address));
  616. // Verify that return traffic works
  617. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[0],
  618. private_addrs_[0],
  619. sender_external_address));
  620. // Verify that other public IP cannot use the pinhole
  621. ASSERT_FALSE(CheckConnectivityVia(public_addrs_[1],
  622. private_addrs_[0],
  623. sender_external_address));
  624. // Send traffic to other public IP, verify that it uses a new pinhole
  625. nr_transport_addr sender_external_address2;
  626. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  627. public_addrs_[1],
  628. &sender_external_address2));
  629. ASSERT_TRUE(nr_transport_addr_cmp(&sender_external_address,
  630. &sender_external_address2,
  631. NR_TRANSPORT_ADDR_CMP_MODE_ALL));
  632. // Verify that the other public IP can use the new pinhole
  633. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[1],
  634. private_addrs_[0],
  635. sender_external_address2));
  636. }
  637. TEST_F(TestNrSocketTest, BlockUdp) {
  638. RefPtr<TestNat> nat(CreatePrivateAddrs(2));
  639. nat->block_udp_ = true;
  640. CreatePublicAddrs(1);
  641. nr_transport_addr sender_external_address;
  642. ASSERT_FALSE(CheckConnectivity(private_addrs_[0],
  643. public_addrs_[0],
  644. &sender_external_address));
  645. // Make sure UDP behind the NAT still works
  646. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  647. private_addrs_[1]));
  648. ASSERT_TRUE(CheckConnectivity(private_addrs_[1],
  649. private_addrs_[0]));
  650. }
  651. TEST_F(TestNrSocketTest, DenyHairpinning) {
  652. RefPtr<TestNat> nat(CreatePrivateAddrs(2));
  653. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  654. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  655. CreatePublicAddrs(1);
  656. nr_transport_addr sender_external_address;
  657. // Open pinhole to public IP 0
  658. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  659. public_addrs_[0],
  660. &sender_external_address));
  661. // Verify that hairpinning is disallowed
  662. ASSERT_FALSE(CheckConnectivityVia(private_addrs_[1],
  663. private_addrs_[0],
  664. sender_external_address));
  665. }
  666. TEST_F(TestNrSocketTest, AllowHairpinning) {
  667. RefPtr<TestNat> nat(CreatePrivateAddrs(2));
  668. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  669. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  670. nat->mapping_timeout_ = 30000;
  671. nat->allow_hairpinning_ = true;
  672. CreatePublicAddrs(1);
  673. nr_transport_addr sender_external_address;
  674. // Open pinhole to public IP 0, obtain external address
  675. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  676. public_addrs_[0],
  677. &sender_external_address));
  678. // Verify that hairpinning is allowed
  679. ASSERT_TRUE(CheckConnectivityVia(private_addrs_[1],
  680. private_addrs_[0],
  681. sender_external_address));
  682. }
  683. TEST_F(TestNrSocketTest, FullConeTimeout) {
  684. RefPtr<TestNat> nat(CreatePrivateAddrs(1));
  685. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  686. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  687. nat->mapping_timeout_ = 200;
  688. CreatePublicAddrs(2);
  689. nr_transport_addr sender_external_address;
  690. // Open pinhole to public IP 0
  691. ASSERT_TRUE(CheckConnectivity(private_addrs_[0],
  692. public_addrs_[0],
  693. &sender_external_address));
  694. // Verify that return traffic works
  695. ASSERT_TRUE(CheckConnectivityVia(public_addrs_[0],
  696. private_addrs_[0],
  697. sender_external_address));
  698. PR_Sleep(201);
  699. // Verify that return traffic does not work
  700. ASSERT_FALSE(CheckConnectivityVia(public_addrs_[0],
  701. private_addrs_[0],
  702. sender_external_address));
  703. }
  704. TEST_F(TestNrSocketTest, PublicConnectivityTcp)
  705. {
  706. CreatePublicAddrs(2, "127.0.0.1", IPPROTO_TCP);
  707. ASSERT_TRUE(CheckTcpConnectivity(public_addrs_[0], public_addrs_[1]));
  708. }
  709. TEST_F(TestNrSocketTest, PrivateConnectivityTcp) {
  710. RefPtr<TestNat> nat(CreatePrivateAddrs(2, "127.0.0.1", IPPROTO_TCP));
  711. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  712. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  713. ASSERT_TRUE(CheckTcpConnectivity(private_addrs_[0], private_addrs_[1]));
  714. }
  715. TEST_F(TestNrSocketTest, PrivateToPublicConnectivityTcp)
  716. {
  717. RefPtr<TestNat> nat(CreatePrivateAddrs(1, "127.0.0.1", IPPROTO_TCP));
  718. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  719. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  720. CreatePublicAddrs(1, "127.0.0.1", IPPROTO_TCP);
  721. ASSERT_TRUE(CheckTcpConnectivity(private_addrs_[0], public_addrs_[0]));
  722. }
  723. TEST_F(TestNrSocketTest, NoConnectivityBetweenSubnetsTcp)
  724. {
  725. RefPtr<TestNat> nat1(CreatePrivateAddrs(1, "127.0.0.1", IPPROTO_TCP));
  726. nat1->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  727. nat1->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  728. RefPtr<TestNat> nat2(CreatePrivateAddrs(1, "127.0.0.1", IPPROTO_TCP));
  729. nat2->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  730. nat2->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  731. ASSERT_FALSE(CheckTcpConnectivity(private_addrs_[0], private_addrs_[1]));
  732. }
  733. TEST_F(TestNrSocketTest, NoConnectivityPublicToPrivateTcp)
  734. {
  735. RefPtr<TestNat> nat(CreatePrivateAddrs(1, "127.0.0.1", IPPROTO_TCP));
  736. nat->filtering_type_ = TestNat::ENDPOINT_INDEPENDENT;
  737. nat->mapping_type_ = TestNat::ENDPOINT_INDEPENDENT;
  738. CreatePublicAddrs(1, "127.0.0.1", IPPROTO_TCP);
  739. ASSERT_FALSE(CheckTcpConnectivity(public_addrs_[0], private_addrs_[0]));
  740. }