MPTCP Archive mirror
 help / color / mirror / Atom feed
From: Mat Martineau <martineau@kernel.org>
To: Geliang Tang <geliang@kernel.org>
Cc: mptcp@lists.linux.dev, Geliang Tang <tanggeliang@kylinos.cn>
Subject: Re: [PATCH mptcp-next v8 2/4] selftests/bpf: Add mptcp subflow subtest
Date: Tue, 23 Apr 2024 13:58:17 -0700 (PDT)	[thread overview]
Message-ID: <fe31493a-c21a-9535-36a8-8d49981f3d19@kernel.org> (raw)
In-Reply-To: <c479600e938723857db1bba00c98c100c3852aca.1713612119.git.tanggeliang@kylinos.cn>

On Sat, 20 Apr 2024, Geliang Tang wrote:

> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> This patch adds a subtest named test_subflow to load and verify the newly
> added mptcp subflow example in test_mptcp. Add a helper endpoint_init()
> to add a new subflow endpoint. Add another helper ss_search() to verify the
> fwmark and congestion values set by mptcp_subflow prog using setsockopts.
>
> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/76
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
> .../testing/selftests/bpf/prog_tests/mptcp.c  | 114 +++++++++++++++++-
> 1 file changed, 108 insertions(+), 6 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
> index d3cc3541dd4f..0b0da4556d91 100644
> --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
> +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
> @@ -9,6 +9,7 @@
> #include "network_helpers.h"
> #include "mptcp_sock.skel.h"
> #include "mptcpify.skel.h"
> +#include "mptcp_subflow.skel.h"
> #include "mptcp_bpf_first.skel.h"
> #include "mptcp_bpf_bkup.skel.h"
> #include "mptcp_bpf_rr.skel.h"
> @@ -16,6 +17,9 @@
> #include "mptcp_bpf_burst.skel.h"
>
> #define NS_TEST "mptcp_ns"
> +#define ADDR_1	"10.0.1.1"
> +#define ADDR_2	"10.0.1.2"
> +#define PORT_1	10001
> #define WITH_DATA	true
> #define WITHOUT_DATA	false
>
> @@ -41,6 +45,9 @@
> #endif
> #define MPTCP_SCHED_NAME_MAX	16
>
> +static const unsigned int total_bytes = 10 * 1024 * 1024;
> +static int duration;
> +
> struct __mptcp_info {
> 	__u8	mptcpi_subflows;
> 	__u8	mptcpi_add_addr_signal;
> @@ -332,8 +339,106 @@ static void test_mptcpify(void)
> 	close(cgroup_fd);
> }
>
> -static const unsigned int total_bytes = 10 * 1024 * 1024;
> -static int stop, duration;
> +static int endpoint_init(char *flags)
> +{
> +	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);
> +
> +	return 0;
> +fail:
> +	return -1;
> +}
> +
> +static int _ss_search(char *src, char *dst, char *port, char *keyword)
> +{
> +	char cmd[128];
> +
> +	snprintf(cmd, sizeof(cmd),
> +		 "ip netns exec %s ss -Menita src %s dst %s %s %d | grep -q '%s'",
> +		 NS_TEST, src, dst, port, PORT_1, keyword);

Hi Geliang -

Sorry I missed this before, can you validate the return value of 
snprintf() before executing the command? I see that wasn't included in the 
old has_bytes_sent() code that this is similar to, but it would be good to 
fix it now.

Thanks,
Mat

> +	return system(cmd);
> +}
> +
> +static int ss_search(char *src, char *keyword)
> +{
> +	return _ss_search(src, ADDR_1, "dport", keyword);
> +}
> +
> +static void run_subflow(char *new)
> +{
> +	int server_fd, client_fd, err;
> +	char cc[TCP_CA_NAME_MAX];
> +	socklen_t len = sizeof(cc);
> +
> +	server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
> +	if (!ASSERT_GE(server_fd, 0, "start_mptcp_server"))
> +		return;
> +
> +	client_fd = connect_to_fd(server_fd, 0);
> +	if (!ASSERT_GE(client_fd, 0, "connect to fd"))
> +		goto fail;
> +
> +	err = getsockopt(server_fd, SOL_TCP, TCP_CONGESTION, cc, &len);
> +	if (!ASSERT_OK(err, "getsockopt(srv_fd, TCP_CONGESTION)"))
> +		goto fail;
> +
> +	send_byte(client_fd);
> +
> +	ASSERT_OK(ss_search(ADDR_1, "fwmark:0x1"), "ss_search fwmark:0x1");
> +	ASSERT_OK(ss_search(ADDR_2, "fwmark:0x2"), "ss_search fwmark:0x2");
> +	ASSERT_OK(ss_search(ADDR_1, new), "ss_search new cc");
> +	ASSERT_OK(ss_search(ADDR_2, cc), "ss_search default cc");
> +
> +	close(client_fd);
> +fail:
> +	close(server_fd);
> +}
> +
> +static void test_subflow(void)
> +{
> +	int cgroup_fd, prog_fd, err;
> +	struct mptcp_subflow *skel;
> +	struct nstoken *nstoken;
> +
> +	cgroup_fd = test__join_cgroup("/mptcp_subflow");
> +	if (!ASSERT_GE(cgroup_fd, 0, "join_cgroup: mptcp_subflow"))
> +		return;
> +
> +	skel = mptcp_subflow__open_and_load();
> +	if (!ASSERT_OK_PTR(skel, "skel_open_load: mptcp_subflow"))
> +		goto close_cgroup;
> +
> +	err = mptcp_subflow__attach(skel);
> +	if (!ASSERT_OK(err, "skel_attach: mptcp_subflow"))
> +		goto skel_destroy;
> +
> +	prog_fd = bpf_program__fd(skel->progs.mptcp_subflow);
> +	err = bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS, 0);
> +	if (!ASSERT_OK(err, "prog_attach"))
> +		goto skel_destroy;
> +
> +	nstoken = create_netns();
> +	if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_subflow"))
> +		goto skel_destroy;
> +
> +	if (!ASSERT_OK(endpoint_init("subflow"), "endpoint_init"))
> +		goto close_netns;
> +
> +	run_subflow(skel->data->cc);
> +
> +close_netns:
> +	cleanup_netns(nstoken);
> +skel_destroy:
> +	mptcp_subflow__destroy(skel);
> +close_cgroup:
> +	close(cgroup_fd);
> +}
> +
> +static int stop;
>
> static void *server(void *arg)
> {
> @@ -414,10 +519,6 @@ static void send_data(int lfd, int fd, char *msg)
> 	      PTR_ERR(thread_ret));
> }
>
> -#define ADDR_1	"10.0.1.1"
> -#define ADDR_2	"10.0.1.2"
> -#define PORT_1	10001
> -
> static struct nstoken *sched_init(char *flags, char *sched)
> {
> 	struct nstoken *nstoken;
> @@ -558,6 +659,7 @@ void test_mptcp(void)
> {
> 	RUN_MPTCP_TEST(base);
> 	RUN_MPTCP_TEST(mptcpify);
> +	RUN_MPTCP_TEST(subflow);
> 	RUN_MPTCP_TEST(default);
> 	RUN_MPTCP_TEST(first);
> 	RUN_MPTCP_TEST(bkup);
> -- 
> 2.40.1
>
>
>

  reply	other threads:[~2024-04-23 20:58 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-20 11:23 [PATCH mptcp-next v8 0/4] setsockopt per subflow: BPF Geliang Tang
2024-04-20 11:23 ` [PATCH mptcp-next v8 1/4] selftests/bpf: Add mptcp subflow example Geliang Tang
2024-04-20 11:23 ` [PATCH mptcp-next v8 2/4] selftests/bpf: Add mptcp subflow subtest Geliang Tang
2024-04-23 20:58   ` Mat Martineau [this message]
2024-04-20 11:23 ` [PATCH mptcp-next v8 3/4] selftests/bpf: Handle SIGINT when creating netns Geliang Tang
2024-04-20 11:23 ` [PATCH mptcp-next v8 4/4] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
2024-04-20 12:17 ` [PATCH mptcp-next v8 0/4] setsockopt per subflow: BPF MPTCP CI

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=fe31493a-c21a-9535-36a8-8d49981f3d19@kernel.org \
    --to=martineau@kernel.org \
    --cc=geliang@kernel.org \
    --cc=mptcp@lists.linux.dev \
    --cc=tanggeliang@kylinos.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).