@@ -25,3 +25,17 @@ void __mptcp_pre_connect(struct mptcp_sock *msk, struct sock *ssk,
release_sock(ssk);
}
+
+void mptcp_gen_msk_ackseq_fastopen(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow,
+ struct mptcp_options_received mp_opt)
+{
+ u64 ack_seq;
+
+ WRITE_ONCE(msk->can_ack, true);
+ WRITE_ONCE(msk->remote_key, mp_opt.sndr_key);
+ mptcp_crypto_key_sha(msk->remote_key, NULL, &ack_seq);
+ ack_seq++;
+ WRITE_ONCE(msk->ack_seq, ack_seq);
+ pr_debug("ack_seq=%llu sndr_key=%llu", msk->ack_seq, mp_opt.sndr_key);
+ atomic64_set(&msk->rcv_wnd_sent, ack_seq);
+}
@@ -1208,6 +1208,11 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
mpext->dsn64 = 1;
mpext->mpc_map = 1;
mpext->data_fin = 0;
+
+ if (msk->is_mptfo) {
+ mptcp_gen_msk_ackseq_fastopen(msk, subflow, mp_opt);
+ mpext->data_seq = READ_ONCE(msk->ack_seq);
+ }
} else {
mpext->data_seq = mp_opt.data_seq;
mpext->subflow_seq = mp_opt.subflow_seq;
@@ -282,6 +282,7 @@ struct mptcp_sock {
bool use_64bit_ack; /* Set when we received a 64-bit DSN */
bool csum_enabled;
bool allow_infinite_fallback;
+ bool is_mptfo;
u8 mpc_endpoint_id;
u8 recvmsg_inq:1,
cork:1,
@@ -843,6 +844,8 @@ int __mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
// Fast Open Mechanism functions begin
void __mptcp_pre_connect(struct mptcp_sock *msk, struct sock *ssk,
struct msghdr *msg, size_t len);
+void mptcp_gen_msk_ackseq_fastopen(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow,
+ struct mptcp_options_received mp_opt);
// Fast Open Mechanism functions end
static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
With fastopen in place the first subflow socket is created before the MPC handshake completes, and we need to properly initialize the sequence numbers at MPC ACK reception. Signed-off-by: Dmytro Shytyi <dmytro@shytyi.net> --- net/mptcp/fastopen.c | 14 ++++++++++++++ net/mptcp/options.c | 5 +++++ net/mptcp/protocol.h | 3 +++ 3 files changed, 22 insertions(+)