return ret;
        }
 
-       ack_size = TCPOLEN_MPTCP_DSS_ACK64;
+       if (subflow->use_64bit_ack) {
+               ack_size = TCPOLEN_MPTCP_DSS_ACK64;
+               opts->ext_copy.data_ack = msk->ack_seq;
+               opts->ext_copy.ack64 = 1;
+       } else {
+               ack_size = TCPOLEN_MPTCP_DSS_ACK32;
+               opts->ext_copy.data_ack32 = (uint32_t)(msk->ack_seq);
+               opts->ext_copy.ack64 = 0;
+       }
+       opts->ext_copy.use_ack = 1;
 
        /* Add kind/length/subtype/flag overhead if mapping is not populated */
        if (dss_size == 0)
 
        dss_size += ack_size;
 
-       opts->ext_copy.data_ack = msk->ack_seq;
-       opts->ext_copy.ack64 = 1;
-       opts->ext_copy.use_ack = 1;
-
        *size = ALIGN(dss_size, 4);
        return true;
 }
                u8 flags = 0;
 
                if (mpext->use_ack) {
-                       len += TCPOLEN_MPTCP_DSS_ACK64;
-                       flags = MPTCP_DSS_HAS_ACK | MPTCP_DSS_ACK64;
+                       flags = MPTCP_DSS_HAS_ACK;
+                       if (mpext->ack64) {
+                               len += TCPOLEN_MPTCP_DSS_ACK64;
+                               flags |= MPTCP_DSS_ACK64;
+                       } else {
+                               len += TCPOLEN_MPTCP_DSS_ACK32;
+                       }
                }
 
                if (mpext->use_map) {
                *ptr++ = mptcp_option(MPTCPOPT_DSS, len, 0, flags);
 
                if (mpext->use_ack) {
-                       put_unaligned_be64(mpext->data_ack, ptr);
-                       ptr += 2;
+                       if (mpext->ack64) {
+                               put_unaligned_be64(mpext->data_ack, ptr);
+                               ptr += 2;
+                       } else {
+                               put_unaligned_be32(mpext->data_ack32, ptr);
+                               ptr += 1;
+                       }
                }
 
                if (mpext->use_map) {
 
        if (!mpext->dsn64) {
                map_seq = expand_seq(subflow->map_seq, subflow->map_data_len,
                                     mpext->data_seq);
+               subflow->use_64bit_ack = 0;
                pr_debug("expanded seq=%llu", subflow->map_seq);
        } else {
                map_seq = mpext->data_seq;
+               subflow->use_64bit_ack = 1;
        }
 
        if (subflow->map_valid) {