Branch data Line data Source code
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 : :
9 : 38 : void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subflow,
10 : : struct request_sock *req)
11 : : {
12 : 38 : struct sock *sk, *ssk;
13 : 38 : struct sk_buff *skb;
14 : 38 : struct tcp_sock *tp;
15 : :
16 : : /* on early fallback the subflow context is deleted by
17 : : * subflow_syn_recv_sock()
18 : : */
19 [ + - ]: 38 : if (!subflow)
20 : : return;
21 : :
22 : 38 : ssk = subflow->tcp_sock;
23 : 38 : sk = subflow->conn;
24 [ - + ]: 38 : tp = tcp_sk(ssk);
25 : :
26 : 38 : subflow->is_mptfo = 1;
27 : :
28 [ + - ]: 38 : skb = skb_peek(&ssk->sk_receive_queue);
29 [ - + ]: 38 : if (WARN_ON_ONCE(!skb))
30 : 0 : return;
31 : :
32 : : /* dequeue the skb from sk receive queue */
33 : 38 : __skb_unlink(skb, &ssk->sk_receive_queue);
34 : 38 : skb_ext_reset(skb);
35 : 38 : 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 : 38 : tp->copied_seq += skb->len;
41 : 38 : subflow->ssn_offset += skb->len;
42 : :
43 : : /* initialize a dummy sequence number, we will update it at MPC
44 : : * completion, if needed
45 : : */
46 : 38 : MPTCP_SKB_CB(skb)->map_seq = -skb->len;
47 : 38 : MPTCP_SKB_CB(skb)->end_seq = 0;
48 : 38 : MPTCP_SKB_CB(skb)->offset = 0;
49 : 38 : MPTCP_SKB_CB(skb)->has_rxtstamp = TCP_SKB_CB(skb)->has_rxtstamp;
50 : :
51 : 38 : mptcp_data_lock(sk);
52 [ - + ]: 38 : DEBUG_NET_WARN_ON_ONCE(sock_owned_by_user_nocheck(sk));
53 : :
54 : 38 : skb_set_owner_r(skb, sk);
55 [ - + ]: 38 : __skb_queue_tail(&sk->sk_receive_queue, skb);
56 [ - + ]: 38 : mptcp_sk(sk)->bytes_received += skb->len;
57 : :
58 : 38 : sk->sk_data_ready(sk);
59 : :
60 : 38 : mptcp_data_unlock(sk);
61 : : }
62 : :
63 : 26 : void __mptcp_fastopen_gen_msk_ackseq(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow,
64 : : const struct mptcp_options_received *mp_opt)
65 : : {
66 : 26 : struct sock *sk = (struct sock *)msk;
67 : 26 : struct sk_buff *skb;
68 : :
69 [ - + ]: 26 : DEBUG_NET_WARN_ON_ONCE(sock_owned_by_user_nocheck(sk));
70 [ + + ]: 26 : skb = skb_peek_tail(&sk->sk_receive_queue);
71 [ + - ]: 25 : if (skb) {
72 [ - + ]: 25 : WARN_ON_ONCE(MPTCP_SKB_CB(skb)->end_seq);
73 [ - + ]: 25 : pr_debug("msk %p moving seq %llx -> %llx end_seq %llx -> %llx\n", sk,
74 : : MPTCP_SKB_CB(skb)->map_seq, MPTCP_SKB_CB(skb)->map_seq + msk->ack_seq,
75 : : MPTCP_SKB_CB(skb)->end_seq, MPTCP_SKB_CB(skb)->end_seq + msk->ack_seq);
76 : 25 : MPTCP_SKB_CB(skb)->map_seq += msk->ack_seq;
77 : 25 : MPTCP_SKB_CB(skb)->end_seq += msk->ack_seq;
78 : : }
79 : :
80 [ - + ]: 26 : pr_debug("msk=%p ack_seq=%llx\n", msk, msk->ack_seq);
81 : 26 : }
|