diff options
author | Geliang Tang <tanggeliang@kylinos.cn> | 2024-04-06 21:36:41 +0800 |
---|---|---|
committer | Geliang Tang <tanggeliang@kylinos.cn> | 2024-04-08 18:12:20 +0800 |
commit | b643ad3aa1d691a579aae1d33d749c6203c3ec8c (patch) | |
tree | dcee71ce6ee4f199d53988db15b8d2684a5de299 | |
parent | 88b688e3eea5499f62da37af2fefd3018611ad92 (diff) | |
download | linux-export.tar.gz |
Squash to "selftests/bpf: Add bpf scheduler test" 4export
Use endpoint_init, _ss_search, set_nonblock and send_recv_data, drop
send_data.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
-rw-r--r-- | tools/testing/selftests/bpf/prog_tests/mptcp.c | 104 |
1 files changed, 10 insertions, 94 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index e7e256a233db3e..319531ffc50036 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -343,87 +343,6 @@ fail: close(cgroup_fd); } -static int stop; - -static void *server(void *arg) -{ - int lfd = (int)(long)arg, err = 0, fd; - ssize_t nr_sent = 0, bytes = 0; - char batch[1500]; - - fd = accept(lfd, NULL, NULL); - while (fd == -1) { - if (errno == EINTR) - continue; - err = -errno; - goto done; - } - - if (settimeo(fd, 0)) { - err = -errno; - goto done; - } - - while (bytes < total_bytes && !READ_ONCE(stop)) { - nr_sent = send(fd, &batch, - MIN(total_bytes - bytes, sizeof(batch)), 0); - if (nr_sent == -1 && errno == EINTR) - continue; - if (nr_sent == -1) { - err = -errno; - break; - } - bytes += nr_sent; - } - - CHECK(bytes != total_bytes, "send", "%zd != %u nr_sent:%zd errno:%d\n", - bytes, total_bytes, nr_sent, errno); - -done: - if (fd >= 0) - close(fd); - if (err) { - WRITE_ONCE(stop, 1); - return ERR_PTR(err); - } - return NULL; -} - -static void send_data(int lfd, int fd, char *msg) -{ - ssize_t nr_recv = 0, bytes = 0; - pthread_t srv_thread; - void *thread_ret; - char batch[1500]; - int err; - - WRITE_ONCE(stop, 0); - - err = pthread_create(&srv_thread, NULL, server, (void *)(long)lfd); - if (CHECK(err != 0, "pthread_create", "err:%d errno:%d\n", err, errno)) - return; - - /* recv total_bytes */ - while (bytes < total_bytes && !READ_ONCE(stop)) { - nr_recv = recv(fd, &batch, - MIN(total_bytes - bytes, sizeof(batch)), 0); - if (nr_recv == -1 && errno == EINTR) - continue; - if (nr_recv == -1) - break; - bytes += nr_recv; - } - - CHECK(bytes != total_bytes, "recv", "%zd != %u nr_recv:%zd errno:%d\n", - bytes, total_bytes, nr_recv, errno); - - WRITE_ONCE(stop, 1); - - pthread_join(srv_thread, &thread_ret); - CHECK(IS_ERR(thread_ret), "pthread_join", "thread_ret:%ld", - PTR_ERR(thread_ret)); -} - static int endpoint_init(char *flags) { SYS(fail, "ip -net %s link add veth1 type veth peer name veth2", NS_TEST); @@ -532,28 +451,22 @@ static struct nstoken *sched_init(char *flags, char *sched) nstoken = create_netns(); if (!ASSERT_OK_PTR(nstoken, "create_netns")) + return NULL; + + if (!ASSERT_OK(endpoint_init("subflow"), "endpoint_init")) goto fail; - SYS(fail, "ip -net %s link add veth1 type veth peer name veth2", NS_TEST); - SYS(fail, "ip -net %s addr add %s/24 dev veth1", NS_TEST, ADDR_1); - SYS(fail, "ip -net %s link set dev veth1 up", NS_TEST); - SYS(fail, "ip -net %s addr add %s/24 dev veth2", NS_TEST, ADDR_2); - SYS(fail, "ip -net %s link set dev veth2 up", NS_TEST); - SYS(fail, "ip -net %s mptcp endpoint add %s %s", NS_TEST, ADDR_2, flags); SYS(fail, "ip netns exec %s sysctl -qw net.mptcp.scheduler=%s", NS_TEST, sched); return nstoken; fail: + cleanup_netns(nstoken); return NULL; } -static int has_bytes_sent(char *addr) +static int has_bytes_sent(char *dst) { - char cmd[128]; - - snprintf(cmd, sizeof(cmd), "ip netns exec %s ss -it src %s sport %d dst %s | %s", - NS_TEST, ADDR_1, PORT_1, addr, "grep -q bytes_sent:"); - return system(cmd); + return _ss_search(ADDR_1, dst, "sport", "bytes_sent:"); } static void send_data_and_verify(char *sched, char *addr1, char *addr2) @@ -570,10 +483,13 @@ static void send_data_and_verify(char *sched, char *addr1, char *addr2) if (CHECK(client_fd < 0, sched, "connect_to_fd: %d\n", errno)) goto close_server; + if (set_nonblock(server_fd)) + goto close_server; + if (clock_gettime(CLOCK_MONOTONIC, &start) < 0) goto close_server; - send_data(server_fd, client_fd, sched); + send_recv_data(server_fd, client_fd, total_bytes); if (clock_gettime(CLOCK_MONOTONIC, &end) < 0) goto close_server; |