From nobody Mon Sep 16 18:50:08 2024 Received: from sender11-of-o51.zoho.eu (sender11-of-o51.zoho.eu [31.186.226.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7ED4F28EC for ; Sun, 6 Nov 2022 15:24:46 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1667748274; cv=none; d=zohomail.eu; s=zohoarc; b=ZAa/N68Tsi3gP2MtJpLIqPf3e4OxImpOJOJOEJZp9HXfHdAsoAIrjXoO55VMVVVt/9t7wA0VDZ9gNScnvMY8Utx/iqxurwwTMlAz81titANBoIZ2OfYHiCJZQsZC9vQgIjW15HiAqGj/HMg03dKZ/dLGhrYeJYoDeTPZGBAHJDY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1667748274; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=J3HXM8Itg6QZp4idplxxdPXA4VyuWF3eP1i47bCh7rk=; b=fAmwU2V5nLRI/RaA+S9y7jqimlTrs+pMKaOtyA2pNV/sgUQp4Mn43ruPZUeWBZqQ9JfRbL5QAc1P+3Kr8aXBgbrmQM2Y7rjQC2GwA1vOTYNmX2BnjmfxUoXcPUf2e4N1bC5uc+rddXDeDAoPzrlBQsjUhO070EMcbKHfQtDmJ70= ARC-Authentication-Results: i=1; mx.zohomail.eu; dkim=pass header.i=shytyi.net; spf=pass smtp.mailfrom=dmytro@shytyi.net; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1667748274; s=hs; d=shytyi.net; i=dmytro@shytyi.net; h=From:From:To:To:Cc:Cc:Message-ID:Subject:Subject:Date:Date:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type:Message-Id:Reply-To; bh=J3HXM8Itg6QZp4idplxxdPXA4VyuWF3eP1i47bCh7rk=; b=MgHEZk9uDvDrjH8buZPFZdShImy51eIw4ILn/DMx7MN5jk6YUBqyjLRSyy02y4bo 9sHFh3f9iFnrnnpDzcPb/JPEbCk3Q4JbexstiTSjmth94XHvkIhk1Rv0pnIyfpWCh6C 7/Tt0soFHpKVLe3/TUzM9NCqMCKUEAgW2HBCDt2w= Received: from localhost.localdomain (vps-940813d4.vps.ovh.net [198.244.188.50]) by mx.zoho.eu with SMTPS id 1667748272011923.596557633137; Sun, 6 Nov 2022 16:24:32 +0100 (CET) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20221106152411.655-6-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v15 5/5] selftests: mptcp: mptfo Initiator/Listener Date: Sun, 6 Nov 2022 15:24:11 +0000 X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221106152411.655-1-dmytro@shytyi.net> References: <20221106152411.655-1-dmytro@shytyi.net> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" This patch adds the selftests support for mptfo in mptcp_connect.c We introduce mptfo option, that sets "TCP_FASTOPEN" + "MSG_FASTOPEN" We call sendto() instead of connect(). Signed-off-by: Dmytro Shytyi --- .../selftests/net/mptcp/mptcp_connect.c | 121 +++++++++++++----- .../selftests/net/mptcp/mptcp_connect.sh | 21 +++ 2 files changed, 113 insertions(+), 29 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/test= ing/selftests/net/mptcp/mptcp_connect.c index e54653ea2ed4..4bc855159c52 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.c +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c @@ -26,11 +26,13 @@ =20 #include #include +#include =20 -#include #include #include =20 + + extern int optind; =20 #ifndef IPPROTO_MPTCP @@ -83,6 +85,7 @@ struct cfg_cmsg_types { =20 struct cfg_sockopt_types { unsigned int transparent:1; + unsigned int mptfo:1; }; =20 struct tcp_inq_state { @@ -232,6 +235,14 @@ static void set_transparent(int fd, int pf) } } =20 +static void set_mptfo(int fd, int pf) +{ + int qlen =3D 25; + + if (setsockopt(fd, SOL_TCP, TCP_FASTOPEN, &qlen, sizeof(qlen)) =3D=3D -1) + perror("TCP_FASTOPEN"); +} + static int do_ulp_so(int sock, const char *name) { return setsockopt(sock, IPPROTO_TCP, TCP_ULP, name, strlen(name)); @@ -300,6 +311,9 @@ static int sock_listen_mptcp(const char * const listena= ddr, if (cfg_sockopt_types.transparent) set_transparent(sock, pf); =20 + if (cfg_sockopt_types.mptfo) + set_mptfo(sock, pf); + if (bind(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) break; /* success */ =20 @@ -330,13 +344,18 @@ static int sock_listen_mptcp(const char * const liste= naddr, =20 static int sock_connect_mptcp(const char * const remoteaddr, const char * const port, int proto, - struct addrinfo **peer) + struct addrinfo **peer, + int infd, + unsigned int *woff) { struct addrinfo hints =3D { .ai_protocol =3D IPPROTO_TCP, .ai_socktype =3D SOCK_STREAM, }; struct addrinfo *a, *addr; + unsigned int wlen =3D 0; + int syn_copied =3D 0; + char wbuf[8192]; int sock =3D -1; =20 hints.ai_family =3D pf; @@ -354,14 +373,33 @@ static int sock_connect_mptcp(const char * const remo= teaddr, if (cfg_mark) set_mark(sock, cfg_mark); =20 - if (connect(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) { - *peer =3D a; - break; /* success */ - } + if (cfg_sockopt_types.mptfo) { + if (wlen =3D=3D 0) + wlen =3D read(infd, wbuf, sizeof(wbuf)); =20 - perror("connect()"); - close(sock); - sock =3D -1; + syn_copied =3D sendto(sock, wbuf, wlen, MSG_FASTOPEN, + a->ai_addr, a->ai_addrlen); + if (syn_copied) { + *woff =3D wlen; + *peer =3D a; + break; /* success */ + } + } else { + if (connect(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) { + *peer =3D a; + break; /* success */ + } + } + if (cfg_sockopt_types.mptfo) { + perror("sendto()"); + close(sock); + sock =3D -1; + } else { + + perror("connect()"); + close(sock); + sock =3D -1; + } } =20 freeaddrinfo(addr); @@ -571,13 +609,14 @@ static void shut_wr(int fd) shutdown(fd, SHUT_WR); } =20 -static int copyfd_io_poll(int infd, int peerfd, int outfd, bool *in_closed= _after_out) +static int copyfd_io_poll(int infd, int peerfd, int outfd, + bool *in_closed_after_out, unsigned int woff) { struct pollfd fds =3D { .fd =3D peerfd, .events =3D POLLIN | POLLOUT, }; - unsigned int woff =3D 0, wlen =3D 0, total_wlen =3D 0, total_rlen =3D 0; + unsigned int wlen =3D 0, total_wlen =3D 0, total_rlen =3D 0; char wbuf[8192]; =20 set_nonblock(peerfd, true); @@ -839,7 +878,7 @@ static int copyfd_io_sendfile(int infd, int peerfd, int= outfd, return err; } =20 -static int copyfd_io(int infd, int peerfd, int outfd, bool close_peerfd) +static int copyfd_io(int infd, int peerfd, int outfd, bool close_peerfd, u= nsigned int woff) { bool in_closed_after_out =3D false; struct timespec start, end; @@ -851,7 +890,7 @@ static int copyfd_io(int infd, int peerfd, int outfd, b= ool close_peerfd) =20 switch (cfg_mode) { case CFG_MODE_POLL: - ret =3D copyfd_io_poll(infd, peerfd, outfd, &in_closed_after_out); + ret =3D copyfd_io_poll(infd, peerfd, outfd, &in_closed_after_out, woff); break; =20 case CFG_MODE_MMAP: @@ -1033,7 +1072,7 @@ int main_loop_s(int listensock) =20 SOCK_TEST_TCPULP(remotesock, 0); =20 - copyfd_io(fd, remotesock, 1, true); + copyfd_io(fd, remotesock, 1, true, 0); } else { perror("accept"); return 1; @@ -1130,6 +1169,11 @@ static void parse_setsock_options(const char *name) return; } =20 + if (strncmp(name, "MPTFO", len) =3D=3D 0) { + cfg_sockopt_types.mptfo =3D 1; + return; + } + fprintf(stderr, "Unrecognized setsockopt option %s\n", name); exit(1); } @@ -1168,23 +1212,25 @@ int main_loop(void) { int fd, ret, fd_in =3D 0; struct addrinfo *peer; + unsigned int woff =3D 0; =20 - /* listener is ready. */ - fd =3D sock_connect_mptcp(cfg_host, cfg_port, cfg_sock_proto, &peer); - if (fd < 0) - return 2; - + if (!cfg_sockopt_types.mptfo) { + /* listener is ready. */ + fd =3D sock_connect_mptcp(cfg_host, cfg_port, cfg_sock_proto, &peer, 0, = 0); + if (fd < 0) + return 2; again: - check_getpeername_connect(fd); + check_getpeername_connect(fd); =20 - SOCK_TEST_TCPULP(fd, cfg_sock_proto); + SOCK_TEST_TCPULP(fd, cfg_sock_proto); =20 - if (cfg_rcvbuf) - set_rcvbuf(fd, cfg_rcvbuf); - if (cfg_sndbuf) - set_sndbuf(fd, cfg_sndbuf); - if (cfg_cmsg_types.cmsg_enabled) - apply_cmsg_types(fd, &cfg_cmsg_types); + if (cfg_rcvbuf) + set_rcvbuf(fd, cfg_rcvbuf); + if (cfg_sndbuf) + set_sndbuf(fd, cfg_sndbuf); + if (cfg_cmsg_types.cmsg_enabled) + apply_cmsg_types(fd, &cfg_cmsg_types); + } =20 if (cfg_input) { fd_in =3D open(cfg_input, O_RDONLY); @@ -1192,8 +1238,25 @@ int main_loop(void) xerror("can't open %s:%d", cfg_input, errno); } =20 - /* close the client socket open only if we are not going to reconnect */ - ret =3D copyfd_io(fd_in, fd, 1, 0); + if (cfg_sockopt_types.mptfo) { + /* sendto() instead of connect */ + fd =3D sock_connect_mptcp(cfg_host, cfg_port, cfg_sock_proto, &peer, fd_= in, &woff); + if (fd < 0) + return 2; + + check_getpeername_connect(fd); + + SOCK_TEST_TCPULP(fd, cfg_sock_proto); + + if (cfg_rcvbuf) + set_rcvbuf(fd, cfg_rcvbuf); + if (cfg_sndbuf) + set_sndbuf(fd, cfg_sndbuf); + if (cfg_cmsg_types.cmsg_enabled) + apply_cmsg_types(fd, &cfg_cmsg_types); + } + + ret =3D copyfd_io(fd_in, fd, 1, 0, 0); if (ret) return ret; =20 diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_connect.sh index 621af6895f4d..60198b91a530 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.sh @@ -762,6 +762,23 @@ run_tests_peekmode() run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 "-P ${peekmode}" } =20 +run_tests_mptfo() +{ + echo "INFO: with MPTFO start" + ip netns exec "$ns1" sysctl -q net.ipv4.tcp_fastopen=3D2 + ip netns exec "$ns2" sysctl -q net.ipv4.tcp_fastopen=3D1 + + run_tests_lo "$ns1" "$ns2" 10.0.1.1 0 "-o MPTFO" + run_tests_lo "$ns1" "$ns2" 10.0.1.1 0 "-o MPTFO" + + run_tests_lo "$ns1" "$ns2" dead:beef:1::1 0 "-o MPTFO" + run_tests_lo "$ns1" "$ns2" dead:beef:1::1 0 "-o MPTFO" + + ip netns exec "$ns1" sysctl -q net.ipv4.tcp_fastopen=3D0 + ip netns exec "$ns2" sysctl -q net.ipv4.tcp_fastopen=3D0 + echo "INFO: with MPTFO end" +} + run_tests_disconnect() { local peekmode=3D"$1" @@ -901,6 +918,10 @@ run_tests_peekmode "saveWithPeek" run_tests_peekmode "saveAfterPeek" stop_if_error "Tests with peek mode have failed" =20 +# MPTFO (MultiPath TCP Fatopen tests) +run_tests_mptfo +stop_if_error "Tests with MPTFO have failed" + # connect to ns4 ip address, ns2 should intercept/proxy run_test_transparent 10.0.3.1 "tproxy ipv4" run_test_transparent dead:beef:3::1 "tproxy ipv6" --=20 2.34.1