|
@@ -11,6 +11,7 @@
|
|
|
*/
|
|
|
|
|
|
#include "or.h"
|
|
|
+#include "channel.h"
|
|
|
#include "circuitbuild.h"
|
|
|
#include "circuitmux.h"
|
|
|
#include "circuitmux_ewma.h"
|
|
@@ -1636,6 +1637,7 @@ networkstatus_set_current_consensus(const char *consensus,
|
|
|
consensus_waiting_for_certs_t *waiting = NULL;
|
|
|
time_t current_valid_after = 0;
|
|
|
int free_consensus = 1; /* Free 'c' at the end of the function */
|
|
|
+ int old_ewma_enabled;
|
|
|
|
|
|
if (flav < 0) {
|
|
|
/* XXXX we don't handle unrecognized flavors yet. */
|
|
@@ -1829,7 +1831,19 @@ networkstatus_set_current_consensus(const char *consensus,
|
|
|
|
|
|
dirvote_recalculate_timing(options, now);
|
|
|
routerstatus_list_update_named_server_map();
|
|
|
- cell_ewma_set_scale_factor(options, current_consensus);
|
|
|
+
|
|
|
+ /* Update ewma and adjust policy if needed; first cache the old value */
|
|
|
+ old_ewma_enabled = cell_ewma_enabled();
|
|
|
+ /* Change the cell EWMA settings */
|
|
|
+ cell_ewma_set_scale_factor(options, networkstatus_get_latest_consensus());
|
|
|
+ /* If we just enabled ewma, set the cmux policy on all active channels */
|
|
|
+ if (cell_ewma_enabled() && !old_ewma_enabled) {
|
|
|
+ channel_set_cmux_policy_everywhere(&ewma_policy);
|
|
|
+ } else if (!cell_ewma_enabled() && old_ewma_enabled) {
|
|
|
+ /* Turn it off everywhere */
|
|
|
+ channel_set_cmux_policy_everywhere(NULL);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/* XXXX024 this call might be unnecessary here: can changing the
|
|
|
* current consensus really alter our view of any OR's rate limits? */
|