mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-27 13:53:31 +01:00
cleaned up new_route()
now it deals gracefully with too few connected routers (i think) svn:r77
This commit is contained in:
parent
01aadefbfc
commit
08adaa4b46
@ -194,7 +194,7 @@ int connection_handle_listener_read(connection_t *conn, int new_type, int new_st
|
|||||||
}
|
}
|
||||||
log(LOG_DEBUG,"Connection accepted on socket %d.",news);
|
log(LOG_DEBUG,"Connection accepted on socket %d.",news);
|
||||||
|
|
||||||
fcntl(news, F_SETFL, O_NONBLOCK); /* set s to non-blocking */
|
fcntl(news, F_SETFL, O_NONBLOCK); /* set news to non-blocking */
|
||||||
|
|
||||||
newconn = connection_new(new_type);
|
newconn = connection_new(new_type);
|
||||||
newconn->s = news;
|
newconn->s = news;
|
||||||
@ -207,7 +207,7 @@ int connection_handle_listener_read(connection_t *conn, int new_type, int new_st
|
|||||||
/* learn things from parent, so we can perform auth */
|
/* learn things from parent, so we can perform auth */
|
||||||
memcpy(&newconn->local,&conn->local,sizeof(struct sockaddr_in));
|
memcpy(&newconn->local,&conn->local,sizeof(struct sockaddr_in));
|
||||||
newconn->prkey = conn->prkey;
|
newconn->prkey = conn->prkey;
|
||||||
// newconn->address = strdup(get_string_from_remote()) FIXME ;
|
newconn->address = strdup(inet_ntoa(*(struct in_addr *)&remote.sin_addr.s_addr)); /* remember the remote address */
|
||||||
|
|
||||||
if(connection_add(newconn) < 0) { /* no space, forget it */
|
if(connection_add(newconn) < 0) { /* no space, forget it */
|
||||||
connection_free(newconn);
|
connection_free(newconn);
|
||||||
|
@ -108,7 +108,7 @@ connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) {
|
|||||||
/* first check if it's there exactly */
|
/* first check if it's there exactly */
|
||||||
conn = connection_exact_get_by_addr_port(addr,port);
|
conn = connection_exact_get_by_addr_port(addr,port);
|
||||||
if(conn && connection_state_is_open(conn)) {
|
if(conn && connection_state_is_open(conn)) {
|
||||||
log(LOG_DEBUG,"connection_twin_get_by_addr_port(): Found exact match.");
|
log(LOG_INFO,"connection_twin_get_by_addr_port(): Found exact match.");
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) {
|
|||||||
conn = connection_array[i];
|
conn = connection_array[i];
|
||||||
assert(conn);
|
assert(conn);
|
||||||
if(connection_state_is_open(conn) && !pkey_cmp(conn->pkey, router->pkey)) {
|
if(connection_state_is_open(conn) && !pkey_cmp(conn->pkey, router->pkey)) {
|
||||||
log(LOG_DEBUG,"connection_twin_get_by_addr_port(): Found twin (%s).",conn->address);
|
log(LOG_INFO,"connection_twin_get_by_addr_port(): Found twin (%s).",conn->address);
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,8 @@ int chooselen(double cw)
|
|||||||
unsigned int *new_route(double cw, routerinfo_t **rarray, size_t rarray_len, size_t *rlen)
|
unsigned int *new_route(double cw, routerinfo_t **rarray, size_t rarray_len, size_t *rlen)
|
||||||
{
|
{
|
||||||
int routelen = 0;
|
int routelen = 0;
|
||||||
int i = 0;
|
int i, j;
|
||||||
|
int num_acceptable_routers = 0;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
unsigned int *route = NULL;
|
unsigned int *route = NULL;
|
||||||
unsigned int oldchoice, choice;
|
unsigned int oldchoice, choice;
|
||||||
@ -103,46 +104,69 @@ unsigned int *new_route(double cw, routerinfo_t **rarray, size_t rarray_len, siz
|
|||||||
assert((cw >= 0) && (cw < 1) && (rarray) && (rlen) ); /* valid parameters */
|
assert((cw >= 0) && (cw < 1) && (rarray) && (rlen) ); /* valid parameters */
|
||||||
|
|
||||||
routelen = chooselen(cw);
|
routelen = chooselen(cw);
|
||||||
if (routelen == -1)
|
if (routelen == -1) {
|
||||||
{
|
|
||||||
log(LOG_ERR,"Choosing route length failed.");
|
log(LOG_ERR,"Choosing route length failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
log(LOG_DEBUG,"new_route(): Chosen route length %u.",routelen);
|
log(LOG_DEBUG,"new_route(): Chosen route length %d.",routelen);
|
||||||
|
|
||||||
/* FIXME need to figure out how many routers we can actually choose from.
|
for(i=0;i<rarray_len;i++) {
|
||||||
* We can get into an infinite loop if there are too few. */
|
log(LOG_DEBUG,"Contemplating whether router %d is any good...",i);
|
||||||
|
if(!connection_exact_get_by_addr_port(rarray[i]->addr, rarray[i]->or_port)) {
|
||||||
|
log(LOG_DEBUG,"Nope, %d is not connected.",i);
|
||||||
|
goto next_i_loop;
|
||||||
|
}
|
||||||
|
for(j=0;j<i;j++) {
|
||||||
|
if(!pkey_cmp(rarray[i]->pkey, rarray[j]->pkey)) {
|
||||||
|
/* these guys are twins. so we've already counted him. */
|
||||||
|
log(LOG_DEBUG,"Nope, %d is a twin of %d.",i,j);
|
||||||
|
goto next_i_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num_acceptable_routers++;
|
||||||
|
log(LOG_DEBUG,"I like %d. num_acceptable_routers now %d.",i, num_acceptable_routers);
|
||||||
|
next_i_loop:
|
||||||
|
}
|
||||||
|
|
||||||
|
if(num_acceptable_routers < routelen) {
|
||||||
|
log(LOG_DEBUG,"new_route(): Cutting routelen from %d to %d.",routelen, num_acceptable_routers);
|
||||||
|
routelen = num_acceptable_routers;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(routelen < 1) {
|
||||||
|
log(LOG_ERR,"new_route(): Didn't find any acceptable routers. Failing.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* allocate memory for the new route */
|
/* allocate memory for the new route */
|
||||||
route = (unsigned int *)malloc(routelen * sizeof(unsigned int));
|
route = (unsigned int *)malloc(routelen * sizeof(unsigned int));
|
||||||
if (!route)
|
if (!route) {
|
||||||
{
|
|
||||||
log(LOG_ERR,"Memory allocation failed.");
|
log(LOG_ERR,"Memory allocation failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
oldchoice = rarray_len;
|
oldchoice = rarray_len;
|
||||||
for(i=0;i<routelen;i++)
|
for(i=0;i<routelen;i++) {
|
||||||
{
|
log(LOG_DEBUG,"new_route(): Choosing hop %u.",i);
|
||||||
log(LOG_DEBUG,"new_route() : Choosing hop %u.",i);
|
|
||||||
retval = crypto_pseudo_rand(sizeof(unsigned int),(unsigned char *)&choice);
|
retval = crypto_pseudo_rand(sizeof(unsigned int),(unsigned char *)&choice);
|
||||||
if (retval)
|
if (retval) {
|
||||||
{
|
|
||||||
free((void *)route);
|
free((void *)route);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
choice = choice % (rarray_len);
|
choice = choice % (rarray_len);
|
||||||
log(LOG_DEBUG,"new_route() : Chosen router %u.",choice);
|
log(LOG_DEBUG,"new_route(): Contemplating router %u.",choice);
|
||||||
if (choice == oldchoice ||
|
while(choice == oldchoice ||
|
||||||
(oldchoice < rarray_len && !pkey_cmp(rarray[choice]->pkey, rarray[oldchoice]->pkey)) ||
|
(oldchoice < rarray_len && !pkey_cmp(rarray[choice]->pkey, rarray[oldchoice]->pkey)) ||
|
||||||
!connection_twin_get_by_addr_port(rarray[choice]->addr, rarray[choice]->or_port)) {
|
!connection_twin_get_by_addr_port(rarray[choice]->addr, rarray[choice]->or_port)) {
|
||||||
/* Same router as last choice, or router twin,
|
/* Same router as last choice, or router twin,
|
||||||
* or no routers with that key are connected to us.
|
* or no routers with that key are connected to us.
|
||||||
* Try again. */
|
* Try again. */
|
||||||
i--;
|
log(LOG_DEBUG,"new_route(): Picked a router %d that won't work as next hop.",choice);
|
||||||
continue;
|
choice++;
|
||||||
|
choice = choice % (rarray_len);
|
||||||
}
|
}
|
||||||
|
log(LOG_DEBUG,"new_route(): Chosen router %u for hop %u.",choice,i);
|
||||||
oldchoice = choice;
|
oldchoice = choice;
|
||||||
route[i] = choice;
|
route[i] = choice;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user