aboutsummaryrefslogtreecommitdiff
path: root/src/or/rendmid.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/or/rendmid.c')
-rw-r--r--src/or/rendmid.c39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/or/rendmid.c b/src/or/rendmid.c
index e7a7849db..81a2f16ec 100644
--- a/src/or/rendmid.c
+++ b/src/or/rendmid.c
@@ -174,6 +174,7 @@ rend_mid_introduce(or_circuit_t *circ, const uint8_t *request,
(char*)request, REND_SERVICE_ID_LEN);
/* The first 20 bytes are all we look at: they have a hash of Bob's PK. */
+
smartlist_t *intro_circuits = circuits_get_intro_point((char*)request);
log_info(LD_REND,
@@ -189,14 +190,44 @@ rend_mid_introduce(or_circuit_t *circ, const uint8_t *request,
}
// Need to select which circuit to use
- int circ_selection = crypto_rand_int(smartlist_len(intro_circuits));
+ int circ_selection = -1;
- log_info(LD_REND,
- "selected circuit %i for service %s",
- circ_selection, safe_str(serviceid));
+ if (strcasecmp(get_options()->IntroPointLoadBalancingAlgorithm, "random")) {
+ circ_selection = crypto_rand_int(smartlist_len(intro_circuits));
+
+ log_info(LD_REND,
+ "selected circuit %i randomly for service %s",
+ circ_selection, safe_str(serviceid));
+ } else if (strcasecmp(get_options()->IntroPointLoadBalancingAlgorithm,
+ "roundrobin")) {
+
+ SMARTLIST_FOREACH_BEGIN(intro_circuits, or_circuit_t *, circuit)
+ {
+ circ_selection++;
+ if (circuit->intro_last_used) {
+ circuit->intro_last_used = 0;
+ break;
+ }
+ }
+ SMARTLIST_FOREACH_END(circuit);
+
+ circ_selection++;
+
+ if (circ_selection == smartlist_len(intro_circuits))
+ circ_selection = 0;
+
+ log_info(LD_REND,
+ "selected circuit %i using round robin for service %s",
+ circ_selection, safe_str(serviceid));
+ } else if (strcasecmp(get_options()->IntroPointLoadBalancingAlgorithm,
+ "weightedroundrobin")) {
+
+ }
intro_circ = smartlist_get(intro_circuits, circ_selection);
+ intro_circ->intro_last_used = 1;
+
log_info(LD_REND,
"Sending introduction request for service %s "
"from circ %u to circ %u",