Message ID | 92ee6be5a465601ff3a2df29b6a517086e87ca3c.1691069778.git.geliang.tang@suse.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | bpf: Force to MPTCP | expand |
On 8/3/23 6:41 AM, Geliang Tang wrote: > Implement a new test program mptcpify: if the family is AF_INET or > AF_INET6, the type is SOCK_STREAM, and the protocol ID is 0 or > IPPROTO_TCP, set it to IPPROTO_MPTCP. It will be hooked in > update_socket_protocol(). > > Extend 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 outputs of 'ss' and 'nstat' > commands. > > Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net> > Signed-off-by: Geliang Tang <geliang.tang@suse.com> > --- > .../testing/selftests/bpf/prog_tests/mptcp.c | 94 +++++++++++++++++++ > tools/testing/selftests/bpf/progs/mptcpify.c | 25 +++++ > 2 files changed, 119 insertions(+) > create mode 100644 tools/testing/selftests/bpf/progs/mptcpify.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c > index 4407bd5c9e9a..caab3aa6a162 100644 > --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c > +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c > @@ -6,6 +6,7 @@ > #include "cgroup_helpers.h" > #include "network_helpers.h" > #include "mptcp_sock.skel.h" > +#include "mptcpify.skel.h" > > char NS_TEST[32]; > > @@ -195,8 +196,101 @@ 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(void) > +{ > + char cmd[256]; > + int err = 0; > + > + snprintf(cmd, sizeof(cmd), > + "ip netns exec %s ss -tOni | grep -q '%s'", > + NS_TEST, "tcp-ulp-mptcp"); > + if (!ASSERT_OK(system(cmd), "No tcp-ulp-mptcp found!")) > + err++; > + > + snprintf(cmd, sizeof(cmd), > + "ip netns exec %s nstat -asz %s | awk '%s' | grep -q '%s'", > + NS_TEST, "MPTcpExtMPCapableSYNACKRX", > + "NR==1 {next} {print $2}", "1"); > + if (!ASSERT_OK(system(cmd), "No MPTcpExtMPCapableSYNACKRX found!")) > + err++; > + > + return err; > +} > + > +static int run_mptcpify(int cgroup_fd) > +{ > + int server_fd, client_fd, prog_fd, err = 0; > + struct mptcpify *mptcpify_skel; > + > + mptcpify_skel = mptcpify__open_and_load(); > + if (!ASSERT_OK_PTR(mptcpify_skel, "skel_open_load")) > + return -EIO; > + > + err = mptcpify__attach(mptcpify_skel); > + if (!ASSERT_OK(err, "skel_attach")) > + goto out; > + > + prog_fd = bpf_program__fd(mptcpify_skel->progs.mptcpify); > + if (!ASSERT_GE(prog_fd, 0, "bpf_program__fd")) { > + err = -EIO; > + goto out; > + } load success means prog_fd is always valid. So above ASSERT_GE not needed. > + > + /* 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(); > + > + 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); > +} > + > void test_mptcp(void) > { > if (test__start_subtest("base")) > test_base(); > + if (test__start_subtest("mptcpify")) > + test_mptcpify(); > } > diff --git a/tools/testing/selftests/bpf/progs/mptcpify.c b/tools/testing/selftests/bpf/progs/mptcpify.c > new file mode 100644 > index 000000000000..9cf1febe982d > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/mptcpify.c > @@ -0,0 +1,25 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* Copyright (c) 2023, SUSE. */ > + > +#include <linux/bpf.h> > +#include <bpf/bpf_tracing.h> > + > +char _license[] SEC("license") = "GPL"; > + > +#define AF_INET 2 > +#define AF_INET6 10 > +#define SOCK_STREAM 1 > +#define IPPROTO_TCP 6 > +#define IPPROTO_MPTCP 262 To avoid the above macros, you can use vmlinux.h and bpf_tracing_net.h. > + > +SEC("fmod_ret/update_socket_protocol") > +int BPF_PROG(mptcpify, int family, int type, int protocol) > +{ > + if ((family == AF_INET || family == AF_INET6) && > + type == SOCK_STREAM && > + (!protocol || protocol == IPPROTO_TCP)) { > + return IPPROTO_MPTCP; > + } > + > + return protocol; > +}
On 8/3/23 6:41 AM, Geliang Tang wrote: > Implement a new test program mptcpify: if the family is AF_INET or > AF_INET6, the type is SOCK_STREAM, and the protocol ID is 0 or > IPPROTO_TCP, set it to IPPROTO_MPTCP. It will be hooked in > update_socket_protocol(). > > Extend 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 outputs of 'ss' and 'nstat' > commands. > > Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net> > Signed-off-by: Geliang Tang <geliang.tang@suse.com> > --- > .../testing/selftests/bpf/prog_tests/mptcp.c | 94 +++++++++++++++++++ > tools/testing/selftests/bpf/progs/mptcpify.c | 25 +++++ > 2 files changed, 119 insertions(+) > create mode 100644 tools/testing/selftests/bpf/progs/mptcpify.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c > index 4407bd5c9e9a..caab3aa6a162 100644 > --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c > +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c > @@ -6,6 +6,7 @@ > #include "cgroup_helpers.h" > #include "network_helpers.h" > #include "mptcp_sock.skel.h" > +#include "mptcpify.skel.h" > > char NS_TEST[32]; > > @@ -195,8 +196,101 @@ 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(void) > +{ > + char cmd[256]; > + int err = 0; > + > + snprintf(cmd, sizeof(cmd), > + "ip netns exec %s ss -tOni | grep -q '%s'", > + NS_TEST, "tcp-ulp-mptcp"); Could you show what is the expected output from the above command line ip netns exec %s ss -tOni ? This way, users can easily reason about the ss states based on tests. > + if (!ASSERT_OK(system(cmd), "No tcp-ulp-mptcp found!")) > + err++; > + > + snprintf(cmd, sizeof(cmd), > + "ip netns exec %s nstat -asz %s | awk '%s' | grep -q '%s'", > + NS_TEST, "MPTcpExtMPCapableSYNACKRX", > + "NR==1 {next} {print $2}", "1"); The same thing here. Could you show the expected output with ip netns exec %s nstat -asz %s ? > + if (!ASSERT_OK(system(cmd), "No MPTcpExtMPCapableSYNACKRX found!")) > + err++; > + > + return err; > +} > + [...]
Hi Yonghong, On Thu, Aug 03, 2023 at 06:23:57PM -0700, Yonghong Song wrote: > > > On 8/3/23 6:41 AM, Geliang Tang wrote: > > Implement a new test program mptcpify: if the family is AF_INET or > > AF_INET6, the type is SOCK_STREAM, and the protocol ID is 0 or > > IPPROTO_TCP, set it to IPPROTO_MPTCP. It will be hooked in > > update_socket_protocol(). > > > > Extend 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 outputs of 'ss' and 'nstat' > > commands. > > > > Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net> > > Signed-off-by: Geliang Tang <geliang.tang@suse.com> > > --- > > .../testing/selftests/bpf/prog_tests/mptcp.c | 94 +++++++++++++++++++ > > tools/testing/selftests/bpf/progs/mptcpify.c | 25 +++++ > > 2 files changed, 119 insertions(+) > > create mode 100644 tools/testing/selftests/bpf/progs/mptcpify.c > > > > diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c > > index 4407bd5c9e9a..caab3aa6a162 100644 > > --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c > > +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c > > @@ -6,6 +6,7 @@ > > #include "cgroup_helpers.h" > > #include "network_helpers.h" > > #include "mptcp_sock.skel.h" > > +#include "mptcpify.skel.h" > > char NS_TEST[32]; > > @@ -195,8 +196,101 @@ 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(void) > > +{ > > + char cmd[256]; > > + int err = 0; > > + > > + snprintf(cmd, sizeof(cmd), > > + "ip netns exec %s ss -tOni | grep -q '%s'", > > + NS_TEST, "tcp-ulp-mptcp"); > > Could you show what is the expected output from the above command line > ip netns exec %s ss -tOni > ? > This way, users can easily reason about the ss states based on tests. There're too many items in the output of command 'ip netns exec %s ss -tOni': ''' State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 127.0.0.1:42225 127.0.0.1:44180 cubic wscale:7,7 rto:201 rtt:0.034/0.017 ato:40 mss:16640 pmtu:65535 rcvmss:536 advmss:65483 cwnd:10 bytes_received:1 segs_out:1 segs_in:3 data_segs_in:1 send 39152941176bps lastsnd:7 lastrcv:7 lastack:7 pacing_rate 78305882352bps delivered:1 app_limited rcv_space:33280 rcv_ssthresh:33280 minrtt:0.034 snd_wnd:33280 tcp-ulp-mptcp flags:Mec token:0000(id:0)/3a1e0d3c(id:0) seq:c2802f11c5228db6 sfseq:1 ssnoff:49d3c135 maplen:1 ESTAB 0 0 127.0.0.1:44180 127.0.0.1:42225 cubic wscale:7,7 rto:201 rtt:0.036/0.02 mss:16640 pmtu:65535 rcvmss:536 advmss:65483 cwnd:10 bytes_sent:1 bytes_acked:2 segs_out:3 segs_in:2 data_segs_out:1 send 36977777778bps lastsnd:7 lastrcv:7 lastack:7 pacing_rate 72200677960bps delivery_rate 8874666664bps delivered:2 rcv_space:33280 rcv_ssthresh:33280 minrtt:0.015 snd_wnd:33280 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/39429ce(id:0) seq:e3ed00de37c805c sfseq:1 ssnoff:d4e4d561 maplen:0 ''' We only care about this 'tcp-ulp-mptcp' item. Show all output will confuse users. So we just pick and test the only item we care. > > > + if (!ASSERT_OK(system(cmd), "No tcp-ulp-mptcp found!")) > > + err++; > > + > > + snprintf(cmd, sizeof(cmd), > > + "ip netns exec %s nstat -asz %s | awk '%s' | grep -q '%s'", > > + NS_TEST, "MPTcpExtMPCapableSYNACKRX", > > + "NR==1 {next} {print $2}", "1"); > > The same thing here. Could you show the expected output with > ip netns exec %s nstat -asz %s > ? The output of 'ip netns exec %s nstat -asz %s' is: ''' #kernel MPTcpExtMPCapableSYNACKRX 1 0.0 ''' The same, we only check if it contains an MPTcpExtMPCapableSYNACKRX, not show the output. -Geliang > > > + if (!ASSERT_OK(system(cmd), "No MPTcpExtMPCapableSYNACKRX found!")) > > + err++; > > + > > + return err; > > +} > > + > [...]
On 8/3/23 7:24 PM, Geliang Tang wrote: > Hi Yonghong, > > On Thu, Aug 03, 2023 at 06:23:57PM -0700, Yonghong Song wrote: >> >> >> On 8/3/23 6:41 AM, Geliang Tang wrote: >>> Implement a new test program mptcpify: if the family is AF_INET or >>> AF_INET6, the type is SOCK_STREAM, and the protocol ID is 0 or >>> IPPROTO_TCP, set it to IPPROTO_MPTCP. It will be hooked in >>> update_socket_protocol(). >>> >>> Extend 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 outputs of 'ss' and 'nstat' >>> commands. >>> >>> Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net> >>> Signed-off-by: Geliang Tang <geliang.tang@suse.com> >>> --- >>> .../testing/selftests/bpf/prog_tests/mptcp.c | 94 +++++++++++++++++++ >>> tools/testing/selftests/bpf/progs/mptcpify.c | 25 +++++ >>> 2 files changed, 119 insertions(+) >>> create mode 100644 tools/testing/selftests/bpf/progs/mptcpify.c >>> >>> diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c >>> index 4407bd5c9e9a..caab3aa6a162 100644 >>> --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c >>> +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c >>> @@ -6,6 +6,7 @@ >>> #include "cgroup_helpers.h" >>> #include "network_helpers.h" >>> #include "mptcp_sock.skel.h" >>> +#include "mptcpify.skel.h" >>> char NS_TEST[32]; >>> @@ -195,8 +196,101 @@ 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(void) >>> +{ >>> + char cmd[256]; >>> + int err = 0; >>> + >>> + snprintf(cmd, sizeof(cmd), >>> + "ip netns exec %s ss -tOni | grep -q '%s'", >>> + NS_TEST, "tcp-ulp-mptcp"); >> >> Could you show what is the expected output from the above command line >> ip netns exec %s ss -tOni >> ? >> This way, users can easily reason about the ss states based on tests. > > There're too many items in the output of command 'ip netns exec %s ss -tOni': > > ''' > State Recv-Q Send-Q Local Address:Port Peer Address:Port Process > ESTAB 0 0 127.0.0.1:42225 127.0.0.1:44180 cubic wscale:7,7 rto:201 rtt:0.034/0.017 ato:40 mss:16640 pmtu:65535 rcvmss:536 advmss:65483 cwnd:10 bytes_received:1 segs_out:1 segs_in:3 data_segs_in:1 send 39152941176bps lastsnd:7 lastrcv:7 lastack:7 pacing_rate 78305882352bps delivered:1 app_limited rcv_space:33280 rcv_ssthresh:33280 minrtt:0.034 snd_wnd:33280 tcp-ulp-mptcp flags:Mec token:0000(id:0)/3a1e0d3c(id:0) seq:c2802f11c5228db6 sfseq:1 ssnoff:49d3c135 maplen:1 > ESTAB 0 0 127.0.0.1:44180 127.0.0.1:42225 cubic wscale:7,7 rto:201 rtt:0.036/0.02 mss:16640 pmtu:65535 rcvmss:536 advmss:65483 cwnd:10 bytes_sent:1 bytes_acked:2 segs_out:3 segs_in:2 data_segs_out:1 send 36977777778bps lastsnd:7 lastrcv:7 lastack:7 pacing_rate 72200677960bps delivery_rate 8874666664bps delivered:2 rcv_space:33280 rcv_ssthresh:33280 minrtt:0.015 snd_wnd:33280 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/39429ce(id:0) seq:e3ed00de37c805c sfseq:1 ssnoff:d4e4d561 maplen:0 > ''' > > We only care about this 'tcp-ulp-mptcp' item. > > Show all output will confuse users. So we just pick and test the only > item we care. Thanks. Originally I thought at least we should put one line in the comment which has 'tcp-ulp-mptcp' like ESTAB 0 0 127.0.0.1:44180 127.0.0.1:42225 cubic wscale:7,7 rto:201 rtt:0.036/0.02 mss:16640 pmtu:65535 rcvmss:536 advmss:65483 cwnd:10 bytes_sent:1 bytes_acked:2 segs_out:3 segs_in:2 data_segs_out:1 send 36977777778bps lastsnd:7 lastrcv:7 lastack:7 pacing_rate 72200677960bps delivery_rate 8874666664bps delivered:2 rcv_space:33280 rcv_ssthresh:33280 minrtt:0.015 snd_wnd:33280 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/39429ce(id:0) seq:e3ed00de37c805c sfseq:1 ssnoff:d4e4d561 maplen:0 or simplified version ESTAB 0 0 127.0.0.1:44180 127.0.0.1:42225 cubic ... tcp-ulp-mptcp flags:Mmec ... But people familiar with 'ss' should be able to dump it and get the above (maybe without tcp-ulp-mptcp) easily. So I am okay with no additional comments. > >> >>> + if (!ASSERT_OK(system(cmd), "No tcp-ulp-mptcp found!")) >>> + err++; >>> + >>> + snprintf(cmd, sizeof(cmd), >>> + "ip netns exec %s nstat -asz %s | awk '%s' | grep -q '%s'", >>> + NS_TEST, "MPTcpExtMPCapableSYNACKRX", >>> + "NR==1 {next} {print $2}", "1"); >> >> The same thing here. Could you show the expected output with >> ip netns exec %s nstat -asz %s >> ? > > The output of 'ip netns exec %s nstat -asz %s' is: > > ''' > #kernel > MPTcpExtMPCapableSYNACKRX 1 0.0 > ''' > > The same, we only check if it contains an MPTcpExtMPCapableSYNACKRX, not > show the output. > > -Geliang > >> >>> + if (!ASSERT_OK(system(cmd), "No MPTcpExtMPCapableSYNACKRX found!")) >>> + err++; >>> + >>> + return err; >>> +} >>> + >> [...]
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index 4407bd5c9e9a..caab3aa6a162 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -6,6 +6,7 @@ #include "cgroup_helpers.h" #include "network_helpers.h" #include "mptcp_sock.skel.h" +#include "mptcpify.skel.h" char NS_TEST[32]; @@ -195,8 +196,101 @@ 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(void) +{ + char cmd[256]; + int err = 0; + + snprintf(cmd, sizeof(cmd), + "ip netns exec %s ss -tOni | grep -q '%s'", + NS_TEST, "tcp-ulp-mptcp"); + if (!ASSERT_OK(system(cmd), "No tcp-ulp-mptcp found!")) + err++; + + snprintf(cmd, sizeof(cmd), + "ip netns exec %s nstat -asz %s | awk '%s' | grep -q '%s'", + NS_TEST, "MPTcpExtMPCapableSYNACKRX", + "NR==1 {next} {print $2}", "1"); + if (!ASSERT_OK(system(cmd), "No MPTcpExtMPCapableSYNACKRX found!")) + err++; + + return err; +} + +static int run_mptcpify(int cgroup_fd) +{ + int server_fd, client_fd, prog_fd, err = 0; + struct mptcpify *mptcpify_skel; + + mptcpify_skel = mptcpify__open_and_load(); + if (!ASSERT_OK_PTR(mptcpify_skel, "skel_open_load")) + return -EIO; + + err = mptcpify__attach(mptcpify_skel); + if (!ASSERT_OK(err, "skel_attach")) + goto out; + + prog_fd = bpf_program__fd(mptcpify_skel->progs.mptcpify); + if (!ASSERT_GE(prog_fd, 0, "bpf_program__fd")) { + err = -EIO; + 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(); + + 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); +} + void test_mptcp(void) { if (test__start_subtest("base")) test_base(); + if (test__start_subtest("mptcpify")) + test_mptcpify(); } diff --git a/tools/testing/selftests/bpf/progs/mptcpify.c b/tools/testing/selftests/bpf/progs/mptcpify.c new file mode 100644 index 000000000000..9cf1febe982d --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcpify.c @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2023, SUSE. */ + +#include <linux/bpf.h> +#include <bpf/bpf_tracing.h> + +char _license[] SEC("license") = "GPL"; + +#define AF_INET 2 +#define AF_INET6 10 +#define SOCK_STREAM 1 +#define IPPROTO_TCP 6 +#define IPPROTO_MPTCP 262 + +SEC("fmod_ret/update_socket_protocol") +int BPF_PROG(mptcpify, int family, int type, int protocol) +{ + if ((family == AF_INET || family == AF_INET6) && + type == SOCK_STREAM && + (!protocol || protocol == IPPROTO_TCP)) { + return IPPROTO_MPTCP; + } + + return protocol; +}