fastopen.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* MPTCP Fast Open Mechanism
  3. *
  4. * Copyright (c) 2021-2022, Dmytro SHYTYI
  5. */
  6. #include "protocol.h"
  7. void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subflow,
  8. struct request_sock *req)
  9. {
  10. struct sock *sk, *ssk;
  11. struct sk_buff *skb;
  12. struct tcp_sock *tp;
  13. /* on early fallback the subflow context is deleted by
  14. * subflow_syn_recv_sock()
  15. */
  16. if (!subflow)
  17. return;
  18. ssk = subflow->tcp_sock;
  19. sk = subflow->conn;
  20. tp = tcp_sk(ssk);
  21. subflow->is_mptfo = 1;
  22. skb = skb_peek(&ssk->sk_receive_queue);
  23. if (WARN_ON_ONCE(!skb))
  24. return;
  25. /* dequeue the skb from sk receive queue */
  26. __skb_unlink(skb, &ssk->sk_receive_queue);
  27. skb_ext_reset(skb);
  28. skb_orphan(skb);
  29. /* We copy the fastopen data, but that don't belong to the mptcp sequence
  30. * space, need to offset it in the subflow sequence, see mptcp_subflow_get_map_offset()
  31. */
  32. tp->copied_seq += skb->len;
  33. subflow->ssn_offset += skb->len;
  34. /* initialize a dummy sequence number, we will update it at MPC
  35. * completion, if needed
  36. */
  37. MPTCP_SKB_CB(skb)->map_seq = -skb->len;
  38. MPTCP_SKB_CB(skb)->end_seq = 0;
  39. MPTCP_SKB_CB(skb)->offset = 0;
  40. MPTCP_SKB_CB(skb)->has_rxtstamp = TCP_SKB_CB(skb)->has_rxtstamp;
  41. mptcp_data_lock(sk);
  42. mptcp_set_owner_r(skb, sk);
  43. __skb_queue_tail(&sk->sk_receive_queue, skb);
  44. mptcp_sk(sk)->bytes_received += skb->len;
  45. sk->sk_data_ready(sk);
  46. mptcp_data_unlock(sk);
  47. }
  48. void __mptcp_fastopen_gen_msk_ackseq(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow,
  49. const struct mptcp_options_received *mp_opt)
  50. {
  51. struct sock *sk = (struct sock *)msk;
  52. struct sk_buff *skb;
  53. skb = skb_peek_tail(&sk->sk_receive_queue);
  54. if (skb) {
  55. WARN_ON_ONCE(MPTCP_SKB_CB(skb)->end_seq);
  56. pr_debug("msk %p moving seq %llx -> %llx end_seq %llx -> %llx\n", sk,
  57. MPTCP_SKB_CB(skb)->map_seq, MPTCP_SKB_CB(skb)->map_seq + msk->ack_seq,
  58. MPTCP_SKB_CB(skb)->end_seq, MPTCP_SKB_CB(skb)->end_seq + msk->ack_seq);
  59. MPTCP_SKB_CB(skb)->map_seq += msk->ack_seq;
  60. MPTCP_SKB_CB(skb)->end_seq += msk->ack_seq;
  61. }
  62. pr_debug("msk=%p ack_seq=%llx\n", msk, msk->ack_seq);
  63. }