|
@@ -3264,46 +3264,41 @@ dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
|
|
* router listening at <b>address</b>:<b>or_port</b>, and has yielded
|
|
* router listening at <b>address</b>:<b>or_port</b>, and has yielded
|
|
* a certificate with digest <b>digest_rcvd</b>.
|
|
* a certificate with digest <b>digest_rcvd</b>.
|
|
*
|
|
*
|
|
- * Also, if as_advertised is 1, then inform the reachability checker
|
|
|
|
- * that we could get to this guy.
|
|
|
|
|
|
+ * Inform the reachability checker that we could get to this guy.
|
|
*/
|
|
*/
|
|
void
|
|
void
|
|
dirserv_orconn_tls_done(const char *address,
|
|
dirserv_orconn_tls_done(const char *address,
|
|
uint16_t or_port,
|
|
uint16_t or_port,
|
|
- const char *digest_rcvd,
|
|
|
|
- int as_advertised)
|
|
|
|
|
|
+ const char *digest_rcvd)
|
|
{
|
|
{
|
|
- routerlist_t *rl = router_get_routerlist();
|
|
|
|
|
|
+ routerinfo_t *ri;
|
|
time_t now = time(NULL);
|
|
time_t now = time(NULL);
|
|
- int bridge_auth = authdir_mode_bridge(get_options());
|
|
|
|
tor_assert(address);
|
|
tor_assert(address);
|
|
tor_assert(digest_rcvd);
|
|
tor_assert(digest_rcvd);
|
|
|
|
|
|
- /* XXX023 Doing a loop like this is stupid. We should just look up the
|
|
|
|
- * router by digest_rcvd, and see if address, orport, and as_advertised
|
|
|
|
- * match up. -NM */
|
|
|
|
- SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, ri) {
|
|
|
|
- if (!strcasecmp(address, ri->address) && or_port == ri->or_port &&
|
|
|
|
- as_advertised &&
|
|
|
|
- fast_memeq(ri->cache_info.identity_digest, digest_rcvd, DIGEST_LEN)) {
|
|
|
|
- /* correct digest. mark this router reachable! */
|
|
|
|
- if (!bridge_auth || ri->purpose == ROUTER_PURPOSE_BRIDGE) {
|
|
|
|
- tor_addr_t addr, *addrp=NULL;
|
|
|
|
- log_info(LD_DIRSERV, "Found router %s to be reachable at %s:%d. Yay.",
|
|
|
|
- router_describe(ri),
|
|
|
|
- address, ri->or_port);
|
|
|
|
- if (tor_addr_parse(&addr, ri->address) != -1)
|
|
|
|
- addrp = &addr;
|
|
|
|
- else
|
|
|
|
- log_warn(LD_BUG, "Couldn't parse IP address \"%s\"", ri->address);
|
|
|
|
- rep_hist_note_router_reachable(digest_rcvd, addrp, or_port, now);
|
|
|
|
- ri->last_reachable = now;
|
|
|
|
- }
|
|
|
|
|
|
+ ri = router_get_mutable_by_digest(digest_rcvd);
|
|
|
|
+
|
|
|
|
+ if (ri == NULL)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (!strcasecmp(address, ri->address) && or_port == ri->or_port) {
|
|
|
|
+ /* Found the right router. */
|
|
|
|
+ if (!authdir_mode_bridge(get_options()) ||
|
|
|
|
+ ri->purpose == ROUTER_PURPOSE_BRIDGE) {
|
|
|
|
+ /* This is a bridge or we're not a bridge authorititative --
|
|
|
|
+ mark it as reachable. */
|
|
|
|
+ tor_addr_t addr, *addrp=NULL;
|
|
|
|
+ log_info(LD_DIRSERV, "Found router %s to be reachable at %s:%d. Yay.",
|
|
|
|
+ router_describe(ri),
|
|
|
|
+ address, ri->or_port);
|
|
|
|
+ if (tor_addr_parse(&addr, ri->address) != -1)
|
|
|
|
+ addrp = &addr;
|
|
|
|
+ else
|
|
|
|
+ log_warn(LD_BUG, "Couldn't parse IP address \"%s\"", ri->address);
|
|
|
|
+ rep_hist_note_router_reachable(digest_rcvd, addrp, or_port, now);
|
|
|
|
+ ri->last_reachable = now;
|
|
}
|
|
}
|
|
- } SMARTLIST_FOREACH_END(ri);
|
|
|
|
- /* FFFF Maybe we should reinstate the code that dumps routers with the same
|
|
|
|
- * addr/port but with nonmatching keys, but instead of dumping, we should
|
|
|
|
- * skip testing. */
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/** Called when we, as an authority, receive a new router descriptor either as
|
|
/** Called when we, as an authority, receive a new router descriptor either as
|