Commit 1c3b2bb8 authored by Matthieu Boutier's avatar Matthieu Boutier Committed by Juliusz Chroboczek

Rename struct network to interface and associated changes.

parent 5f40b621
...@@ -108,7 +108,7 @@ main(int argc, char **argv) ...@@ -108,7 +108,7 @@ main(int argc, char **argv)
char *config_file = NULL; char *config_file = NULL;
void *vrc; void *vrc;
unsigned int seed; unsigned int seed;
struct network *net; struct interface *ifp;
gettime(&now); gettime(&now);
...@@ -362,22 +362,22 @@ main(int argc, char **argv) ...@@ -362,22 +362,22 @@ main(int argc, char **argv)
} }
for(i = optind; i < argc; i++) { for(i = optind; i < argc; i++) {
vrc = add_network(argv[i], NULL); vrc = add_interface(argv[i], NULL);
if(vrc == NULL) if(vrc == NULL)
goto fail; goto fail;
} }
if(networks == NULL) { if(interfaces == NULL) {
fprintf(stderr, "Eek... asked to run on no interfaces!\n"); fprintf(stderr, "Eek... asked to run on no interfaces!\n");
goto fail; goto fail;
} }
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
/* net->ifindex is not necessarily valid at this point */ /* ifp->ifindex is not necessarily valid at this point */
int ifindex = if_nametoindex(net->ifname); int ifindex = if_nametoindex(ifp->name);
if(ifindex > 0) { if(ifindex > 0) {
unsigned char eui[8]; unsigned char eui[8];
rc = if_eui64(net->ifname, ifindex, eui); rc = if_eui64(ifp->name, ifindex, eui);
if(rc < 0) if(rc < 0)
continue; continue;
memcpy(myid, eui, 8); memcpy(myid, eui, 8);
...@@ -482,7 +482,7 @@ main(int argc, char **argv) ...@@ -482,7 +482,7 @@ main(int argc, char **argv)
rc = resize_receive_buffer(1500); rc = resize_receive_buffer(1500);
if(rc < 0) if(rc < 0)
goto fail; goto fail;
check_networks(); check_interfaces();
if(receive_buffer == NULL) if(receive_buffer == NULL)
goto fail; goto fail;
...@@ -499,27 +499,27 @@ main(int argc, char **argv) ...@@ -499,27 +499,27 @@ main(int argc, char **argv)
/* Make some noise so that others notice us, and send retractions in /* Make some noise so that others notice us, and send retractions in
case we were restarted recently */ case we were restarted recently */
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
/* Apply jitter before we send the first message. */ /* Apply jitter before we send the first message. */
usleep(roughly(10000)); usleep(roughly(10000));
gettime(&now); gettime(&now);
send_hello(net); send_hello(ifp);
send_wildcard_retraction(net); send_wildcard_retraction(ifp);
} }
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
usleep(roughly(10000)); usleep(roughly(10000));
gettime(&now); gettime(&now);
send_hello(net); send_hello(ifp);
send_wildcard_retraction(net); send_wildcard_retraction(ifp);
send_self_update(net); send_self_update(ifp);
send_request(net, NULL, 0); send_request(ifp, NULL, 0);
flushupdates(net); flushupdates(ifp);
flushbuf(net); flushbuf(ifp);
} }
debugf("Entering main loop.\n"); debugf("Entering main loop.\n");
...@@ -535,13 +535,13 @@ main(int argc, char **argv) ...@@ -535,13 +535,13 @@ main(int argc, char **argv)
timeval_min_sec(&tv, source_expiry_time); timeval_min_sec(&tv, source_expiry_time);
timeval_min_sec(&tv, kernel_dump_time); timeval_min_sec(&tv, kernel_dump_time);
timeval_min(&tv, &resend_time); timeval_min(&tv, &resend_time);
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
timeval_min(&tv, &net->flush_timeout); timeval_min(&tv, &ifp->flush_timeout);
timeval_min(&tv, &net->hello_timeout); timeval_min(&tv, &ifp->hello_timeout);
timeval_min(&tv, &net->update_timeout); timeval_min(&tv, &ifp->update_timeout);
timeval_min(&tv, &net->update_flush_timeout); timeval_min(&tv, &ifp->update_flush_timeout);
} }
timeval_min(&tv, &unicast_flush_timeout); timeval_min(&tv, &unicast_flush_timeout);
FD_ZERO(&readfds); FD_ZERO(&readfds);
...@@ -593,11 +593,11 @@ main(int argc, char **argv) ...@@ -593,11 +593,11 @@ main(int argc, char **argv)
sleep(1); sleep(1);
} }
} else { } else {
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
if(net->ifindex == sin6.sin6_scope_id) { if(ifp->ifindex == sin6.sin6_scope_id) {
parse_packet((unsigned char*)&sin6.sin6_addr, net, parse_packet((unsigned char*)&sin6.sin6_addr, ifp,
receive_buffer, rc); receive_buffer, rc);
VALGRIND_MAKE_MEM_UNDEFINED(receive_buffer, VALGRIND_MAKE_MEM_UNDEFINED(receive_buffer,
receive_buffer_size); receive_buffer_size);
...@@ -647,7 +647,7 @@ main(int argc, char **argv) ...@@ -647,7 +647,7 @@ main(int argc, char **argv)
} }
if(kernel_link_changed || kernel_addr_changed) { if(kernel_link_changed || kernel_addr_changed) {
check_networks(); check_interfaces();
kernel_link_changed = 0; kernel_link_changed = 0;
} }
...@@ -671,7 +671,7 @@ main(int argc, char **argv) ...@@ -671,7 +671,7 @@ main(int argc, char **argv)
} }
if(now.tv_sec >= expiry_time) { if(now.tv_sec >= expiry_time) {
check_networks(); check_interfaces();
expire_routes(); expire_routes();
expire_resend(); expire_resend();
expiry_time = now.tv_sec + roughly(30); expiry_time = now.tv_sec + roughly(30);
...@@ -682,15 +682,15 @@ main(int argc, char **argv) ...@@ -682,15 +682,15 @@ main(int argc, char **argv)
source_expiry_time = now.tv_sec + roughly(300); source_expiry_time = now.tv_sec + roughly(300);
} }
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
if(timeval_compare(&now, &net->hello_timeout) >= 0) if(timeval_compare(&now, &ifp->hello_timeout) >= 0)
send_hello(net); send_hello(ifp);
if(timeval_compare(&now, &net->update_timeout) >= 0) if(timeval_compare(&now, &ifp->update_timeout) >= 0)
send_update(net, 0, NULL, 0); send_update(ifp, 0, NULL, 0);
if(timeval_compare(&now, &net->update_flush_timeout) >= 0) if(timeval_compare(&now, &ifp->update_flush_timeout) >= 0)
flushupdates(net); flushupdates(ifp);
} }
if(resend_time.tv_sec != 0) { if(resend_time.tv_sec != 0) {
...@@ -703,12 +703,12 @@ main(int argc, char **argv) ...@@ -703,12 +703,12 @@ main(int argc, char **argv)
flush_unicast(1); flush_unicast(1);
} }
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
if(net->flush_timeout.tv_sec != 0) { if(ifp->flush_timeout.tv_sec != 0) {
if(timeval_compare(&now, &net->flush_timeout) >= 0) if(timeval_compare(&now, &ifp->flush_timeout) >= 0)
flushbuf(net); flushbuf(ifp);
} }
} }
...@@ -726,31 +726,31 @@ main(int argc, char **argv) ...@@ -726,31 +726,31 @@ main(int argc, char **argv)
while(numroutes > 0) { while(numroutes > 0) {
if(routes[0].installed) if(routes[0].installed)
uninstall_route(&routes[0]); uninstall_route(&routes[0]);
/* We need to flush the route so network_up won't reinstall it */ /* We need to flush the route so interface_up won't reinstall it */
flush_route(&routes[0]); flush_route(&routes[0]);
} }
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
send_wildcard_retraction(net); send_wildcard_retraction(ifp);
/* Make sure that we expire quickly from our neighbours' /* Make sure that we expire quickly from our neighbours'
association caches. */ association caches. */
send_hello_noupdate(net, 10); send_hello_noupdate(ifp, 10);
flushbuf(net); flushbuf(ifp);
usleep(roughly(1000)); usleep(roughly(1000));
gettime(&now); gettime(&now);
} }
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
/* Make sure they got it. */ /* Make sure they got it. */
send_wildcard_retraction(net); send_wildcard_retraction(ifp);
send_hello_noupdate(net, 1); send_hello_noupdate(ifp, 1);
flushbuf(net); flushbuf(ifp);
usleep(roughly(10000)); usleep(roughly(10000));
gettime(&now); gettime(&now);
network_up(net, 0); interface_up(ifp, 0);
} }
kernel_setup_socket(0); kernel_setup_socket(0);
kernel_setup(0); kernel_setup(0);
...@@ -802,10 +802,10 @@ main(int argc, char **argv) ...@@ -802,10 +802,10 @@ main(int argc, char **argv)
exit(1); exit(1);
fail: fail:
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if(!net_up(net)) if(!if_up(ifp))
continue; continue;
network_up(net, 0); interface_up(ifp, 0);
} }
kernel_setup_socket(0); kernel_setup_socket(0);
kernel_setup(0); kernel_setup(0);
...@@ -936,12 +936,12 @@ dump_tables(FILE *out) ...@@ -936,12 +936,12 @@ dump_tables(FILE *out)
FOR_ALL_NEIGHBOURS(neigh) { FOR_ALL_NEIGHBOURS(neigh) {
fprintf(out, "Neighbour %s dev %s reach %04x rxcost %d txcost %d chan %d%s.\n", fprintf(out, "Neighbour %s dev %s reach %04x rxcost %d txcost %d chan %d%s.\n",
format_address(neigh->address), format_address(neigh->address),
neigh->network->ifname, neigh->ifp->name,
neigh->reach, neigh->reach,
neighbour_rxcost(neigh), neighbour_rxcost(neigh),
neigh->txcost, neigh->txcost,
neigh->network->channel, neigh->ifp->channel,
net_up(neigh->network) ? "" : " (down)"); if_up(neigh->ifp) ? "" : " (down)");
} }
for(i = 0; i < numxroutes; i++) { for(i = 0; i < numxroutes; i++) {
fprintf(out, "%s metric %d (exported)\n", fprintf(out, "%s metric %d (exported)\n",
...@@ -980,7 +980,7 @@ dump_tables(FILE *out) ...@@ -980,7 +980,7 @@ dump_tables(FILE *out)
(int)routes[i].seqno, (int)routes[i].seqno,
channels, channels,
(int)(now.tv_sec - routes[i].time), (int)(now.tv_sec - routes[i].time),
routes[i].neigh->network->ifname, routes[i].neigh->ifp->name,
format_address(routes[i].neigh->address), format_address(routes[i].neigh->address),
nexthop ? " nexthop " : "", nexthop ? " nexthop " : "",
nexthop ? format_address(nexthop) : "", nexthop ? format_address(nexthop) : "",
......
...@@ -40,7 +40,7 @@ THE SOFTWARE. ...@@ -40,7 +40,7 @@ THE SOFTWARE.
struct filter *input_filters = NULL; struct filter *input_filters = NULL;
struct filter *output_filters = NULL; struct filter *output_filters = NULL;
struct filter *redistribute_filters = NULL; struct filter *redistribute_filters = NULL;
struct network_conf *network_confs = NULL; struct interface_conf *interface_confs = NULL;
/* get_next_char callback */ /* get_next_char callback */
typedef int (*gnc_t)(void*); typedef int (*gnc_t)(void*);
...@@ -370,15 +370,15 @@ parse_filter(gnc_t gnc, void *closure) ...@@ -370,15 +370,15 @@ parse_filter(gnc_t gnc, void *closure)
return NULL; return NULL;
} }
static struct network_conf * static struct interface_conf *
parse_nconf(gnc_t gnc, void *closure) parse_ifconf(gnc_t gnc, void *closure)
{ {
int c; int c;
char *token; char *token;
struct network_conf *nconf; struct interface_conf *if_conf;
nconf = calloc(1, sizeof(struct network_conf)); if_conf = calloc(1, sizeof(struct interface_conf));
if(nconf == NULL) if(if_conf == NULL)
goto error; goto error;
c = gnc(closure); c = gnc(closure);
...@@ -393,7 +393,7 @@ parse_nconf(gnc_t gnc, void *closure) ...@@ -393,7 +393,7 @@ parse_nconf(gnc_t gnc, void *closure)
if(c < -1 || token == NULL) if(c < -1 || token == NULL)
goto error; goto error;
nconf->ifname = token; if_conf->ifname = token;
while(c >= 0 && c != '\n') { while(c >= 0 && c != '\n') {
c = skip_whitespace(c, gnc, closure); c = skip_whitespace(c, gnc, closure);
...@@ -410,43 +410,43 @@ parse_nconf(gnc_t gnc, void *closure) ...@@ -410,43 +410,43 @@ parse_nconf(gnc_t gnc, void *closure)
c = getint(c, &cost, gnc, closure); c = getint(c, &cost, gnc, closure);
if(c < -1 || cost <= 0 || cost > 0xFFFF) if(c < -1 || cost <= 0 || cost > 0xFFFF)
goto error; goto error;
nconf->cost = cost; if_conf->cost = cost;
} else if(strcmp(token, "hello-interval") == 0) { } else if(strcmp(token, "hello-interval") == 0) {
int interval; int interval;
c = getmsec(c, &interval, gnc, closure); c = getmsec(c, &interval, gnc, closure);
if(c < -1 || interval <= 0 || interval > 10 * 0xFFFF) if(c < -1 || interval <= 0 || interval > 10 * 0xFFFF)
goto error; goto error;
nconf->hello_interval = interval; if_conf->hello_interval = interval;
} else if(strcmp(token, "update-interval") == 0) { } else if(strcmp(token, "update-interval") == 0) {
int interval; int interval;
c = getmsec(c, &interval, gnc, closure); c = getmsec(c, &interval, gnc, closure);
if(c < -1 || interval <= 0 || interval > 10 * 0xFFFF) if(c < -1 || interval <= 0 || interval > 10 * 0xFFFF)
goto error; goto error;
nconf->update_interval = interval; if_conf->update_interval = interval;
} else if(strcmp(token, "wired") == 0) { } else if(strcmp(token, "wired") == 0) {
int v; int v;
c = getbool(c, &v, gnc, closure); c = getbool(c, &v, gnc, closure);
if(c < -1) if(c < -1)
goto error; goto error;
nconf->wired = v; if_conf->wired = v;
} else if(strcmp(token, "faraway") == 0) { } else if(strcmp(token, "faraway") == 0) {
int v; int v;
c = getbool(c, &v, gnc, closure); c = getbool(c, &v, gnc, closure);
if(c < -1) if(c < -1)
goto error; goto error;
nconf->faraway = v; if_conf->faraway = v;
} else if(strcmp(token, "link-quality") == 0) { } else if(strcmp(token, "link-quality") == 0) {
int v; int v;
c = getbool(c, &v, gnc, closure); c = getbool(c, &v, gnc, closure);
if(c < -1) if(c < -1)
goto error; goto error;
nconf->lq = v; if_conf->lq = v;
} else if(strcmp(token, "split-horizon") == 0) { } else if(strcmp(token, "split-horizon") == 0) {
int v; int v;
c = getbool(c, &v, gnc, closure); c = getbool(c, &v, gnc, closure);
if(c < -1) if(c < -1)
goto error; goto error;
nconf->split_horizon = v; if_conf->split_horizon = v;
} else if(strcmp(token, "channel") == 0) { } else if(strcmp(token, "channel") == 0) {
char *t, *end; char *t, *end;
...@@ -455,19 +455,19 @@ parse_nconf(gnc_t gnc, void *closure) ...@@ -455,19 +455,19 @@ parse_nconf(gnc_t gnc, void *closure)
goto error; goto error;
if(strcmp(t, "noninterfering") == 0) if(strcmp(t, "noninterfering") == 0)
nconf->channel = NET_CHANNEL_NONINTERFERING; if_conf->channel = IF_CHANNEL_NONINTERFERING;
else if(strcmp(t, "interfering") == 0) else if(strcmp(t, "interfering") == 0)
nconf->channel = NET_CHANNEL_INTERFERING; if_conf->channel = IF_CHANNEL_INTERFERING;
else { else {
nconf->channel = strtol(t, &end, 0); if_conf->channel = strtol(t, &end, 0);
if(*end != '\0') if(*end != '\0')
goto error; goto error;
} }
free(t); free(t);
if((nconf->channel < 1 || nconf->channel > 254) && if((if_conf->channel < 1 || if_conf->channel > 254) &&
nconf->channel != NET_CHANNEL_NONINTERFERING) if_conf->channel != IF_CHANNEL_NONINTERFERING)
goto error; goto error;
} else { } else {
goto error; goto error;
...@@ -475,10 +475,10 @@ parse_nconf(gnc_t gnc, void *closure) ...@@ -475,10 +475,10 @@ parse_nconf(gnc_t gnc, void *closure)
free(token); free(token);
} }
return nconf; return if_conf;
error: error:
free(nconf); free(if_conf);
return NULL; return NULL;
} }
...@@ -499,7 +499,7 @@ add_filter(struct filter *filter, struct filter **filters) ...@@ -499,7 +499,7 @@ add_filter(struct filter *filter, struct filter **filters)
} }
static void static void
merge_nconf(struct network_conf *dest, struct network_conf *src) merge_ifconf(struct interface_conf *dest, struct interface_conf *src)
{ {
assert(strcmp(dest->ifname, src->ifname) == 0); assert(strcmp(dest->ifname, src->ifname) == 0);
...@@ -520,24 +520,24 @@ merge_nconf(struct network_conf *dest, struct network_conf *src) ...@@ -520,24 +520,24 @@ merge_nconf(struct network_conf *dest, struct network_conf *src)
} }
static void static void
add_nconf(struct network_conf *nconf, struct network_conf **nconfs) add_ifconf(struct interface_conf *if_conf, struct interface_conf **if_confs)
{ {
if(*nconfs == NULL) { if(*if_confs == NULL) {
nconf->next = NULL; if_conf->next = NULL;
*nconfs = nconf; *if_confs = if_conf;
} else { } else {
struct network_conf *n; struct interface_conf *if_c;
n = *nconfs; if_c = *if_confs;
while(n->next) { while(if_c->next) {
if(strcmp(n->ifname, nconf->ifname) == 0) { if(strcmp(if_c->ifname, if_conf->ifname) == 0) {
merge_nconf(n, nconf); merge_ifconf(if_c, if_conf);
free(nconf); free(if_conf);
return; return;
} }
n = n->next; if_c = if_c->next;
} }
nconf->next = NULL; if_conf->next = NULL;
n->next = nconf; if_c->next = if_conf;
} }
} }
...@@ -582,11 +582,11 @@ parse_config(gnc_t gnc, void *closure) ...@@ -582,11 +582,11 @@ parse_config(gnc_t gnc, void *closure)
return -1; return -1;
add_filter(filter, &redistribute_filters); add_filter(filter, &redistribute_filters);
} else if(strcmp(token, "interface") == 0) { } else if(strcmp(token, "interface") == 0) {
struct network_conf *nconf; struct interface_conf *if_conf;
nconf = parse_nconf(gnc, closure); if_conf = parse_ifconf(gnc, closure);
if(nconf == NULL) if(if_conf == NULL)
return -1; return -1;
add_nconf(nconf, &network_confs); add_ifconf(if_conf, &interface_confs);
} else { } else {
return -1; return -1;
} }
...@@ -759,15 +759,15 @@ finalise_config() ...@@ -759,15 +759,15 @@ finalise_config()
filter->plen_le = 128; filter->plen_le = 128;
add_filter(filter, &redistribute_filters); add_filter(filter, &redistribute_filters);
while(network_confs) { while(interface_confs) {
struct network_conf *n; struct interface_conf *if_conf;
void *vrc; void *vrc;
n = network_confs; if_conf = interface_confs;
network_confs = network_confs->next; interface_confs = interface_confs->next;
n->next = NULL; if_conf->next = NULL;
vrc = add_network(n->ifname, n); vrc = add_interface(if_conf->ifname, if_conf);
if(vrc == NULL) { if(vrc == NULL) {
fprintf(stderr, "Couldn't add interface %s.\n", n->ifname); fprintf(stderr, "Couldn't add interface %s.\n", if_conf->ifname);
return -1; return -1;
} }
} }
......
...@@ -1239,7 +1239,7 @@ filter_link(struct nlmsghdr *nh, void *data) ...@@ -1239,7 +1239,7 @@ filter_link(struct nlmsghdr *nh, void *data)
int ifindex; int ifindex;
char *ifname; char *ifname;
unsigned int ifflags; unsigned int ifflags;
struct network *net; struct interface *ifp;
len = nh->nlmsg_len; len = nh->nlmsg_len;
...@@ -1257,8 +1257,8 @@ filter_link(struct nlmsghdr *nh, void *data) ...@@ -1257,8 +1257,8 @@ filter_link(struct nlmsghdr *nh, void *data)
return 0; return 0;
kdebugf("filter_interfaces: link change on if %s(%d): 0x%x\n", kdebugf("filter_interfaces: link change on if %s(%d): 0x%x\n",
ifname, ifindex, (unsigned)ifflags); ifname, ifindex, (unsigned)ifflags);
FOR_ALL_NETS(net) { FOR_ALL_INTERFACES(ifp) {
if (strcmp(net->ifname, ifname) == 0) if (strcmp(ifp->name, ifname) == 0)
return 1; return 1;
} }
return 0; return 0;
......
...@@ -140,7 +140,7 @@ local_notify_neighbour(struct neighbour *neigh, int kind) ...@@ -140,7 +140,7 @@ local_notify_neighbour(struct neighbour *neigh, int kind)
address as a unique identifier. */ address as a unique identifier. */
(unsigned long int)neigh, (unsigned long int)neigh,
format_address(neigh->address), format_address(neigh->address),
neigh->network->ifname, neigh->ifp->name,
neigh->reach, neigh->reach,
neighbour_rxcost(neigh), neighbour_rxcost(neigh),
neighbour_txcost(neigh), neighbour_txcost(neigh),
...@@ -207,7 +207,7 @@ local_notify_route(struct route *route, int kind) ...@@ -207,7 +207,7 @@ local_notify_route(struct route *route, int kind)
format_eui64(route->src->id), format_eui64(route->src->id),
route_metric(route), route->refmetric, route_metric(route), route->refmetric,
format_address(route->neigh->address), format_address(route->neigh->address),
route->neigh->network->ifname); route->neigh->ifp->name);
if(rc < 0 || rc >= 512) if(rc < 0 || rc >= 512)
goto fail; goto fail;
......
This diff is collapsed.
...@@ -50,29 +50,29 @@ extern unsigned char packet_header[4]; ...@@ -50,29 +50,29 @@ extern unsigned char packet_header[4];
extern struct neighbour *unicast_neighbour; extern struct neighbour *unicast_neighbour;
extern struct timeval unicast_flush_timeout; extern struct timeval unicast_flush_timeout;
void parse_packet(const unsigned char *from, struct network *net, void parse_packet(const unsigned char *from, struct interface *ifp,
const unsigned char *packet, int packetlen); const unsigned char *packet, int packetlen);
void flushbuf(struct network *net); void flushbuf(struct interface *ifp);
void flushupdates(struct network *net); void flushupdates(struct interface *ifp);
void send_ack(struct neighbour *neigh, unsigned short nonce, void send_ack(struct neighbour *neigh, unsigned short nonce,
unsigned short interval); unsigned short interval);
void send_hello_noupdate(struct network *net, unsigned interval); void send_hello_noupdate(struct interface *ifp, unsigned interval);
void send_hello(struct network *net); void send_hello(struct interface *ifp);
void flush_unicast(int dofree); void flush_unicast(int dofree);
void send_update(struct network *net, int urgent, void send_update(struct interface *ifp, int urgent,
const unsigned char *prefix, unsigned char plen); const unsigned char *prefix, unsigned char plen);
void send_update_resend(struct network *net, void send_update_resend(struct interface *ifp,
const unsigned char *prefix, unsigned char plen); const unsigned char *prefix, unsigned char plen);
void send_wildcard_retraction(struct network *net); void send_wildcard_retraction(struct interface *ifp);
void update_myseqno(void); void update_myseqno(void);
void send_self_update(struct network *net); void send_self_update(struct interface *ifp);
void send_ihu(struct neighbour *neigh, struct network *net); void send_ihu(struct neighbour *neigh, struct interface *ifp);
void send_marginal_ihu(struct network *net); void send_marginal_ihu(struct interface *ifp);
void send_request(struct network *net, void send_request(struct interface *ifp,
const unsigned char *prefix, unsigned char plen); const unsigned char *prefix, unsigned char plen);
void send_unicast_request(struct neighbour *neigh, void send_unicast_request(struct neighbour *neigh,
const unsigned char *prefix, unsigned char plen); const unsigned char *prefix, unsigned char plen);
void send_multihop_request(struct network *net, void send_multihop_request(struct interface *ifp,
const unsigned char *prefix, unsigned char plen, const unsigned char *prefix, unsigned char plen,
unsigned short seqno, const unsigned char *id, unsigned short seqno, const unsigned char *id,
unsigned short hop_count); unsigned short hop_count);
......
...@@ -39,12 +39,12 @@ THE SOFTWARE. ...@@ -39,12 +39,12 @@ THE SOFTWARE.
struct neighbour *neighs = NULL; struct neighbour *neighs = NULL;
static struct neighbour * static struct neighbour *
find_neighbour_nocreate(const unsigned char *address, struct network *net) find_neighbour_nocreate(const unsigned char *address, struct interface *ifp)
{ {
struct neighbour *neigh; struct neighbour *neigh;
FOR_ALL_NEIGHBOURS(neigh) { FOR_ALL_NEIGHBOURS(neigh) {
if(memcmp(address, neigh->address, 16) == 0 && if(memcmp(address, neigh->address, 16) == 0 &&
neigh->network == net) neigh->ifp == ifp)
return neigh; return neigh;
} }
return NULL; return NULL;
...@@ -71,17 +71,17 @@ flush_neighbour(struct neighbour *neigh) ...@@ -71,17 +71,17 @@ flush_neighbour(struct neighbour *neigh)
} }
struct neighbour * struct neighbour *
find_neighbour(const unsigned char *address, struct network *net) find_neighbour(const unsigned char *address, struct interface *ifp)
{ {
struct neighbour *neigh; struct neighbour *neigh;
const struct timeval zero = {0, 0}; const struct timeval zero = {0, 0};
neigh = find_neighbour_nocreate(address, net); neigh = find_neighbour_nocreate(address, ifp);
if(neigh) if(neigh)
return neigh; return neigh;
debugf("Creating neighbour %s on %s.\n", debugf("Creating neighbour %s on %s.\n",
format_address(address), net->ifname); format_address(address), ifp->name);
neigh = malloc(sizeof(struct neighbour)); neigh = malloc(sizeof(struct neighbour));
if(neigh == NULL) { if(neigh == NULL) {
...@@ -97,11 +97,11 @@ find_neighbour(const unsigned char *address, struct network *net) ...@@ -97,11 +97,11 @@ find_neighbour(const unsigned char *address, struct network *net)
neigh->hello_time = zero; neigh->hello_time = zero;
neigh->hello_interval = 0; neigh->hello_interval = 0;
neigh->ihu_interval = 0; neigh->ihu_interval = 0;
neigh->network = net; neigh->ifp = ifp;
neigh->next = neighs; neigh->next = neighs;
neighs = neigh; neighs = neigh;
local_notify_neighbour(neigh, LOCAL_ADD); local_notify_neighbour(neigh, LOCAL_ADD);
send_hello(net); send_hello(ifp);
return neigh; return neigh;
} }
...@@ -174,14 +174,14 @@ update_neighbour(struct neighbour *neigh, int hello, int hello_interval) ...@@ -174,14 +174,14 @@ update_neighbour(struct neighbour *neigh, int hello, int hello_interval)
/* Make sure to give neighbours some feedback early after association */ /* Make sure to give neighbours some feedback early after association */
if((neigh->reach & 0xBF00) == 0x8000) { if((neigh->reach & 0xBF00) == 0x8000) {
/* A new neighbour */ /* A new neighbour */
send_hello(neigh->network); send_hello(neigh->ifp);
} else { } else {
/* Don't send hellos, in order to avoid a positive feedback loop. */ /* Don't send hellos, in order to avoid a positive feedback loop. */
int a = (neigh->reach & 0xC000); int a = (neigh->reach & 0xC000);
int b = (neigh->reach & 0x3000); int b = (neigh->reach & 0x3000);
if((a == 0xC000 && b == 0) || (a == 0 && b == 0x3000)) { if((a == 0xC000 && b == 0) || (a == 0 && b == 0x3000)) {
/* Reachability is either 1100 or 0011 */ /* Reachability is either 1100 or 0011 */
send_self_update(neigh->network); send_self_update(neigh->ifp);
} }
} }
...@@ -269,25 +269,25 @@ neighbour_rxcost(struct neighbour *neigh) ...@@ -269,25 +269,25 @@ neighbour_rxcost(struct neighbour *neigh)
if((reach & 0xFFF0) == 0 || delay >= 180000) { if((reach & 0xFFF0) == 0 || delay >= 180000) {
return INFINITY; return INFINITY;
} else if((neigh->network->flags & NET_LQ)) { } else if((neigh->ifp->flags & IF_LQ)) {
int sreach = int sreach =
((reach & 0x8000) >> 2) + ((reach & 0x8000) >> 2) +
((reach & 0x4000) >> 1) + ((reach & 0x4000) >> 1) +
(reach & 0x3FFF); (reach & 0x3FFF);
/* 0 <= sreach <= 0x7FFF */ /* 0 <= sreach <= 0x7FFF */
int cost = (0x8000 * neigh->network->cost) / (sreach + 1); int cost = (0x8000 * neigh->ifp->cost) / (sreach + 1);
/* cost >= network->cost */ /* cost >= interface->cost */
if(delay >= 40000) if(delay >= 40000)
cost = (cost * (delay - 20000) + 10000) / 20000; cost = (cost * (delay - 20000) + 10000) / 20000;
return MIN(cost, INFINITY); return MIN(cost, INFINITY);
} else { } else {
/* To lose one hello is a misfortune, to lose two is carelessness. */ /* To lose one hello is a misfortune, to lose two is carelessness. */
if((reach & 0xC000) == 0xC000) if((reach & 0xC000) == 0xC000)
return neigh->network->cost; return neigh->ifp->cost;
else if((reach & 0xC000) == 0) else if((reach & 0xC000) == 0)
return INFINITY; return INFINITY;
else if((reach & 0x2000)) else if((reach & 0x2000))
return neigh->network->cost; return neigh->ifp->cost;
else else
return INFINITY; return INFINITY;
} }
...@@ -298,7 +298,7 @@ neighbour_cost(struct neighbour *neigh) ...@@ -298,7 +298,7 @@ neighbour_cost(struct neighbour *neigh)
{ {
unsigned a, b; unsigned a, b;
if(!net_up(neigh->network)) if(!if_up(neigh->ifp))
return INFINITY; return INFINITY;
a = neighbour_txcost(neigh); a = neighbour_txcost(neigh);
...@@ -310,7 +310,7 @@ neighbour_cost(struct neighbour *neigh) ...@@ -310,7 +310,7 @@ neighbour_cost(struct neighbour *neigh)
if(b >= INFINITY) if(b >= INFINITY)
return INFINITY; return INFINITY;
if(!(neigh->network->flags & NET_LQ) || (a <= 256 && b <= 256)) { if(!(neigh->ifp->flags & IF_LQ) || (a <= 256 && b <= 256)) {
return a; return a;
} else { } else {
/* a = 256/alpha, b = 256/beta, where alpha and beta are the expected /* a = 256/alpha, b = 256/beta, where alpha and beta are the expected
......
...@@ -31,7 +31,7 @@ struct neighbour { ...@@ -31,7 +31,7 @@ struct neighbour {
struct timeval ihu_time; struct timeval ihu_time;
unsigned short hello_interval; /* in centiseconds */ unsigned short hello_interval; /* in centiseconds */
unsigned short ihu_interval; /* in centiseconds */ unsigned short ihu_interval; /* in centiseconds */
struct network *network; struct interface *ifp;
}; };
extern struct neighbour *neighs; extern struct neighbour *neighs;
...@@ -42,7 +42,7 @@ extern struct neighbour *neighs; ...@@ -42,7 +42,7 @@ extern struct neighbour *neighs;
int neighbour_valid(struct neighbour *neigh); int neighbour_valid(struct neighbour *neigh);
void flush_neighbour(struct neighbour *neigh); void flush_neighbour(struct neighbour *neigh);
struct neighbour *find_neighbour(const unsigned char *address, struct neighbour *find_neighbour(const unsigned char *address,
struct network *net); struct interface *ifp);
int update_neighbour(struct neighbour *neigh, int hello, int hello_interval); int update_neighbour(struct neighbour *neigh, int hello, int hello_interval);
unsigned check_neighbours(void); unsigned check_neighbours(void);
unsigned neighbour_txcost(struct neighbour *neigh); unsigned neighbour_txcost(struct neighbour *neigh);
......
This diff is collapsed.
...@@ -27,7 +27,7 @@ struct buffered_update { ...@@ -27,7 +27,7 @@ struct buffered_update {
unsigned char pad[3]; unsigned char pad[3];
}; };
struct network_conf { struct interface_conf {
char *ifname; char *ifname;
unsigned hello_interval; unsigned hello_interval;
unsigned update_interval; unsigned update_interval;
...@@ -37,27 +37,27 @@ struct network_conf { ...@@ -37,27 +37,27 @@ struct network_conf {
char lq; char lq;
char faraway; char faraway;
int channel; int channel;
struct network_conf *next; struct interface_conf *next;
}; };
#define CONFIG_DEFAULT 0 #define CONFIG_DEFAULT 0
#define CONFIG_NO 1 #define CONFIG_NO 1
#define CONFIG_YES 2 #define CONFIG_YES 2
#define NET_UP (1 << 0) #define IF_UP (1 << 0)
#define NET_WIRED (1<<1) #define IF_WIRED (1<<1)
#define NET_SPLIT_HORIZON (1 << 2) #define IF_SPLIT_HORIZON (1 << 2)
#define NET_LQ (1 << 3) #define IF_LQ (1 << 3)
#define NET_FARAWAY (1 << 4) #define IF_FARAWAY (1 << 4)
/* Only INTERFERING can appear on the wire. */ /* Only INTERFERING can appear on the wire. */
#define NET_CHANNEL_UNKNOWN 0 #define IF_CHANNEL_UNKNOWN 0
#define NET_CHANNEL_INTERFERING 255 #define IF_CHANNEL_INTERFERING 255
#define NET_CHANNEL_NONINTERFERING -2 #define IF_CHANNEL_NONINTERFERING -2
struct network { struct interface {
struct network *next; struct interface *next;
struct network_conf *conf; struct interface_conf *conf;
unsigned int ifindex; unsigned int ifindex;
unsigned short flags; unsigned short flags;
unsigned short cost; unsigned short cost;
...@@ -66,7 +66,7 @@ struct network { ...@@ -66,7 +66,7 @@ struct network {
struct timeval update_timeout; struct timeval update_timeout;
struct timeval flush_timeout; struct timeval flush_timeout;
struct timeval update_flush_timeout; struct timeval update_flush_timeout;
char ifname[IF_NAMESIZE]; char name[IF_NAMESIZE];
unsigned char *ipv4; unsigned char *ipv4;
int numll; int numll;
unsigned char (*ll)[16]; unsigned char (*ll)[16];
...@@ -91,26 +91,25 @@ struct network { ...@@ -91,26 +91,25 @@ struct network {
unsigned update_interval; unsigned update_interval;
}; };
#define NET_CONF(_net, _field) \ #define IF_CONF(_ifp, _field) \
((_net)->conf ? (_net)->conf->_field : 0) ((_ifp)->conf ? (_ifp)->conf->_field : 0)
extern struct network *networks; extern struct interface *interfaces;
extern int numnets;
#define FOR_ALL_NETS(_net) for(_net = networks; _net; _net = _net->next) #define FOR_ALL_INTERFACES(_ifp) for(_ifp = interfaces; _ifp; _ifp = _ifp->next)
static inline int static inline int
net_up(struct network *net) if_up(struct interface *ifp)
{ {
return !!(net->flags & NET_UP); return !!(ifp->flags & IF_UP);
} }
struct network *add_network(char *ifname, struct network_conf *conf); struct interface *add_interface(char *ifname, struct interface_conf *if_conf);
int network_idle(struct network *net); int interface_idle(struct interface *ifp);
int update_hello_interval(struct network *net); int update_hello_interval(struct interface *ifp);
unsigned jitter(struct network *net, int urgent); unsigned jitter(struct interface *ifp, int urgent);
unsigned update_jitter(struct network *net, int urgent); unsigned update_jitter(struct interface *ifp, int urgent);
void set_timeout(struct timeval *timeout, int msecs); void set_timeout(struct timeval *timeout, int msecs);
int network_up(struct network *net, int up); int interface_up(struct interface *ifp, int up);
int network_ll_address(struct network *net, const unsigned char *address); int interface_ll_address(struct interface *ifp, const unsigned char *address);
void check_networks(void); void check_interfaces(void);
...@@ -83,10 +83,10 @@ find_request(const unsigned char *prefix, unsigned char plen, ...@@ -83,10 +83,10 @@ find_request(const unsigned char *prefix, unsigned char plen,
int int
record_resend(int kind, const unsigned char *prefix, unsigned char plen, record_resend(int kind, const unsigned char *prefix, unsigned char plen,
unsigned short seqno, const unsigned char *id, unsigned short seqno, const unsigned char *id,
struct network *network, int delay) struct interface *ifp, int delay)
{ {
struct resend *resend; struct resend *resend;
unsigned int ifindex = network ? network->ifindex : 0; unsigned int ifindex = ifp ? ifp->ifindex : 0;
if((kind == RESEND_REQUEST && if((kind == RESEND_REQUEST &&
input_filter(NULL, prefix, plen, NULL, ifindex) >= INFINITY) || input_filter(NULL, prefix, plen, NULL, ifindex) >= INFINITY) ||
...@@ -114,8 +114,8 @@ record_resend(int kind, const unsigned char *prefix, unsigned char plen, ...@@ -114,8 +114,8 @@ record_resend(int kind, const unsigned char *prefix, unsigned char plen,
else else
memset(resend->id, 0, 8); memset(resend->id, 0, 8);
resend->seqno = seqno; resend->seqno = seqno;
if(resend->network != network) if(resend->ifp != ifp)
resend->network = NULL; resend->ifp = NULL;
} else { } else {
resend = malloc(sizeof(struct resend)); resend = malloc(sizeof(struct resend));
if(resend == NULL) if(resend == NULL)
...@@ -130,7 +130,7 @@ record_resend(int kind, const unsigned char *prefix, unsigned char plen, ...@@ -130,7 +130,7 @@ record_resend(int kind, const unsigned char *prefix, unsigned char plen,
memcpy(resend->id, id, 8); memcpy(resend->id, id, 8);
else else
memset(resend->id, 0, 8); memset(resend->id, 0, 8);
resend->network = network; resend->ifp = ifp;
resend->time = now; resend->time = now;
resend->next = to_resend; resend->next = to_resend;
to_resend = resend; to_resend = resend;
...@@ -174,7 +174,7 @@ unsatisfied_request(const unsigned char *prefix, unsigned char plen, ...@@ -174,7 +174,7 @@ unsatisfied_request(const unsigned char *prefix, unsigned char plen,
/* Determine whether a given request should be forwarded. */ /* Determine whether a given request should be forwarded. */
int int
request_redundant(struct network *net, request_redundant(struct interface *ifp,
const unsigned char *prefix, unsigned char plen, const unsigned char *prefix, unsigned char plen,
unsigned short seqno, const unsigned char *id) unsigned short seqno, const unsigned char *id)
{ {
...@@ -188,7 +188,7 @@ request_redundant(struct network *net, ...@@ -188,7 +188,7 @@ request_redundant(struct network *net,
seqno_compare(request->seqno, seqno) > 0) seqno_compare(request->seqno, seqno) > 0)
return 0; return 0;
if(request->network != NULL && request->network != net) if(request->ifp != NULL && request->ifp != ifp)
return 0; return 0;
if(request->max > 0) if(request->max > 0)
...@@ -196,7 +196,7 @@ request_redundant(struct network *net, ...@@ -196,7 +196,7 @@ request_redundant(struct network *net,
return 1; return 1;
if(timeval_minus_msec(&now, &request->time) < if(timeval_minus_msec(&now, &request->time) <
(net ? MIN(net->hello_interval, 1000) : 1000)) (ifp ? MIN(ifp->hello_interval, 1000) : 1000))
/* Fairly recent. */ /* Fairly recent. */
return 1; return 1;
...@@ -206,7 +206,7 @@ request_redundant(struct network *net, ...@@ -206,7 +206,7 @@ request_redundant(struct network *net,
int int
satisfy_request(const unsigned char *prefix, unsigned char plen, satisfy_request(const unsigned char *prefix, unsigned char plen,
unsigned short seqno, const unsigned char *id, unsigned short seqno, const unsigned char *id,
struct network *network) struct interface *ifp)
{ {
struct resend *request, *previous; struct resend *request, *previous;
...@@ -214,7 +214,7 @@ satisfy_request(const unsigned char *prefix, unsigned char plen, ...@@ -214,7 +214,7 @@ satisfy_request(const unsigned char *prefix, unsigned char plen,
if(request == NULL) if(request == NULL)
return 0; return 0;
if(network != NULL && request->network != network) if(ifp != NULL && request->ifp != ifp)
return 0; return 0;
if(memcmp(request->id, id, 8) != 0 || if(memcmp(request->id, id, 8) != 0 ||
...@@ -291,12 +291,12 @@ do_resend() ...@@ -291,12 +291,12 @@ do_resend()
if(timeval_compare(&now, &timeout) >= 0) { if(timeval_compare(&now, &timeout) >= 0) {
switch(resend->kind) { switch(resend->kind) {
case RESEND_REQUEST: case RESEND_REQUEST:
send_multihop_request(resend->network, send_multihop_request(resend->ifp,
resend->prefix, resend->plen, resend->prefix, resend->plen,
resend->seqno, resend->id, 127); resend->seqno, resend->id, 127);
break; break;
case RESEND_UPDATE: case RESEND_UPDATE:
send_update(resend->network, 1, send_update(resend->ifp, 1,
resend->prefix, resend->plen); resend->prefix, resend->plen);
break; break;
default: abort(); default: abort();
......
...@@ -35,7 +35,7 @@ struct resend { ...@@ -35,7 +35,7 @@ struct resend {
unsigned char plen; unsigned char plen;
unsigned short seqno; unsigned short seqno;
unsigned char id[8]; unsigned char id[8];
struct network *network; struct interface *ifp;
struct resend *next; struct resend *next;
}; };
...@@ -46,15 +46,15 @@ struct resend *find_request(const unsigned char *prefix, unsigned char plen, ...@@ -46,15 +46,15 @@ struct resend *find_request(const unsigned char *prefix, unsigned char plen,
void flush_resends(struct neighbour *neigh); void flush_resends(struct neighbour *neigh);
int record_resend(int kind, const unsigned char *prefix, unsigned char plen, int record_resend(int kind, const unsigned char *prefix, unsigned char plen,
unsigned short seqno, const unsigned char *id, unsigned short seqno, const unsigned char *id,
struct network *net, int delay); struct interface *ifp, int delay);
int unsatisfied_request(const unsigned char *prefix, unsigned char plen, int unsatisfied_request(const unsigned char *prefix, unsigned char plen,
unsigned short seqno, const unsigned char *id); unsigned short seqno, const unsigned char *id);
int request_redundant(struct network *net, int request_redundant(struct interface *ifp,
const unsigned char *prefix, unsigned char plen, const unsigned char *prefix, unsigned char plen,
unsigned short seqno, const unsigned char *id); unsigned short seqno, const unsigned char *id);
int satisfy_request(const unsigned char *prefix, unsigned char plen, int satisfy_request(const unsigned char *prefix, unsigned char plen,
unsigned short seqno, const unsigned char *id, unsigned short seqno, const unsigned char *id,
struct network *net); struct interface *ifp);
void expire_resend(void); void expire_resend(void);
void recompute_resend_time(void); void recompute_resend_time(void);
......
...@@ -134,13 +134,13 @@ flush_neighbour_routes(struct neighbour *neigh) ...@@ -134,13 +134,13 @@ flush_neighbour_routes(struct neighbour *neigh)
} }
void void
flush_network_routes(struct network *net, int v4only) flush_interface_routes(struct interface *ifp, int v4only)
{ {
int i; int i;
i = 0; i = 0;
while(i < numroutes) { while(i < numroutes) {
if(routes[i].neigh->network == net && if(routes[i].neigh->ifp == ifp &&
(!v4only || v4mapped(routes[i].nexthop))) { (!v4only || v4mapped(routes[i].nexthop))) {
flush_route(&routes[i]); flush_route(&routes[i]);
continue; continue;
...@@ -169,7 +169,7 @@ install_route(struct route *route) ...@@ -169,7 +169,7 @@ install_route(struct route *route)
rc = kernel_route(ROUTE_ADD, route->src->prefix, route->src->plen, rc = kernel_route(ROUTE_ADD, route->src->prefix, route->src->plen,
route->nexthop, route->nexthop,
route->neigh->network->ifindex, route->neigh->ifp->ifindex,
metric_to_kernel(route_metric(route)), NULL, 0, 0); metric_to_kernel(route_metric(route)), NULL, 0, 0);
if(rc < 0) { if(rc < 0) {
int save = errno; int save = errno;
...@@ -191,7 +191,7 @@ uninstall_route(struct route *route) ...@@ -191,7 +191,7 @@ uninstall_route(struct route *route)
rc = kernel_route(ROUTE_FLUSH, route->src->prefix, route->src->plen, rc = kernel_route(ROUTE_FLUSH, route->src->prefix, route->src->plen,
route->nexthop, route->nexthop,
route->neigh->network->ifindex, route->neigh->ifp->ifindex,
metric_to_kernel(route_metric(route)), NULL, 0, 0); metric_to_kernel(route_metric(route)), NULL, 0, 0);
if(rc < 0) if(rc < 0)
perror("kernel_route(FLUSH)"); perror("kernel_route(FLUSH)");
...@@ -222,9 +222,9 @@ switch_routes(struct route *old, struct route *new) ...@@ -222,9 +222,9 @@ switch_routes(struct route *old, struct route *new)
"(this shouldn't happen)."); "(this shouldn't happen).");
rc = kernel_route(ROUTE_MODIFY, old->src->prefix, old->src->plen, rc = kernel_route(ROUTE_MODIFY, old->src->prefix, old->src->plen,
old->nexthop, old->neigh->network->ifindex, old->nexthop, old->neigh->ifp->ifindex,
metric_to_kernel(route_metric(old)), metric_to_kernel(route_metric(old)),
new->nexthop, new->neigh->network->ifindex, new->nexthop, new->neigh->ifp->ifindex,
metric_to_kernel(route_metric(new))); metric_to_kernel(route_metric(new)));
if(rc < 0) { if(rc < 0) {
perror("kernel_route(MODIFY)"); perror("kernel_route(MODIFY)");
...@@ -251,9 +251,9 @@ change_route_metric(struct route *route, ...@@ -251,9 +251,9 @@ change_route_metric(struct route *route,
if(route->installed && old != new) { if(route->installed && old != new) {
int rc; int rc;
rc = kernel_route(ROUTE_MODIFY, route->src->prefix, route->src->plen, rc = kernel_route(ROUTE_MODIFY, route->src->prefix, route->src->plen,
route->nexthop, route->neigh->network->ifindex, route->nexthop, route->neigh->ifp->ifindex,
old, old,
route->nexthop, route->neigh->network->ifindex, route->nexthop, route->neigh->ifp->ifindex,
new); new);
if(rc < 0) { if(rc < 0) {
perror("kernel_route(MODIFY metric)"); perror("kernel_route(MODIFY metric)");
...@@ -294,33 +294,33 @@ route_expired(struct route *route) ...@@ -294,33 +294,33 @@ route_expired(struct route *route)
static int static int
channels_interfere(int ch1, int ch2) channels_interfere(int ch1, int ch2)
{ {
if(ch1 == NET_CHANNEL_NONINTERFERING || ch2 == NET_CHANNEL_NONINTERFERING) if(ch1 == IF_CHANNEL_NONINTERFERING || ch2 == IF_CHANNEL_NONINTERFERING)
return 0; return 0;
if(ch1 == NET_CHANNEL_INTERFERING || ch2 == NET_CHANNEL_INTERFERING) if(ch1 == IF_CHANNEL_INTERFERING || ch2 == IF_CHANNEL_INTERFERING)
return 1; return 1;
return ch1 == ch2; return ch1 == ch2;
} }
int int
route_interferes(struct route *route, struct network *net) route_interferes(struct route *route, struct interface *ifp)
{ {
switch(diversity_kind) { switch(diversity_kind) {
case DIVERSITY_NONE: case DIVERSITY_NONE:
return 1; return 1;
case DIVERSITY_INTERFACE_1: case DIVERSITY_INTERFACE_1:
return route->neigh->network == net; return route->neigh->ifp == ifp;
case DIVERSITY_CHANNEL_1: case DIVERSITY_CHANNEL_1:
case DIVERSITY_CHANNEL: case DIVERSITY_CHANNEL:
if(route->neigh->network == net) if(route->neigh->ifp == ifp)
return 1; return 1;
if(channels_interfere(net->channel, route->neigh->network->channel)) if(channels_interfere(ifp->channel, route->neigh->ifp->channel))
return 1; return 1;
if(diversity_kind == DIVERSITY_CHANNEL) { if(diversity_kind == DIVERSITY_CHANNEL) {
int i; int i;
for(i = 0; i < DIVERSITY_HOPS; i++) { for(i = 0; i < DIVERSITY_HOPS; i++) {
if(route->channels[i] == 0) if(route->channels[i] == 0)
break; break;
if(channels_interfere(net->channel, route->channels[i])) if(channels_interfere(ifp->channel, route->channels[i]))
return 1; return 1;
} }
} }
...@@ -391,7 +391,7 @@ update_route_metric(struct route *route) ...@@ -391,7 +391,7 @@ update_route_metric(struct route *route)
int add_metric = input_filter(route->src->id, int add_metric = input_filter(route->src->id,
route->src->prefix, route->src->plen, route->src->prefix, route->src->plen,
neigh->address, neigh->address,
neigh->network->ifindex); neigh->ifp->ifindex);
change_route_metric(route, route->refmetric, change_route_metric(route, route->refmetric,
neighbour_cost(route->neigh), add_metric); neighbour_cost(route->neigh), add_metric);
if(route_metric(route) != oldmetric) if(route_metric(route) != oldmetric)
...@@ -420,13 +420,13 @@ update_neighbour_metric(struct neighbour *neigh, int changed) ...@@ -420,13 +420,13 @@ update_neighbour_metric(struct neighbour *neigh, int changed)
} }
void void
update_network_metric(struct network *net) update_interface_metric(struct interface *ifp)
{ {
int i; int i;
i = 0; i = 0;
while(i < numroutes) { while(i < numroutes) {
if(routes[i].neigh->network == net) if(routes[i].neigh->ifp == ifp)
update_route_metric(&routes[i]); update_route_metric(&routes[i]);
i++; i++;
} }
...@@ -456,7 +456,7 @@ update_route(const unsigned char *a, const unsigned char *p, unsigned char plen, ...@@ -456,7 +456,7 @@ update_route(const unsigned char *a, const unsigned char *p, unsigned char plen,
} }
add_metric = input_filter(a, p, plen, add_metric = input_filter(a, p, plen,
neigh->address, neigh->network->ifindex); neigh->address, neigh->ifp->ifindex);
if(add_metric >= INFINITY) if(add_metric >= INFINITY)
return NULL; return NULL;
......
...@@ -71,14 +71,14 @@ struct route *find_installed_route(const unsigned char *prefix, ...@@ -71,14 +71,14 @@ struct route *find_installed_route(const unsigned char *prefix,
unsigned char plen); unsigned char plen);
void flush_route(struct route *route); void flush_route(struct route *route);
void flush_neighbour_routes(struct neighbour *neigh); void flush_neighbour_routes(struct neighbour *neigh);
void flush_network_routes(struct network *net, int v4only); void flush_interface_routes(struct interface *ifp, int v4only);
void install_route(struct route *route); void install_route(struct route *route);
void uninstall_route(struct route *route); void uninstall_route(struct route *route);
void switch_route(struct route *old, struct route *new); void switch_route(struct route *old, struct route *new);
int route_feasible(struct route *route); int route_feasible(struct route *route);
int route_old(struct route *route); int route_old(struct route *route);
int route_expired(struct route *route); int route_expired(struct route *route);
int route_interferes(struct route *route, struct network *net); int route_interferes(struct route *route, struct interface *ifp);
int update_feasible(struct source *src, int update_feasible(struct source *src,
unsigned short seqno, unsigned short refmetric); unsigned short seqno, unsigned short refmetric);
struct route *find_best_route(const unsigned char *prefix, unsigned char plen, struct route *find_best_route(const unsigned char *prefix, unsigned char plen,
...@@ -86,7 +86,7 @@ struct route *find_best_route(const unsigned char *prefix, unsigned char plen, ...@@ -86,7 +86,7 @@ struct route *find_best_route(const unsigned char *prefix, unsigned char plen,
struct route *install_best_route(const unsigned char prefix[16], struct route *install_best_route(const unsigned char prefix[16],
unsigned char plen); unsigned char plen);
void update_neighbour_metric(struct neighbour *neigh, int changed); void update_neighbour_metric(struct neighbour *neigh, int changed);
void update_network_metric(struct network *net); void update_interface_metric(struct interface *ifp);
void update_route_metric(struct route *route); void update_route_metric(struct route *route);
struct route *update_route(const unsigned char *a, struct route *update_route(const unsigned char *a,
const unsigned char *p, unsigned char plen, const unsigned char *p, unsigned char plen,
......
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