From nobody Thu Apr 25 08:56:30 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:3394:0:0:0:0 with SMTP id h20csp129584jav; Thu, 21 Oct 2021 22:15:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxypFyx7/c0KRaVWpi/ZxrZJ4eHRUyt/ikwa3EkljaFRS12RN/Qj7mwvKDzRJQYSubPe9TW X-Received: by 2002:a63:7c41:: with SMTP id l1mr3055432pgn.372.1634879755764; Thu, 21 Oct 2021 22:15:55 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1634879755; cv=pass; d=google.com; s=arc-20160816; b=TbuXH5PDx5j0CqM1DROzM26tPdqcevAXAnxdniXahFaA+mPb71d6tApN/vhFMy13t5 6lkTCNeA0NpOd4boB+7P218E9TSi7npu8Scz2O6MJtYL7DY0D4WPmDzssfxwkkOmjqHJ ergwB1Za13PXp4wp/3G6z4COFJ2h6fQOxRxAtFhMmcC3Y1sPeqPl1B7YeEv78bJdUrj6 HiizIRHAAxbGnoYmvn4eD61gg3oA+4istNFNRdioJ0+/VO7ZfHfzsTzPe87whtAqyzYX VRhtFCDwNbLlhB2dwCA73EwlLXbZyFKRKoosyJreOvLiXEe/lIEkfY8mkptpw/E1Lh8n DxFg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=user-agent:importance:content-transfer-encoding:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:subject :in-reply-to:message-id:cc:to:from:date:dkim-signature; bh=rWjzXhTDsdsfrOukOYlP1JvzxPVzK3mbCkYG8xgK8jk=; b=MnfJ5U70oOEOLpx42MS9g4diXg+PP+0euMR8aY8gmQ8PX80DSti1da0UE3frcmiNrj BPXe5yPaiOEPZ4FTWd0NFdL+PJg57g2mRKeMPr7rOOYVOK5eGfHodblfPiEg7J6ZCpBQ A8xEK33VDooZ9ZRXfi8tbw87H1LOWLXHsDE7GK/v2sLjMsY2/zbE/X6CbPp0Sy2Zinb1 C/Qti7Em6Ec8uSt6zxU4tOiU3YvvhTOMDNDWmgoC2gE1jq73xW0QgSjJq1EQ1k+sv5dG /1KMaFlHVS1VUIsvqmLk46vMGnuG2f6RaqOV1CdGxgicE+aZmUGjVZPYzZ1fl6IZhGQ6 A1pw== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@shytyi.net header.s=hs header.b="Qgq/Uwyn"; arc=pass (i=1 spf=pass spfdomain=shytyi.net dkim=pass dkdomain=shytyi.net dmarc=pass fromdomain=shytyi.net>); spf=pass (google.com: domain of mptcp+bounces-2233-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2233-wpasupplicant.patchew=gmail.com@lists.linux.dev" Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id m14si8983119pls.109.2021.10.21.22.15.54 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 21 Oct 2021 22:15:55 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-2233-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@shytyi.net header.s=hs header.b="Qgq/Uwyn"; arc=pass (i=1 spf=pass spfdomain=shytyi.net dkim=pass dkdomain=shytyi.net dmarc=pass fromdomain=shytyi.net>); spf=pass (google.com: domain of mptcp+bounces-2233-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2233-wpasupplicant.patchew=gmail.com@lists.linux.dev" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 5564E1C0EDF for ; Fri, 22 Oct 2021 05:15:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F12192C98; Fri, 22 Oct 2021 05:15:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev 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 7A3B02C81 for ; Fri, 22 Oct 2021 05:15:46 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1634879728; cv=none; d=zohomail.eu; s=zohoarc; b=SOqQFsoInBLCAqMgkT1CRHnU1kP0mFJ7Nftv5X22dS4MMS6v/DLTEEz2gEvPtoTC6TLjYYBDwRWGfA/lfPFczAKHkLdB20wR+jdp2LoRsgHfTf7kfjOOQml+wCzrjArfKihneouThUO/8CsOYoxuDr4Gvs9nS3SCanncAWprnQQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1634879728; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:MIME-Version:Message-ID:Subject:To; bh=rWjzXhTDsdsfrOukOYlP1JvzxPVzK3mbCkYG8xgK8jk=; b=Ds7H05Q1cj3domzLWssc6pKASp1aeOziZ3HeR1nrwLDzCdVebbgNXdIVVuWGJlogsyLGqk4/hj3ttmdSu5Cqf12KbbBCIzrsk8br4AtcfyDCbWsdagDD7hIvJnIMx+8MDEkHTSoZmA0WKNzVC8UuwN1XRrQjAyYATydu9qfMxOk= 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=1634879728; s=hs; d=shytyi.net; i=dmytro@shytyi.net; h=Date:From:To:Cc:Message-ID:In-Reply-To:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding; bh=rWjzXhTDsdsfrOukOYlP1JvzxPVzK3mbCkYG8xgK8jk=; b=Qgq/UwynQWI/3GiiZwpEqd5i1+FlqTL5GgadidUtIgcdOb9UsRrCOqqwq1Ltbunk vsBOTei/ePuIQG6lBMG7dejHWKOnpfZBQqCXJLZXKbeA+CfYafj2kS0OW3Q/cpTtfYo zzcqFCC6lbnHRIjKRn7W92yx1jsW2JX5Ih9wL5bg= Received: from mail.zoho.eu by mx.zoho.eu with SMTP id 1634879722555685.0241726852904; Fri, 22 Oct 2021 07:15:22 +0200 (CEST) Date: Fri, 22 Oct 2021 07:15:22 +0200 From: Dmytro Shytyi To: "mathewjmartineau" , ""matthieubaerts" <" Cc: "Davem" , "Kuba" , "mptcp" , "netdev" Message-ID: <17ca66cd439.10a0a3ce11621928.1543611905599720914@shytyi.net> In-Reply-To: Subject: [PATCH net-next v1] net: mptcp, Fast Open Mechanism Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Importance: Medium User-Agent: Zoho Mail X-Mailer: Zoho Mail Content-Type: text/plain; charset="utf-8" This set of patches will bring "Fast Open" Option support to MPTCP. The aim of Fast Open Mechanism is to eliminate one round trip=20 time from a TCP conversation by allowing data to be included as=20 part of the SYN segment that initiates the connection.=20 IETF RFC 8684: Appendix B. TCP Fast Open and MPTCP. [PATCH v1] includes "client" partial support for : 1. send request for cookie; 2. send syn+data+cookie. Signed-off-by: Dmytro Shytyi --- diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index cd6b11c9b54d..1f9ef060e980 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1686,6 +1686,68 @@ static void mptcp_set_nospace(struct sock *sk) set_bit(MPTCP_NOSPACE, &mptcp_sk(sk)->flags); } +static int mptcp_sendmsg_fastopen_cookie_req(struct sock *sk, struct msghd= r *msg, + size_t *copied, size_t size, + struct ubuf_info *uarg) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + struct socket *ssk =3D __mptcp_nmpc_socket(msk); + struct tcp_sock *tp =3D tcp_sk(ssk->sk); + struct sockaddr *uaddr =3D msg->msg_name; + struct tcp_fastopen_context *ctx; + const struct iphdr *iph; + struct sk_buff *skb; + int err; + + skb =3D sk_stream_alloc_skb(ssk->sk, 0, ssk->sk->sk_allocation, tru= e); + iph =3D ip_hdr(skb); + tcp_fastopen_init_key_once(sock_net(ssk->sk)); + ctx =3D tcp_fastopen_get_ctx(ssk->sk); + tp->fastopen_req =3D kzalloc(sizeof(*tp->fatopen_req), + ssk->sk->sk_allocation); + tp->fastopen_req->data =3D msg; + tp->fastopen_req->size =3D size; + tp->fastopen_req->uarg =3D uarg; + err =3D mptcp_stream_connect(sk->sk_socket, uaddr, msg->msg_namelen= , msg->msg_flags); + return err; +} + +static int mptcp_sendmsg_fastopen_cookie_send(struct sock *sk, struct msgh= dr *msg, + size_t *copied, size_t size, + struct ubuf_info *uarg) +{ + struct tcp_fastopen_cookie *fastopen_cookie =3D kmalloc(sizeof(*fas= topen_cookie), + GFP_KERNEL); + struct mptcp_sock *msk =3D mptcp_sk(sk); + struct socket *ssk =3D __mptcp_nmpc_socket(msk); + struct tcp_sock *tp =3D tcp_sk(ssk->sk); + struct sockaddr *uaddr =3D msg->msg_name; + struct tcp_fastopen_context *ctx; + const struct iphdr *iph; + struct sk_buff *skb; + int err; + + skb =3D sk_stream_alloc_skb(ssk->sk, 0, ssk->sk->sk_allocation, tru= e); + iph =3D ip_hdr(skb); + tcp_fastopen_init_key_once(sock_net(ssk->sk)); + ctx =3D tcp_fastopen_get_ctx(ssk->sk); + + fastopen_cookie->val[0] =3D cpu_to_le64(siphash(&iph->saddr, + sizeof(iph->saddr) + + sizeof(iph->daddr), + &ctx->key[0])); + fastopen_cookie->len =3D TCP_FASTOPEN_COOKIE_SIZE; + + tp->fastopen_req =3D kzalloc(sizeof(*tp->fastopen_req), + ssk->sk->sk_allocation); + tp->fastopen_req->data =3D msg; + tp->fastopen_req->size =3D size; + tp->fastopen_req->uarg =3D uarg; + memcpy(&tp->fastopen_req->cookie, fastopen_cookie, sizeof(tp->fasto= pen_req->cookie)); + err =3D mptcp_stream_connect(sk->sk_socket, uaddr, msg->msg_namelen= , msg->msg_flags); + return err; +} + static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) { struct mptcp_sock *msk =3D mptcp_sk(sk); @@ -1694,9 +1756,22 @@ static int mptcp_sendmsg(struct sock *sk, struct msg= hdr *msg, size_t len) int ret =3D 0; long timeo; - /* we don't support FASTOPEN yet */ - if (msg->msg_flags & MSG_FASTOPEN) - return -EOPNOTSUPP; + /* we don't fully support FASTOPEN yet */ + + if (msg->msg_flags & MSG_FASTOPEN) { + struct socket *ssk =3D __mptcp_nmpc_socket(msk); + struct tcp_sock *tp =3D tcp_sk(ssk->sk); + + if (tp && tp->fastopen_req && tp->fastopen_req->cookie.len = !=3D 0) { + // send cookie + ret =3D mptcp_sendmsg_fastopen_cookie_send(sk, msg,= &copied, len, uarg); + } else { + struct tcp_fastopen_request *fastopen =3D tp->fasto= pen_req; + //requests a cookie + ret =3D mptcp_sendmsg_fastopen_cookie_req(sk, msg, = &copied, len, uarg); + } + return ret; + } /* silently ignore everything else */ msg->msg_flags &=3D MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL;