File Index
Files and directories
Sign in
FILE

fastopen.c

File preview with syntax highlighting.

linux-6.19.14/net/mptcp/fastopen.c C
 1// SPDX-License-Identifier: GPL-2.0
 2/* MPTCP Fast Open Mechanism
 3 *
 4 * Copyright (c) 2021-2022, Dmytro SHYTYI
 5 */
 6
 7#include "protocol.h"
 8
 9void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subflow,
10					      struct request_sock *req)
11{
12	struct sock *sk, *ssk;
13	struct sk_buff *skb;
14	struct tcp_sock *tp;
15
16	/* on early fallback the subflow context is deleted by
17	 * subflow_syn_recv_sock()
18	 */
19	if (!subflow)
20		return;
21
22	ssk = subflow->tcp_sock;
23	sk = subflow->conn;
24	tp = tcp_sk(ssk);
25
26	subflow->is_mptfo = 1;
27
28	skb = skb_peek(&ssk->sk_receive_queue);
29	if (WARN_ON_ONCE(!skb))
30		return;
31
32	/* dequeue the skb from sk receive queue */
33	__skb_unlink(skb, &ssk->sk_receive_queue);
34	skb_ext_reset(skb);
35
36	mptcp_subflow_lend_fwdmem(subflow, skb);
37
38	/* We copy the fastopen data, but that don't belong to the mptcp sequence
39	 * space, need to offset it in the subflow sequence, see mptcp_subflow_get_map_offset()
40	 */
41	tp->copied_seq += skb->len;
42	subflow->ssn_offset += skb->len;
43
44	/* Only the sequence delta is relevant */
45	MPTCP_SKB_CB(skb)->map_seq = -skb->len;
46	MPTCP_SKB_CB(skb)->end_seq = 0;
47	MPTCP_SKB_CB(skb)->offset = 0;
48	MPTCP_SKB_CB(skb)->has_rxtstamp = TCP_SKB_CB(skb)->has_rxtstamp;
49	MPTCP_SKB_CB(skb)->cant_coalesce = 1;
50
51	mptcp_data_lock(sk);
52	DEBUG_NET_WARN_ON_ONCE(sock_owned_by_user_nocheck(sk));
53
54	mptcp_borrow_fwdmem(sk, skb);
55	skb_set_owner_r(skb, sk);
56	__skb_queue_tail(&sk->sk_receive_queue, skb);
57	mptcp_sk(sk)->bytes_received += skb->len;
58
59	sk->sk_data_ready(sk);
60
61	mptcp_data_unlock(sk);
62}
~/ Read-only file preview.