PageRenderTime 26ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/src/test/test_ipaddr.cc

https://gitlab.com/unofficial-mirrors/ceph
C++ | 590 lines | 477 code | 111 blank | 2 comment | 0 complexity | 93fa0bbb1a60becd907549af39d0b807 MD5 | raw file
  1. #include "include/ipaddr.h"
  2. #include "common/pick_address.h"
  3. #include "global/global_context.h"
  4. #include "gtest/gtest.h"
  5. #if defined(__FreeBSD__)
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #endif
  10. #include <arpa/inet.h>
  11. #include <ifaddrs.h>
  12. static void ipv4(struct sockaddr_in *addr, const char *s) {
  13. int err;
  14. addr->sin_family = AF_INET;
  15. err = inet_pton(AF_INET, s, &addr->sin_addr);
  16. ASSERT_EQ(1, err);
  17. }
  18. static void ipv6(struct sockaddr_in6 *addr, const char *s) {
  19. int err;
  20. addr->sin6_family = AF_INET6;
  21. err = inet_pton(AF_INET6, s, &addr->sin6_addr);
  22. ASSERT_EQ(1, err);
  23. }
  24. static char eth0[] = "eth0";
  25. static char eth1[] = "eth1";
  26. TEST(CommonIPAddr, TestNotFound)
  27. {
  28. struct ifaddrs one, two;
  29. struct sockaddr_in a_one;
  30. struct sockaddr_in6 a_two;
  31. struct sockaddr_in net;
  32. const struct ifaddrs *result;
  33. memset(&net, 0, sizeof(net));
  34. one.ifa_next = &two;
  35. one.ifa_addr = (struct sockaddr*)&a_one;
  36. one.ifa_name = eth0;
  37. two.ifa_next = NULL;
  38. two.ifa_addr = (struct sockaddr*)&a_two;
  39. two.ifa_name = eth1;
  40. ipv4(&a_one, "10.11.12.13");
  41. ipv6(&a_two, "2001:1234:5678:90ab::cdef");
  42. ipv4(&net, "10.11.234.56");
  43. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 24);
  44. ASSERT_EQ(0, result);
  45. }
  46. TEST(CommonIPAddr, TestV4_Simple)
  47. {
  48. struct ifaddrs one, two;
  49. struct sockaddr_in a_one;
  50. struct sockaddr_in6 a_two;
  51. struct sockaddr_in net;
  52. const struct ifaddrs *result;
  53. memset(&net, 0, sizeof(net));
  54. one.ifa_next = &two;
  55. one.ifa_addr = (struct sockaddr*)&a_one;
  56. one.ifa_name = eth0;
  57. two.ifa_next = NULL;
  58. two.ifa_addr = (struct sockaddr*)&a_two;
  59. two.ifa_name = eth1;
  60. ipv4(&a_one, "10.11.12.13");
  61. ipv6(&a_two, "2001:1234:5678:90ab::cdef");
  62. ipv4(&net, "10.11.12.42");
  63. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 24);
  64. ASSERT_EQ((struct sockaddr*)&a_one, result->ifa_addr);
  65. }
  66. TEST(CommonIPAddr, TestV4_Prefix25)
  67. {
  68. struct ifaddrs one, two;
  69. struct sockaddr_in a_one;
  70. struct sockaddr_in a_two;
  71. struct sockaddr_in net;
  72. const struct ifaddrs *result;
  73. memset(&net, 0, sizeof(net));
  74. one.ifa_next = &two;
  75. one.ifa_addr = (struct sockaddr*)&a_one;
  76. one.ifa_name = eth0;
  77. two.ifa_next = NULL;
  78. two.ifa_addr = (struct sockaddr*)&a_two;
  79. two.ifa_name = eth1;
  80. ipv4(&a_one, "10.11.12.13");
  81. ipv4(&a_two, "10.11.12.129");
  82. ipv4(&net, "10.11.12.128");
  83. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 25);
  84. ASSERT_EQ((struct sockaddr*)&a_two, result->ifa_addr);
  85. }
  86. TEST(CommonIPAddr, TestV4_Prefix16)
  87. {
  88. struct ifaddrs one, two;
  89. struct sockaddr_in a_one;
  90. struct sockaddr_in a_two;
  91. struct sockaddr_in net;
  92. const struct ifaddrs *result;
  93. memset(&net, 0, sizeof(net));
  94. one.ifa_next = &two;
  95. one.ifa_addr = (struct sockaddr*)&a_one;
  96. one.ifa_name = eth0;
  97. two.ifa_next = NULL;
  98. two.ifa_addr = (struct sockaddr*)&a_two;
  99. two.ifa_name = eth1;
  100. ipv4(&a_one, "10.1.1.2");
  101. ipv4(&a_two, "10.2.1.123");
  102. ipv4(&net, "10.2.0.0");
  103. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 16);
  104. ASSERT_EQ((struct sockaddr*)&a_two, result->ifa_addr);
  105. }
  106. TEST(CommonIPAddr, TestV4_PrefixTooLong)
  107. {
  108. struct ifaddrs one;
  109. struct sockaddr_in a_one;
  110. struct sockaddr_in net;
  111. const struct ifaddrs *result;
  112. memset(&net, 0, sizeof(net));
  113. one.ifa_next = NULL;
  114. one.ifa_addr = (struct sockaddr*)&a_one;
  115. one.ifa_name = eth0;
  116. ipv4(&a_one, "10.11.12.13");
  117. ipv4(&net, "10.11.12.12");
  118. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 42);
  119. ASSERT_EQ(0, result);
  120. }
  121. TEST(CommonIPAddr, TestV4_PrefixZero)
  122. {
  123. struct ifaddrs one, two;
  124. struct sockaddr_in6 a_one;
  125. struct sockaddr_in a_two;
  126. struct sockaddr_in net;
  127. const struct ifaddrs *result;
  128. memset(&net, 0, sizeof(net));
  129. one.ifa_next = &two;
  130. one.ifa_addr = (struct sockaddr*)&a_one;
  131. one.ifa_name = eth0;
  132. two.ifa_next = NULL;
  133. two.ifa_addr = (struct sockaddr*)&a_two;
  134. two.ifa_name = eth1;
  135. ipv6(&a_one, "2001:1234:5678:900F::cdef");
  136. ipv4(&a_two, "10.1.2.3");
  137. ipv4(&net, "255.0.1.2");
  138. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 0);
  139. ASSERT_EQ((struct sockaddr*)&a_two, result->ifa_addr);
  140. }
  141. TEST(CommonIPAddr, TestV6_Simple)
  142. {
  143. struct ifaddrs one, two;
  144. struct sockaddr_in a_one;
  145. struct sockaddr_in6 a_two;
  146. struct sockaddr_in6 net;
  147. const struct ifaddrs *result;
  148. memset(&net, 0, sizeof(net));
  149. one.ifa_next = &two;
  150. one.ifa_addr = (struct sockaddr*)&a_one;
  151. one.ifa_name = eth0;
  152. two.ifa_next = NULL;
  153. two.ifa_addr = (struct sockaddr*)&a_two;
  154. two.ifa_name = eth1;
  155. ipv4(&a_one, "10.11.12.13");
  156. ipv6(&a_two, "2001:1234:5678:90ab::cdef");
  157. ipv6(&net, "2001:1234:5678:90ab::dead:beef");
  158. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 64);
  159. ASSERT_EQ((struct sockaddr*)&a_two, result->ifa_addr);
  160. }
  161. TEST(CommonIPAddr, TestV6_Prefix57)
  162. {
  163. struct ifaddrs one, two;
  164. struct sockaddr_in6 a_one;
  165. struct sockaddr_in6 a_two;
  166. struct sockaddr_in6 net;
  167. const struct ifaddrs *result;
  168. memset(&net, 0, sizeof(net));
  169. one.ifa_next = &two;
  170. one.ifa_addr = (struct sockaddr*)&a_one;
  171. one.ifa_name = eth0;
  172. two.ifa_next = NULL;
  173. two.ifa_addr = (struct sockaddr*)&a_two;
  174. two.ifa_name = eth1;
  175. ipv6(&a_one, "2001:1234:5678:900F::cdef");
  176. ipv6(&a_two, "2001:1234:5678:90ab::cdef");
  177. ipv6(&net, "2001:1234:5678:90ab::dead:beef");
  178. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 57);
  179. ASSERT_EQ((struct sockaddr*)&a_two, result->ifa_addr);
  180. }
  181. TEST(CommonIPAddr, TestV6_PrefixTooLong)
  182. {
  183. struct ifaddrs one;
  184. struct sockaddr_in6 a_one;
  185. struct sockaddr_in6 net;
  186. const struct ifaddrs *result;
  187. memset(&net, 0, sizeof(net));
  188. one.ifa_next = NULL;
  189. one.ifa_addr = (struct sockaddr*)&a_one;
  190. one.ifa_name = eth0;
  191. ipv6(&a_one, "2001:1234:5678:900F::cdef");
  192. ipv6(&net, "2001:1234:5678:900F::cdee");
  193. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 9000);
  194. ASSERT_EQ(0, result);
  195. }
  196. TEST(CommonIPAddr, TestV6_PrefixZero)
  197. {
  198. struct ifaddrs one, two;
  199. struct sockaddr_in a_one;
  200. struct sockaddr_in6 a_two;
  201. struct sockaddr_in6 net;
  202. const struct ifaddrs *result;
  203. one.ifa_next = &two;
  204. one.ifa_addr = (struct sockaddr*)&a_one;
  205. one.ifa_name = eth0;
  206. two.ifa_next = NULL;
  207. two.ifa_addr = (struct sockaddr*)&a_two;
  208. two.ifa_name = eth1;
  209. ipv4(&a_one, "10.2.3.4");
  210. ipv6(&a_two, "2001:f00b::1");
  211. ipv6(&net, "ff00::1");
  212. result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 0);
  213. ASSERT_EQ((struct sockaddr*)&a_two, result->ifa_addr);
  214. }
  215. TEST(CommonIPAddr, ParseNetwork_Empty)
  216. {
  217. struct sockaddr_storage network;
  218. unsigned int prefix_len;
  219. bool ok;
  220. ok = parse_network("", &network, &prefix_len);
  221. ASSERT_EQ(ok, false);
  222. }
  223. TEST(CommonIPAddr, ParseNetwork_Bad_Junk)
  224. {
  225. struct sockaddr_storage network;
  226. unsigned int prefix_len;
  227. bool ok;
  228. ok = parse_network("foo", &network, &prefix_len);
  229. ASSERT_EQ(ok, false);
  230. }
  231. TEST(CommonIPAddr, ParseNetwork_Bad_SlashNum)
  232. {
  233. struct sockaddr_storage network;
  234. unsigned int prefix_len;
  235. bool ok;
  236. ok = parse_network("/24", &network, &prefix_len);
  237. ASSERT_EQ(ok, false);
  238. }
  239. TEST(CommonIPAddr, ParseNetwork_Bad_Slash)
  240. {
  241. struct sockaddr_storage network;
  242. unsigned int prefix_len;
  243. bool ok;
  244. ok = parse_network("/", &network, &prefix_len);
  245. ASSERT_EQ(ok, false);
  246. }
  247. TEST(CommonIPAddr, ParseNetwork_Bad_IPv4)
  248. {
  249. struct sockaddr_storage network;
  250. unsigned int prefix_len;
  251. bool ok;
  252. ok = parse_network("123.123.123.123", &network, &prefix_len);
  253. ASSERT_EQ(ok, false);
  254. }
  255. TEST(CommonIPAddr, ParseNetwork_Bad_IPv4Slash)
  256. {
  257. struct sockaddr_storage network;
  258. unsigned int prefix_len;
  259. bool ok;
  260. ok = parse_network("123.123.123.123/", &network, &prefix_len);
  261. ASSERT_EQ(ok, false);
  262. }
  263. TEST(CommonIPAddr, ParseNetwork_Bad_IPv4SlashNegative)
  264. {
  265. struct sockaddr_storage network;
  266. unsigned int prefix_len;
  267. bool ok;
  268. ok = parse_network("123.123.123.123/-3", &network, &prefix_len);
  269. ASSERT_EQ(ok, false);
  270. }
  271. TEST(CommonIPAddr, ParseNetwork_Bad_IPv4SlashJunk)
  272. {
  273. struct sockaddr_storage network;
  274. unsigned int prefix_len;
  275. bool ok;
  276. ok = parse_network("123.123.123.123/foo", &network, &prefix_len);
  277. ASSERT_EQ(ok, false);
  278. }
  279. TEST(CommonIPAddr, ParseNetwork_Bad_IPv6)
  280. {
  281. struct sockaddr_storage network;
  282. unsigned int prefix_len;
  283. bool ok;
  284. ok = parse_network("2001:1234:5678:90ab::dead:beef", &network, &prefix_len);
  285. ASSERT_EQ(ok, false);
  286. }
  287. TEST(CommonIPAddr, ParseNetwork_Bad_IPv6Slash)
  288. {
  289. struct sockaddr_storage network;
  290. unsigned int prefix_len;
  291. bool ok;
  292. ok = parse_network("2001:1234:5678:90ab::dead:beef/", &network, &prefix_len);
  293. ASSERT_EQ(ok, false);
  294. }
  295. TEST(CommonIPAddr, ParseNetwork_Bad_IPv6SlashNegative)
  296. {
  297. struct sockaddr_storage network;
  298. unsigned int prefix_len;
  299. bool ok;
  300. ok = parse_network("2001:1234:5678:90ab::dead:beef/-3", &network, &prefix_len);
  301. ASSERT_EQ(ok, false);
  302. }
  303. TEST(CommonIPAddr, ParseNetwork_Bad_IPv6SlashJunk)
  304. {
  305. struct sockaddr_storage network;
  306. unsigned int prefix_len;
  307. bool ok;
  308. ok = parse_network("2001:1234:5678:90ab::dead:beef/foo", &network, &prefix_len);
  309. ASSERT_EQ(ok, false);
  310. }
  311. TEST(CommonIPAddr, ParseNetwork_IPv4_0)
  312. {
  313. struct sockaddr_in network;
  314. struct sockaddr_storage net_storage;
  315. unsigned int prefix_len;
  316. bool ok;
  317. ok = parse_network("123.123.123.123/0", &net_storage, &prefix_len);
  318. network = *(struct sockaddr_in *) &net_storage;
  319. ASSERT_EQ(ok, true);
  320. ASSERT_EQ(0U, prefix_len);
  321. ASSERT_EQ(AF_INET, network.sin_family);
  322. ASSERT_EQ(0, network.sin_port);
  323. struct sockaddr_in want;
  324. ipv4(&want, "123.123.123.123");
  325. ASSERT_EQ(want.sin_addr.s_addr, network.sin_addr.s_addr);
  326. }
  327. TEST(CommonIPAddr, ParseNetwork_IPv4_13)
  328. {
  329. struct sockaddr_in network;
  330. struct sockaddr_storage net_storage;
  331. unsigned int prefix_len;
  332. bool ok;
  333. ok = parse_network("123.123.123.123/13", &net_storage, &prefix_len);
  334. network = *(struct sockaddr_in *) &net_storage;
  335. ASSERT_EQ(ok, true);
  336. ASSERT_EQ(13U, prefix_len);
  337. ASSERT_EQ(AF_INET, network.sin_family);
  338. ASSERT_EQ(0, network.sin_port);
  339. struct sockaddr_in want;
  340. ipv4(&want, "123.123.123.123");
  341. ASSERT_EQ(want.sin_addr.s_addr, network.sin_addr.s_addr);
  342. }
  343. TEST(CommonIPAddr, ParseNetwork_IPv4_32)
  344. {
  345. struct sockaddr_in network;
  346. struct sockaddr_storage net_storage;
  347. unsigned int prefix_len;
  348. bool ok;
  349. ok = parse_network("123.123.123.123/32", &net_storage, &prefix_len);
  350. network = *(struct sockaddr_in *) &net_storage;
  351. ASSERT_EQ(ok, true);
  352. ASSERT_EQ(32U, prefix_len);
  353. ASSERT_EQ(AF_INET, network.sin_family);
  354. ASSERT_EQ(0, network.sin_port);
  355. struct sockaddr_in want;
  356. ipv4(&want, "123.123.123.123");
  357. ASSERT_EQ(want.sin_addr.s_addr, network.sin_addr.s_addr);
  358. }
  359. TEST(CommonIPAddr, ParseNetwork_IPv4_42)
  360. {
  361. struct sockaddr_in network;
  362. struct sockaddr_storage net_storage;
  363. unsigned int prefix_len;
  364. bool ok;
  365. ok = parse_network("123.123.123.123/42", &net_storage, &prefix_len);
  366. network = *(struct sockaddr_in *) &net_storage;
  367. ASSERT_EQ(ok, true);
  368. ASSERT_EQ(42U, prefix_len);
  369. ASSERT_EQ(AF_INET, network.sin_family);
  370. ASSERT_EQ(0, network.sin_port);
  371. struct sockaddr_in want;
  372. ipv4(&want, "123.123.123.123");
  373. ASSERT_EQ(want.sin_addr.s_addr, network.sin_addr.s_addr);
  374. }
  375. TEST(CommonIPAddr, ParseNetwork_IPv6_0)
  376. {
  377. struct sockaddr_in6 network;
  378. struct sockaddr_storage net_storage;
  379. unsigned int prefix_len;
  380. bool ok;
  381. ok = parse_network("2001:1234:5678:90ab::dead:beef/0", &net_storage, &prefix_len);
  382. network = *(struct sockaddr_in6 *) &net_storage;
  383. ASSERT_EQ(ok, true);
  384. ASSERT_EQ(0U, prefix_len);
  385. ASSERT_EQ(AF_INET6, network.sin6_family);
  386. ASSERT_EQ(0, network.sin6_port);
  387. struct sockaddr_in6 want;
  388. ipv6(&want, "2001:1234:5678:90ab::dead:beef");
  389. ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));
  390. }
  391. TEST(CommonIPAddr, ParseNetwork_IPv6_67)
  392. {
  393. struct sockaddr_in6 network;
  394. struct sockaddr_storage net_storage;
  395. unsigned int prefix_len;
  396. bool ok;
  397. ok = parse_network("2001:1234:5678:90ab::dead:beef/67", &net_storage, &prefix_len);
  398. network = *(struct sockaddr_in6 *) &net_storage;
  399. ASSERT_EQ(ok, true);
  400. ASSERT_EQ(67U, prefix_len);
  401. ASSERT_EQ(AF_INET6, network.sin6_family);
  402. ASSERT_EQ(0, network.sin6_port);
  403. struct sockaddr_in6 want;
  404. ipv6(&want, "2001:1234:5678:90ab::dead:beef");
  405. ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));
  406. }
  407. TEST(CommonIPAddr, ParseNetwork_IPv6_128)
  408. {
  409. struct sockaddr_in6 network;
  410. struct sockaddr_storage net_storage;
  411. unsigned int prefix_len;
  412. bool ok;
  413. ok = parse_network("2001:1234:5678:90ab::dead:beef/128", &net_storage, &prefix_len);
  414. network = *(struct sockaddr_in6 *) &net_storage;
  415. ASSERT_EQ(ok, true);
  416. ASSERT_EQ(128U, prefix_len);
  417. ASSERT_EQ(AF_INET6, network.sin6_family);
  418. ASSERT_EQ(0, network.sin6_port);
  419. struct sockaddr_in6 want;
  420. ipv6(&want, "2001:1234:5678:90ab::dead:beef");
  421. ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));
  422. }
  423. TEST(CommonIPAddr, ParseNetwork_IPv6_9000)
  424. {
  425. struct sockaddr_in6 network;
  426. struct sockaddr_storage net_storage;
  427. unsigned int prefix_len;
  428. bool ok;
  429. ok = parse_network("2001:1234:5678:90ab::dead:beef/9000", &net_storage, &prefix_len);
  430. network = *(struct sockaddr_in6 *) &net_storage;
  431. ASSERT_EQ(ok, true);
  432. ASSERT_EQ(9000U, prefix_len);
  433. ASSERT_EQ(AF_INET6, network.sin6_family);
  434. ASSERT_EQ(0, network.sin6_port);
  435. struct sockaddr_in6 want;
  436. ipv6(&want, "2001:1234:5678:90ab::dead:beef");
  437. ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));
  438. }
  439. TEST(pick_address, find_ip_in_subnet_list)
  440. {
  441. struct ifaddrs one, two;
  442. struct sockaddr_in a_one;
  443. struct sockaddr_in a_two;
  444. const struct sockaddr *result;
  445. one.ifa_next = &two;
  446. one.ifa_addr = (struct sockaddr*)&a_one;
  447. one.ifa_name = eth0;
  448. two.ifa_next = NULL;
  449. two.ifa_addr = (struct sockaddr*)&a_two;
  450. two.ifa_name = eth1;
  451. ipv4(&a_one, "10.1.1.2");
  452. ipv4(&a_two, "10.2.1.123");
  453. // match by network
  454. result = find_ip_in_subnet_list(
  455. g_ceph_context,
  456. &one,
  457. "10.1.0.0/16",
  458. "eth0");
  459. ASSERT_EQ((struct sockaddr*)&a_one, result);
  460. result = find_ip_in_subnet_list(
  461. g_ceph_context,
  462. &one,
  463. "10.2.0.0/16",
  464. "eth1");
  465. ASSERT_EQ((struct sockaddr*)&a_two, result);
  466. // match by eth name
  467. result = find_ip_in_subnet_list(
  468. g_ceph_context,
  469. &one,
  470. "10.0.0.0/8",
  471. "eth0");
  472. ASSERT_EQ((struct sockaddr*)&a_one, result);
  473. result = find_ip_in_subnet_list(
  474. g_ceph_context,
  475. &one,
  476. "10.0.0.0/8",
  477. "eth1");
  478. ASSERT_EQ((struct sockaddr*)&a_two, result);
  479. }