10#define TOR_CONGESTION_CONTROL_VEGAS_PRIVATE
15#include "core/or/or_circuit_st.h"
28#define OUTBUF_CELLS (2*TLS_RECORD_MAX_CELLS)
30#define SS_CWND_MAX_DFLT (5000)
33#define VEGAS_ALPHA_SBWS_DFLT (2*OUTBUF_CELLS-TLS_RECORD_MAX_CELLS)
34#define VEGAS_BETA_SBWS_DFLT (2*OUTBUF_CELLS+TLS_RECORD_MAX_CELLS)
35#define VEGAS_GAMMA_SBWS_DFLT (2*OUTBUF_CELLS)
36#define VEGAS_DELTA_SBWS_DFLT (4*OUTBUF_CELLS)
37#define VEGAS_SSCAP_SBWS_DFLT (400)
40#define VEGAS_ALPHA_EXIT_DFLT (3*OUTBUF_CELLS)
41#define VEGAS_BETA_EXIT_DFLT (4*OUTBUF_CELLS)
42#define VEGAS_GAMMA_EXIT_DFLT (3*OUTBUF_CELLS)
43#define VEGAS_DELTA_EXIT_DFLT (5*OUTBUF_CELLS)
44#define VEGAS_SSCAP_EXIT_DFLT (600)
47#define VEGAS_ALPHA_ONION_DFLT (3*OUTBUF_CELLS)
48#define VEGAS_BETA_ONION_DFLT (6*OUTBUF_CELLS)
49#define VEGAS_GAMMA_ONION_DFLT (4*OUTBUF_CELLS)
50#define VEGAS_DELTA_ONION_DFLT (7*OUTBUF_CELLS)
51#define VEGAS_SSCAP_ONION_DFLT (475)
56#define VEGAS_CWND_FULL_GAP_DFLT (4)
63#define VEGAS_CWND_FULL_MINPCT_DFLT (25)
69#define VEGAS_CWND_FULL_PER_CWND_DFLT (1)
74double cc_stats_vegas_exit_ss_bdp_ma = 0;
75double cc_stats_vegas_exit_ss_inc_ma = 0;
76double cc_stats_vegas_gamma_drop_ma = 0;
77double cc_stats_vegas_delta_drop_ma = 0;
78double cc_stats_vegas_ss_csig_blocked_ma = 0;
79double cc_stats_vegas_csig_blocked_ma = 0;
80double cc_stats_vegas_csig_alpha_ma = 0;
81double cc_stats_vegas_csig_beta_ma = 0;
82double cc_stats_vegas_csig_delta_ma = 0;
84double cc_stats_vegas_ss_queue_ma = 0;
85double cc_stats_vegas_queue_ma = 0;
86double cc_stats_vegas_bdp_ma = 0;
92uint64_t cc_stats_vegas_below_ss_inc_floor = 0;
93uint64_t cc_stats_vegas_circ_exited_ss = 0;
112 const char *alpha_str = NULL, *beta_str = NULL, *gamma_str = NULL;
113 const char *delta_str = NULL, *sscap_str = NULL;
114 int alpha, beta, gamma, delta, ss_cwnd_cap;
118 alpha_str =
"cc_vegas_alpha_sbws";
119 beta_str =
"cc_vegas_beta_sbws";
120 gamma_str =
"cc_vegas_gamma_sbws";
121 delta_str =
"cc_vegas_delta_sbws";
122 sscap_str =
"cc_sscap_sbws";
123 alpha = VEGAS_ALPHA_SBWS_DFLT;
124 beta = VEGAS_BETA_SBWS_DFLT;
125 gamma = VEGAS_GAMMA_SBWS_DFLT;
126 delta = VEGAS_DELTA_SBWS_DFLT;
127 ss_cwnd_cap = VEGAS_SSCAP_SBWS_DFLT;
130 case CC_PATH_ONION_SOS:
131 alpha_str =
"cc_vegas_alpha_exit";
132 beta_str =
"cc_vegas_beta_exit";
133 gamma_str =
"cc_vegas_gamma_exit";
134 delta_str =
"cc_vegas_delta_exit";
135 sscap_str =
"cc_sscap_exit";
136 alpha = VEGAS_ALPHA_EXIT_DFLT;
137 beta = VEGAS_BETA_EXIT_DFLT;
138 gamma = VEGAS_GAMMA_EXIT_DFLT;
139 delta = VEGAS_DELTA_EXIT_DFLT;
140 ss_cwnd_cap = VEGAS_SSCAP_EXIT_DFLT;
143 case CC_PATH_ONION_VG:
144 alpha_str =
"cc_vegas_alpha_onion";
145 beta_str =
"cc_vegas_beta_onion";
146 gamma_str =
"cc_vegas_gamma_onion";
147 delta_str =
"cc_vegas_delta_onion";
148 sscap_str =
"cc_sscap_onion";
149 alpha = VEGAS_ALPHA_ONION_DFLT;
150 beta = VEGAS_BETA_ONION_DFLT;
151 gamma = VEGAS_GAMMA_ONION_DFLT;
152 delta = VEGAS_DELTA_ONION_DFLT;
153 ss_cwnd_cap = VEGAS_SSCAP_ONION_DFLT;
196 cc_vegas_cwnd_full_minpct =
202 cc_vegas_cwnd_full_gap =
208 cc_cwnd_full_per_cwnd =
227 "CC: TOR_VEGAS Onion Circuit %d "
228 "RTT: %"PRIu64
", %"PRIu64
", %"PRIu64
", "
235 CONST_TO_ORIGIN_CIRCUIT(circ)->global_identifier,
236 cc->min_rtt_usec/1000,
238 cc->max_rtt_usec/1000,
250 "RTT: %"PRIu64
", %"PRIu64
", %"PRIu64
", "
257 cc->min_rtt_usec/1000,
259 cc->max_rtt_usec/1000,
275static inline uint64_t
313 cc_stats_vegas_exit_ss_bdp_ma =
314 stats_update_running_avg(cc_stats_vegas_exit_ss_bdp_ma,
316 cc_stats_vegas_exit_ss_inc_ma =
317 stats_update_running_avg(cc_stats_vegas_exit_ss_inc_ma,
319 cc_stats_vegas_circ_exited_ss++;
358 if (100*cc->
inflight < cc_vegas_cwnd_full_minpct * cc->
cwnd) {
379 if (cc_cwnd_full_per_cwnd) {
443 if (queue_use < cc->vegas_params.gamma && !cc->
blocked_chan) {
458 cc_stats_vegas_below_ss_inc_floor++;
461 cc_stats_vegas_ss_csig_blocked_ma =
462 stats_update_running_avg(cc_stats_vegas_ss_csig_blocked_ma,
467 uint64_t old_cwnd = cc->
cwnd;
474 cc_stats_vegas_ss_csig_blocked_ma =
475 stats_update_running_avg(cc_stats_vegas_ss_csig_blocked_ma,
478 uint64_t cwnd_diff = (old_cwnd > cc->
cwnd ? old_cwnd - cc->
cwnd : 0);
480 cc_stats_vegas_ss_csig_blocked_ma =
481 stats_update_running_avg(cc_stats_vegas_ss_csig_blocked_ma,
485 cc_stats_vegas_gamma_drop_ma =
486 stats_update_running_avg(cc_stats_vegas_gamma_drop_ma,
499 cc_stats_vegas_ss_queue_ma =
500 stats_update_running_avg(cc_stats_vegas_ss_queue_ma,
505 uint64_t old_cwnd = cc->
cwnd;
513 cwnd_diff = (old_cwnd > cc->
cwnd ? old_cwnd - cc->
cwnd : 0);
514 cc_stats_vegas_delta_drop_ma =
515 stats_update_running_avg(cc_stats_vegas_delta_drop_ma,
521 cc_stats_vegas_csig_alpha_ma =
522 stats_update_running_avg(cc_stats_vegas_csig_alpha_ma,
524 cc_stats_vegas_csig_beta_ma =
525 stats_update_running_avg(cc_stats_vegas_csig_beta_ma,
527 cc_stats_vegas_csig_delta_ma =
528 stats_update_running_avg(cc_stats_vegas_csig_delta_ma,
535 cc_stats_vegas_csig_blocked_ma =
536 stats_update_running_avg(cc_stats_vegas_csig_blocked_ma,
539 cc_stats_vegas_csig_blocked_ma =
540 stats_update_running_avg(cc_stats_vegas_csig_blocked_ma,
545 cc_stats_vegas_csig_alpha_ma =
546 stats_update_running_avg(cc_stats_vegas_csig_alpha_ma,
548 cc_stats_vegas_csig_beta_ma =
549 stats_update_running_avg(cc_stats_vegas_csig_beta_ma,
551 cc_stats_vegas_csig_delta_ma =
552 stats_update_running_avg(cc_stats_vegas_csig_delta_ma,
555 queue_use < cc->vegas_params.alpha) {
559 cc_stats_vegas_csig_alpha_ma =
560 stats_update_running_avg(cc_stats_vegas_csig_alpha_ma,
562 cc_stats_vegas_csig_beta_ma =
563 stats_update_running_avg(cc_stats_vegas_csig_beta_ma,
565 cc_stats_vegas_csig_delta_ma =
566 stats_update_running_avg(cc_stats_vegas_csig_delta_ma,
570 cc_stats_vegas_csig_alpha_ma =
571 stats_update_running_avg(cc_stats_vegas_csig_alpha_ma,
573 cc_stats_vegas_csig_beta_ma =
574 stats_update_running_avg(cc_stats_vegas_csig_beta_ma,
576 cc_stats_vegas_csig_delta_ma =
577 stats_update_running_avg(cc_stats_vegas_csig_delta_ma,
587 cc_stats_vegas_queue_ma =
588 stats_update_running_avg(cc_stats_vegas_queue_ma,
590 cc_stats_vegas_bdp_ma =
591 stats_update_running_avg(cc_stats_vegas_bdp_ma,
597 "CC: TOR_VEGAS above ss_max in steady state for circ %d: %"PRIu64,
Header file for channel.c.
origin_circuit_t * TO_ORIGIN_CIRCUIT(circuit_t *x)
Header file for circuitlist.c.
#define CIRCUIT_IS_ORIGIN(c)
#define CIRCUIT_PURPOSE_S_REND_JOINED
Header file for circuituse.c.
bool congestion_control_update_circuit_estimates(congestion_control_t *cc, const circuit_t *circ)
Public APIs for congestion control.
Structure definitions for congestion control.
static uint64_t SENDME_PER_CWND(const struct congestion_control_t *cc)
static uint64_t CWND_UPDATE_RATE(const struct congestion_control_t *cc)
static uint64_t vegas_bdp(const congestion_control_t *cc)
static bool cwnd_full_reset(const congestion_control_t *cc)
uint64_t cc_stats_vegas_above_ss_cwnd_max
uint64_t cc_stats_vegas_above_delta
double cc_stats_vegas_exit_ss_cwnd_ma
#define VEGAS_CWND_FULL_PER_CWND_DFLT
static bool cwnd_became_full(const congestion_control_t *cc)
#define VEGAS_CWND_FULL_GAP_DFLT
static uint64_t rfc3742_ss_inc(const congestion_control_t *cc)
static void congestion_control_vegas_exit_slow_start(const circuit_t *circ, congestion_control_t *cc)
void congestion_control_vegas_set_params(congestion_control_t *cc, cc_path_t path)
int congestion_control_vegas_process_sendme(congestion_control_t *cc, const circuit_t *circ)
static bool cwnd_became_nonfull(const congestion_control_t *cc)
#define VEGAS_CWND_FULL_MINPCT_DFLT
static void congestion_control_vegas_log(const circuit_t *circ, const congestion_control_t *cc)
Private-ish APIs for the TOR_VEGAS congestion control algorithm.
int control_event_circ_bandwidth_used_for_circ(origin_circuit_t *ocirc)
Header file for control_events.c.
Header file for crypt_path.c.
int32_t networkstatus_get_param(const networkstatus_t *ns, const char *param_name, int32_t default_val, int32_t min_val, int32_t max_val)
Header file for networkstatus.c.
Master header file for Tor-specific functionality.
#define CELL_MAX_NETWORK_SIZE
Origin circuit structure.
Header file for sendme.c.
struct vegas_params_t vegas_params