Skip to content

Commit

Permalink
selftests/bpf: Add mptcp_subflow bpf_iter subtest
Browse files Browse the repository at this point in the history
This patch adds a subtest named test_bpf_iter to load and verify the newly
added mptcp_subflow type bpf_iter example in test_mptcp. Use the helper
endpoint_init() to add 3 new subflow endpoints. A new helper recv_byte()
is invoked to trigger the ftrace hook for mptcp_sched_get_send() after
wait_for_new_subflows(). Check if skel->bss->subflows equals 4 to verify
whether the "fentry" program loops fourth as expected.

Signed-off-by: Geliang Tang <[email protected]>
  • Loading branch information
Geliang Tang authored and intel-lab-lkp committed Oct 1, 2024
1 parent 5d5a861 commit 8da9791
Showing 1 changed file with 78 additions and 0 deletions.
78 changes: 78 additions & 0 deletions tools/testing/selftests/bpf/prog_tests/mptcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "mptcp_sock.skel.h"
#include "mptcpify.skel.h"
#include "mptcp_subflow.skel.h"
#include "mptcp_bpf_iter.skel.h"
#include "mptcp_bpf_first.skel.h"
#include "mptcp_bpf_bkup.skel.h"
#include "mptcp_bpf_rr.skel.h"
Expand Down Expand Up @@ -261,6 +262,19 @@ static void send_byte(int fd)
ASSERT_EQ(write(fd, &b, sizeof(b)), 1, "send single byte");
}

static int recv_byte(int fd)
{
char buf[1];
ssize_t n;

n = recv(fd, buf, sizeof(buf), 0);
if (CHECK(n <= 0, "recv_byte", "recv")) {
log_err("failed/partial recv");
return -1;
}
return 0;
}

static int verify_mptcpify(int server_fd, int client_fd)
{
struct __mptcp_info info;
Expand Down Expand Up @@ -501,6 +515,68 @@ static void test_subflow(void)
close(cgroup_fd);
}

static void run_bpf_iter(void)
{
int server_fd, client_fd, accept_fd;

server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
if (!ASSERT_OK_FD(server_fd, "start_mptcp_server"))
return;

client_fd = connect_to_fd(server_fd, 0);
if (!ASSERT_OK_FD(client_fd, "connect_to_fd"))
goto close_server;

accept_fd = accept(server_fd, NULL, NULL);
if (!ASSERT_OK_FD(accept_fd, "accept"))
goto close_client;

send_byte(client_fd);
wait_for_new_subflows(client_fd);
recv_byte(accept_fd);
send_byte(client_fd);

close(accept_fd);
close_client:
close(client_fd);
close_server:
close(server_fd);
}

static void test_bpf_iter(void)
{
struct mptcp_bpf_iter *skel;
struct nstoken *nstoken;
int subflows = 4;
int err;

skel = mptcp_bpf_iter__open_and_load();
if (!ASSERT_OK_PTR(skel, "skel_open_load: mptcp_iter"))
return;

skel->bss->pid = getpid();

err = mptcp_bpf_iter__attach(skel);
if (!ASSERT_OK(err, "skel_attach: mptcp_iter"))
goto skel_destroy;

nstoken = create_netns();
if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_iter"))
goto skel_destroy;

if (endpoint_init("subflow", subflows) < 0)
goto close_netns;

run_bpf_iter();

ASSERT_EQ(skel->bss->subflows, subflows, "subflows");

close_netns:
cleanup_netns(nstoken);
skel_destroy:
mptcp_bpf_iter__destroy(skel);
}

static struct nstoken *sched_init(char *flags, char *sched)
{
struct nstoken *nstoken;
Expand Down Expand Up @@ -682,6 +758,8 @@ void test_mptcp(void)
test_mptcpify();
if (test__start_subtest("subflow"))
test_subflow();
if (test__start_subtest("bpf_iter"))
test_bpf_iter();
if (test__start_subtest("default"))
test_default();
if (test__start_subtest("first"))
Expand Down

0 comments on commit 8da9791

Please sign in to comment.