Skip to content

Commit

Permalink
selftests/bpf: Add mptcpify selftest
Browse files Browse the repository at this point in the history
This patch extends the MPTCP test base, add a selftest test_mptcpify()
for the mptcpify case.

Open and load the mptcpify test prog to mptcpify the TCP sockets
dynamically, then use start_server() and connect_to_fd() to create a
TCP socket, but actually what's created is an MPTCP socket, which can
be verified through the stored local BSS variable.

Signed-off-by: Geliang Tang <[email protected]>
  • Loading branch information
geliangtang authored and intel-lab-lkp committed Jul 1, 2023
1 parent c67ffc5 commit a734bef
Showing 1 changed file with 87 additions and 0 deletions.
87 changes: 87 additions & 0 deletions tools/testing/selftests/bpf/prog_tests/mptcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,17 @@
#include "cgroup_helpers.h"
#include "network_helpers.h"
#include "mptcp_sock.skel.h"
#include "mptcpify.skel.h"
#include "mptcp_bpf_first.skel.h"
#include "mptcp_bpf_bkup.skel.h"
#include "mptcp_bpf_rr.skel.h"
#include "mptcp_bpf_red.skel.h"

char NS_TEST[32];

#ifndef IPPROTO_MPTCP
#define IPPROTO_MPTCP 262
#endif
#ifndef TCP_CA_NAME_MAX
#define TCP_CA_NAME_MAX 16
#endif
Expand Down Expand Up @@ -200,6 +204,87 @@ static void test_base(void)
close(cgroup_fd);
}

static void send_byte(int fd)
{
char b = 0x55;

ASSERT_EQ(write(fd, &b, sizeof(b)), 1, "send single byte");
}

static int verify_mptcpify(int protocol)
{
char cmd[128];
int err = 0;

if (!ASSERT_EQ(protocol, IPPROTO_MPTCP, "unexpected protocol"))
err++;

snprintf(cmd, sizeof(cmd),
"ip netns exec %s ss -tOni | grep -q tcp-ulp-mptcp",
NS_TEST);
ASSERT_OK(system(cmd), "No tcp-ulp-mptcp found!");

return err;
}

static int run_mptcpify(int cgroup_fd)
{
int server_fd, client_fd, err = 0;
struct mptcpify *mptcpify_skel;

mptcpify_skel = mptcpify__open_and_load();
if (!ASSERT_OK_PTR(mptcpify_skel, "skel_open_load"))
return -EIO;

mptcpify_skel->links.sock =
bpf_program__attach_cgroup(mptcpify_skel->progs.sock, cgroup_fd);
if (!ASSERT_OK_PTR(mptcpify_skel->links.sock, "cg_attach_sock"))
goto out;

/* without MPTCP */
server_fd = start_server(AF_INET, SOCK_STREAM, NULL, 0, 0);
if (!ASSERT_GE(server_fd, 0, "start_server")) {
err = -EIO;
goto out;
}

client_fd = connect_to_fd(server_fd, 0);
if (!ASSERT_GE(client_fd, 0, "connect to fd")) {
err = -EIO;
goto close_server;
}

send_byte(client_fd);
err += verify_mptcpify(mptcpify_skel->bss->protocol);

close(client_fd);
close_server:
close(server_fd);
out:
mptcpify__destroy(mptcpify_skel);
return err;
}

static void test_mptcpify(void)
{
struct nstoken *nstoken = NULL;
int cgroup_fd;

cgroup_fd = test__join_cgroup("/mptcpify");
if (!ASSERT_GE(cgroup_fd, 0, "test__join_cgroup"))
return;

nstoken = create_netns();
if (!ASSERT_OK_PTR(nstoken, "create_netns"))
goto fail;

ASSERT_OK(run_mptcpify(cgroup_fd), "run_mptcpify");

fail:
cleanup_netns(nstoken);
close(cgroup_fd);
}

static const unsigned int total_bytes = 10 * 1024 * 1024;
static int stop, duration;

Expand Down Expand Up @@ -459,6 +544,8 @@ void test_mptcp(void)
{
if (test__start_subtest("base"))
test_base();
if (test__start_subtest("mptcpify"))
test_mptcpify();
if (test__start_subtest("first"))
test_first();
if (test__start_subtest("bkup"))
Expand Down

0 comments on commit a734bef

Please sign in to comment.