struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req);
        struct sock *nsk = sk_clone_lock(sk, GFP_ATOMIC);
        struct mptcp_sock *msk;
-       u64 ack_seq;
 
        if (!nsk)
                return NULL;
        msk->wnd_end = msk->snd_nxt + req->rsk_rcv_wnd;
        msk->setsockopt_seq = mptcp_sk(sk)->setsockopt_seq;
 
-       if (mp_opt->suboptions & OPTIONS_MPTCP_MPC) {
-               msk->can_ack = true;
-               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);
-               atomic64_set(&msk->rcv_wnd_sent, ack_seq);
-       }
-
        sock_reset_flag(nsk, SOCK_RCU_FREE);
        /* will be fully established after successful MPC subflow creation */
        inet_sk_state_store(nsk, TCP_SYN_RECV);
        struct mptcp_subflow_context *subflow;
        struct mptcp_sock *msk;
        struct sock *sk;
-       u64 ack_seq;
 
        subflow = mptcp_subflow_ctx(ssk);
        sk = subflow->conn;
 
        pr_debug("msk=%p, token=%u", sk, subflow->token);
 
-       mptcp_crypto_key_sha(subflow->remote_key, NULL, &ack_seq);
-       ack_seq++;
-       subflow->map_seq = ack_seq;
+       subflow->map_seq = subflow->iasn;
        subflow->map_subflow_seq = 1;
 
        /* the socket is not connected yet, no msk/subflow ops can access/race
         * accessing the field below
         */
-       WRITE_ONCE(msk->remote_key, subflow->remote_key);
        WRITE_ONCE(msk->local_key, subflow->local_key);
        WRITE_ONCE(msk->write_seq, subflow->idsn + 1);
        WRITE_ONCE(msk->snd_nxt, msk->write_seq);
-       WRITE_ONCE(msk->ack_seq, ack_seq);
-       WRITE_ONCE(msk->can_ack, 1);
        WRITE_ONCE(msk->snd_una, msk->write_seq);
-       atomic64_set(&msk->rcv_wnd_sent, ack_seq);
 
        mptcp_pm_new_connection(msk, ssk, 0);
 
 
                send_fastclose : 1,
                send_infinite_map : 1,
                rx_eof : 1,
-               can_ack : 1,        /* only after processing the remote a key */
+               remote_key_valid : 1,        /* received the peer key from */
                disposable : 1,     /* ctx can be free at ulp release time */
                stale : 1,          /* unable to snd/rcv data, do not use for xmit */
                local_id_valid : 1, /* local_id is correctly initialized */
        u64     thmac;
        u32     local_nonce;
        u32     remote_token;
-       u8      hmac[MPTCPOPT_HMAC_LEN];
+       union {
+               u8      hmac[MPTCPOPT_HMAC_LEN]; /* MPJ subflow only */
+               u64     iasn;       /* initial ack sequence number, MPC subflows only */
+       };
        u8      local_id;
        u8      remote_id;
        u8      reset_seen:1;
 int mptcp_get_pm_type(const struct net *net);
 void mptcp_copy_inaddrs(struct sock *msk, const struct sock *ssk);
 void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
-                                    struct mptcp_options_received *mp_opt);
+                                    const struct mptcp_options_received *mp_opt);
 bool __mptcp_retransmit_pending_data(struct sock *sk);
 void mptcp_check_and_set_pending(struct sock *sk);
 void __mptcp_push_pending(struct sock *sk, unsigned int flags);
 
        mptcp_data_unlock(sk);
 }
 
