Commit 31f695ae authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Cache link-local addresses in network structure.

parent 78c852a0
...@@ -192,6 +192,7 @@ network_up(struct network *net, int up) ...@@ -192,6 +192,7 @@ network_up(struct network *net, int up)
net->up = up; net->up = up;
if(up) { if(up) {
unsigned char ll[32][16];
if(net->ifindex <= 0) { if(net->ifindex <= 0) {
fprintf(stderr, fprintf(stderr,
"Upping unknown interface %s.\n", net->ifname); "Upping unknown interface %s.\n", net->ifname);
...@@ -268,6 +269,23 @@ network_up(struct network *net, int up) ...@@ -268,6 +269,23 @@ network_up(struct network *net, int up)
tries to up it again. */ tries to up it again. */
return network_up(net, 0); return network_up(net, 0);
} }
if(net->ll)
free(net->ll);
net->nll = 0;
net->ll = NULL;
rc = kernel_ll_addresses(net->ifname, net->ifindex, ll, 32);
if(rc < 0) {
perror("kernel_ll_addresses");
} else if(rc > 0) {
net->ll = malloc(16 * rc);
if(net->ll == NULL) {
perror("malloc(ll)");
} else {
net->nll = rc;
memcpy(net->ll, ll, rc * 16);
}
}
delay_jitter(&net->hello_time, &net->hello_timeout, delay_jitter(&net->hello_time, &net->hello_timeout,
net->hello_interval); net->hello_interval);
delay_jitter(&net->self_update_time, &net->self_update_timeout, delay_jitter(&net->self_update_time, &net->self_update_timeout,
...@@ -291,6 +309,10 @@ network_up(struct network *net, int up) ...@@ -291,6 +309,10 @@ network_up(struct network *net, int up)
perror("setsockopt(IPV6_LEAVE_GROUP)"); perror("setsockopt(IPV6_LEAVE_GROUP)");
kernel_setup_interface(0, net->ifname, net->ifindex); kernel_setup_interface(0, net->ifname, net->ifindex);
} }
if(net->ll)
free(net->ll);
net->ll = NULL;
net->nll = 0;
} }
update_network_metric(net); update_network_metric(net);
...@@ -301,6 +323,21 @@ network_up(struct network *net, int up) ...@@ -301,6 +323,21 @@ network_up(struct network *net, int up)
return 1; return 1;
} }
int
network_ll_address(struct network *net, const unsigned char *address)
{
int i;
if(!net->up)
return 0;
for(i = 0; i < net->nll; i++)
if(memcmp(net->ll[i], address, 16) == 0)
return 1;
return 0;
}
void void
check_networks(void) check_networks(void)
{ {
......
...@@ -34,6 +34,8 @@ struct network { ...@@ -34,6 +34,8 @@ struct network {
struct timeval update_timeout; struct timeval update_timeout;
char ifname[IF_NAMESIZE]; char ifname[IF_NAMESIZE];
unsigned char *ipv4; unsigned char *ipv4;
int nll;
unsigned char (*ll)[16];
int buffered; int buffered;
struct timeval flush_timeout; struct timeval flush_timeout;
int bufsize; int bufsize;
...@@ -58,4 +60,5 @@ unsigned int jitter(struct network *net, int urgent); ...@@ -58,4 +60,5 @@ unsigned int jitter(struct network *net, int urgent);
unsigned int update_jitter(struct network *net, int urgent); unsigned int update_jitter(struct network *net, int urgent);
void delay_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);
int network_ll_address(struct network *net, const unsigned char *address);
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