diff options
| author | Martin KaFai Lau <kafai@fb.com> | 2019-06-13 18:00:05 -0400 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-06-14 19:21:50 -0400 |
| commit | d30bd78ce8ba1f093aa4877ed06601d0debd872b (patch) | |
| tree | 204d0fa791e52e71c977611ea0904bc719b7944d | |
| parent | 13a748ea6df1fee13fdcbd9d10a3d70f9e188b48 (diff) | |
bpf: Add test for SO_REUSEPORT_DETACH_BPF
This patch adds a test for the new sockopt SO_REUSEPORT_DETACH_BPF.
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Reviewed-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
| -rw-r--r-- | tools/testing/selftests/bpf/test_select_reuseport.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/test_select_reuseport.c b/tools/testing/selftests/bpf/test_select_reuseport.c index 75646d9b34aa..7566c13eb51a 100644 --- a/tools/testing/selftests/bpf/test_select_reuseport.c +++ b/tools/testing/selftests/bpf/test_select_reuseport.c | |||
| @@ -523,6 +523,58 @@ static void test_pass_on_err(int type, sa_family_t family) | |||
| 523 | printf("OK\n"); | 523 | printf("OK\n"); |
| 524 | } | 524 | } |
| 525 | 525 | ||
| 526 | static void test_detach_bpf(int type, sa_family_t family) | ||
| 527 | { | ||
| 528 | #ifdef SO_DETACH_REUSEPORT_BPF | ||
| 529 | __u32 nr_run_before = 0, nr_run_after = 0, tmp, i; | ||
| 530 | struct epoll_event ev; | ||
| 531 | int cli_fd, err, nev; | ||
| 532 | struct cmd cmd = {}; | ||
| 533 | int optvalue = 0; | ||
| 534 | |||
| 535 | printf("%s: ", __func__); | ||
| 536 | err = setsockopt(sk_fds[0], SOL_SOCKET, SO_DETACH_REUSEPORT_BPF, | ||
| 537 | &optvalue, sizeof(optvalue)); | ||
| 538 | CHECK(err == -1, "setsockopt(SO_DETACH_REUSEPORT_BPF)", | ||
| 539 | "err:%d errno:%d\n", err, errno); | ||
| 540 | |||
| 541 | err = setsockopt(sk_fds[1], SOL_SOCKET, SO_DETACH_REUSEPORT_BPF, | ||
| 542 | &optvalue, sizeof(optvalue)); | ||
| 543 | CHECK(err == 0 || errno != ENOENT, "setsockopt(SO_DETACH_REUSEPORT_BPF)", | ||
| 544 | "err:%d errno:%d\n", err, errno); | ||
| 545 | |||
| 546 | for (i = 0; i < NR_RESULTS; i++) { | ||
| 547 | err = bpf_map_lookup_elem(result_map, &i, &tmp); | ||
| 548 | CHECK(err == -1, "lookup_elem(result_map)", | ||
| 549 | "i:%u err:%d errno:%d\n", i, err, errno); | ||
| 550 | nr_run_before += tmp; | ||
| 551 | } | ||
| 552 | |||
| 553 | cli_fd = send_data(type, family, &cmd, sizeof(cmd), PASS); | ||
| 554 | nev = epoll_wait(epfd, &ev, 1, 5); | ||
| 555 | CHECK(nev <= 0, "nev <= 0", | ||
| 556 | "nev:%d expected:1 type:%d family:%d data:(0, 0)\n", | ||
| 557 | nev, type, family); | ||
| 558 | |||
| 559 | for (i = 0; i < NR_RESULTS; i++) { | ||
| 560 | err = bpf_map_lookup_elem(result_map, &i, &tmp); | ||
| 561 | CHECK(err == -1, "lookup_elem(result_map)", | ||
| 562 | "i:%u err:%d errno:%d\n", i, err, errno); | ||
| 563 | nr_run_after += tmp; | ||
| 564 | } | ||
| 565 | |||
| 566 | CHECK(nr_run_before != nr_run_after, | ||
| 567 | "nr_run_before != nr_run_after", | ||
| 568 | "nr_run_before:%u nr_run_after:%u\n", | ||
| 569 | nr_run_before, nr_run_after); | ||
| 570 | |||
| 571 | printf("OK\n"); | ||
| 572 | close(cli_fd); | ||
| 573 | #else | ||
| 574 | printf("%s: SKIP\n", __func__); | ||
| 575 | #endif | ||
| 576 | } | ||
| 577 | |||
| 526 | static void prepare_sk_fds(int type, sa_family_t family, bool inany) | 578 | static void prepare_sk_fds(int type, sa_family_t family, bool inany) |
| 527 | { | 579 | { |
| 528 | const int first = REUSEPORT_ARRAY_SIZE - 1; | 580 | const int first = REUSEPORT_ARRAY_SIZE - 1; |
| @@ -664,6 +716,8 @@ static void test_all(void) | |||
| 664 | test_pass(type, family); | 716 | test_pass(type, family); |
| 665 | test_syncookie(type, family); | 717 | test_syncookie(type, family); |
| 666 | test_pass_on_err(type, family); | 718 | test_pass_on_err(type, family); |
| 719 | /* Must be the last test */ | ||
| 720 | test_detach_bpf(type, family); | ||
| 667 | 721 | ||
| 668 | cleanup_per_test(); | 722 | cleanup_per_test(); |
| 669 | printf("\n"); | 723 | printf("\n"); |
