Skip to content

Commit 51f69d6

Browse files
Geliang Tangmatttbe
authored andcommitted
selftests/bpf: Add bpf scheduler test
This patch extends the MPTCP test base to support MPTCP packet scheduler tests. Add a new test to use the default in-kernel scheduler. In the new helper sched_init(), add two veth net devices to simulate the multiple addresses case. Use 'ip mptcp endpoint' command to add the new endpoint ADDR_2 to PM netlink. Use sysctl to set net.mptcp.scheduler to use the given sched. Invoke start_mptcp_server() to start the server on ADDR_1, and invoke connect_to_fd() to connect with the server from the client. Then invoke send_data() to send data. Some code in send_data() is from prog_tests/bpf_tcp_ca.c. Add time metrics for BPF tests to compare the performance of each schedulers. Run prog_tests with '-v' option can print out the running time of each test. Use the new helper has_bytes_sent() to check the bytes_sent filed of 'ss' output after send_data() to make sure no data has been sent on ADDR_2. All data has been sent on the first subflow. Invoke the new helper sched_cleanup() to set back net.mptcp.scheduler to default, flush all mptcp endpoints, and delete the veth net devices. Signed-off-by: Geliang Tang <[email protected]> Reviewed-by: Mat Martineau <[email protected]>
1 parent 9226c50 commit 51f69d6

File tree

1 file changed

+92
-0
lines changed
  • tools/testing/selftests/bpf/prog_tests

1 file changed

+92
-0
lines changed

tools/testing/selftests/bpf/prog_tests/mptcp.c

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#define ADDR6_3 "dead:beef:3::1"
2424
#define ADDR6_4 "dead:beef:4::1"
2525
#define PORT_1 10001
26+
#define WITH_DATA true
27+
#define WITHOUT_DATA false
2628

2729
#ifndef IPPROTO_MPTCP
2830
#define IPPROTO_MPTCP 262
@@ -48,6 +50,9 @@
4850
#define TCP_CA_NAME_MAX 16
4951
#endif
5052

53+
static const unsigned int total_bytes = 10 * 1024 * 1024;
54+
static int duration;
55+
5156
struct __mptcp_info {
5257
__u8 mptcpi_subflows;
5358
__u8 mptcpi_add_addr_signal;
@@ -569,6 +574,91 @@ static void test_iters_subflow(void)
569574
close(cgroup_fd);
570575
}
571576

577+
static struct nstoken *sched_init(char *flags, char *sched)
578+
{
579+
struct nstoken *nstoken;
580+
581+
nstoken = create_netns();
582+
if (!ASSERT_OK_PTR(nstoken, "create_netns"))
583+
return NULL;
584+
585+
if (endpoint_init("subflow", 2) < 0)
586+
goto fail;
587+
588+
SYS(fail, "ip netns exec %s sysctl -qw net.mptcp.scheduler=%s", NS_TEST, sched);
589+
590+
return nstoken;
591+
fail:
592+
cleanup_netns(nstoken);
593+
return NULL;
594+
}
595+
596+
static int ss_search(char *src, char *dst, char *port, char *keyword)
597+
{
598+
return SYS_NOFAIL("ip netns exec %s ss -enita src %s dst %s %s %d | grep -q '%s'",
599+
NS_TEST, src, dst, port, PORT_1, keyword);
600+
}
601+
602+
static int has_bytes_sent(char *dst)
603+
{
604+
return ss_search(ADDR_1, dst, "sport", "bytes_sent:");
605+
}
606+
607+
static void send_data_and_verify(char *sched, bool addr1, bool addr2)
608+
{
609+
struct timespec start, end;
610+
int server_fd, client_fd;
611+
unsigned int delta_ms;
612+
613+
server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
614+
if (!ASSERT_OK_FD(server_fd, "start_mptcp_server"))
615+
return;
616+
617+
client_fd = connect_to_fd(server_fd, 0);
618+
if (!ASSERT_OK_FD(client_fd, "connect_to_fd"))
619+
goto fail;
620+
621+
if (clock_gettime(CLOCK_MONOTONIC, &start) < 0)
622+
goto fail;
623+
624+
if (!ASSERT_OK(send_recv_data(server_fd, client_fd, total_bytes),
625+
"send_recv_data"))
626+
goto fail;
627+
628+
if (clock_gettime(CLOCK_MONOTONIC, &end) < 0)
629+
goto fail;
630+
631+
delta_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
632+
printf("%s: %u ms\n", sched, delta_ms);
633+
634+
if (addr1)
635+
CHECK(has_bytes_sent(ADDR_1), sched, "should have bytes_sent on addr1\n");
636+
else
637+
CHECK(!has_bytes_sent(ADDR_1), sched, "shouldn't have bytes_sent on addr1\n");
638+
if (addr2)
639+
CHECK(has_bytes_sent(ADDR_2), sched, "should have bytes_sent on addr2\n");
640+
else
641+
CHECK(!has_bytes_sent(ADDR_2), sched, "shouldn't have bytes_sent on addr2\n");
642+
643+
close(client_fd);
644+
fail:
645+
close(server_fd);
646+
}
647+
648+
static void test_default(void)
649+
{
650+
struct nstoken *nstoken;
651+
652+
nstoken = sched_init("subflow", "default");
653+
if (!nstoken)
654+
goto fail;
655+
656+
send_data_and_verify("default", WITH_DATA, WITH_DATA);
657+
658+
fail:
659+
cleanup_netns(nstoken);
660+
}
661+
572662
void test_mptcp(void)
573663
{
574664
if (test__start_subtest("base"))
@@ -579,4 +669,6 @@ void test_mptcp(void)
579669
test_subflow();
580670
if (test__start_subtest("iters_subflow"))
581671
test_iters_subflow();
672+
if (test__start_subtest("default"))
673+
test_default();
582674
}

0 commit comments

Comments
 (0)