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(list_: &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, list: &ssk->sk_receive_queue);
34 skb_ext_reset(skb);
35 skb_orphan(skb);
36
37 /* We copy the fastopen data, but that don't belong to the mptcp sequence
38 * space, need to offset it in the subflow sequence, see mptcp_subflow_get_map_offset()
39 */
40 tp->copied_seq += skb->len;
41 subflow->ssn_offset += skb->len;
42
43 /* initialize a dummy sequence number, we will update it at MPC
44 * completion, if needed
45 */
46 MPTCP_SKB_CB(skb)->map_seq = -skb->len;
47 MPTCP_SKB_CB(skb)->end_seq = 0;
48 MPTCP_SKB_CB(skb)->offset = 0;
49 MPTCP_SKB_CB(skb)->has_rxtstamp = TCP_SKB_CB(skb)->has_rxtstamp;
50
51 mptcp_data_lock(sk);
52
53 mptcp_set_owner_r(skb, sk);
54 __skb_queue_tail(list: &sk->sk_receive_queue, newsk: skb);
55 mptcp_sk(sk)->bytes_received += skb->len;
56
57 sk->sk_data_ready(sk);
58
59 mptcp_data_unlock(sk);
60}
61
62void mptcp_fastopen_gen_msk_ackseq(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow,
63 const struct mptcp_options_received *mp_opt)
64{
65 struct sock *sk = (struct sock *)msk;
66 struct sk_buff *skb;
67
68 mptcp_data_lock(sk);
69 skb = skb_peek_tail(list_: &sk->sk_receive_queue);
70 if (skb) {
71 WARN_ON_ONCE(MPTCP_SKB_CB(skb)->end_seq);
72 pr_debug("msk %p moving seq %llx -> %llx end_seq %llx -> %llx", sk,
73 MPTCP_SKB_CB(skb)->map_seq, MPTCP_SKB_CB(skb)->map_seq + msk->ack_seq,
74 MPTCP_SKB_CB(skb)->end_seq, MPTCP_SKB_CB(skb)->end_seq + msk->ack_seq);
75 MPTCP_SKB_CB(skb)->map_seq += msk->ack_seq;
76 MPTCP_SKB_CB(skb)->end_seq += msk->ack_seq;
77 }
78
79 pr_debug("msk=%p ack_seq=%llx", msk, msk->ack_seq);
80 mptcp_data_unlock(sk);
81}
82

source code of linux/net/mptcp/fastopen.c