diff options
Diffstat (limited to 'src/or/rendmid.c')
-rw-r--r-- | src/or/rendmid.c | 39 |
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", |