#define CWND_MAX_DFLT (INT32_MAX)
#define BWE_SENDME_MIN_DFLT (5)
-#define EWMA_CWND_COUNT_DFLT (2)
+
+#define N_EWMA_CWND_PCT_DFLT (50)
+#define N_EWMA_MAX_DFLT (10)
/* BDP algorithms for each congestion control algorithms use the piecewise
* estimattor. See section 3.1.4 of proposal 324. */
/**
* Number of cwnd worth of sendme acks to smooth RTT and BDP with,
* using N_EWMA */
-static uint8_t ewma_cwnd_cnt;
+static uint8_t n_ewma_cwnd_pct;
+
+/**
+ * Maximum number N for the N-count EWMA averaging of RTT and BDP.
+ */
+static uint8_t n_ewma_max;
/**
* Minimum number of sendmes before we begin BDP estimates
BWE_SENDME_MIN_MIN,
BWE_SENDME_MIN_MAX);
-#define EWMA_CWND_COUNT_MIN 1
-#define EWMA_CWND_COUNT_MAX (100)
- ewma_cwnd_cnt =
- networkstatus_get_param(NULL, "cc_ewma_cwnd_cnt",
- EWMA_CWND_COUNT_DFLT,
- EWMA_CWND_COUNT_MIN,
- EWMA_CWND_COUNT_MAX);
-
+#define N_EWMA_CWND_PCT_MIN 1
+#define N_EWMA_CWND_PCT_MAX (255)
+ n_ewma_cwnd_pct =
+ networkstatus_get_param(NULL, "cc_ewma_cwnd_pct",
+ N_EWMA_CWND_PCT_DFLT,
+ N_EWMA_CWND_PCT_MIN,
+ N_EWMA_CWND_PCT_MAX);
+
+#define N_EWMA_MAX_MIN 2
+#define N_EWMA_MAX_MAX (INT32_MAX)
+ n_ewma_max =
+ networkstatus_get_param(NULL, "cc_ewma_max",
+ N_EWMA_MAX_DFLT,
+ N_EWMA_MAX_MIN,
+ N_EWMA_MAX_MAX);
}
/**
}
/**
- * Returns the number of sendme acks that will be recieved in the
- * current congestion window size, rounded to nearest int.
+ * Returns the number N of N-count EWMA, for averaging RTT and BDP over
+ * N SENDME acks.
+ *
+ * This N is bracketed between a divisor of the number of acks in a CWND
+ * and a max value. It is always at least 2.
*/
static inline uint64_t
-sendme_acks_per_cwnd(const congestion_control_t *cc)
+n_ewma_count(const congestion_control_t *cc)
{
- /* We add half a sendme_inc to cwnd to round to the nearest int */
- return ((cc->cwnd + cc->sendme_inc/2)/cc->sendme_inc);
+ uint64_t ewma_cnt = MIN(CWND_UPDATE_RATE(cc)*n_ewma_cwnd_pct/100,
+ n_ewma_max);
+ ewma_cnt = MAX(ewma_cnt, 2);
+ return ewma_cnt;
}
/**
return 0;
}
- ewma_cnt = ewma_cwnd_cnt*sendme_acks_per_cwnd(cc);
- ewma_cnt = MAX(ewma_cnt, 2); // Use at least 2
+ ewma_cnt = n_ewma_count(cc);
cc->ewma_rtt_usec = n_count_ewma(rtt, cc->ewma_rtt_usec, ewma_cnt);
while (smartlist_len(cc->sendme_arrival_timestamps) >
bwe_sendme_min &&
(uint64_t)smartlist_len(cc->sendme_arrival_timestamps) >
- sendme_acks_per_cwnd(cc)) {
+ n_ewma_count(cc)) {
(void)dequeue_timestamp(cc->sendme_arrival_timestamps);
}
int sendme_cnt = smartlist_len(cc->sendme_arrival_timestamps);
/* Calculate BDP_EWMA_COUNT N-EWMA */
cc->bdp[BDP_ALG_SENDME_RATE] =
n_count_ewma(sendme_rate_bdp, cc->bdp[BDP_ALG_SENDME_RATE],
- ewma_cwnd_cnt*sendme_acks_per_cwnd(cc));
+ n_ewma_count(cc));
}
}