/* no MPTCP if MD5SIG is enabled on this socket or we may run out of
         * TCP option space.
         */
-       if (rcu_access_pointer(tcp_sk(sk_listener)->md5sig_info))
+       if (rcu_access_pointer(tcp_sk(sk_listener)->md5sig_info)) {
+               subflow_add_reset_reason(skb, MPTCP_RST_EMPTCP);
                return -EINVAL;
+       }
 #endif
 
        mptcp_get_options(skb, &mp_opt);
                                 ntohs(inet_sk((struct sock *)subflow_req->msk)->inet_sport));
                        if (!mptcp_pm_sport_in_anno_list(subflow_req->msk, sk_listener)) {
                                SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MISMATCHPORTSYNRX);
+                               subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT);
                                return -EPERM;
                        }
                        SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINPORTSYNRX);
                subflow_req_create_thmac(subflow_req);
 
                if (unlikely(req->syncookie)) {
-                       if (mptcp_can_accept_new_subflow(subflow_req->msk))
-                               subflow_init_req_cookie_join_save(subflow_req, skb);
-                       else
+                       if (!mptcp_can_accept_new_subflow(subflow_req->msk)) {
+                               subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT);
                                return -EPERM;
+                       }
+
+                       subflow_init_req_cookie_join_save(subflow_req, skb);
                }
 
                pr_debug("token=%u, remote_nonce=%u msk=%p", subflow_req->token,
                                         ntohs(inet_sk((struct sock *)owner)->inet_sport));
                                if (!mptcp_pm_sport_in_anno_list(owner, sk)) {
                                        SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MISMATCHPORTACKRX);
+                                       subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT);
                                        goto dispose_child;
                                }
                                SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINPORTACKRX);
                        }
 
-                       if (!mptcp_finish_join(child))
+                       if (!mptcp_finish_join(child)) {
+                               struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(child);
+
+                               subflow_add_reset_reason(skb, subflow->reset_reason);
                                goto dispose_child;
+                       }
 
                        SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINACKRX);
                        tcp_rsk(req)->drop_req = true;