mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
Add last_reachable and testing_since for IPv6 OR port.
This commit is contained in:
parent
c1ff07440e
commit
4cce8ab742
@ -1540,7 +1540,7 @@ connection_or_client_learned_peer_id(or_connection_t *conn,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (authdir_mode_tests_reachability(options)) {
|
if (authdir_mode_tests_reachability(options)) {
|
||||||
dirserv_orconn_tls_done(conn->_base.address, conn->_base.port,
|
dirserv_orconn_tls_done(&conn->_base.addr, conn->_base.port,
|
||||||
(const char*)peer_id);
|
(const char*)peer_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3273,14 +3273,15 @@ dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
|
|||||||
* 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 tor_addr_t *addr,
|
||||||
uint16_t or_port,
|
uint16_t or_port,
|
||||||
const char *digest_rcvd)
|
const char *digest_rcvd)
|
||||||
{
|
{
|
||||||
node_t *node = NULL;
|
node_t *node = NULL;
|
||||||
|
tor_addr_port_t orport;
|
||||||
routerinfo_t *ri = NULL;
|
routerinfo_t *ri = NULL;
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
tor_assert(address);
|
tor_assert(addr);
|
||||||
tor_assert(digest_rcvd);
|
tor_assert(digest_rcvd);
|
||||||
|
|
||||||
node = node_get_mutable_by_id(digest_rcvd);
|
node = node_get_mutable_by_id(digest_rcvd);
|
||||||
@ -3288,22 +3289,26 @@ dirserv_orconn_tls_done(const char *address,
|
|||||||
return;
|
return;
|
||||||
ri = node->ri;
|
ri = node->ri;
|
||||||
|
|
||||||
if (!strcasecmp(address, ri->address) && or_port == ri->or_port) {
|
tor_addr_copy(&orport.addr, addr);
|
||||||
|
orport.port = or_port;
|
||||||
|
if (router_has_orport(ri, &orport)) {
|
||||||
/* Found the right router. */
|
/* Found the right router. */
|
||||||
if (!authdir_mode_bridge(get_options()) ||
|
if (!authdir_mode_bridge(get_options()) ||
|
||||||
ri->purpose == ROUTER_PURPOSE_BRIDGE) {
|
ri->purpose == ROUTER_PURPOSE_BRIDGE) {
|
||||||
|
char addrstr[TOR_ADDR_BUF_LEN];
|
||||||
/* This is a bridge or we're not a bridge authorititative --
|
/* This is a bridge or we're not a bridge authorititative --
|
||||||
mark it as reachable. */
|
mark it as reachable. */
|
||||||
tor_addr_t addr, *addrp=NULL;
|
|
||||||
log_info(LD_DIRSERV, "Found router %s to be reachable at %s:%d. Yay.",
|
log_info(LD_DIRSERV, "Found router %s to be reachable at %s:%d. Yay.",
|
||||||
router_describe(ri),
|
router_describe(ri),
|
||||||
address, ri->or_port);
|
tor_addr_to_str(addrstr, addr, sizeof(addrstr), 1),
|
||||||
if (tor_addr_parse(&addr, ri->address) != -1)
|
ri->or_port);
|
||||||
addrp = &addr;
|
if (tor_addr_family(addr) == AF_INET) {
|
||||||
else
|
rep_hist_note_router_reachable(digest_rcvd, addr, or_port, now);
|
||||||
log_warn(LD_BUG, "Couldn't parse IP address \"%s\"", ri->address);
|
node->last_reachable = now;
|
||||||
rep_hist_note_router_reachable(digest_rcvd, addrp, or_port, now);
|
} else if (tor_addr_family(addr) == AF_INET6) {
|
||||||
node->last_reachable = now;
|
/* No rephist for IPv6. */
|
||||||
|
node->last_reachable6 = now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3345,6 +3350,8 @@ dirserv_single_reachability_test(time_t now, routerinfo_t *router)
|
|||||||
tor_assert(router);
|
tor_assert(router);
|
||||||
node = node_get_mutable_by_id(router->cache_info.identity_digest);
|
node = node_get_mutable_by_id(router->cache_info.identity_digest);
|
||||||
tor_assert(node);
|
tor_assert(node);
|
||||||
|
|
||||||
|
/* IPv4. */
|
||||||
log_debug(LD_OR,"Testing reachability of %s at %s:%u.",
|
log_debug(LD_OR,"Testing reachability of %s at %s:%u.",
|
||||||
router->nickname, router->address, router->or_port);
|
router->nickname, router->address, router->or_port);
|
||||||
/* Remember when we started trying to determine reachability */
|
/* Remember when we started trying to determine reachability */
|
||||||
@ -3353,6 +3360,19 @@ dirserv_single_reachability_test(time_t now, routerinfo_t *router)
|
|||||||
tor_addr_from_ipv4h(&router_addr, router->addr);
|
tor_addr_from_ipv4h(&router_addr, router->addr);
|
||||||
connection_or_connect(&router_addr, router->or_port,
|
connection_or_connect(&router_addr, router->or_port,
|
||||||
router->cache_info.identity_digest);
|
router->cache_info.identity_digest);
|
||||||
|
|
||||||
|
/* Possible IPv6. */
|
||||||
|
if (!tor_addr_is_null(&router->ipv6_addr)) {
|
||||||
|
char addrstr[TOR_ADDR_BUF_LEN];
|
||||||
|
log_debug(LD_OR, "Testing reachability of %s at %s:%u.",
|
||||||
|
router->nickname,
|
||||||
|
tor_addr_to_str(addrstr, &router->ipv6_addr, sizeof(addrstr), 1),
|
||||||
|
router->ipv6_orport);
|
||||||
|
if (!node->testing_since6)
|
||||||
|
node->testing_since6 = now;
|
||||||
|
connection_or_connect(&router->ipv6_addr, router->ipv6_orport,
|
||||||
|
router->cache_info.identity_digest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Auth dir server only: load balance such that we only
|
/** Auth dir server only: load balance such that we only
|
||||||
|
@ -107,7 +107,7 @@ int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key,
|
|||||||
int is_extrainfo);
|
int is_extrainfo);
|
||||||
int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
|
int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
|
||||||
const char **msg);
|
const char **msg);
|
||||||
void dirserv_orconn_tls_done(const char *address,
|
void dirserv_orconn_tls_done(const tor_addr_t *addr,
|
||||||
uint16_t or_port,
|
uint16_t or_port,
|
||||||
const char *digest_rcvd);
|
const char *digest_rcvd);
|
||||||
int dirserv_should_launch_reachability_test(const routerinfo_t *ri,
|
int dirserv_should_launch_reachability_test(const routerinfo_t *ri,
|
||||||
|
@ -139,8 +139,8 @@ nodelist_replace_routerinfo(routerinfo_t *old, routerinfo_t *new)
|
|||||||
if (!routers_have_same_or_addr(old, new)) {
|
if (!routers_have_same_or_addr(old, new)) {
|
||||||
/* These mustn't carry over when the address and orport
|
/* These mustn't carry over when the address and orport
|
||||||
change. */
|
change. */
|
||||||
node->last_reachable = 0;
|
node->last_reachable = node->last_reachable6 = 0;
|
||||||
node->testing_since = 0;
|
node->testing_since = node->testing_since6 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
14
src/or/or.h
14
src/or/or.h
@ -1997,13 +1997,13 @@ typedef struct node_t {
|
|||||||
routerstatus_t *rs;
|
routerstatus_t *rs;
|
||||||
|
|
||||||
/* local info: copied from routerstatus, then possibly frobbed based
|
/* local info: copied from routerstatus, then possibly frobbed based
|
||||||
* on experience. Authorities set this stuff directly. */
|
* on experience. Authorities set this stuff directly. Note that
|
||||||
|
* these reflect knowledge of the primary (IPv4) OR port only. */
|
||||||
|
|
||||||
unsigned int is_running:1; /**< As far as we know, is this OR currently
|
unsigned int is_running:1; /**< As far as we know, is this OR currently
|
||||||
* running? */
|
* running? */
|
||||||
unsigned int is_valid:1; /**< Has a trusted dirserver validated this OR?
|
unsigned int is_valid:1; /**< Has a trusted dirserver validated this OR?
|
||||||
* (For Authdir: Have we validated this OR?)
|
* (For Authdir: Have we validated this OR?) */
|
||||||
*/
|
|
||||||
unsigned int is_fast:1; /** Do we think this is a fast OR? */
|
unsigned int is_fast:1; /** Do we think this is a fast OR? */
|
||||||
unsigned int is_stable:1; /** Do we think this is a stable OR? */
|
unsigned int is_stable:1; /** Do we think this is a stable OR? */
|
||||||
unsigned int is_possible_guard:1; /**< Do we think this is an OK guard? */
|
unsigned int is_possible_guard:1; /**< Do we think this is an OK guard? */
|
||||||
@ -2027,15 +2027,19 @@ typedef struct node_t {
|
|||||||
/* Local info: derived. */
|
/* Local info: derived. */
|
||||||
|
|
||||||
/** According to the geoip db what country is this router in? */
|
/** According to the geoip db what country is this router in? */
|
||||||
|
/* XXXprop186 what is this suppose to mean with multiple OR ports? */
|
||||||
country_t country;
|
country_t country;
|
||||||
|
|
||||||
/* The below items are used only by authdirservers for
|
/* The below items are used only by authdirservers for
|
||||||
* reachability testing. */
|
* reachability testing. */
|
||||||
|
|
||||||
/** When was the last time we could reach this OR? */
|
/** When was the last time we could reach this OR? */
|
||||||
time_t last_reachable; /* IPv4 */
|
time_t last_reachable; /* IPv4. */
|
||||||
|
time_t last_reachable6; /* IPv6. */
|
||||||
|
|
||||||
/** When did we start testing reachability for this OR? */
|
/** When did we start testing reachability for this OR? */
|
||||||
time_t testing_since; /* IPv4 */
|
time_t testing_since; /* IPv4. */
|
||||||
|
time_t testing_since6; /* IPv6. */
|
||||||
} node_t;
|
} node_t;
|
||||||
|
|
||||||
/** How many times will we try to download a router's descriptor before giving
|
/** How many times will we try to download a router's descriptor before giving
|
||||||
|
@ -2230,6 +2230,26 @@ router_get_pref_ipv6_orport(const routerinfo_t *router,
|
|||||||
ap_out->port = router->ipv6_orport;
|
ap_out->port = router->ipv6_orport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Return 1 if any of <b>router</b>'s addresses are <b>addr</b>.
|
||||||
|
* Otherwise return 0. */
|
||||||
|
int
|
||||||
|
router_has_addr(const routerinfo_t *router, const tor_addr_t *addr)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
tor_addr_eq_ipv4h(addr, router->addr) ||
|
||||||
|
tor_addr_eq(&router->ipv6_addr, addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
router_has_orport(const routerinfo_t *router, const tor_addr_port_t *orport)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(tor_addr_eq_ipv4h(&orport->addr, router->addr) &&
|
||||||
|
orport->port == router->or_port) ||
|
||||||
|
(tor_addr_eq(&orport->addr, &router->ipv6_addr) &&
|
||||||
|
orport->port == router->ipv6_orport);
|
||||||
|
}
|
||||||
|
|
||||||
/** Load the contents of <b>filename</b>, find the last line starting with
|
/** Load the contents of <b>filename</b>, find the last line starting with
|
||||||
* <b>end_line</b>, ensure that its timestamp is not more than 25 hours in
|
* <b>end_line</b>, ensure that its timestamp is not more than 25 hours in
|
||||||
* the past or more than 1 hour in the future with respect to <b>now</b>,
|
* the past or more than 1 hour in the future with respect to <b>now</b>,
|
||||||
|
@ -93,6 +93,8 @@ void router_get_pref_orport(const routerinfo_t *router,
|
|||||||
void router_get_pref_ipv6_orport(const routerinfo_t *router,
|
void router_get_pref_ipv6_orport(const routerinfo_t *router,
|
||||||
tor_addr_port_t *addr_port_out);
|
tor_addr_port_t *addr_port_out);
|
||||||
int router_ipv6_preferred(const routerinfo_t *router);
|
int router_ipv6_preferred(const routerinfo_t *router);
|
||||||
|
int router_has_addr(const routerinfo_t *router, const tor_addr_t *addr);
|
||||||
|
int router_has_orport(const routerinfo_t *router, const tor_addr_port_t *orport);
|
||||||
int extrainfo_dump_to_string(char **s, extrainfo_t *extrainfo,
|
int extrainfo_dump_to_string(char **s, extrainfo_t *extrainfo,
|
||||||
crypto_pk_t *ident_key);
|
crypto_pk_t *ident_key);
|
||||||
int is_legal_nickname(const char *s);
|
int is_legal_nickname(const char *s);
|
||||||
|
@ -1345,7 +1345,9 @@ mark_all_trusteddirservers_up(void)
|
|||||||
int
|
int
|
||||||
routers_have_same_or_addr(const routerinfo_t *r1, const routerinfo_t *r2)
|
routers_have_same_or_addr(const routerinfo_t *r1, const routerinfo_t *r2)
|
||||||
{
|
{
|
||||||
return r1->addr == r2->addr && r1->or_port == r2->or_port;
|
return r1->addr == r2->addr && r1->or_port == r2->or_port &&
|
||||||
|
tor_addr_eq(&r1->ipv6_addr, &r2->ipv6_addr) &&
|
||||||
|
r1->ipv6_orport == r2->ipv6_orport;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reset all internal variables used to count failed downloads of network
|
/** Reset all internal variables used to count failed downloads of network
|
||||||
|
Loading…
Reference in New Issue
Block a user