Commit 3f2eadb1 authored by Peter Oskolkov's avatar Peter Oskolkov Committed by David S. Miller

selftests: net: refactor reuseport_addr_any test

This patch refactors reuseport_add_any selftest a bit:
- makes it more modular (eliminates several copy/pasted blocks);
- skips DCCP tests if DCCP is not supported

V2: added "Signed-off-by" tag.
Signed-off-by: default avatarPeter Oskolkov <posk@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9c7f37e5
...@@ -203,7 +203,9 @@ static void test(int *rcv_fds, int count, int family, int proto, int fd) ...@@ -203,7 +203,9 @@ static void test(int *rcv_fds, int count, int family, int proto, int fd)
close(epfd); close(epfd);
} }
int main(void)
static void run_one_test(int fam_send, int fam_rcv, int proto,
const char *addr_str)
{ {
/* Below we test that a socket listening on a specific address /* Below we test that a socket listening on a specific address
* is always selected in preference over a socket listening * is always selected in preference over a socket listening
...@@ -214,95 +216,48 @@ int main(void) ...@@ -214,95 +216,48 @@ int main(void)
*/ */
int rcv_fds[10], i; int rcv_fds[10], i;
fprintf(stderr, "---- UDP IPv4 ----\n"); build_rcv_fd(AF_INET, proto, rcv_fds, 2, NULL);
build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds, 2, NULL); build_rcv_fd(AF_INET6, proto, rcv_fds + 2, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds + 2, 2, NULL); build_rcv_fd(fam_rcv, proto, rcv_fds + 4, 1, addr_str);
build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds + 4, 1, IP4_ADDR); build_rcv_fd(AF_INET, proto, rcv_fds + 5, 2, NULL);
build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds + 5, 2, NULL); build_rcv_fd(AF_INET6, proto, rcv_fds + 7, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds + 7, 2, NULL); test(rcv_fds, 9, fam_send, proto, rcv_fds[4]);
test(rcv_fds, 9, AF_INET, SOCK_DGRAM, rcv_fds[4]);
for (i = 0; i < 9; ++i)
close(rcv_fds[i]);
fprintf(stderr, "---- UDP IPv6 ----\n");
build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds + 2, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds + 4, 1, IP6_ADDR);
build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds + 5, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds + 7, 2, NULL);
test(rcv_fds, 9, AF_INET6, SOCK_DGRAM, rcv_fds[4]);
for (i = 0; i < 9; ++i)
close(rcv_fds[i]);
fprintf(stderr, "---- UDP IPv4 mapped to IPv6 ----\n");
build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds + 2, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds + 4, 1, IP4_MAPPED6);
build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds + 5, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds + 7, 2, NULL);
test(rcv_fds, 9, AF_INET, SOCK_DGRAM, rcv_fds[4]);
for (i = 0; i < 9; ++i)
close(rcv_fds[i]);
fprintf(stderr, "---- TCP IPv4 ----\n");
build_rcv_fd(AF_INET, SOCK_STREAM, rcv_fds, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds + 2, 2, NULL);
build_rcv_fd(AF_INET, SOCK_STREAM, rcv_fds + 4, 1, IP4_ADDR);
build_rcv_fd(AF_INET, SOCK_STREAM, rcv_fds + 5, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds + 7, 2, NULL);
test(rcv_fds, 9, AF_INET, SOCK_STREAM, rcv_fds[4]);
for (i = 0; i < 9; ++i) for (i = 0; i < 9; ++i)
close(rcv_fds[i]); close(rcv_fds[i]);
fprintf(stderr, "pass\n");
}
fprintf(stderr, "---- TCP IPv6 ----\n"); static void test_proto(int proto, const char *proto_str)
build_rcv_fd(AF_INET, SOCK_STREAM, rcv_fds, 2, NULL); {
build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds + 2, 2, NULL); if (proto == SOCK_DCCP) {
build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds + 4, 1, IP6_ADDR); int test_fd;
build_rcv_fd(AF_INET, SOCK_STREAM, rcv_fds + 5, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds + 7, 2, NULL); test_fd = socket(AF_INET, proto, 0);
test(rcv_fds, 9, AF_INET6, SOCK_STREAM, rcv_fds[4]); if (test_fd < 0) {
for (i = 0; i < 9; ++i) if (errno == ESOCKTNOSUPPORT) {
close(rcv_fds[i]); fprintf(stderr, "DCCP not supported: skipping DCCP tests\n");
return;
} else
error(1, errno, "failed to create a DCCP socket");
}
close(test_fd);
}
fprintf(stderr, "---- TCP IPv4 mapped to IPv6 ----\n"); fprintf(stderr, "%s IPv4 ... ", proto_str);
build_rcv_fd(AF_INET, SOCK_STREAM, rcv_fds, 2, NULL); run_one_test(AF_INET, AF_INET, proto, IP4_ADDR);
build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds + 2, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds + 4, 1, IP4_MAPPED6);
build_rcv_fd(AF_INET, SOCK_STREAM, rcv_fds + 5, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds + 7, 2, NULL);
test(rcv_fds, 9, AF_INET, SOCK_STREAM, rcv_fds[4]);
for (i = 0; i < 9; ++i)
close(rcv_fds[i]);
fprintf(stderr, "---- DCCP IPv4 ----\n"); fprintf(stderr, "%s IPv6 ... ", proto_str);
build_rcv_fd(AF_INET, SOCK_DCCP, rcv_fds, 2, NULL); run_one_test(AF_INET6, AF_INET6, proto, IP6_ADDR);
build_rcv_fd(AF_INET6, SOCK_DCCP, rcv_fds + 2, 2, NULL);
build_rcv_fd(AF_INET, SOCK_DCCP, rcv_fds + 4, 1, IP4_ADDR);
build_rcv_fd(AF_INET, SOCK_DCCP, rcv_fds + 5, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DCCP, rcv_fds + 7, 2, NULL);
test(rcv_fds, 9, AF_INET, SOCK_DCCP, rcv_fds[4]);
for (i = 0; i < 9; ++i)
close(rcv_fds[i]);
fprintf(stderr, "---- DCCP IPv6 ----\n"); fprintf(stderr, "%s IPv4 mapped to IPv6 ... ", proto_str);
build_rcv_fd(AF_INET, SOCK_DCCP, rcv_fds, 2, NULL); run_one_test(AF_INET, AF_INET6, proto, IP4_MAPPED6);
build_rcv_fd(AF_INET6, SOCK_DCCP, rcv_fds + 2, 2, NULL); }
build_rcv_fd(AF_INET6, SOCK_DCCP, rcv_fds + 4, 1, IP6_ADDR);
build_rcv_fd(AF_INET, SOCK_DCCP, rcv_fds + 5, 2, NULL);
build_rcv_fd(AF_INET6, SOCK_DCCP, rcv_fds + 7, 2, NULL);
test(rcv_fds, 9, AF_INET6, SOCK_DCCP, rcv_fds[4]);
for (i = 0; i < 9; ++i)
close(rcv_fds[i]);
fprintf(stderr, "---- DCCP IPv4 mapped to IPv6 ----\n"); int main(void)
build_rcv_fd(AF_INET, SOCK_DCCP, rcv_fds, 2, NULL); {
build_rcv_fd(AF_INET6, SOCK_DCCP, rcv_fds + 2, 2, NULL); test_proto(SOCK_DGRAM, "UDP");
build_rcv_fd(AF_INET6, SOCK_DCCP, rcv_fds + 4, 1, IP4_MAPPED6); test_proto(SOCK_STREAM, "TCP");
build_rcv_fd(AF_INET, SOCK_DCCP, rcv_fds + 5, 2, NULL); test_proto(SOCK_DCCP, "DCCP");
build_rcv_fd(AF_INET6, SOCK_DCCP, rcv_fds + 7, 2, NULL);
test(rcv_fds, 9, AF_INET, SOCK_DCCP, rcv_fds[4]);
for (i = 0; i < 9; ++i)
close(rcv_fds[i]);
fprintf(stderr, "SUCCESS\n"); fprintf(stderr, "SUCCESS\n");
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment