From nobody Mon Feb 9 12:36:05 2026 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 8C30A33D2 for ; Wed, 21 Sep 2022 12:56:08 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1663764964; cv=none; d=zohomail.eu; s=zohoarc; b=IthWvBJktwbeKBbY4Ev4qUiK/OnI5hOea9pcTrdKjeYL2JerXN0h58libu+rbiTZtotlgI9EIru2bA+OxBh3i8QaNPEks44XXAPn5dFXc/PiwutOkEl/M4TxJEBExMet340/X6UMP2agVvL8y1Z7BGa8Kg4rCx/SioGHST7wrFM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1663764964; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=4rVkQa3qMMUlSRfyOKnPoxRWIYdOpkQv2kjbajFkgxY=; b=ejn1mcJnfuN8uYUKAsI1cx6PQqDu/QPs8OyZZI4wNQRvVtS+mfbR/PUPUgjqB7NmJJacODxRkqVzW9Niiivf68tviVHeaZfLh3X0pkGzQbJfGT8nZmX/AsXFwbPbllywo2qLknnUuezjm4frHNayqF5r+kwSwD6g2stIzEbG5GM= 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=1663764964; 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=4rVkQa3qMMUlSRfyOKnPoxRWIYdOpkQv2kjbajFkgxY=; b=XwKskZ5PUENRgeK4snDwFVIIigXC2S7nZrwpQqrPWTPJqWGX4bvnX7CMAbkwjMNc 98gB49mAPQK65x0TqKi9EYKiWPWbBdsK8uEciHt40pl4osS5olJYKvNfCzmjHWZPgSK 6aYjVnV+MowYb9qwBJhjkq3A4wL0G7E+sp5jNoEE= Received: from doris.localdomain (243.34.22.93.rev.sfr.net [93.22.34.243]) by mx.zoho.eu with SMTPS id 1663764962725995.374396107438; Wed, 21 Sep 2022 14:56:02 +0200 (CEST) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20220921125558.19483-2-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v9 1/6] mptcp: add mptcp_stream_connect to protocol.h Date: Wed, 21 Sep 2022 14:55:53 +0200 X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220921125558.19483-1-dmytro@shytyi.net> References: <20220921125558.19483-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" In the following patches we will call mptcp_stream_connect() from function tcp_sendmsg_fastopen() in file "net/ipv4/tcp.c", thus make such symbol visible. Signed-off-by: Dmytro Shytyi --- net/mptcp/protocol.c | 4 ++-- net/mptcp/protocol.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index c0bf48e3149b..470045793181 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3484,8 +3484,8 @@ static void mptcp_subflow_early_fallback(struct mptcp= _sock *msk, __mptcp_do_fallback(msk); } =20 -static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uadd= r, - int addr_len, int flags) +int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, + int addr_len, int flags) { struct mptcp_sock *msk =3D mptcp_sk(sock->sk); struct mptcp_subflow_context *subflow; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 93c535440a5c..632161b13950 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -837,6 +837,7 @@ void mptcp_event(enum mptcp_event_type type, const stru= ct mptcp_sock *msk, void mptcp_event_addr_announced(const struct sock *ssk, const struct mptcp= _addr_info *info); void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id); bool mptcp_userspace_pm_active(const struct mptcp_sock *msk); +int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, int = addr_len, int flags); =20 static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk) { --=20 2.25.1 From nobody Mon Feb 9 12:36:05 2026 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 ABCA333D4 for ; Wed, 21 Sep 2022 12:56:09 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1663764965; cv=none; d=zohomail.eu; s=zohoarc; b=H+UU/3Jy9g/tEH7X6gEUSTHOegiI3eHkv/3FZCLbsv9Vggn4XuAkaETO74xt5izeM1L0trtXOpDxXNX8wXK7GQLxL9+/cmcBaiLCjnvshjY9uEZOH9D6tXHWA6efrKreOAKP1jowf0wXqeIYxG+Ndsi+YUlMglVwPF5tIs28qeg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1663764965; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=5OyQn/p9PkC8XokMX7sYXXXkgJmhTlm5FtNujHkyZ0s=; b=CpeFqoGQDIc3FsJSznOc6l2tbRC7+OXekfiDVwe/KFI31fcvT0iKhJ45aEZnJAHuxEMZJXaCko5uossOhp/Yyqs7hbZ7SbL2KMhTqY/vXEJnYUOU3OVQOwL0hH3d8TvZpuCIFmwIBBYTUY9anPM2Mv2b1cwwmI9ujuLu56DEstM= 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=1663764965; 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=5OyQn/p9PkC8XokMX7sYXXXkgJmhTlm5FtNujHkyZ0s=; b=cJ2RghRwkETAukYIkL66AjyA5dv1twLH7jodXDVu8F6Ox8ZmO+No5d5mEjOSUFoK 6+ufsmJNOBlyRmI2ig5AmgOweBZxIij8ygoydcsOvoLYH44DdeZOytXCiUYKu1obigu KOAoWKJsGGq15WXFTGdhshGHsDYlq6fYzDCNmUzQ= Received: from doris.localdomain (243.34.22.93.rev.sfr.net [93.22.34.243]) by mx.zoho.eu with SMTPS id 1663764962931359.4916161028393; Wed, 21 Sep 2022 14:56:02 +0200 (CEST) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20220921125558.19483-3-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v9 2/6] mptcp: add mptcp_setsockopt_fastopen Date: Wed, 21 Sep 2022 14:55:54 +0200 X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220921125558.19483-1-dmytro@shytyi.net> References: <20220921125558.19483-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" Add set MPTFO socket option for MPTCP. This option is needed for the listen socket to accept MPTFO. Signed-off-by: Dmytro Shytyi --- net/mptcp/Makefile | 2 +- net/mptcp/fastopen.c | 32 ++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 5 +++++ net/mptcp/sockopt.c | 3 +++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 net/mptcp/fastopen.c diff --git a/net/mptcp/Makefile b/net/mptcp/Makefile index 8a7f68efa35f..c42ad8609876 100644 --- a/net/mptcp/Makefile +++ b/net/mptcp/Makefile @@ -2,7 +2,7 @@ obj-$(CONFIG_MPTCP) +=3D mptcp.o =20 mptcp-y :=3D protocol.o subflow.o options.o token.o crypto.o ctrl.o pm.o d= iag.o \ - mib.o pm_netlink.o sockopt.o pm_userspace.o sched.o + mib.o pm_netlink.o sockopt.o pm_userspace.o sched.o fastopen.o =20 obj-$(CONFIG_SYN_COOKIES) +=3D syncookies.o obj-$(CONFIG_INET_MPTCP_DIAG) +=3D mptcp_diag.o diff --git a/net/mptcp/fastopen.c b/net/mptcp/fastopen.c new file mode 100644 index 000000000000..9ef49a2d2ea2 --- /dev/null +++ b/net/mptcp/fastopen.c @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0 + * MPTCP Fast Open Mechanism. Copyright (c) 2021-2022, Dmytro SHYTYI + */ + +#include "protocol.h" + +int mptcp_setsockopt_sol_tcp_fastopen(struct mptcp_sock *msk, sockptr_t op= tval, + unsigned int optlen) +{ + struct sock *sk =3D (struct sock *)msk; + struct net *net =3D sock_net(sk); + int val; + int ret; + + ret =3D 0; + + if (copy_from_sockptr(&val, optval, sizeof(val))) + return -EFAULT; + + lock_sock(sk); + + if (val >=3D 0 && ((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) { + tcp_fastopen_init_key_once(net); + fastopen_queue_tune(sk, val); + } else { + ret =3D -EINVAL; + } + + release_sock(sk); + + return ret; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 632161b13950..57596cdfb1f9 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -839,6 +839,11 @@ void mptcp_event_addr_removed(const struct mptcp_sock = *msk, u8 id); bool mptcp_userspace_pm_active(const struct mptcp_sock *msk); int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, int = addr_len, int flags); =20 +// Fast Open Mechanism functions begin +int mptcp_setsockopt_sol_tcp_fastopen(struct mptcp_sock *msk, sockptr_t op= tval, + unsigned int optlen); +// Fast Open Mechanism functions end + static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk) { return READ_ONCE(msk->pm.addr_signal) & diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 423d3826ca1e..f62f0d63b8e6 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -559,6 +559,7 @@ static bool mptcp_supported_sockopt(int level, int optn= ame) case TCP_NOTSENT_LOWAT: case TCP_TX_DELAY: case TCP_INQ: + case TCP_FASTOPEN: return true; } =20 @@ -796,6 +797,8 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *= msk, int optname, return mptcp_setsockopt_sol_tcp_nodelay(msk, optval, optlen); case TCP_DEFER_ACCEPT: return mptcp_setsockopt_sol_tcp_defer(msk, optval, optlen); + case TCP_FASTOPEN: + return mptcp_setsockopt_sol_tcp_fastopen(msk, optval, optlen); } =20 return -EOPNOTSUPP; --=20 2.25.1 From nobody Mon Feb 9 12:36:05 2026 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 C9BEC33C0 for ; Wed, 21 Sep 2022 12:56:07 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1663764964; cv=none; d=zohomail.eu; s=zohoarc; b=V0HOIILVDDRINsf+m8VghZhehssavHByYS9xFkJC52O+PXfQb4a1aZtjqKw8pGUnXqBq4uqs7gXS81iCnla4YVuXau/UNBv26OmXuvoJB0WvjnxVQvGJUACsp5uONErRUSW1KB1/LL3bq+eeC3o/ziqyqmNjELIRlrL02la+Xxc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1663764964; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=WRncidMfE40C+dTPtggN1+TrhPs22BWkn0VJlHw1exc=; b=WQZw8CB1X5RLGA3Y9WOmUwGoFtSJp5HfahHxo6q7Wlar2qByhmHY2Bbr4+cA4jJqb5TqnwizNqK+qreYvv+7HjQ6JszBfY4pQe/UNsdai0jmRY6oB4AeLwpOG3Ed4Th29lUfi5WWdnKQOsFay6Gxe0VN/W0mRwM3O1rbQWxkZo0= 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=1663764964; 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=WRncidMfE40C+dTPtggN1+TrhPs22BWkn0VJlHw1exc=; b=BVhG5UaCJbvLrIq4wJbkw6AG/25Nf7/tuO0h+L5Dzv5reLAIf98Ft4E+VF8noIYA 8wGOrdHt5r5oczsdig4ehZ0Oyu/fl8PR26YwQwTSUJD2O0zqOhlR4YU5QQBiTWa7i3p bMxDGYTIfuEXVEBUf4eRKNB5hu2rDSOVfBlZk0/4= Received: from doris.localdomain (243.34.22.93.rev.sfr.net [93.22.34.243]) by mx.zoho.eu with SMTPS id 16637649631431022.7540864576093; Wed, 21 Sep 2022 14:56:03 +0200 (CEST) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20220921125558.19483-4-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v9 3/6] mptcp: reuse tcp_sendmsg_fastopen() Date: Wed, 21 Sep 2022 14:55:55 +0200 X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220921125558.19483-1-dmytro@shytyi.net> References: <20220921125558.19483-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" In the following patches we will reuse modified tcp_sendmsg_fastopen(). We call it from mptcp_sendmsg(). Signed-off-by: Dmytro Shytyi --- include/net/tcp.h | 3 +++ net/ipv4/tcp.c | 24 +++++++++++++++++++----- net/mptcp/protocol.c | 29 +++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index 735e957f7f4b..a7d49e42470a 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1754,6 +1754,9 @@ struct sock *tcp_try_fastopen(struct sock *sk, struct= sk_buff *skb, struct request_sock *req, struct tcp_fastopen_cookie *foc, const struct dst_entry *dst); +int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, + int *copied, size_t size, + struct ubuf_info *uarg); void tcp_fastopen_init_key_once(struct net *net); bool tcp_fastopen_cookie_check(struct sock *sk, u16 *mss, struct tcp_fastopen_cookie *cookie); diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 9251c99d3cfd..41fa9e840e0e 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -280,6 +280,9 @@ #include #include =20 +#include +#include "../mptcp/protocol.h" + /* Track pending CMSGs. */ enum { TCP_CMSG_INQ =3D 1, @@ -1162,9 +1165,9 @@ void tcp_free_fastopen_req(struct tcp_sock *tp) } } =20 -static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, - int *copied, size_t size, - struct ubuf_info *uarg) +int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, + int *copied, size_t size, + struct ubuf_info *uarg) { struct tcp_sock *tp =3D tcp_sk(sk); struct inet_sock *inet =3D inet_sk(sk); @@ -1197,8 +1200,19 @@ static int tcp_sendmsg_fastopen(struct sock *sk, str= uct msghdr *msg, } } flags =3D (msg->msg_flags & MSG_DONTWAIT) ? O_NONBLOCK : 0; - err =3D __inet_stream_connect(sk->sk_socket, uaddr, - msg->msg_namelen, flags, 1); + if (!sk_is_mptcp(sk)) { + err =3D __inet_stream_connect(sk->sk_socket, uaddr, + msg->msg_namelen, flags, 1); + } else { + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(sk); + + release_sock(sk); + release_sock(subflow->conn); + err =3D mptcp_stream_connect(sk->sk_socket, uaddr, + msg->msg_namelen, msg->msg_flags); + lock_sock(subflow->conn); + lock_sock(sk); + } /* fastopen_req could already be freed in __inet_stream_connect * if the connection times out or gets rst */ diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 470045793181..d5c502d141b4 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1668,14 +1668,39 @@ static int mptcp_sendmsg(struct sock *sk, struct ms= ghdr *msg, size_t len) { struct mptcp_sock *msk =3D mptcp_sk(sk); struct page_frag *pfrag; + struct socket *ssock; size_t copied =3D 0; int ret =3D 0; long timeo; =20 + lock_sock(sk); + + ssock =3D __mptcp_nmpc_socket(msk); + + if (ssock && inet_sk(ssock->sk)->defer_connect) { + release_sock(sk); + goto fastopen; + } else { + release_sock(sk); + } /* we don't support FASTOPEN yet */ - if (msg->msg_flags & MSG_FASTOPEN) - return -EOPNOTSUPP; + if (msg->msg_flags & MSG_FASTOPEN) { +fastopen: + lock_sock(sk); + + ssock =3D __mptcp_nmpc_socket(msk); + + lock_sock(ssock->sk); =20 + if (ssock) { + int copied_syn_fastopen =3D 0; + + ret =3D tcp_sendmsg_fastopen(ssock->sk, msg, &copied_syn_fastopen, len,= NULL); + copied +=3D copied_syn_fastopen; + } + release_sock(ssock->sk); + release_sock(sk); + } /* silently ignore everything else */ msg->msg_flags &=3D MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL; =20 --=20 2.25.1 From nobody Mon Feb 9 12:36:05 2026 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 89DFB33C3 for ; Wed, 21 Sep 2022 12:56:08 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1663764965; cv=none; d=zohomail.eu; s=zohoarc; b=I4ZfW1+UJRMHeH5hSxKPZ70/9CUDBdBjPc0HZoVCpyuZeM5hEqY0eE2rzSNOSy7A4IISZLCpw+fF4oGMZwRl/QJxN08yOvuevbtf4ERlppefIkWHnPCpxT1ce9XkK4pMmImcY0a68BYvTp6f0rT8RpM83SY/hw++tsgrN/6KT5s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1663764965; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=0o8v70YzDAVTa15FuMLgMkERQ9BpXL04ZypaIZkxmuw=; b=ahgNcYn+wXIl2m3xJSaumL4HnMW2AUFqWiZmyyHtwSnhCiOTWs3QM7KpogG5Q9B7ne0BShhxFMxj9sPIuFu3+sNbPQaxW0U234FoXVOrIxSzaOoZwm09oN+hvjwUE2bGUol3SA6SKJ0FRNNW5Eh4q6oxx9eIVR43qlnR1CYfauA= 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=1663764965; 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=0o8v70YzDAVTa15FuMLgMkERQ9BpXL04ZypaIZkxmuw=; b=S7h4oL+6vseTjiNgy0Z/rmN0UD/GKBA7mB+lwM3bq8gg6Ltjz7TPzeoPDGZwzY1O akYEn6/VJ05NIxtYwxmMnJMSocS9h69b/4I+ZkmmlHoKnzlWyo4xSOGiWnQVTzbYeJR ZYPWg7xaWk3dzqTaUwyYmyiUYqvRsSiXM46VPGaI= Received: from doris.localdomain (243.34.22.93.rev.sfr.net [93.22.34.243]) by mx.zoho.eu with SMTPS id 1663764963358336.34936517135304; Wed, 21 Sep 2022 14:56:03 +0200 (CEST) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20220921125558.19483-5-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v9 4/6] mptcp: fix retrans., add mptfo vars to msk Date: Wed, 21 Sep 2022 14:55:56 +0200 X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220921125558.19483-1-dmytro@shytyi.net> References: <20220921125558.19483-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" We use mptcp_gen_msk_ackseq_fasopen() when we know this is the first chunk of data after MPTFO. Without it I observe infinite retransmissions. Signed-off-by: Dmytro Shytyi --- net/mptcp/fastopen.c | 14 ++++++++++++++ net/mptcp/options.c | 5 +++++ net/mptcp/protocol.h | 3 +++ 3 files changed, 22 insertions(+) diff --git a/net/mptcp/fastopen.c b/net/mptcp/fastopen.c index 9ef49a2d2ea2..40c3fb8c75e3 100644 --- a/net/mptcp/fastopen.c +++ b/net/mptcp/fastopen.c @@ -30,3 +30,17 @@ int mptcp_setsockopt_sol_tcp_fastopen(struct mptcp_sock = *msk, sockptr_t optval, =20 return ret; } + +void mptcp_gen_msk_ackseq_fastopen(struct mptcp_sock *msk, struct mptcp_su= bflow_context *subflow, + struct mptcp_options_received mp_opt) +{ + u64 ack_seq; + + WRITE_ONCE(msk->can_ack, true); + WRITE_ONCE(msk->remote_key, mp_opt.sndr_key); + mptcp_crypto_key_sha(msk->remote_key, NULL, &ack_seq); + ack_seq++; + WRITE_ONCE(msk->ack_seq, ack_seq); + pr_debug("ack_seq=3D%llu sndr_key=3D%llu", msk->ack_seq, mp_opt.sndr_key); + atomic64_set(&msk->rcv_wnd_sent, ack_seq); +} diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 30d289044e71..0b6c4535750c 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1208,6 +1208,11 @@ bool mptcp_incoming_options(struct sock *sk, struct = sk_buff *skb) mpext->dsn64 =3D 1; mpext->mpc_map =3D 1; mpext->data_fin =3D 0; + + if (msk->is_mptfo) { + mptcp_gen_msk_ackseq_fastopen(msk, subflow, mp_opt); + mpext->data_seq =3D READ_ONCE(msk->ack_seq); + } } else { mpext->data_seq =3D mp_opt.data_seq; mpext->subflow_seq =3D mp_opt.subflow_seq; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 57596cdfb1f9..b9e251848099 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -282,6 +282,7 @@ struct mptcp_sock { bool use_64bit_ack; /* Set when we received a 64-bit DSN */ bool csum_enabled; bool allow_infinite_fallback; + bool is_mptfo; u8 mpc_endpoint_id; u8 recvmsg_inq:1, cork:1, @@ -842,6 +843,8 @@ int mptcp_stream_connect(struct socket *sock, struct so= ckaddr *uaddr, int addr_l // Fast Open Mechanism functions begin int mptcp_setsockopt_sol_tcp_fastopen(struct mptcp_sock *msk, sockptr_t op= tval, unsigned int optlen); +void mptcp_gen_msk_ackseq_fastopen(struct mptcp_sock *msk, struct mptcp_su= bflow_context *subflow, + struct mptcp_options_received mp_opt); // Fast Open Mechanism functions end =20 static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk) --=20 2.25.1 From nobody Mon Feb 9 12:36:05 2026 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 A344C33C0 for ; Wed, 21 Sep 2022 12:56:10 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1663764966; cv=none; d=zohomail.eu; s=zohoarc; b=RdH4qwsodOHLmu5k1M5opLh28aG/JWwsDjpsdmQ5rMctU/f5JkEM+YTVR4a9RVNQdrFP1cWpXiDzUYryVXROfu/76YOkiJ+ONJgQYxSejs/nDqP4YyQ6qpzn12EGCuEqukLd010bvuluvp7kly0zftEioi+UVpXOIHQ00oR1iwQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1663764966; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=eokmlQ8oi4OXiUuVhpV+0KvYeCkgGnbZtyTz99fuKMY=; b=XKxvWiGyUn8dW+/J3CvvujhqXdCeiRh6VzwYfannyp7XnQg24zWStdJiyXZYdR/zvq4wbHssUd8LyUQ97sDkZeCea2CbeNPuFApgQLYzglN/Jpg5guEoD5YTMRxXK0ReWoP3qz/o9JoBVkcWFerF6uj/krylLqJ3qaEJ3CrUPAE= 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=1663764966; 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=eokmlQ8oi4OXiUuVhpV+0KvYeCkgGnbZtyTz99fuKMY=; b=SJM8r6FzNfNFKHC8Wwd/t6ggjFlPO5Cm0aVJU6w+UnaV0Jw95z5KGQY0rypObGXu GM9rd5xs3IdVezJtIl5Kzbf8yTaqp6krKUZ6bbYaLdgtaU/MgVSC0ezHk5b4XFBu/hf 2mJlfAjZC6xA3+/J3PgI4f1g+UlbPA/JFTmRzKfE= Received: from doris.localdomain (243.34.22.93.rev.sfr.net [93.22.34.243]) by mx.zoho.eu with SMTPS id 1663764963595498.2564563571075; Wed, 21 Sep 2022 14:56:03 +0200 (CEST) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20220921125558.19483-6-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v9 5/6] mptcp: add subflow_v(4,6)_send_synack() Date: Wed, 21 Sep 2022 14:55:57 +0200 X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220921125558.19483-1-dmytro@shytyi.net> References: <20220921125558.19483-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" In this patch we add skb to the msk, dequeue it from sk, remove TSs and do skb mapping. Signed-off-by: Dmytro Shytyi --- net/ipv4/tcp_fastopen.c | 19 +++++++---- net/mptcp/protocol.c | 2 +- net/mptcp/protocol.h | 1 + net/mptcp/subflow.c | 70 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 7 deletions(-) diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c index 45cc7f1ca296..d6b1380525ea 100644 --- a/net/ipv4/tcp_fastopen.c +++ b/net/ipv4/tcp_fastopen.c @@ -356,13 +356,20 @@ struct sock *tcp_try_fastopen(struct sock *sk, struct= sk_buff *skb, if (foc->len =3D=3D 0) /* Client requests a cookie */ NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPFASTOPENCOOKIEREQD); =20 - if (!((tcp_fastopen & TFO_SERVER_ENABLE) && - (syn_data || foc->len >=3D 0) && - tcp_fastopen_queue_check(sk))) { - foc->len =3D -1; - return NULL; + if (sk_is_mptcp(sk)) { + if (((syn_data || foc->len >=3D 0) && + tcp_fastopen_queue_check(sk))) { + foc->len =3D -1; + return NULL; + } + } else { + if (!((tcp_fastopen & TFO_SERVER_ENABLE) && + (syn_data || foc->len >=3D 0) && + tcp_fastopen_queue_check(sk))) { + foc->len =3D -1; + return NULL; + } } - if (tcp_fastopen_no_cookie(sk, dst, TFO_SERVER_COOKIE_NOT_REQD)) goto fastopen; =20 diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index d5c502d141b4..6a593be6076b 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -200,7 +200,7 @@ static void mptcp_rfree(struct sk_buff *skb) mptcp_rmem_uncharge(sk, len); } =20 -static void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk) +void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk) { skb_orphan(skb); skb->sk =3D sk; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index b9e251848099..58a04144fff0 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -845,6 +845,7 @@ int mptcp_setsockopt_sol_tcp_fastopen(struct mptcp_sock= *msk, sockptr_t optval, unsigned int optlen); void mptcp_gen_msk_ackseq_fastopen(struct mptcp_sock *msk, struct mptcp_su= bflow_context *subflow, struct mptcp_options_received mp_opt); +void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk); // Fast Open Mechanism functions end =20 static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 07dd23d0fe04..7deb80c2af69 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -307,6 +307,74 @@ static struct dst_entry *subflow_v4_route_req(const st= ruct sock *sk, return NULL; } =20 +static int subflow_v4_send_synack(const struct sock *sk, struct dst_entry = *dst, + struct flowi *fl, + struct request_sock *req, + struct tcp_fastopen_cookie *foc, + enum tcp_synack_type synack_type, + struct sk_buff *syn_skb) +{ + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(sk); + struct tcp_request_sock *tcp_r_sock =3D tcp_rsk(req); + struct sock *socket =3D mptcp_subflow_ctx(sk)->conn; + struct inet_request_sock *ireq =3D inet_rsk(req); + struct mptcp_sock *msk =3D mptcp_sk(socket); + struct sock *var_sk =3D subflow->tcp_sock; + struct tcp_sock *tp =3D tcp_sk(sk); + struct sk_buff *skb; + + // + //We add ts here as in the "if" below it has no effect. + if (foc->len > -1) { + ireq->tstamp_ok =3D 0; + } + if (synack_type =3D=3D TCP_SYNACK_FASTOPEN) { + // + msk->is_mptfo =3D 1; + + skb =3D skb_peek(&var_sk->sk_receive_queue); + + // + __skb_unlink(skb, &var_sk->sk_receive_queue); + skb_ext_reset(skb); + skb_orphan(skb); + + // + //Solves: WARNING: at 704 _mptcp_move_skbs_from_subflow+0x5d0/0x651 + tp->copied_seq +=3D tp->rcv_nxt - tcp_r_sock->rcv_isn - 1; + + subflow->map_seq =3D mptcp_subflow_get_mapped_dsn(subflow); + + //Solves: BAD mapping: ssn=3D0 map_seq=3D1 map_data_len=3D3 + subflow->ssn_offset =3D tp->copied_seq - 1; + + // + lock_sock((struct sock *)msk); + + // + mptcp_set_owner_r(skb, (struct sock *)msk); + __skb_queue_tail(&msk->receive_queue, skb); + atomic64_set(&msk->rcv_wnd_sent, mptcp_subflow_get_mapped_dsn(subflow)); + + // + ((struct sock *)msk)->sk_data_ready((struct sock *)msk); + + // + release_sock((struct sock *)msk); + } + return tcp_request_sock_ipv4_ops.send_synack(sk, dst, fl, req, foc, synac= k_type, syn_skb); +} + +static int subflow_v6_send_synack(const struct sock *sk, struct dst_entry = *dst, + struct flowi *fl, + struct request_sock *req, + struct tcp_fastopen_cookie *foc, + enum tcp_synack_type synack_type, + struct sk_buff *syn_skb) +{ + return tcp_request_sock_ipv6_ops.send_synack(sk, dst, fl, req, foc, synac= k_type, syn_skb); +} + #if IS_ENABLED(CONFIG_MPTCP_IPV6) static struct dst_entry *subflow_v6_route_req(const struct sock *sk, struct sk_buff *skb, @@ -1920,6 +1988,7 @@ void __init mptcp_subflow_init(void) =20 subflow_request_sock_ipv4_ops =3D tcp_request_sock_ipv4_ops; subflow_request_sock_ipv4_ops.route_req =3D subflow_v4_route_req; + subflow_request_sock_ipv4_ops.send_synack =3D subflow_v4_send_synack; =20 subflow_specific =3D ipv4_specific; subflow_specific.conn_request =3D subflow_v4_conn_request; @@ -1933,6 +2002,7 @@ void __init mptcp_subflow_init(void) #if IS_ENABLED(CONFIG_MPTCP_IPV6) subflow_request_sock_ipv6_ops =3D tcp_request_sock_ipv6_ops; subflow_request_sock_ipv6_ops.route_req =3D subflow_v6_route_req; + subflow_request_sock_ipv6_ops.send_synack =3D subflow_v6_send_synack; =20 subflow_v6_specific =3D ipv6_specific; subflow_v6_specific.conn_request =3D subflow_v6_conn_request; --=20 2.25.1 From nobody Mon Feb 9 12:36:05 2026 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 B2CF133D6 for ; Wed, 21 Sep 2022 12:56:09 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1663764965; cv=none; d=zohomail.eu; s=zohoarc; b=F4OQUdYoJ05ERCnNlKwQYDb3qCz76hhFI86wWFIRg+Swt6y4vdA2euYo1UPPx7aJ3nNe7NLyRx/E+bwPpdbU8w4tS84IYTKo/Ml21Idk1Lo+aQYxgKqGtUMSNeV9VM5yZ6RksKDVfBQPBxB08PeHnOReToQ90oB2+wkmlZ+0aV8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1663764965; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=UsYtUbS3HsSr6GUypr31lTu7hfnlWzJ2z+9X9eBEaUM=; b=Lcwa0wc8oMQGgUP4+B+A5iydJ9yelFUJH7tSDwvJqw9OwQrzU+Nv+JxgbZrF2UZvSqUKYoKeGd/G6J5YEzghjvnwwJ0F6qUapXEvJfzfxlHPB/2snVxIjQ4PPPyjmOZZ9kwkzihxlL6NXnmkACXa42zgdmGI9K09tfx/fNB1Wt0= 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=1663764965; 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=UsYtUbS3HsSr6GUypr31lTu7hfnlWzJ2z+9X9eBEaUM=; b=RMha6fqk6faWhkG7kcYFMgitJ0YsfQX243um0PL136qjPpDzBErwiQ4dKDdOOntu 3n6Ch7Vc8kyPT0+RhvV/yv9gOFS+CmH1N/UTDqTA1DGMRXrab/7iDCz2Vn5IOjMmCmS nYUgx/oqg6zBqtzjaEcrT51XLa39wvjTk6vLWxE0= Received: from doris.localdomain (243.34.22.93.rev.sfr.net [93.22.34.243]) by mx.zoho.eu with SMTPS id 16637649639141002.3966716987634; Wed, 21 Sep 2022 14:56:03 +0200 (CEST) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20220921125558.19483-7-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v9 6/6] selftests: mptfo initiator/listener Date: Wed, 21 Sep 2022 14:55:58 +0200 X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220921125558.19483-1-dmytro@shytyi.net> References: <20220921125558.19483-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" MPTFO tests: these are examples of initiator (sendto) and listener, probably are going to be integrated to the mptcp_connect.* selftests Signed-off-by: Dmytro Shytyi --- tools/testing/selftests/net/mptcp/mptfo.sh | 13 +++ .../selftests/net/mptcp/mptfo_initiator.c | 43 ++++++++ .../selftests/net/mptcp/mptfo_listener.c | 100 ++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 tools/testing/selftests/net/mptcp/mptfo.sh create mode 100644 tools/testing/selftests/net/mptcp/mptfo_initiator.c create mode 100644 tools/testing/selftests/net/mptcp/mptfo_listener.c diff --git a/tools/testing/selftests/net/mptcp/mptfo.sh b/tools/testing/sel= ftests/net/mptcp/mptfo.sh new file mode 100644 index 000000000000..9ed0cb281094 --- /dev/null +++ b/tools/testing/selftests/net/mptcp/mptfo.sh @@ -0,0 +1,13 @@ +#!/bin/bash +#This is an example of environmen that was used to generate wireshark +sudo ip netns add server +sudo ip netns add client +sudo ip link add veth0 type veth peer name veth1 +sudo ip link set veth1 netns server +sudo ip link set veth0 netns client +sudo ip netns exec client ip a a 10.10.0.1/24 dev veth0 +sudo ip netns exec server ip a a 10.10.0.2/24 dev veth1 +sudo ip netns exec client ip link set dev veth0 up +sudo ip netns exec server ip link set dev veth1 up +sudo ip netns exec server bash -c "echo 2 > /proc/sys/net/ipv4/tcp_fastope= n" +sudo ip netns exec client bash -c "echo 1 > /proc/sys/net/ipv4/tcp_fastope= n" diff --git a/tools/testing/selftests/net/mptcp/mptfo_initiator.c b/tools/te= sting/selftests/net/mptcp/mptfo_initiator.c new file mode 100644 index 000000000000..05e6a3d62bb8 --- /dev/null +++ b/tools/testing/selftests/net/mptcp/mptfo_initiator.c @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SERVER_PORT 7003 + +int main(int argc, char *argv[]) +{ + unsigned char valsyn[3] =3D "abc"; + struct sockaddr_in daddr; + char *valend =3D "fff"; + char *val1 =3D "zz1"; + char *val2 =3D "zz2"; + char *val3 =3D "zz3"; + int sock_fd =3D -1; + int ret; + + memset(&daddr, 0, sizeof(daddr)); + inet_pton(AF_INET, "10.10.0.2", &daddr.sin_addr); + daddr.sin_family =3D AF_INET; + daddr.sin_port =3D htons(SERVER_PORT); + + sock_fd =3D socket(AF_INET, SOCK_STREAM, IPPROTO_MPTCP); + + ret =3D sendto(sock_fd, valsyn, 3, MSG_FASTOPEN, (struct sockaddr *) &dad= dr, sizeof(daddr)); + ret =3D write(sock_fd, val1, 3); + ret =3D write(sock_fd, val2, 3); + ret =3D write(sock_fd, val2, 3); + ret =3D write(sock_fd, val2, 3); + ret =3D write(sock_fd, val3, 3); + ret =3D write(sock_fd, valend, 3); + + close(sock_fd); + return EXIT_SUCCESS; +} diff --git a/tools/testing/selftests/net/mptcp/mptfo_listener.c b/tools/tes= ting/selftests/net/mptcp/mptfo_listener.c new file mode 100644 index 000000000000..6890349b14bb --- /dev/null +++ b/tools/testing/selftests/net/mptcp/mptfo_listener.c @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CLIENT_QUEUE_LEN 10 +#define SERVER_PORT 7003 + +int main(void) +{ + int listen_sock_fd =3D -1, client_sock_fd =3D -1; + char str_addr[INET6_ADDRSTRLEN]; + struct sockaddr_in server_addr; + int ret, flag; + int qlen =3D 5; + char ch; + + server_addr.sin_family =3D AF_INET; + inet_pton(AF_INET, "10.10.0.2", &server_addr.sin_addr); + server_addr.sin_port =3D htons(SERVER_PORT); + + /* Create socket for listening (client requests) */ + listen_sock_fd =3D socket(AF_INET, SOCK_STREAM, IPPROTO_MPTCP); + if (listen_sock_fd =3D=3D -1) { + perror("socket()server"); + return EXIT_FAILURE; + } + + /* Set socket to reuse address */ + flag =3D 1; + ret =3D setsockopt(listen_sock_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeo= f(flag)); + if (ret =3D=3D -1) { + perror("setsockopt()"); + return EXIT_FAILURE; + } + + ret =3D setsockopt(listen_sock_fd, SOL_TCP, TCP_FASTOPEN, &qlen, sizeof(q= len)); + if (ret =3D=3D -1) { + perror("setsockopt()TCP_FASTOPEN"); + return EXIT_FAILURE; + } + + /* Bind address and socket together */ + ret =3D bind(listen_sock_fd, (struct sockaddr *)&server_addr, sizeof(serv= er_addr)); + if (ret =3D=3D -1) { + perror("bind()"); + close(listen_sock_fd); + return EXIT_FAILURE; + } + + /* Create listening queue (client requests) */ + ret =3D listen(listen_sock_fd, CLIENT_QUEUE_LEN); + if (ret =3D=3D -1) { + perror("listen()"); + close(listen_sock_fd); + return EXIT_FAILURE; + } + perror("Server listening"); + while (1) { + /* Do TCP handshake with client */ + client_sock_fd =3D accept(listen_sock_fd, + NULL, + 0); + if (client_sock_fd =3D=3D -1) { + perror("accept()"); + close(listen_sock_fd); + return EXIT_FAILURE; + } else { + perror("ACCEPT_SUCCESS"); + } + + char rb[1024]; + + while (1) { + ret =3D read(client_sock_fd, rb, 3); + + if (ret =3D=3D -1) { + perror("SERVVERread()"); + close(client_sock_fd); + break; + } else { + fprintf(stderr, "received %c%c%c from client", rb[0], rb[1], rb[2]); + } + if (rb[0] =3D=3D 'f' && rb[1] =3D=3D 'f' && rb[2] =3D=3D 'f') { + close(client_sock_fd); + break; + } + + } + } + + return EXIT_SUCCESS; +} --=20 2.25.1