projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Releasing 1.1pre13.
[tinc]
/
src
/
net.c
diff --git
a/src/net.c
b/src/net.c
index
a539425
..
52c7fe3
100644
(file)
--- a/
src/net.c
+++ b/
src/net.c
@@
-152,7
+152,7
@@
static void timeout_handler(void *data) {
if(c->edge) {
try_tx(c->node, false);
if(c->status.pinged) {
if(c->edge) {
try_tx(c->node, false);
if(c->status.pinged) {
- logger(DEBUG_CONNECTIONS, LOG_INFO, "%s (%s) didn't respond to PING in %ld seconds", c->name, c->hostname, (long)
now.tv_sec - c->last_ping_time
);
+ logger(DEBUG_CONNECTIONS, LOG_INFO, "%s (%s) didn't respond to PING in %ld seconds", c->name, c->hostname, (long)
(now.tv_sec - c->last_ping_time)
);
} else if(c->last_ping_time + pinginterval <= now.tv_sec) {
send_ping(c);
continue;
} else if(c->last_ping_time + pinginterval <= now.tv_sec) {
send_ping(c);
continue;
@@
-181,7
+181,7
@@
static void periodic_handler(void *data) {
if(contradicting_del_edge > 100 && contradicting_add_edge > 100) {
logger(DEBUG_ALWAYS, LOG_WARNING, "Possible node with same Name as us! Sleeping %d seconds.", sleeptime);
if(contradicting_del_edge > 100 && contradicting_add_edge > 100) {
logger(DEBUG_ALWAYS, LOG_WARNING, "Possible node with same Name as us! Sleeping %d seconds.", sleeptime);
-
usleep(sleeptime * 1000000
LL);
+
nanosleep(&(struct timespec){sleeptime, 0}, NU
LL);
sleeptime *= 2;
if(sleeptime < 0)
sleeptime = 3600;
sleeptime *= 2;
if(sleeptime < 0)
sleeptime = 3600;
@@
-210,15
+210,24
@@
static void periodic_handler(void *data) {
and we are not already trying to make one, create an
outgoing connection to this node.
*/
and we are not already trying to make one, create an
outgoing connection to this node.
*/
- int r = rand() % node_tree->count;
- int i = 0;
+ int count = 0;
+ for splay_each(node_t, n, node_tree) {
+ if(n == myself || n->connection || !(n->status.has_address || n->status.reachable))
+ continue;
+ count++;
+ }
+
+ if(!count)
+ goto end;
+
+ int r = rand() % count;
for splay_each(node_t, n, node_tree) {
for splay_each(node_t, n, node_tree) {
- if(
i++ != r
)
+ if(
n == myself || n->connection || !(n->status.has_address || n->status.reachable)
)
continue;
continue;
- if(
n->connection
)
-
break
;
+ if(
r--
)
+
continue
;
bool found = false;
bool found = false;
@@
-236,6
+245,7
@@
static void periodic_handler(void *data) {
list_insert_tail(outgoing_list, outgoing);
setup_outgoing_connection(outgoing);
}
list_insert_tail(outgoing_list, outgoing);
setup_outgoing_connection(outgoing);
}
+
break;
}
} else if(nc > 3) {
break;
}
} else if(nc > 3) {
@@
-284,6
+294,7
@@
static void periodic_handler(void *data) {
}
}
}
}
+end:
timeout_set(data, &(struct timeval){5, rand() % 100000});
}
timeout_set(data, &(struct timeval){5, rand() % 100000});
}
@@
-341,9
+352,14
@@
int reload_configuration(void) {
for splay_each(subnet_t, subnet, subnet_tree)
if (subnet->owner)
subnet->expires = 1;
for splay_each(subnet_t, subnet, subnet_tree)
if (subnet->owner)
subnet->expires = 1;
+ }
+
+ for splay_each(node_t, n, node_tree)
+ n->status.has_address = false;
-
load_all_subnet
s();
+
load_all_node
s();
+ if(strictsubnets) {
for splay_each(subnet_t, subnet, subnet_tree) {
if (!subnet->owner)
continue;
for splay_each(subnet_t, subnet, subnet_tree) {
if (!subnet->owner)
continue;
@@
-442,7
+458,7
@@
void retry(void) {
*/
int main_loop(void) {
timeout_add(&pingtimer, timeout_handler, &pingtimer, &(struct timeval){pingtimeout, rand() % 100000});
*/
int main_loop(void) {
timeout_add(&pingtimer, timeout_handler, &pingtimer, &(struct timeval){pingtimeout, rand() % 100000});
- timeout_add(&periodictimer, periodic_handler, &periodictimer, &(struct timeval){
pingtimeout, rand() % 10000
0});
+ timeout_add(&periodictimer, periodic_handler, &periodictimer, &(struct timeval){
0,
0});
#ifndef HAVE_MINGW
signal_t sighup = {0};
#ifndef HAVE_MINGW
signal_t sighup = {0};