- gettext_noop ("# average retransmission delay (ms)"),
- total_delay * 1000LL / plan_count,
- GNUNET_NO);
- prd = GSF_pending_request_get_data_ (rp->pr);
- // FIXME: calculate 'rp->earliest_transmission'!
- // FIXME: claculate 'rp->priority'!
- delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
- rp->transmission_counter);
- rp->earliest_transmission
- = GNUNET_TIME_relative_to_absolute (delay);
-#if DEBUG_FS
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Earliest (re)transmission for `%s' in %us\n",
- GNUNET_h2s (&prd->query),
- rp->transmission_counter);
-#endif
+ gettext_noop ("# average retransmission delay (ms)"),
+ total_delay * 1000LL / plan_count, GNUNET_NO);
+ prd = GSF_pending_request_get_data_ (rp->pe_head->pr);
+
+ if (rp->transmission_counter < 8)
+ delay =
+ GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
+ rp->transmission_counter);
+ else if (rp->transmission_counter < 32)
+ delay =
+ GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
+ 8 +
+ (1LL << (rp->transmission_counter - 8)));
+ else
+ delay =
+ GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
+ 8 + (1LL << 24));
+ delay.rel_value_us =
+ GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+ delay.rel_value_us + 1);
+ /* Add 0.01 to avg_delay to avoid division-by-zero later */
+ avg_delay = (((avg_delay * (N - 1.0)) + delay.rel_value_us) / N) + 0.01;
+
+ /*
+ * For the priority, we need to consider a few basic rules:
+ * 1) if we just started requesting (delay is small), we should
+ * virtually always have a priority of zero.
+ * 2) for requests with average latency, our priority should match
+ * the average priority observed on the network
+ * 3) even the longest-running requests should not be WAY out of
+ * the observed average (thus we bound by a factor of 2)
+ * 4) we add +1 to the observed average priority to avoid everyone
+ * staying put at zero (2 * 0 = 0...).
+ *
+ * Using the specific calculation below, we get:
+ *
+ * delay = 0 => priority = 0;
+ * delay = avg delay => priority = running-average-observed-priority;
+ * delay >> avg_delay => priority = 2 * running-average-observed-priority;
+ *
+ * which satisfies all of the rules above.
+ *
+ * Note: M_PI_4 = PI/4 = arctan(1)
+ */
+ rp->priority =
+ round ((GSF_current_priorities +
+ 1.0) * atan (delay.rel_value_us / avg_delay)) / M_PI_4;
+ /* Note: usage of 'round' and 'atan' requires -lm */