use_ack:1,
                        ack64:1,
                        mpc_map:1,
-                       __unused:2;
+                       frozen:1,
+                       __unused:1;
        /* one byte hole */
 };
 
        from->active_extensions = 0;
 }
 
+static inline void mptcp_skb_ext_copy(struct sk_buff *to,
+                                     struct sk_buff *from)
+{
+       struct mptcp_ext *from_ext;
+
+       from_ext = skb_ext_find(from, SKB_EXT_MPTCP);
+       if (!from_ext)
+               return;
+
+       from_ext->frozen = 1;
+       skb_ext_copy(to, from);
+}
+
 static inline bool mptcp_ext_matches(const struct mptcp_ext *to_ext,
                                     const struct mptcp_ext *from_ext)
 {
 {
 }
 
+static inline void mptcp_skb_ext_copy(struct sk_buff *to,
+                                     struct sk_buff *from)
+{
+}
+
 static inline bool mptcp_skb_can_collapse(const struct sk_buff *to,
                                          const struct sk_buff *from)
 {
 
        if (!buff)
                return -ENOMEM; /* We'll just try again later. */
        skb_copy_decrypted(buff, skb);
+       mptcp_skb_ext_copy(buff, skb);
 
        sk_wmem_queued_add(sk, buff->truesize);
        sk_mem_charge(sk, buff->truesize);
        if (unlikely(!buff))
                return -ENOMEM;
        skb_copy_decrypted(buff, skb);
+       mptcp_skb_ext_copy(buff, skb);
 
        sk_wmem_queued_add(sk, buff->truesize);
        sk_mem_charge(sk, buff->truesize);
 
        skb = tcp_send_head(sk);
        skb_copy_decrypted(nskb, skb);
+       mptcp_skb_ext_copy(nskb, skb);
 
        TCP_SKB_CB(nskb)->seq = TCP_SKB_CB(skb)->seq;
        TCP_SKB_CB(nskb)->end_seq = TCP_SKB_CB(skb)->seq + probe_size;
 
        if (!tcp_skb_can_collapse_to(skb))
                return false;
 
-       /* can collapse only if MPTCP level sequence is in order */
-       return mpext && mpext->data_seq + mpext->data_len == write_seq;
+       /* can collapse only if MPTCP level sequence is in order and this
+        * mapping has not been xmitted yet
+        */
+       return mpext && mpext->data_seq + mpext->data_len == write_seq &&
+              !mpext->frozen;
 }
 
 static bool mptcp_frag_can_collapse_to(const struct mptcp_sock *msk,