Commit b6955597 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Use explicit timeouts for hellos, IHUs and updates.

This is in preparation for sub-second hello intervals.
parent e75aa64e
...@@ -529,12 +529,10 @@ main(int argc, char **argv) ...@@ -529,12 +529,10 @@ main(int argc, char **argv)
if(!nets[i].up) if(!nets[i].up)
continue; continue;
timeval_min(&tv, &nets[i].flush_time); timeval_min(&tv, &nets[i].flush_time);
timeval_min_sec(&tv, timeval_min(&tv, &nets[i].hello_timeout);
nets[i].hello_time + nets[i].hello_interval);
if(!network_idle(&nets[i])) { if(!network_idle(&nets[i])) {
timeval_min_sec(&tv, nets[i].self_update_time + timeval_min(&tv, &nets[i].self_update_timeout);
nets[i].self_update_interval); timeval_min(&tv, &nets[i].update_timeout);
timeval_min_sec(&tv, nets[i].update_time + update_interval);
} }
} }
timeval_min(&tv, &update_flush_time); timeval_min(&tv, &update_flush_time);
...@@ -640,17 +638,15 @@ main(int argc, char **argv) ...@@ -640,17 +638,15 @@ main(int argc, char **argv)
for(i = 0; i < numnets; i++) { for(i = 0; i < numnets; i++) {
if(!nets[i].up) if(!nets[i].up)
continue; continue;
if(now.tv_sec >= nets[i].hello_time + nets[i].hello_interval) if(timeval_compare(&now, &nets[i].hello_timeout) >= 0)
send_hello(&nets[i]); send_hello(&nets[i]);
if(now.tv_sec >= nets[i].ihu_time + nets[i].ihu_interval) if(timeval_compare(&now, &nets[i].ihu_timeout) >= 0)
send_ihu(NULL, &nets[i]); send_ihu(NULL, &nets[i]);
if(!network_idle(&nets[i])) { if(!network_idle(&nets[i])) {
if(now.tv_sec >= nets[i].update_time + update_interval) if(timeval_compare(&now, &nets[i].update_timeout) >= 0)
send_update(&nets[i], 0, NULL, 0); send_update(&nets[i], 0, NULL, 0);
if(now.tv_sec >= if(timeval_compare(&now, &nets[i].self_update_timeout) >= 0)
nets[i].self_update_time + nets[i].self_update_interval) {
send_self_update(&nets[i], 0); send_self_update(&nets[i], 0);
}
} }
} }
......
...@@ -79,5 +79,6 @@ extern unsigned char protocol_group[16]; ...@@ -79,5 +79,6 @@ extern unsigned char protocol_group[16];
extern int protocol_socket; extern int protocol_socket;
extern int kernel_socket; extern int kernel_socket;
extern int max_request_hopcount; extern int max_request_hopcount;
extern int update_interval;
void resize_receive_buffer(int size); void resize_receive_buffer(int size);
...@@ -464,7 +464,8 @@ send_hello_noupdate(struct network *net, unsigned interval) ...@@ -464,7 +464,8 @@ send_hello_noupdate(struct network *net, unsigned interval)
{ {
debugf("Sending hello (%d) to %s.\n", interval, net->ifname); debugf("Sending hello (%d) to %s.\n", interval, net->ifname);
net->hello_seqno = seqno_plus(net->hello_seqno, 1); net->hello_seqno = seqno_plus(net->hello_seqno, 1);
net->hello_time = now.tv_sec; delay_jitter(&net->hello_time, &net->hello_timeout,
net->hello_interval * 1000);
send_message(net, 0, 0, 0, net->hello_seqno, send_message(net, 0, 0, 0, net->hello_seqno,
interval > 0xFFFF ? 0 : interval, interval > 0xFFFF ? 0 : interval,
myid); myid);
...@@ -750,7 +751,8 @@ send_update(struct network *net, int urgent, ...@@ -750,7 +751,8 @@ send_update(struct network *net, int urgent,
if(parasitic || (silent_time && now.tv_sec < reboot_time + silent_time)) { if(parasitic || (silent_time && now.tv_sec < reboot_time + silent_time)) {
if(prefix == NULL) { if(prefix == NULL) {
send_self_update(net, 0); send_self_update(net, 0);
net->update_time = now.tv_sec; delay_jitter(&net->update_time, &net->update_timeout,
update_interval * 1000);
} else if(find_xroute(prefix, plen)) { } else if(find_xroute(prefix, plen)) {
buffer_update(net, prefix, plen); buffer_update(net, prefix, plen);
} }
...@@ -769,13 +771,15 @@ send_update(struct network *net, int urgent, ...@@ -769,13 +771,15 @@ send_update(struct network *net, int urgent,
buffer_update(net, prefix, plen); buffer_update(net, prefix, plen);
} else { } else {
send_self_update(net, 0); send_self_update(net, 0);
if(now.tv_sec - net->update_time < 1) /* Avoid sending full route dumps more than once per second */
if(now.tv_sec - net->update_time.tv_sec < 1)
return; return;
debugf("Sending update to %s for any.\n", net->ifname); debugf("Sending update to %s for any.\n", net->ifname);
for(i = 0; i < numroutes; i++) for(i = 0; i < numroutes; i++)
if(routes[i].installed) if(routes[i].installed)
buffer_update(net, routes[i].src->prefix, routes[i].src->plen); buffer_update(net, routes[i].src->prefix, routes[i].src->plen);
net->update_time = now.tv_sec; delay_jitter(&net->update_time, &net->update_timeout,
update_interval * 1000);
} }
schedule_update_flush(net, urgent); schedule_update_flush(net, urgent);
} }
...@@ -807,8 +811,8 @@ send_self_update(struct network *net, int force_seqno) ...@@ -807,8 +811,8 @@ send_self_update(struct network *net, int force_seqno)
debugf("Sending self update to %s.\n", net->ifname); debugf("Sending self update to %s.\n", net->ifname);
net->self_update_time = now.tv_sec; delay_jitter(&net->self_update_time, &net->self_update_timeout,
net->self_update_interval * 1000);
for(i = 0; i < numxroutes; i++) { for(i = 0; i < numxroutes; i++) {
send_update(net, 0, xroutes[i].prefix, xroutes[i].plen); send_update(net, 0, xroutes[i].prefix, xroutes[i].plen);
} }
...@@ -834,7 +838,8 @@ send_self_retract(struct network *net) ...@@ -834,7 +838,8 @@ send_self_retract(struct network *net)
myseqno = seqno_plus(myseqno, 1); myseqno = seqno_plus(myseqno, 1);
seqno_time = now.tv_sec; seqno_time = now.tv_sec;
net->self_update_time = now.tv_sec; delay_jitter(&net->self_update_time, &net->self_update_timeout,
net->self_update_interval);
for(i = 0; i < numxroutes; i++) { for(i = 0; i < numxroutes; i++) {
really_send_update(net, myid, xroutes[i].prefix, xroutes[i].plen, really_send_update(net, myid, xroutes[i].prefix, xroutes[i].plen,
myseqno, 0xFFFF); myseqno, 0xFFFF);
...@@ -874,7 +879,8 @@ send_ihu(struct neighbour *neigh, struct network *net) ...@@ -874,7 +879,8 @@ send_ihu(struct neighbour *neigh, struct network *net)
send_ihu(&neighs[i], net); send_ihu(&neighs[i], net);
} }
} }
net->ihu_time = now.tv_sec; delay_jitter(&net->ihu_time, &net->ihu_timeout,
net->ihu_interval * 1000);
} else { } else {
int rxcost; int rxcost;
......
...@@ -128,7 +128,7 @@ update_jitter(struct network *net, int urgent) ...@@ -128,7 +128,7 @@ update_jitter(struct network *net, int urgent)
} }
void void
timeout_jitter(struct timeval *time, struct timeval *timeout, int msecs) delay_jitter(struct timeval *time, struct timeval *timeout, int msecs)
{ {
int delay; int delay;
delay = msecs * 3 / 2 + random() % MAX(msecs / 3, 10); delay = msecs * 3 / 2 + random() % MAX(msecs / 3, 10);
......
...@@ -25,10 +25,14 @@ struct network { ...@@ -25,10 +25,14 @@ struct network {
unsigned int ifindex; unsigned int ifindex;
int wired; int wired;
unsigned short cost; unsigned short cost;
int hello_time; struct timeval hello_time;
int self_update_time; struct timeval hello_timeout;
int update_time; struct timeval self_update_time;
int ihu_time; struct timeval self_update_timeout;
struct timeval update_time;
struct timeval update_timeout;
struct timeval ihu_time;
struct timeval ihu_timeout;
char ifname[IF_NAMESIZE]; char ifname[IF_NAMESIZE];
unsigned char *ipv4; unsigned char *ipv4;
int buffered; int buffered;
...@@ -52,6 +56,6 @@ int network_idle(struct network *net); ...@@ -52,6 +56,6 @@ int network_idle(struct network *net);
int update_hello_interval(struct network *net); int update_hello_interval(struct network *net);
unsigned int jitter(struct network *net); unsigned int jitter(struct network *net);
unsigned int update_jitter(struct network *net, int urgent); unsigned int update_jitter(struct network *net, int urgent);
void timeout_jitter(struct timeval *time, struct timeval *timeout, int msecs); void delay_jitter(struct timeval *time, struct timeval *timeout, int msecs);
int network_up(struct network *net, int up); int network_up(struct network *net, int up);
void check_networks(void); void check_networks(void);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment