Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest: tcp: Add bind() tests for IPV6_V6ONLY.

bhash2 was not well tested for IPv6-only sockets.

This patch adds test cases where we set IPV6_V6ONLY for per-fixture
bind() calls if variant->ipv6_only[i] is true.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://lore.kernel.org/r/20240326204251.51301-8-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Kuniyuki Iwashima and committed by
Jakub Kicinski
d37f2f72 f40742c2

+116
+116
tools/testing/selftests/net/bind_wildcard.c
··· 42 42 { 43 43 sa_family_t family[2]; 44 44 const void *addr[2]; 45 + bool ipv6_only[2]; 45 46 46 47 /* 6 bind() calls below follow two bind() for the defined 2 addresses: 47 48 * ··· 88 87 EADDRINUSE, EADDRINUSE}, 89 88 }; 90 89 90 + FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_any_only) 91 + { 92 + .family = {AF_INET, AF_INET6}, 93 + .addr = {&in4addr_any, &in6addr_any}, 94 + .ipv6_only = {false, true}, 95 + .expected_errno = {0, 0, 96 + EADDRINUSE, EADDRINUSE, 97 + EADDRINUSE, EADDRINUSE, 98 + EADDRINUSE, EADDRINUSE}, 99 + }; 100 + 91 101 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_local) 92 102 { 93 103 .family = {AF_INET, AF_INET6}, ··· 136 124 .expected_errno = {0, EADDRINUSE, 137 125 EADDRINUSE, EADDRINUSE, 138 126 EADDRINUSE, 0, 127 + EADDRINUSE, EADDRINUSE}, 128 + }; 129 + 130 + FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any_only) 131 + { 132 + .family = {AF_INET, AF_INET6}, 133 + .addr = {&in4addr_loopback, &in6addr_any}, 134 + .ipv6_only = {false, true}, 135 + .expected_errno = {0, 0, 136 + EADDRINUSE, EADDRINUSE, 137 + EADDRINUSE, EADDRINUSE, 139 138 EADDRINUSE, EADDRINUSE}, 140 139 }; 141 140 ··· 191 168 EADDRINUSE, EADDRINUSE}, 192 169 }; 193 170 171 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v4_any) 172 + { 173 + .family = {AF_INET6, AF_INET}, 174 + .addr = {&in6addr_any, &in4addr_any}, 175 + .ipv6_only = {true, false}, 176 + .expected_errno = {0, 0, 177 + EADDRINUSE, EADDRINUSE, 178 + EADDRINUSE, EADDRINUSE, 179 + EADDRINUSE, EADDRINUSE}, 180 + }; 181 + 194 182 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v4_local) 195 183 { 196 184 .family = {AF_INET6, AF_INET}, 197 185 .addr = {&in6addr_any, &in4addr_loopback}, 198 186 .expected_errno = {0, EADDRINUSE, 187 + EADDRINUSE, EADDRINUSE, 188 + EADDRINUSE, EADDRINUSE, 189 + EADDRINUSE, EADDRINUSE}, 190 + }; 191 + 192 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v4_local) 193 + { 194 + .family = {AF_INET6, AF_INET}, 195 + .addr = {&in6addr_any, &in4addr_loopback}, 196 + .ipv6_only = {true, false}, 197 + .expected_errno = {0, 0, 199 198 EADDRINUSE, EADDRINUSE, 200 199 EADDRINUSE, EADDRINUSE, 201 200 EADDRINUSE, EADDRINUSE}, ··· 294 249 EADDRINUSE, EADDRINUSE}, 295 250 }; 296 251 252 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_local) 253 + { 254 + .family = {AF_INET6, AF_INET6}, 255 + .addr = {&in6addr_any, &in6addr_loopback}, 256 + .ipv6_only = {true, false}, 257 + .expected_errno = {0, EADDRINUSE, 258 + 0, EADDRINUSE, 259 + EADDRINUSE, EADDRINUSE, 260 + EADDRINUSE, EADDRINUSE}, 261 + }; 262 + 297 263 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_any) 298 264 { 299 265 .family = {AF_INET6, AF_INET6}, 300 266 .addr = {&in6addr_any, &in6addr_v4mapped_any}, 301 267 .expected_errno = {0, EADDRINUSE, 268 + EADDRINUSE, EADDRINUSE, 269 + EADDRINUSE, EADDRINUSE, 270 + EADDRINUSE, EADDRINUSE}, 271 + }; 272 + 273 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_v4mapped_any) 274 + { 275 + .family = {AF_INET6, AF_INET6}, 276 + .addr = {&in6addr_any, &in6addr_v4mapped_any}, 277 + .ipv6_only = {true, false}, 278 + .expected_errno = {0, 0, 302 279 EADDRINUSE, EADDRINUSE, 303 280 EADDRINUSE, EADDRINUSE, 304 281 EADDRINUSE, EADDRINUSE}, ··· 336 269 EADDRINUSE, EADDRINUSE}, 337 270 }; 338 271 272 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_v4mapped_local) 273 + { 274 + .family = {AF_INET6, AF_INET6}, 275 + .addr = {&in6addr_any, &in6addr_v4mapped_loopback}, 276 + .ipv6_only = {true, false}, 277 + .expected_errno = {0, 0, 278 + EADDRINUSE, EADDRINUSE, 279 + EADDRINUSE, EADDRINUSE, 280 + EADDRINUSE, EADDRINUSE}, 281 + }; 282 + 339 283 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any) 340 284 { 341 285 .family = {AF_INET6, AF_INET6}, 342 286 .addr = {&in6addr_loopback, &in6addr_any}, 287 + .expected_errno = {0, EADDRINUSE, 288 + 0, EADDRINUSE, 289 + EADDRINUSE, EADDRINUSE, 290 + EADDRINUSE, EADDRINUSE}, 291 + }; 292 + 293 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any_only) 294 + { 295 + .family = {AF_INET6, AF_INET6}, 296 + .addr = {&in6addr_loopback, &in6addr_any}, 297 + .ipv6_only = {false, true}, 343 298 .expected_errno = {0, EADDRINUSE, 344 299 0, EADDRINUSE, 345 300 EADDRINUSE, EADDRINUSE, ··· 398 309 EADDRINUSE, EADDRINUSE}, 399 310 }; 400 311 312 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_any_only) 313 + { 314 + .family = {AF_INET6, AF_INET6}, 315 + .addr = {&in6addr_v4mapped_any, &in6addr_any}, 316 + .ipv6_only = {false, true}, 317 + .expected_errno = {0, 0, 318 + EADDRINUSE, EADDRINUSE, 319 + EADDRINUSE, EADDRINUSE, 320 + EADDRINUSE, EADDRINUSE}, 321 + }; 322 + 401 323 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_local) 402 324 { 403 325 .family = {AF_INET6, AF_INET6}, ··· 436 336 .expected_errno = {0, EADDRINUSE, 437 337 EADDRINUSE, EADDRINUSE, 438 338 EADDRINUSE, 0, 339 + EADDRINUSE, EADDRINUSE}, 340 + }; 341 + 342 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_any_only) 343 + { 344 + .family = {AF_INET6, AF_INET6}, 345 + .addr = {&in6addr_v4mapped_loopback, &in6addr_any}, 346 + .ipv6_only = {false, true}, 347 + .expected_errno = {0, 0, 348 + EADDRINUSE, EADDRINUSE, 349 + EADDRINUSE, EADDRINUSE, 439 350 EADDRINUSE, EADDRINUSE}, 440 351 }; 441 352 ··· 525 414 526 415 self->fd[i] = socket(self->addr[i].addr.sa_family, SOCK_STREAM, 0); 527 416 ASSERT_GT(self->fd[i], 0); 417 + 418 + if (i < 2 && variant->ipv6_only[i]) { 419 + ret = setsockopt(self->fd[i], SOL_IPV6, IPV6_V6ONLY, &(int){1}, sizeof(int)); 420 + ASSERT_EQ(ret, 0); 421 + } 528 422 529 423 self->addr[i].addr4.sin_port = self->addr[0].addr4.sin_port; 530 424