+ /* send ACK */
+ if (mc->frag_times_write_offset - mc->frag_times_start_offset > 1)
+ {
+ dc->latency = estimate_latency (mc);
+ }
+ delay = GNUNET_TIME_relative_saturating_multiply (dc->latency,
+ bc + 1);
+ if ( (last + fid == num_fragments) ||
+ (0 == mc->bits) ||
+ (GNUNET_YES == duplicate) )
+ {
+ /* message complete or duplicate or last missing fragment in
+ linear sequence; ACK now! */
+ delay = GNUNET_TIME_UNIT_ZERO;
+ }
+ if (NULL != mc->ack_task)
+ GNUNET_SCHEDULER_cancel (mc->ack_task);
+ mc->ack_task = GNUNET_SCHEDULER_add_delayed (delay,
+ &send_ack,
+ mc);
+ if (GNUNET_YES == duplicate)
+ {
+ mc->last_duplicate = GNUNET_YES;