}
 
 static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
+                                        bool snd_data_fin_enable,
                                         unsigned int *size,
                                         unsigned int remaining,
                                         struct mptcp_out_options *opts)
        if (!skb)
                return false;
 
-       /* MPC/MPJ needed only on 3rd ack packet */
-       if (subflow->fully_established ||
-           subflow->snd_isn != TCP_SKB_CB(skb)->seq)
+       /* MPC/MPJ needed only on 3rd ack packet, DATA_FIN and TCP shutdown take precedence */
+       if (subflow->fully_established || snd_data_fin_enable ||
+           subflow->snd_isn != TCP_SKB_CB(skb)->seq ||
+           sk->sk_state != TCP_ESTABLISHED)
                return false;
 
        if (subflow->mp_capable) {
 }
 
 static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
+                                         bool snd_data_fin_enable,
                                          unsigned int *size,
                                          unsigned int remaining,
                                          struct mptcp_out_options *opts)
 {
        struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
        struct mptcp_sock *msk = mptcp_sk(subflow->conn);
-       u64 snd_data_fin_enable, ack_seq;
        unsigned int dss_size = 0;
        struct mptcp_ext *mpext;
        unsigned int ack_size;
        bool ret = false;
+       u64 ack_seq;
 
        mpext = skb ? mptcp_get_ext(skb) : NULL;
-       snd_data_fin_enable = mptcp_data_fin_enabled(msk);
 
        if (!skb || (mpext && mpext->use_map) || snd_data_fin_enable) {
                unsigned int map_size;
                               unsigned int *size, unsigned int remaining,
                               struct mptcp_out_options *opts)
 {
+       struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
+       struct mptcp_sock *msk = mptcp_sk(subflow->conn);
        unsigned int opt_size = 0;
+       bool snd_data_fin;
        bool ret = false;
 
        opts->suboptions = 0;
 
-       if (unlikely(mptcp_check_fallback(sk)))
+       if (unlikely(__mptcp_check_fallback(msk)))
                return false;
 
        /* prevent adding of any MPTCP related options on reset packet
        if (unlikely(skb && TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST))
                return false;
 
-       if (mptcp_established_options_mp(sk, skb, &opt_size, remaining, opts))
+       snd_data_fin = mptcp_data_fin_enabled(msk);
+       if (mptcp_established_options_mp(sk, skb, snd_data_fin, &opt_size, remaining, opts))
                ret = true;
-       else if (mptcp_established_options_dss(sk, skb, &opt_size, remaining,
-                                              opts))
+       else if (mptcp_established_options_dss(sk, skb, snd_data_fin, &opt_size, remaining, opts))
                ret = true;
 
        /* we reserved enough space for the above options, and exceeding the