+static void subflow_set_remote_key(struct mptcp_sock *msk,
+                                  struct mptcp_subflow_context *subflow,
+                                  const struct mptcp_options_received *mp_opt)
+{
+       /* active MPC subflow will reach here multiple times:
+        * at subflow_finish_connect() time and at 4th ack time
+        */
+       if (subflow->remote_key_valid)
+               return;
+
+       subflow->remote_key_valid = 1;
+       subflow->remote_key = mp_opt->sndr_key;
+       mptcp_crypto_key_sha(subflow->remote_key, NULL, &subflow->iasn);
+       subflow->iasn++;
+
+       WRITE_ONCE(msk->remote_key, subflow->remote_key);
+       WRITE_ONCE(msk->ack_seq, subflow->iasn);
+       WRITE_ONCE(msk->can_ack, true);
+       atomic64_set(&msk->rcv_wnd_sent, subflow->iasn);
+}
+
 static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
 {
        struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
        struct mptcp_options_received mp_opt;
        struct sock *parent = subflow->conn;
+       struct mptcp_sock *msk;
 
        subflow->icsk_af_ops->sk_rx_dst_set(sk, skb);
 
        if (subflow->conn_finished)
                return;
 
+       msk = mptcp_sk(parent);
        mptcp_propagate_sndbuf(parent, sk);
        subflow->rel_write_seq = 1;
        subflow->conn_finished = 1;
                        MPTCP_INC_STATS(sock_net(sk),
                                        MPTCP_MIB_MPCAPABLEACTIVEFALLBACK);
                        mptcp_do_fallback(sk);
-                       pr_fallback(mptcp_sk(subflow->conn));
+                       pr_fallback(msk);
                        goto fallback;
                }
 
                if (mp_opt.suboptions & OPTION_MPTCP_CSUMREQD)
-                       WRITE_ONCE(mptcp_sk(parent)->csum_enabled, true);
+                       WRITE_ONCE(msk->csum_enabled, true);
                if (mp_opt.deny_join_id0)
-                       WRITE_ONCE(mptcp_sk(parent)->pm.remote_deny_join_id0, true);
+                       WRITE_ONCE(msk->pm.remote_deny_join_id0, true);
                subflow->mp_capable = 1;
-               subflow->can_ack = 1;
-               subflow->remote_key = mp_opt.sndr_key;
-               pr_debug("subflow=%p, remote_key=%llu", subflow,
-                        subflow->remote_key);
+               subflow_set_remote_key(msk, subflow, &mp_opt);
                MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPCAPABLEACTIVEACK);
                mptcp_finish_connect(sk);
                mptcp_set_connected(parent);
                subflow->mp_join = 1;
                MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNACKRX);
 
-               if (subflow_use_different_dport(mptcp_sk(parent), sk)) {
+               if (subflow_use_different_dport(msk, sk)) {
                        pr_debug("synack inet_dport=%d %d",
                                 ntohs(inet_sk(sk)->inet_dport),
                                 ntohs(inet_sk(parent)->inet_dport));
                }
        } else if (mptcp_check_fallback(sk)) {
 fallback:
-               mptcp_rcv_space_init(mptcp_sk(parent), sk);
+               mptcp_rcv_space_init(msk, sk);
                mptcp_set_connected(parent);
        }
        return;
 }
 
 void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
-                                    struct mptcp_options_received *mp_opt)
+                                    const struct mptcp_options_received *mp_opt)
 {
        struct mptcp_sock *msk = mptcp_sk(subflow->conn);
 
-       subflow->remote_key = mp_opt->sndr_key;
+       subflow_set_remote_key(msk, subflow, mp_opt);
        subflow->fully_established = 1;
-       subflow->can_ack = 1;
        WRITE_ONCE(msk->fully_established, true);
 }
 
                if (WARN_ON_ONCE(!skb))
                        goto no_data;
 
-               /* if msk lacks the remote key, this subflow must provide an
-                * MP_CAPABLE-based mapping
-                */
-               if (unlikely(!READ_ONCE(msk->can_ack))) {
-                       if (!subflow->mpc_map)
-                               goto fallback;
-                       WRITE_ONCE(msk->remote_key, subflow->remote_key);
-                       WRITE_ONCE(msk->ack_seq, subflow->map_seq);
-                       WRITE_ONCE(msk->can_ack, true);
-               }
+               if (unlikely(!READ_ONCE(msk->can_ack)))
+                       goto fallback;
 
                old_ack = READ_ONCE(msk->ack_seq);
                ack_seq = mptcp_subflow_get_mapped_dsn(subflow);
 
        mptcp_pm_get_flags_and_ifindex_by_id(msk, local_id,
                                             &flags, &ifindex);
+       subflow->remote_key_valid = 1;
        subflow->remote_key = msk->remote_key;
        subflow->local_key = msk->local_key;
        subflow->token = msk->token;
                new_ctx->ssn_offset = subflow_req->ssn_offset;
                new_ctx->mp_join = 1;
                new_ctx->fully_established = 1;
+               new_ctx->remote_key_valid = 1;
                new_ctx->backup = subflow_req->backup;
                new_ctx->remote_id = subflow_req->remote_id;
                new_ctx->token = subflow_req->token;