From nobody Fri Apr 19 22:50:07 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 535521C2C for ; Tue, 20 Sep 2022 12:52:55 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1663678372; cv=none; d=zohomail.eu; s=zohoarc; b=K14jNiPf9oz69zqrsupFNNQdd0Ui4FOKVkyZV/XD4CJlzgN5BRzu5uckUuoeG5LU/GvPEa5P5ZM3NJ8zRt4L00a42++Kwk7g3AfxcP1mBrWqlAvbgOqRh0XZiKHyPfebxEBJggMCrrw59rQZ4PUaDiRr1IQ8EqHL+7blsgg0m18= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1663678372; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=2XZ7xI9ZUYlysUXOthx8OFRz0Ou/hN+oPvfOGP7eC78=; b=NF5Bt37I675PhS8VRuEG7aROnlbdiheetxxGlMxghfO8p4mrgD5EQejvMEtcYzpFreSL/MGGELTTtv7CH8BMKr8gKDHAElie/Fy/zenYS18AP4KYVjc58PgXEnQ9i/r9sVZ+b4b1GE/Uim2buhSXUFIFmzVO7OBo+zCLKfop3U8= 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=1663678372; 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=2XZ7xI9ZUYlysUXOthx8OFRz0Ou/hN+oPvfOGP7eC78=; b=RyjoWOQAoMYDEwh67qzz+nAKaXF4jBP5SIJGa63TrBeH4hyEFCJn7UbwPhhaz147 x6eIrou0hLLnQezjI8KFX2vVfVEP0AkFBA5zaqiiHV4kVqTb8Ms82aec4+vmO6wKaBo 2VL7EeKloEguy69Czgvt+9ADbPzJJTDTQm23c9b4= Received: from doris.localdomain (243.34.22.93.rev.sfr.net [93.22.34.243]) by mx.zoho.eu with SMTPS id 1663678369719293.1301311611096; Tue, 20 Sep 2022 14:52:49 +0200 (CEST) From: Dmytro Shytyi To: mptcp@lists.linux.dev Cc: Dmytro Shytyi Message-ID: <20220920125243.2880-7-dmytro@shytyi.net> Subject: [RFC PATCH mptcp-next v8 6/7] add skb to mskq in tcp_fastopen_add_skb() Date: Tue, 20 Sep 2022 14:52:42 +0200 X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220920125243.2880-1-dmytro@shytyi.net> References: <20220920125243.2880-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 add skb to msk->receive_queue in the MPTCP fastopen context. Signed-off-by: Dmytro Shytyi --- include/net/tcp.h | 2 +- net/ipv4/tcp_fastopen.c | 55 +++++++++++++++++++++++++++++++++++------ net/ipv4/tcp_input.c | 11 +++++++-- net/mptcp/protocol.c | 4 +-- net/mptcp/protocol.h | 2 ++ 5 files changed, 62 insertions(+), 12 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index a7d49e42470a..6456f90ed9ed 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1749,7 +1749,7 @@ int tcp_fastopen_reset_cipher(struct net *net, struct= sock *sk, void *primary_key, void *backup_key); int tcp_fastopen_get_cipher(struct net *net, struct inet_connection_sock *= icsk, u64 *key); -void tcp_fastopen_add_skb(struct sock *sk, struct sk_buff *skb); +void tcp_fastopen_add_skb(struct sock *sk, struct sk_buff *skb, struct req= uest_sock *req); struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb, struct request_sock *req, struct tcp_fastopen_cookie *foc, diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c index 45cc7f1ca296..566706172828 100644 --- a/net/ipv4/tcp_fastopen.c +++ b/net/ipv4/tcp_fastopen.c @@ -3,6 +3,7 @@ #include #include #include +#include "../mptcp/protocol.h" =20 void tcp_fastopen_init_key_once(struct net *net) { @@ -166,8 +167,12 @@ static void tcp_fastopen_cookie_gen(struct sock *sk, /* If an incoming SYN or SYNACK frame contains a payload and/or FIN, * queue this additional data / FIN. */ -void tcp_fastopen_add_skb(struct sock *sk, struct sk_buff *skb) +void tcp_fastopen_add_skb(struct sock *sk, struct sk_buff *skb, struct req= uest_sock *req) { + 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 mptcp_sock *msk =3D mptcp_sk(socket); struct tcp_sock *tp =3D tcp_sk(sk); =20 if (TCP_SKB_CB(skb)->end_seq =3D=3D tp->rcv_nxt) @@ -194,7 +199,34 @@ void tcp_fastopen_add_skb(struct sock *sk, struct sk_b= uff *skb) TCP_SKB_CB(skb)->tcp_flags &=3D ~TCPHDR_SYN; =20 tp->rcv_nxt =3D TCP_SKB_CB(skb)->end_seq; + + if (req && tp->syn_fastopen && sk_is_mptcp(sk)) + tcp_r_sock =3D tcp_rsk(req); + else + goto add_skb_to_sk; + + msk->is_mptfo =3D 1; + + //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; + + skb_orphan(skb); + skb->sk =3D socket; + skb->destructor =3D mptcp_rfree; + atomic_add(skb->truesize, &socket->sk_rmem_alloc); + msk->rmem_fwd_alloc -=3D skb->truesize; + + __skb_queue_tail(&msk->receive_queue, skb); + atomic64_set(&msk->rcv_wnd_sent, mptcp_subflow_get_mapped_dsn(subflow)); + goto avoid_add_skb_to_sk; +add_skb_to_sk: __skb_queue_tail(&sk->sk_receive_queue, skb); +avoid_add_skb_to_sk: tp->syn_data_acked =3D 1; =20 /* u64_stats_update_begin(&tp->syncp) not needed here, @@ -283,7 +315,7 @@ static struct sock *tcp_fastopen_create_child(struct so= ck *sk, =20 tp->rcv_nxt =3D TCP_SKB_CB(skb)->seq + 1; =20 - tcp_fastopen_add_skb(child, skb); + tcp_fastopen_add_skb(child, skb, req); =20 tcp_rsk(req)->rcv_nxt =3D tp->rcv_nxt; tp->rcv_wup =3D tp->rcv_nxt; @@ -350,17 +382,26 @@ struct sock *tcp_try_fastopen(struct sock *sk, struct= sk_buff *skb, bool syn_data =3D TCP_SKB_CB(skb)->end_seq !=3D TCP_SKB_CB(skb)->seq + 1; int tcp_fastopen =3D READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_fastopen); struct tcp_fastopen_cookie valid_foc =3D { .len =3D -1 }; + struct tcp_sock *tp =3D tcp_sk(sk); struct sock *child; int ret =3D 0; =20 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 (tp->syn_fastopen && 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; + } } =20 if (tcp_fastopen_no_cookie(sk, dst, TFO_SERVER_COOKIE_NOT_REQD)) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index bc2ea12221f9..3facccee9dcb 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -6134,7 +6134,7 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, = struct sk_buff *synack, --tp->delivered; } =20 - tcp_fastopen_add_skb(sk, synack); + tcp_fastopen_add_skb(sk, synack, NULL); =20 return false; } @@ -6954,7 +6954,14 @@ int tcp_conn_request(struct request_sock_ops *rsk_op= s, if (IS_ENABLED(CONFIG_SMC) && want_cookie) tmp_opt.smc_ok =3D 0; =20 - tmp_opt.tstamp_ok =3D tmp_opt.saw_tstamp; + if (foc.len =3D=3D -1 && sk_is_mptcp(sk)) { + tmp_opt.tstamp_ok =3D tmp_opt.saw_tstamp; + } else { + tmp_opt.tstamp_ok =3D 0; + tcp_rsk(req)->ts_off =3D 1; + tp->syn_fastopen =3D 1; + } + tcp_openreq_init(req, &tmp_opt, skb, sk); inet_rsk(req)->no_srccheck =3D inet_sk(sk)->transparent; =20 diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 8cf307e4e59c..b2329ef298fd 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -178,7 +178,7 @@ static void __mptcp_rmem_reclaim(struct sock *sk, int a= mount) __sk_mem_reduce_allocated(sk, amount); } =20 -static void mptcp_rmem_uncharge(struct sock *sk, int size) +void mptcp_rmem_uncharge(struct sock *sk, int size) { struct mptcp_sock *msk =3D mptcp_sk(sk); int reclaimable; @@ -191,7 +191,7 @@ static void mptcp_rmem_uncharge(struct sock *sk, int si= ze) __mptcp_rmem_reclaim(sk, reclaimable); } =20 -static void mptcp_rfree(struct sk_buff *skb) +void mptcp_rfree(struct sk_buff *skb) { unsigned int len =3D skb->truesize; struct sock *sk =3D skb->sk; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 3b9a349a7080..5d86cd7d8dab 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -840,6 +840,8 @@ void mptcp_event_addr_announced(const struct sock *ssk,= const struct mptcp_addr_ 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); +void mptcp_rmem_uncharge(struct sock *sk, int size); +void mptcp_rfree(struct sk_buff *skb); =20 // Fast Open Mechanism functions begin int mptcp_setsockopt_sol_tcp_fastopen(struct mptcp_sock *msk, sockptr_t op= tval, --=20 2.25.1