Merge tag 'driver-core-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / net / mptcp / options.c
index 784a205e80dab0352dfaa18c83033ff7f5c27107..5ded85e2c374a1da197aed40641f863d34713bef 100644 (file)
@@ -939,7 +939,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
                    subflow->mp_join && (mp_opt->suboptions & OPTIONS_MPTCP_MPJ) &&
                    !subflow->request_join)
                        tcp_send_ack(ssk);
-               goto fully_established;
+               goto check_notify;
        }
 
        /* we must process OoO packets before the first subflow is fully
@@ -950,17 +950,20 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
        if (TCP_SKB_CB(skb)->seq != subflow->ssn_offset + 1) {
                if (subflow->mp_join)
                        goto reset;
+               if (subflow->is_mptfo && mp_opt->suboptions & OPTION_MPTCP_MPC_ACK)
+                       goto set_fully_established;
                return subflow->mp_capable;
        }
 
-       if (((mp_opt->suboptions & OPTION_MPTCP_DSS) && mp_opt->use_ack) ||
-           ((mp_opt->suboptions & OPTION_MPTCP_ADD_ADDR) && !mp_opt->echo)) {
+       if (subflow->remote_key_valid &&
+           (((mp_opt->suboptions & OPTION_MPTCP_DSS) && mp_opt->use_ack) ||
+            ((mp_opt->suboptions & OPTION_MPTCP_ADD_ADDR) && !mp_opt->echo))) {
                /* subflows are fully established as soon as we get any
                 * additional ack, including ADD_ADDR.
                 */
                subflow->fully_established = 1;
                WRITE_ONCE(msk->fully_established, true);
-               goto fully_established;
+               goto check_notify;
        }
 
        /* If the first established packet does not contain MP_CAPABLE + data
@@ -979,11 +982,12 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
        if (mp_opt->deny_join_id0)
                WRITE_ONCE(msk->pm.remote_deny_join_id0, true);
 
+set_fully_established:
        if (unlikely(!READ_ONCE(msk->pm.server_side)))
                pr_warn_once("bogus mpc option on established client sk");
        mptcp_subflow_fully_established(subflow, mp_opt);
 
-fully_established:
+check_notify:
        /* if the subflow is not already linked into the conn_list, we can't
         * notify the PM: this subflow is still on the listener queue
         * and the PM possibly acquiring the subflow lock could race with