bind_wildcard.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright Amazon.com Inc. or its affiliates. */
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include "kselftest_harness.h"
  6. static const __u32 in4addr_any = INADDR_ANY;
  7. static const __u32 in4addr_loopback = INADDR_LOOPBACK;
  8. static const struct in6_addr in6addr_v4mapped_any = {
  9. .s6_addr = {
  10. 0, 0, 0, 0,
  11. 0, 0, 0, 0,
  12. 0, 0, 255, 255,
  13. 0, 0, 0, 0
  14. }
  15. };
  16. static const struct in6_addr in6addr_v4mapped_loopback = {
  17. .s6_addr = {
  18. 0, 0, 0, 0,
  19. 0, 0, 0, 0,
  20. 0, 0, 255, 255,
  21. 127, 0, 0, 1
  22. }
  23. };
  24. #define NR_SOCKETS 8
  25. FIXTURE(bind_wildcard)
  26. {
  27. int fd[NR_SOCKETS];
  28. socklen_t addrlen[NR_SOCKETS];
  29. union {
  30. struct sockaddr addr;
  31. struct sockaddr_in addr4;
  32. struct sockaddr_in6 addr6;
  33. } addr[NR_SOCKETS];
  34. };
  35. FIXTURE_VARIANT(bind_wildcard)
  36. {
  37. sa_family_t family[2];
  38. const void *addr[2];
  39. bool ipv6_only[2];
  40. /* 6 bind() calls below follow two bind() for the defined 2 addresses:
  41. *
  42. * 0.0.0.0
  43. * 127.0.0.1
  44. * ::
  45. * ::1
  46. * ::ffff:0.0.0.0
  47. * ::ffff:127.0.0.1
  48. */
  49. int expected_errno[NR_SOCKETS];
  50. int expected_reuse_errno[NR_SOCKETS];
  51. };
  52. /* (IPv4, IPv4) */
  53. FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v4_local)
  54. {
  55. .family = {AF_INET, AF_INET},
  56. .addr = {&in4addr_any, &in4addr_loopback},
  57. .expected_errno = {0, EADDRINUSE,
  58. EADDRINUSE, EADDRINUSE,
  59. EADDRINUSE, 0,
  60. EADDRINUSE, EADDRINUSE},
  61. .expected_reuse_errno = {0, 0,
  62. EADDRINUSE, EADDRINUSE,
  63. EADDRINUSE, 0,
  64. EADDRINUSE, EADDRINUSE},
  65. };
  66. FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v4_any)
  67. {
  68. .family = {AF_INET, AF_INET},
  69. .addr = {&in4addr_loopback, &in4addr_any},
  70. .expected_errno = {0, EADDRINUSE,
  71. EADDRINUSE, EADDRINUSE,
  72. EADDRINUSE, 0,
  73. EADDRINUSE, EADDRINUSE},
  74. .expected_reuse_errno = {0, 0,
  75. EADDRINUSE, EADDRINUSE,
  76. EADDRINUSE, 0,
  77. EADDRINUSE, EADDRINUSE},
  78. };
  79. /* (IPv4, IPv6) */
  80. FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_any)
  81. {
  82. .family = {AF_INET, AF_INET6},
  83. .addr = {&in4addr_any, &in6addr_any},
  84. .expected_errno = {0, EADDRINUSE,
  85. EADDRINUSE, EADDRINUSE,
  86. EADDRINUSE, 0,
  87. EADDRINUSE, EADDRINUSE},
  88. .expected_reuse_errno = {0, 0,
  89. EADDRINUSE, EADDRINUSE,
  90. EADDRINUSE, EADDRINUSE,
  91. EADDRINUSE, EADDRINUSE},
  92. };
  93. FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_any_only)
  94. {
  95. .family = {AF_INET, AF_INET6},
  96. .addr = {&in4addr_any, &in6addr_any},
  97. .ipv6_only = {false, true},
  98. .expected_errno = {0, 0,
  99. EADDRINUSE, EADDRINUSE,
  100. EADDRINUSE, EADDRINUSE,
  101. EADDRINUSE, EADDRINUSE},
  102. .expected_reuse_errno = {0, 0,
  103. EADDRINUSE, EADDRINUSE,
  104. EADDRINUSE, EADDRINUSE,
  105. EADDRINUSE, EADDRINUSE},
  106. };
  107. FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_local)
  108. {
  109. .family = {AF_INET, AF_INET6},
  110. .addr = {&in4addr_any, &in6addr_loopback},
  111. .expected_errno = {0, 0,
  112. EADDRINUSE, EADDRINUSE,
  113. EADDRINUSE, EADDRINUSE,
  114. EADDRINUSE, EADDRINUSE},
  115. .expected_reuse_errno = {0, 0,
  116. EADDRINUSE, EADDRINUSE,
  117. EADDRINUSE, EADDRINUSE,
  118. EADDRINUSE, EADDRINUSE},
  119. };
  120. FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_any)
  121. {
  122. .family = {AF_INET, AF_INET6},
  123. .addr = {&in4addr_any, &in6addr_v4mapped_any},
  124. .expected_errno = {0, EADDRINUSE,
  125. EADDRINUSE, EADDRINUSE,
  126. EADDRINUSE, 0,
  127. EADDRINUSE, EADDRINUSE},
  128. .expected_reuse_errno = {0, 0,
  129. EADDRINUSE, EADDRINUSE,
  130. EADDRINUSE, 0,
  131. EADDRINUSE, EADDRINUSE},
  132. };
  133. FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_local)
  134. {
  135. .family = {AF_INET, AF_INET6},
  136. .addr = {&in4addr_any, &in6addr_v4mapped_loopback},
  137. .expected_errno = {0, EADDRINUSE,
  138. EADDRINUSE, EADDRINUSE,
  139. EADDRINUSE, 0,
  140. EADDRINUSE, EADDRINUSE},
  141. .expected_reuse_errno = {0, 0,
  142. EADDRINUSE, EADDRINUSE,
  143. EADDRINUSE, 0,
  144. EADDRINUSE, EADDRINUSE},
  145. };
  146. FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any)
  147. {
  148. .family = {AF_INET, AF_INET6},
  149. .addr = {&in4addr_loopback, &in6addr_any},
  150. .expected_errno = {0, EADDRINUSE,
  151. EADDRINUSE, EADDRINUSE,
  152. EADDRINUSE, 0,
  153. EADDRINUSE, EADDRINUSE},
  154. .expected_reuse_errno = {0, 0,
  155. EADDRINUSE, EADDRINUSE,
  156. EADDRINUSE, EADDRINUSE,
  157. EADDRINUSE, EADDRINUSE},
  158. };
  159. FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any_only)
  160. {
  161. .family = {AF_INET, AF_INET6},
  162. .addr = {&in4addr_loopback, &in6addr_any},
  163. .ipv6_only = {false, true},
  164. .expected_errno = {0, 0,
  165. EADDRINUSE, EADDRINUSE,
  166. EADDRINUSE, EADDRINUSE,
  167. EADDRINUSE, EADDRINUSE},
  168. .expected_reuse_errno = {0, 0,
  169. EADDRINUSE, EADDRINUSE,
  170. EADDRINUSE, EADDRINUSE,
  171. EADDRINUSE, EADDRINUSE},
  172. };
  173. FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_local)
  174. {
  175. .family = {AF_INET, AF_INET6},
  176. .addr = {&in4addr_loopback, &in6addr_loopback},
  177. .expected_errno = {0, 0,
  178. EADDRINUSE, EADDRINUSE,
  179. EADDRINUSE, EADDRINUSE,
  180. EADDRINUSE, EADDRINUSE},
  181. .expected_reuse_errno = {0, 0,
  182. EADDRINUSE, EADDRINUSE,
  183. EADDRINUSE, EADDRINUSE,
  184. EADDRINUSE, EADDRINUSE},
  185. };
  186. FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_any)
  187. {
  188. .family = {AF_INET, AF_INET6},
  189. .addr = {&in4addr_loopback, &in6addr_v4mapped_any},
  190. .expected_errno = {0, EADDRINUSE,
  191. EADDRINUSE, EADDRINUSE,
  192. EADDRINUSE, 0,
  193. EADDRINUSE, EADDRINUSE},
  194. .expected_reuse_errno = {0, 0,
  195. EADDRINUSE, EADDRINUSE,
  196. EADDRINUSE, 0,
  197. EADDRINUSE, EADDRINUSE},
  198. };
  199. FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_local)
  200. {
  201. .family = {AF_INET, AF_INET6},
  202. .addr = {&in4addr_loopback, &in6addr_v4mapped_loopback},
  203. .expected_errno = {0, EADDRINUSE,
  204. EADDRINUSE, EADDRINUSE,
  205. EADDRINUSE, 0,
  206. EADDRINUSE, EADDRINUSE},
  207. .expected_reuse_errno = {0, 0,
  208. EADDRINUSE, EADDRINUSE,
  209. EADDRINUSE, 0,
  210. EADDRINUSE, EADDRINUSE},
  211. };
  212. /* (IPv6, IPv4) */
  213. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v4_any)
  214. {
  215. .family = {AF_INET6, AF_INET},
  216. .addr = {&in6addr_any, &in4addr_any},
  217. .expected_errno = {0, EADDRINUSE,
  218. EADDRINUSE, EADDRINUSE,
  219. EADDRINUSE, EADDRINUSE,
  220. EADDRINUSE, EADDRINUSE},
  221. .expected_reuse_errno = {0, 0,
  222. EADDRINUSE, EADDRINUSE,
  223. EADDRINUSE, EADDRINUSE,
  224. EADDRINUSE, EADDRINUSE},
  225. };
  226. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v4_any)
  227. {
  228. .family = {AF_INET6, AF_INET},
  229. .addr = {&in6addr_any, &in4addr_any},
  230. .ipv6_only = {true, false},
  231. .expected_errno = {0, 0,
  232. EADDRINUSE, EADDRINUSE,
  233. EADDRINUSE, EADDRINUSE,
  234. EADDRINUSE, EADDRINUSE},
  235. .expected_reuse_errno = {0, 0,
  236. EADDRINUSE, EADDRINUSE,
  237. EADDRINUSE, EADDRINUSE,
  238. EADDRINUSE, EADDRINUSE},
  239. };
  240. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v4_local)
  241. {
  242. .family = {AF_INET6, AF_INET},
  243. .addr = {&in6addr_any, &in4addr_loopback},
  244. .expected_errno = {0, EADDRINUSE,
  245. EADDRINUSE, EADDRINUSE,
  246. EADDRINUSE, EADDRINUSE,
  247. EADDRINUSE, EADDRINUSE},
  248. .expected_reuse_errno = {0, 0,
  249. EADDRINUSE, EADDRINUSE,
  250. EADDRINUSE, EADDRINUSE,
  251. EADDRINUSE, EADDRINUSE},
  252. };
  253. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v4_local)
  254. {
  255. .family = {AF_INET6, AF_INET},
  256. .addr = {&in6addr_any, &in4addr_loopback},
  257. .ipv6_only = {true, false},
  258. .expected_errno = {0, 0,
  259. EADDRINUSE, EADDRINUSE,
  260. EADDRINUSE, EADDRINUSE,
  261. EADDRINUSE, EADDRINUSE},
  262. .expected_reuse_errno = {0, 0,
  263. EADDRINUSE, EADDRINUSE,
  264. EADDRINUSE, EADDRINUSE,
  265. EADDRINUSE, EADDRINUSE},
  266. };
  267. FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v4_any)
  268. {
  269. .family = {AF_INET6, AF_INET},
  270. .addr = {&in6addr_loopback, &in4addr_any},
  271. .expected_errno = {0, 0,
  272. EADDRINUSE, EADDRINUSE,
  273. EADDRINUSE, EADDRINUSE,
  274. EADDRINUSE, EADDRINUSE},
  275. .expected_reuse_errno = {0, 0,
  276. EADDRINUSE, EADDRINUSE,
  277. EADDRINUSE, EADDRINUSE,
  278. EADDRINUSE, EADDRINUSE},
  279. };
  280. FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v4_local)
  281. {
  282. .family = {AF_INET6, AF_INET},
  283. .addr = {&in6addr_loopback, &in4addr_loopback},
  284. .expected_errno = {0, 0,
  285. EADDRINUSE, EADDRINUSE,
  286. EADDRINUSE, EADDRINUSE,
  287. EADDRINUSE, EADDRINUSE},
  288. .expected_reuse_errno = {0, 0,
  289. EADDRINUSE, EADDRINUSE,
  290. EADDRINUSE, EADDRINUSE,
  291. EADDRINUSE, EADDRINUSE},
  292. };
  293. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v4_any)
  294. {
  295. .family = {AF_INET6, AF_INET},
  296. .addr = {&in6addr_v4mapped_any, &in4addr_any},
  297. .expected_errno = {0, EADDRINUSE,
  298. EADDRINUSE, EADDRINUSE,
  299. EADDRINUSE, 0,
  300. EADDRINUSE, EADDRINUSE},
  301. .expected_reuse_errno = {0, 0,
  302. EADDRINUSE, EADDRINUSE,
  303. EADDRINUSE, 0,
  304. EADDRINUSE, EADDRINUSE},
  305. };
  306. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v4_local)
  307. {
  308. .family = {AF_INET6, AF_INET},
  309. .addr = {&in6addr_v4mapped_any, &in4addr_loopback},
  310. .expected_errno = {0, EADDRINUSE,
  311. EADDRINUSE, EADDRINUSE,
  312. EADDRINUSE, 0,
  313. EADDRINUSE, EADDRINUSE},
  314. .expected_reuse_errno = {0, 0,
  315. EADDRINUSE, EADDRINUSE,
  316. EADDRINUSE, 0,
  317. EADDRINUSE, EADDRINUSE},
  318. };
  319. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_local_v4_any)
  320. {
  321. .family = {AF_INET6, AF_INET},
  322. .addr = {&in6addr_v4mapped_loopback, &in4addr_any},
  323. .expected_errno = {0, EADDRINUSE,
  324. EADDRINUSE, EADDRINUSE,
  325. EADDRINUSE, 0,
  326. EADDRINUSE, EADDRINUSE},
  327. .expected_reuse_errno = {0, 0,
  328. EADDRINUSE, EADDRINUSE,
  329. EADDRINUSE, 0,
  330. EADDRINUSE, EADDRINUSE},
  331. };
  332. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_local_v4_local)
  333. {
  334. .family = {AF_INET6, AF_INET},
  335. .addr = {&in6addr_v4mapped_loopback, &in4addr_loopback},
  336. .expected_errno = {0, EADDRINUSE,
  337. EADDRINUSE, EADDRINUSE,
  338. EADDRINUSE, 0,
  339. EADDRINUSE, EADDRINUSE},
  340. .expected_reuse_errno = {0, 0,
  341. EADDRINUSE, EADDRINUSE,
  342. EADDRINUSE, 0,
  343. EADDRINUSE, EADDRINUSE},
  344. };
  345. /* (IPv6, IPv6) */
  346. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_any)
  347. {
  348. .family = {AF_INET6, AF_INET6},
  349. .addr = {&in6addr_any, &in6addr_any},
  350. .expected_errno = {0, EADDRINUSE,
  351. EADDRINUSE, EADDRINUSE,
  352. EADDRINUSE, EADDRINUSE,
  353. EADDRINUSE, EADDRINUSE},
  354. .expected_reuse_errno = {0, 0,
  355. EADDRINUSE, EADDRINUSE,
  356. EADDRINUSE, EADDRINUSE,
  357. EADDRINUSE, EADDRINUSE},
  358. };
  359. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_any)
  360. {
  361. .family = {AF_INET6, AF_INET6},
  362. .addr = {&in6addr_any, &in6addr_any},
  363. .ipv6_only = {true, false},
  364. .expected_errno = {0, EADDRINUSE,
  365. 0, EADDRINUSE,
  366. EADDRINUSE, EADDRINUSE,
  367. EADDRINUSE, EADDRINUSE},
  368. .expected_reuse_errno = {0, 0,
  369. EADDRINUSE, EADDRINUSE,
  370. EADDRINUSE, EADDRINUSE,
  371. EADDRINUSE, EADDRINUSE},
  372. };
  373. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_any_only)
  374. {
  375. .family = {AF_INET6, AF_INET6},
  376. .addr = {&in6addr_any, &in6addr_any},
  377. .ipv6_only = {false, true},
  378. .expected_errno = {0, EADDRINUSE,
  379. EADDRINUSE, EADDRINUSE,
  380. EADDRINUSE, EADDRINUSE,
  381. EADDRINUSE, EADDRINUSE},
  382. .expected_reuse_errno = {0, 0,
  383. EADDRINUSE, EADDRINUSE,
  384. EADDRINUSE, EADDRINUSE,
  385. EADDRINUSE, EADDRINUSE},
  386. };
  387. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_any_only)
  388. {
  389. .family = {AF_INET6, AF_INET6},
  390. .addr = {&in6addr_any, &in6addr_any},
  391. .ipv6_only = {true, true},
  392. .expected_errno = {0, EADDRINUSE,
  393. 0, EADDRINUSE,
  394. EADDRINUSE, EADDRINUSE,
  395. EADDRINUSE, EADDRINUSE},
  396. .expected_reuse_errno = {0, 0,
  397. 0, EADDRINUSE,
  398. EADDRINUSE, EADDRINUSE,
  399. EADDRINUSE, EADDRINUSE},
  400. };
  401. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_local)
  402. {
  403. .family = {AF_INET6, AF_INET6},
  404. .addr = {&in6addr_any, &in6addr_loopback},
  405. .expected_errno = {0, EADDRINUSE,
  406. EADDRINUSE, EADDRINUSE,
  407. EADDRINUSE, EADDRINUSE,
  408. EADDRINUSE, EADDRINUSE},
  409. .expected_reuse_errno = {0, 0,
  410. EADDRINUSE, EADDRINUSE,
  411. EADDRINUSE, EADDRINUSE,
  412. EADDRINUSE, EADDRINUSE},
  413. };
  414. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_local)
  415. {
  416. .family = {AF_INET6, AF_INET6},
  417. .addr = {&in6addr_any, &in6addr_loopback},
  418. .ipv6_only = {true, false},
  419. .expected_errno = {0, EADDRINUSE,
  420. 0, EADDRINUSE,
  421. EADDRINUSE, EADDRINUSE,
  422. EADDRINUSE, EADDRINUSE},
  423. .expected_reuse_errno = {0, 0,
  424. 0, EADDRINUSE,
  425. EADDRINUSE, EADDRINUSE,
  426. EADDRINUSE, EADDRINUSE},
  427. };
  428. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_any)
  429. {
  430. .family = {AF_INET6, AF_INET6},
  431. .addr = {&in6addr_any, &in6addr_v4mapped_any},
  432. .expected_errno = {0, EADDRINUSE,
  433. EADDRINUSE, EADDRINUSE,
  434. EADDRINUSE, EADDRINUSE,
  435. EADDRINUSE, EADDRINUSE},
  436. .expected_reuse_errno = {0, 0,
  437. EADDRINUSE, EADDRINUSE,
  438. EADDRINUSE, EADDRINUSE,
  439. EADDRINUSE, EADDRINUSE},
  440. };
  441. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_v4mapped_any)
  442. {
  443. .family = {AF_INET6, AF_INET6},
  444. .addr = {&in6addr_any, &in6addr_v4mapped_any},
  445. .ipv6_only = {true, false},
  446. .expected_errno = {0, 0,
  447. EADDRINUSE, EADDRINUSE,
  448. EADDRINUSE, EADDRINUSE,
  449. EADDRINUSE, EADDRINUSE},
  450. .expected_reuse_errno = {0, 0,
  451. EADDRINUSE, EADDRINUSE,
  452. EADDRINUSE, EADDRINUSE,
  453. EADDRINUSE, EADDRINUSE},
  454. };
  455. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_local)
  456. {
  457. .family = {AF_INET6, AF_INET6},
  458. .addr = {&in6addr_any, &in6addr_v4mapped_loopback},
  459. .expected_errno = {0, EADDRINUSE,
  460. EADDRINUSE, EADDRINUSE,
  461. EADDRINUSE, EADDRINUSE,
  462. EADDRINUSE, EADDRINUSE},
  463. .expected_reuse_errno = {0, 0,
  464. EADDRINUSE, EADDRINUSE,
  465. EADDRINUSE, EADDRINUSE,
  466. EADDRINUSE, EADDRINUSE},
  467. };
  468. FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_v4mapped_local)
  469. {
  470. .family = {AF_INET6, AF_INET6},
  471. .addr = {&in6addr_any, &in6addr_v4mapped_loopback},
  472. .ipv6_only = {true, false},
  473. .expected_errno = {0, 0,
  474. EADDRINUSE, EADDRINUSE,
  475. EADDRINUSE, EADDRINUSE,
  476. EADDRINUSE, EADDRINUSE},
  477. .expected_reuse_errno = {0, 0,
  478. EADDRINUSE, EADDRINUSE,
  479. EADDRINUSE, EADDRINUSE,
  480. EADDRINUSE, EADDRINUSE},
  481. };
  482. FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any)
  483. {
  484. .family = {AF_INET6, AF_INET6},
  485. .addr = {&in6addr_loopback, &in6addr_any},
  486. .expected_errno = {0, EADDRINUSE,
  487. 0, EADDRINUSE,
  488. EADDRINUSE, EADDRINUSE,
  489. EADDRINUSE, EADDRINUSE},
  490. .expected_reuse_errno = {0, 0,
  491. EADDRINUSE, EADDRINUSE,
  492. EADDRINUSE, EADDRINUSE,
  493. EADDRINUSE, EADDRINUSE},
  494. };
  495. FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any_only)
  496. {
  497. .family = {AF_INET6, AF_INET6},
  498. .addr = {&in6addr_loopback, &in6addr_any},
  499. .ipv6_only = {false, true},
  500. .expected_errno = {0, EADDRINUSE,
  501. 0, EADDRINUSE,
  502. EADDRINUSE, EADDRINUSE,
  503. EADDRINUSE, EADDRINUSE},
  504. .expected_reuse_errno = {0, 0,
  505. 0, EADDRINUSE,
  506. EADDRINUSE, EADDRINUSE,
  507. EADDRINUSE, EADDRINUSE},
  508. };
  509. FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_v4mapped_any)
  510. {
  511. .family = {AF_INET6, AF_INET6},
  512. .addr = {&in6addr_loopback, &in6addr_v4mapped_any},
  513. .expected_errno = {0, 0,
  514. EADDRINUSE, EADDRINUSE,
  515. EADDRINUSE, EADDRINUSE,
  516. EADDRINUSE, EADDRINUSE},
  517. .expected_reuse_errno = {0, 0,
  518. EADDRINUSE, EADDRINUSE,
  519. EADDRINUSE, EADDRINUSE,
  520. EADDRINUSE, EADDRINUSE},
  521. };
  522. FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_v4mapped_local)
  523. {
  524. .family = {AF_INET6, AF_INET6},
  525. .addr = {&in6addr_loopback, &in6addr_v4mapped_loopback},
  526. .expected_errno = {0, 0,
  527. EADDRINUSE, EADDRINUSE,
  528. EADDRINUSE, EADDRINUSE,
  529. EADDRINUSE, EADDRINUSE},
  530. .expected_reuse_errno = {0, 0,
  531. EADDRINUSE, EADDRINUSE,
  532. EADDRINUSE, EADDRINUSE,
  533. EADDRINUSE, EADDRINUSE},
  534. };
  535. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_any)
  536. {
  537. .family = {AF_INET6, AF_INET6},
  538. .addr = {&in6addr_v4mapped_any, &in6addr_any},
  539. .expected_errno = {0, EADDRINUSE,
  540. EADDRINUSE, EADDRINUSE,
  541. EADDRINUSE, 0,
  542. EADDRINUSE, EADDRINUSE},
  543. .expected_reuse_errno = {0, 0,
  544. EADDRINUSE, EADDRINUSE,
  545. EADDRINUSE, EADDRINUSE,
  546. EADDRINUSE, EADDRINUSE},
  547. };
  548. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_any_only)
  549. {
  550. .family = {AF_INET6, AF_INET6},
  551. .addr = {&in6addr_v4mapped_any, &in6addr_any},
  552. .ipv6_only = {false, true},
  553. .expected_errno = {0, 0,
  554. EADDRINUSE, EADDRINUSE,
  555. EADDRINUSE, EADDRINUSE,
  556. EADDRINUSE, EADDRINUSE},
  557. .expected_reuse_errno = {0, 0,
  558. EADDRINUSE, EADDRINUSE,
  559. EADDRINUSE, EADDRINUSE,
  560. EADDRINUSE, EADDRINUSE},
  561. };
  562. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_local)
  563. {
  564. .family = {AF_INET6, AF_INET6},
  565. .addr = {&in6addr_v4mapped_any, &in6addr_loopback},
  566. .expected_errno = {0, 0,
  567. EADDRINUSE, EADDRINUSE,
  568. EADDRINUSE, EADDRINUSE,
  569. EADDRINUSE, EADDRINUSE},
  570. .expected_reuse_errno = {0, 0,
  571. EADDRINUSE, EADDRINUSE,
  572. EADDRINUSE, EADDRINUSE,
  573. EADDRINUSE, EADDRINUSE},
  574. };
  575. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_v4mapped_local)
  576. {
  577. .family = {AF_INET6, AF_INET6},
  578. .addr = {&in6addr_v4mapped_any, &in6addr_v4mapped_loopback},
  579. .expected_errno = {0, EADDRINUSE,
  580. EADDRINUSE, EADDRINUSE,
  581. EADDRINUSE, 0,
  582. EADDRINUSE, EADDRINUSE},
  583. .expected_reuse_errno = {0, 0,
  584. EADDRINUSE, EADDRINUSE,
  585. EADDRINUSE, 0,
  586. EADDRINUSE, EADDRINUSE},
  587. };
  588. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_any)
  589. {
  590. .family = {AF_INET6, AF_INET6},
  591. .addr = {&in6addr_v4mapped_loopback, &in6addr_any},
  592. .expected_errno = {0, EADDRINUSE,
  593. EADDRINUSE, EADDRINUSE,
  594. EADDRINUSE, 0,
  595. EADDRINUSE, EADDRINUSE},
  596. .expected_reuse_errno = {0, 0,
  597. EADDRINUSE, EADDRINUSE,
  598. EADDRINUSE, EADDRINUSE,
  599. EADDRINUSE, EADDRINUSE},
  600. };
  601. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_any_only)
  602. {
  603. .family = {AF_INET6, AF_INET6},
  604. .addr = {&in6addr_v4mapped_loopback, &in6addr_any},
  605. .ipv6_only = {false, true},
  606. .expected_errno = {0, 0,
  607. EADDRINUSE, EADDRINUSE,
  608. EADDRINUSE, EADDRINUSE,
  609. EADDRINUSE, EADDRINUSE},
  610. .expected_reuse_errno = {0, 0,
  611. EADDRINUSE, EADDRINUSE,
  612. EADDRINUSE, EADDRINUSE,
  613. EADDRINUSE, EADDRINUSE},
  614. };
  615. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_local)
  616. {
  617. .family = {AF_INET6, AF_INET6},
  618. .addr = {&in6addr_v4mapped_loopback, &in6addr_loopback},
  619. .expected_errno = {0, 0,
  620. EADDRINUSE, EADDRINUSE,
  621. EADDRINUSE, EADDRINUSE,
  622. EADDRINUSE, EADDRINUSE},
  623. .expected_reuse_errno = {0, 0,
  624. EADDRINUSE, EADDRINUSE,
  625. EADDRINUSE, EADDRINUSE,
  626. EADDRINUSE, EADDRINUSE},
  627. };
  628. FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_v4mapped_any)
  629. {
  630. .family = {AF_INET6, AF_INET6},
  631. .addr = {&in6addr_v4mapped_loopback, &in6addr_v4mapped_any},
  632. .expected_errno = {0, EADDRINUSE,
  633. EADDRINUSE, EADDRINUSE,
  634. EADDRINUSE, 0,
  635. EADDRINUSE, EADDRINUSE},
  636. .expected_reuse_errno = {0, 0,
  637. EADDRINUSE, EADDRINUSE,
  638. EADDRINUSE, 0,
  639. EADDRINUSE, EADDRINUSE},
  640. };
  641. static void setup_addr(FIXTURE_DATA(bind_wildcard) *self, int i,
  642. int family, const void *addr_const)
  643. {
  644. if (family == AF_INET) {
  645. struct sockaddr_in *addr4 = &self->addr[i].addr4;
  646. const __u32 *addr4_const = addr_const;
  647. addr4->sin_family = AF_INET;
  648. addr4->sin_port = htons(0);
  649. addr4->sin_addr.s_addr = htonl(*addr4_const);
  650. self->addrlen[i] = sizeof(struct sockaddr_in);
  651. } else {
  652. struct sockaddr_in6 *addr6 = &self->addr[i].addr6;
  653. const struct in6_addr *addr6_const = addr_const;
  654. addr6->sin6_family = AF_INET6;
  655. addr6->sin6_port = htons(0);
  656. addr6->sin6_addr = *addr6_const;
  657. self->addrlen[i] = sizeof(struct sockaddr_in6);
  658. }
  659. }
  660. FIXTURE_SETUP(bind_wildcard)
  661. {
  662. setup_addr(self, 0, variant->family[0], variant->addr[0]);
  663. setup_addr(self, 1, variant->family[1], variant->addr[1]);
  664. setup_addr(self, 2, AF_INET, &in4addr_any);
  665. setup_addr(self, 3, AF_INET, &in4addr_loopback);
  666. setup_addr(self, 4, AF_INET6, &in6addr_any);
  667. setup_addr(self, 5, AF_INET6, &in6addr_loopback);
  668. setup_addr(self, 6, AF_INET6, &in6addr_v4mapped_any);
  669. setup_addr(self, 7, AF_INET6, &in6addr_v4mapped_loopback);
  670. }
  671. FIXTURE_TEARDOWN(bind_wildcard)
  672. {
  673. int i;
  674. for (i = 0; i < NR_SOCKETS; i++)
  675. close(self->fd[i]);
  676. }
  677. void bind_socket(struct __test_metadata *_metadata,
  678. FIXTURE_DATA(bind_wildcard) *self,
  679. const FIXTURE_VARIANT(bind_wildcard) *variant,
  680. int i, int reuse)
  681. {
  682. int ret;
  683. self->fd[i] = socket(self->addr[i].addr.sa_family, SOCK_STREAM, 0);
  684. ASSERT_GT(self->fd[i], 0);
  685. if (i < 2 && variant->ipv6_only[i]) {
  686. ret = setsockopt(self->fd[i], SOL_IPV6, IPV6_V6ONLY, &(int){1}, sizeof(int));
  687. ASSERT_EQ(ret, 0);
  688. }
  689. if (i < 2 && reuse) {
  690. ret = setsockopt(self->fd[i], SOL_SOCKET, reuse, &(int){1}, sizeof(int));
  691. ASSERT_EQ(ret, 0);
  692. }
  693. self->addr[i].addr4.sin_port = self->addr[0].addr4.sin_port;
  694. ret = bind(self->fd[i], &self->addr[i].addr, self->addrlen[i]);
  695. if (reuse) {
  696. if (variant->expected_reuse_errno[i]) {
  697. ASSERT_EQ(ret, -1);
  698. ASSERT_EQ(errno, variant->expected_reuse_errno[i]);
  699. } else {
  700. ASSERT_EQ(ret, 0);
  701. }
  702. } else {
  703. if (variant->expected_errno[i]) {
  704. ASSERT_EQ(ret, -1);
  705. ASSERT_EQ(errno, variant->expected_errno[i]);
  706. } else {
  707. ASSERT_EQ(ret, 0);
  708. }
  709. }
  710. if (i == 0) {
  711. ret = getsockname(self->fd[0], &self->addr[0].addr, &self->addrlen[0]);
  712. ASSERT_EQ(ret, 0);
  713. }
  714. }
  715. TEST_F(bind_wildcard, plain)
  716. {
  717. int i;
  718. for (i = 0; i < NR_SOCKETS; i++)
  719. bind_socket(_metadata, self, variant, i, 0);
  720. }
  721. TEST_F(bind_wildcard, reuseaddr)
  722. {
  723. int i;
  724. for (i = 0; i < NR_SOCKETS; i++)
  725. bind_socket(_metadata, self, variant, i, SO_REUSEADDR);
  726. }
  727. TEST_F(bind_wildcard, reuseport)
  728. {
  729. int i;
  730. for (i = 0; i < NR_SOCKETS; i++)
  731. bind_socket(_metadata, self, variant, i, SO_REUSEPORT);
  732. }
  733. TEST_HARNESS_MAIN