|
10 | 10 | #include "mptcp_sock.skel.h"
|
11 | 11 | #include "mptcpify.skel.h"
|
12 | 12 | #include "mptcp_subflow.skel.h"
|
| 13 | +#include "mptcp_bpf_iter.skel.h" |
13 | 14 | #include "mptcp_bpf_first.skel.h"
|
14 | 15 | #include "mptcp_bpf_bkup.skel.h"
|
15 | 16 | #include "mptcp_bpf_rr.skel.h"
|
@@ -258,6 +259,34 @@ static void send_byte(int fd)
|
258 | 259 | ASSERT_EQ(write(fd, &b, sizeof(b)), 1, "send single byte");
|
259 | 260 | }
|
260 | 261 |
|
| 262 | +static int recv_send(int server_fd) |
| 263 | +{ |
| 264 | + char buf[1]; |
| 265 | + int ret, fd; |
| 266 | + ssize_t n; |
| 267 | + |
| 268 | + fd = accept(server_fd, NULL, NULL); |
| 269 | + if (!ASSERT_OK_FD(fd, "accept")) |
| 270 | + return -1; |
| 271 | + |
| 272 | + n = recv(fd, buf, sizeof(buf), 0); |
| 273 | + if (!ASSERT_GT(n, 0, "recv")) { |
| 274 | + ret = -1; |
| 275 | + goto close; |
| 276 | + } |
| 277 | + |
| 278 | + n = send(fd, buf, n, 0); |
| 279 | + if (!ASSERT_GT(n, 0, "send")) { |
| 280 | + ret = -1; |
| 281 | + goto close; |
| 282 | + } |
| 283 | + |
| 284 | + ret = 0; |
| 285 | +close: |
| 286 | + close(fd); |
| 287 | + return ret; |
| 288 | +} |
| 289 | + |
261 | 290 | static int verify_mptcpify(int server_fd, int client_fd)
|
262 | 291 | {
|
263 | 292 | struct __mptcp_info info;
|
@@ -470,6 +499,60 @@ static void test_subflow(void)
|
470 | 499 | close(cgroup_fd);
|
471 | 500 | }
|
472 | 501 |
|
| 502 | +static void run_bpf_iter(void) |
| 503 | +{ |
| 504 | + int server_fd, client_fd; |
| 505 | + |
| 506 | + server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0); |
| 507 | + if (!ASSERT_OK_FD(server_fd, "start_mptcp_server")) |
| 508 | + return; |
| 509 | + |
| 510 | + client_fd = connect_to_fd(server_fd, 0); |
| 511 | + if (!ASSERT_OK_FD(client_fd, "connect_to_fd")) |
| 512 | + goto close_server; |
| 513 | + |
| 514 | + send_byte(client_fd); |
| 515 | + wait_for_new_subflows(client_fd); |
| 516 | + recv_send(server_fd); |
| 517 | + |
| 518 | + close(client_fd); |
| 519 | +close_server: |
| 520 | + close(server_fd); |
| 521 | +} |
| 522 | + |
| 523 | +static void test_bpf_iter(void) |
| 524 | +{ |
| 525 | + struct mptcp_bpf_iter *skel; |
| 526 | + struct nstoken *nstoken; |
| 527 | + int err; |
| 528 | + |
| 529 | + skel = mptcp_bpf_iter__open_and_load(); |
| 530 | + if (!ASSERT_OK_PTR(skel, "skel_open_load: mptcp_iter")) |
| 531 | + return; |
| 532 | + |
| 533 | + skel->bss->pid = getpid(); |
| 534 | + |
| 535 | + err = mptcp_bpf_iter__attach(skel); |
| 536 | + if (!ASSERT_OK(err, "skel_attach: mptcp_iter")) |
| 537 | + goto skel_destroy; |
| 538 | + |
| 539 | + nstoken = create_netns(); |
| 540 | + if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_iter")) |
| 541 | + goto skel_destroy; |
| 542 | + |
| 543 | + if (endpoint_init("subflow") < 0) |
| 544 | + goto close_netns; |
| 545 | + |
| 546 | + run_bpf_iter(); |
| 547 | + |
| 548 | + ASSERT_EQ(skel->bss->iter, 2, "iter"); |
| 549 | + |
| 550 | +close_netns: |
| 551 | + cleanup_netns(nstoken); |
| 552 | +skel_destroy: |
| 553 | + mptcp_bpf_iter__destroy(skel); |
| 554 | +} |
| 555 | + |
473 | 556 | static struct nstoken *sched_init(char *flags, char *sched)
|
474 | 557 | {
|
475 | 558 | struct nstoken *nstoken;
|
@@ -651,6 +734,8 @@ void test_mptcp(void)
|
651 | 734 | test_mptcpify();
|
652 | 735 | if (test__start_subtest("subflow"))
|
653 | 736 | test_subflow();
|
| 737 | + if (test__start_subtest("bpf_iter")) |
| 738 | + test_bpf_iter(); |
654 | 739 | if (test__start_subtest("default"))
|
655 | 740 | test_default();
|
656 | 741 | if (test__start_subtest("first"))
|
|
0 commit comments