From nobody Thu Oct 15 23:34:51 2026 Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D4E13A6405 for ; Thu, 8 Oct 2026 11:10:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791457812; cv=none; b=nlG3qHjXcnPsKxUMJdzNLiLNu8fhGH79y49cnekKNUQ6WJ+yDoQc2SMWtm21wVnkNq7WE1LNjfq1UNtlExF74RuePOit06bteAoktHmn9Zvt/bFdqnnMeG3lftgT8C29K6CQbyWztKEdnHwaUixOytyNyl3pqCWaM2rXPELiku8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791457812; c=relaxed/simple; bh=OQ1sBuwp7i4mtiBMz3g9ZmE1aw++E1wr3jKq7s6Is9s=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=CWhoLCLcQWRcCMMeN+u59Z3RKpOjPDGHmzNfWPoJlTAVyqMcgWzTQ85HwoHDKgUCaU9zYQiTdY2i9GsC46V8JahOvESCoguCNsv5l0L48ss9zqQzqXY/NUnDQCz8pnXY2sm8BMwRtGp2FyxywMJXHFxELBrKJY5GPEmt7Hcl2ZA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZogCWTIS; arc=none smtp.client-ip=209.85.215.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZogCWTIS" Received: by mail-pg1-f171.google.com with SMTP id 41be03b00d2f7-cc7e79c1eaaso1371960a12.2 for ; Thu, 08 Oct 2026 04:10:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791457811; x=1792062611; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=ksAcPAYjWXgsbyCjE4ePPZl3/rW2axHKGjjtYG6aLyc=; b=ZogCWTISGrhVp3jKAbuJxOTjT8gNSYBlxpfv6m8XpjPlI6v5mbiZGMdYdo0/aG2p/V 5N75kwWfz58v2J8EsCKioiFyURB1BT0OvZBFbxBgoBN7VrpVHdYarfhq4KrxP76LbYIY nXYFquy+Fmhj+1x6SKS08Dvnb8vMJs3C+2KwDJQaPK9Cz326vRupsS2iSDzN7ORDmFdn n9KvTxgGX9dyUg8dHDaaj495zz5nHGHepXAWSSTNPOEl0c8/X2F+f62RpTU//dc7XmrP 8b2xpwyJc5WfLKZaIqrGu3dEAonMWppuYOXH3N9rnZXWZ2+v1x+VDUXcO1JIoeyeGJ91 D+Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791457811; x=1792062611; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ksAcPAYjWXgsbyCjE4ePPZl3/rW2axHKGjjtYG6aLyc=; b=I5lDNWVPGJdMHUGDy/1UtAewdOoHYKGwpCZUKT+253UkHeDRtzWf5JsN2VP6/ZZ//o 9wuLMVIRFhYkgzU0IpNPmz66PHZ0la5bNP+8m/3cbZmHKCNjEyGp5fYcxslsTnZuvR23 d4oNzIqhynJElpt8fRvpv0EnXRKAz3dhRqTHz411daw26Eq7XT8MKsrlu2G4ituV7zVj A6XNRNI7aQ/Dp0FGvkscHVw0jT1RXfC7xexbRRzjRA8E8ra6XCP1bclQ5xU6z9pFC3oP Qua5JN5MvpvmYn7/X81KpHtUboLzh7koT6hqjl9XJvVmvXE34CCS9gsSMUpjO1w6n7o7 gl8A== X-Forwarded-Encrypted: i=1; AKwUvBxtknJpfPL58KTPpQoJLI96iTHoU5chbIZYC8QrAVT8qWQIHED/fnE9IT0Xhe+vll0B0PAfwelValNbxAQ=@vger.kernel.org X-Gm-Message-State: AFuF++lHHjm54sRoRx2lHQIYVArEd+rVDLplFRQPzOeSiaWbWlp/Bjfb U9OFE7g3CyhgNfBbKdKOertQZBHWdqEnYukGvX8QqLUmPpXKb3bYr6nD X-Gm-Gg: AYBFou1jQKwLKfQ0EaP5TsKcd+qkybUnhsRbgNnx6Qo1RW7xzyNYJFSuubhJBGgolfC ZNtl9WbbNTLrgKPN/zoZQIJw/a1LpcusABTx5gIiUhkv/q4kHWD1J3Kr6dYAJbvFVqxln6l0hSI rPykDmfZ6TY4PwSUOFo7YZ+/DjV2P2vEjxdIJqgydHjyRwyJ9Za2dkprM3WhelGRq9azMMYMaNY 3TAysKfHLHZq6f+1LUVdpbpYtplBtkt4p4BFBpIlA2h+5jSjkEd2RonT6jxldIErjKM7H18dLPn 6br+DaJqv+/gdSr7GOptLrRilVhy13e7SNvtU4hNpp7pUvqVjdDAW6/LtEZneBmsWkRzMr6KvLa GTG4YMZw8tj4FoKAEMQf7K+APyyELm5VFaBvnrx6J6WzQDccFGbYWIxkU46cm/euoFe/stmhCOq u217jVJmBUnJWzfFPlGJaX85yHYAnQSpc3kT5Jn6sT8ehKjefyIE78UND81xUAZJeMs1DiEJnCJ jKP1QER X-Received: by 2002:a05:7301:fd05:b0:351:2958:1740 with SMTP id 5a478bee46e88-3515debbfc0mr4973570eec.37.1791457810536; Thu, 08 Oct 2026 04:10:10 -0700 (PDT) Received: from ramesh.. ([124.123.89.203]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3515aeb5c2esm14847521eec.10.2026.10.08.04.10.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Oct 2026 04:10:09 -0700 (PDT) From: T S Rameshkumar X-Google-Original-From: T S Rameshkumar To: matttbe@kernel.org, martineau@kernel.org, geliang@kernel.org Cc: netdev@vger.kernel.org, mptcp@lists.linux.dev, linux-kernel@vger.kernel.org, T S Rameshkumar Subject: [PATCH mptcp-next] selftests: mptcp: sockopt: test passive Fast Open early write push Date: Thu, 8 Oct 2026 16:40:03 +0530 Message-Id: <20261008111003.136143-1-rameshkumar.t@phytecembedded.in> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add automated test coverage for passive Fast Open early write data push in mptcp_sockopt.c and mptcp_sockopt.sh. The server enables TCP_FASTOPEN on an MPTCP listening socket, accepts an incoming connection with SYN payload data, and immediately writes reply bytes before the 3-way handshake fully completes. The client connects with TCP_FASTOPEN_CONNECT, sends request data, and validates reception of the server's reply over both IPv4 and IPv6. Signed-off-by: T S Rameshkumar --- .../selftests/net/mptcp/mptcp_sockopt.c | 59 ++++++++++++++++++- .../selftests/net/mptcp/mptcp_sockopt.sh | 34 +++++++++++ 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index b6e58d936..04af7cebc 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -28,6 +28,7 @@ #include =20 static int pf =3D AF_INET; +static bool do_tfo; =20 #ifndef IPPROTO_MPTCP #define IPPROTO_MPTCP 262 @@ -247,6 +248,14 @@ static int sock_connect_mptcp(const char * const remot= eaddr, if (sock < 0) continue; =20 + if (do_tfo) { + int one =3D 1; + + if (setsockopt(sock, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, + &one, sizeof(one)) < 0) + die_perror("setsockopt TCP_FASTOPEN_CONNECT"); + } + if (connect(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) break; /* success */ =20 @@ -264,7 +273,7 @@ static void parse_opts(int argc, char **argv) { int c; =20 - while ((c =3D getopt(argc, argv, "h6")) !=3D -1) { + while ((c =3D getopt(argc, argv, "h6f")) !=3D -1) { switch (c) { case 'h': die_usage(0); @@ -272,6 +281,9 @@ static void parse_opts(int argc, char **argv) case '6': pf =3D AF_INET6; break; + case 'f': + do_tfo =3D true; + break; default: die_usage(1); break; @@ -719,13 +731,36 @@ static int server(int pipefd) break; } =20 + if (do_tfo) { + int qlen =3D 5; + + if (setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &qlen, sizeof(qlen)) < 0) + die_perror("setsockopt TCP_FASTOPEN"); + } + r =3D write(pipefd, "conn", 4); assert(r =3D=3D 4); =20 alarm(15); r =3D xaccept(fd); =20 - process_one_client(r, pipefd); + if (do_tfo) { + char buf[64] =3D {0}; + ssize_t n; + + n =3D read(r, buf, sizeof(buf) - 1); + if (n <=3D 0) + die_perror("read tfo syn data"); + + n =3D write(r, "PONG_REPLY", 10); + if (n !=3D 10) + die_perror("write tfo reply"); + + n =3D read(r, buf, 1); + close(r); + } else { + process_one_client(r, pipefd); + } =20 close(fd); return 0; @@ -775,6 +810,26 @@ static int client(int pipefd) =20 alarm(15); =20 + if (do_tfo) { + const char *addr =3D (pf =3D=3D AF_INET) ? "127.0.0.1" : "::1"; + struct timeval tv =3D {.tv_sec =3D 5, .tv_usec =3D 0}; + char buf[64] =3D {0}; + ssize_t n; + + fd =3D sock_connect_mptcp(addr, "15432", IPPROTO_MPTCP); + n =3D write(fd, "PING_DATA", 9); + if (n !=3D 9) + die_perror("write PING_DATA"); + + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + n =3D read(fd, buf, sizeof(buf) - 1); + if (n <=3D 0 || strcmp(buf, "PONG_REPLY") !=3D 0) + xerror("Fastopen early write failed: received %zd bytes '%s'", n, buf); + + close(fd); + return 0; + } + switch (pf) { case AF_INET: fd =3D sock_connect_mptcp("127.0.0.1", "15432", IPPROTO_MPTCP); diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_sockopt.sh index e850a8742..b3b523ce8 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh @@ -351,6 +351,39 @@ do_tcpinq_tests() return $? } =20 +do_fastopen_tests() +{ + local lret=3D0 + + ip netns exec "$ns_sbox" sysctl -q net.ipv4.tcp_fastopen=3D3 + + ip netns exec "$ns_sbox" ./mptcp_sockopt -f + lret=3D$? + + print_title "Fast Open early write v4" + if [ $lret -ne 0 ]; then + mptcp_lib_pr_fail + mptcp_lib_result_fail "Fast Open early write v4" + ret=3D$lret + return + fi + mptcp_lib_pr_ok + mptcp_lib_result_pass "Fast Open early write v4" + + ip netns exec "$ns_sbox" ./mptcp_sockopt -6 -f + lret=3D$? + + print_title "Fast Open early write v6" + if [ $lret -ne 0 ]; then + mptcp_lib_pr_fail + mptcp_lib_result_fail "Fast Open early write v6" + ret=3D$lret + return + fi + mptcp_lib_pr_ok + mptcp_lib_result_pass "Fast Open early write v6" +} + sin=3D$(mktemp) sout=3D$(mktemp) cin=3D$(mktemp) @@ -366,6 +399,7 @@ run_tests $ns1 $ns2 dead:beef:1::1 =20 do_mptcp_sockopt_tests do_tcpinq_tests +do_fastopen_tests =20 mptcp_lib_result_print_all_tap exit $ret --=20 2.34.1