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)
char *config_file = NULL;
void *vrc;
unsigned int seed;
struct network *net;
struct interface *ifp;
gettime(&now);
......@@ -362,22 +362,22 @@ main(int argc, char **argv)
}
for(i = optind; i < argc; i++) {
vrc = add_network(argv[i], NULL);
vrc = add_interface(argv[i], NULL);
if(vrc == NULL)
goto fail;
}
if(networks == NULL) {
if(interfaces == NULL) {
fprintf(stderr, "Eek... asked to run on no interfaces!\n");
goto fail;
}
FOR_ALL_NETS(net) {
/* net->ifindex is not necessarily valid at this point */
int ifindex = if_nametoindex(net->ifname);
FOR_ALL_INTERFACES(ifp) {
/* ifp->ifindex is not necessarily valid at this point */
int ifindex = if_nametoindex(ifp->name);
if(ifindex > 0) {
unsigned char eui[8];
rc = if_eui64(net->ifname, ifindex, eui);
rc = if_eui64(ifp->name, ifindex, eui);
if(rc < 0)
continue;
memcpy(myid, eui, 8);
......@@ -482,7 +482,7 @@ main(int argc, char **argv)
rc = resize_receive_buffer(1500);
if(rc < 0)
goto fail;
check_networks();
check_interfaces();
if(receive_buffer == NULL)
goto fail;
......@@ -499,27 +499,27 @@ main(int argc, char **argv)
/* Make some noise so that others notice us, and send retractions in
case we were restarted recently */
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
/* Apply jitter before we send the first message. */
usleep(roughly(10000));
gettime(&now);
send_hello(net);
send_wildcard_retraction(net);
send_hello(ifp);
send_wildcard_retraction(ifp);
}
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
usleep(roughly(10000));
gettime(&now);
send_hello(net);
send_wildcard_retraction(net);
send_self_update(net);
send_request(net, NULL, 0);
flushupdates(net);
flushbuf(net);
send_hello(ifp);
send_wildcard_retraction(ifp);
send_self_update(ifp);
send_request(ifp, NULL, 0);
flushupdates(ifp);
flushbuf(ifp);
}
debugf("Entering main loop.\n");
......@@ -535,13 +535,13 @@ main(int argc, char **argv)
timeval_min_sec(&tv, source_expiry_time);
timeval_min_sec(&tv, kernel_dump_time);
timeval_min(&tv, &resend_time);
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
timeval_min(&tv, &net->flush_timeout);
timeval_min(&tv, &net->hello_timeout);
timeval_min(&tv, &net->update_timeout);
timeval_min(&tv, &net->update_flush_timeout);
timeval_min(&tv, &ifp->flush_timeout);
timeval_min(&tv, &ifp->hello_timeout);
timeval_min(&tv, &ifp->update_timeout);
timeval_min(&tv, &ifp->update_flush_timeout);
}
timeval_min(&tv, &unicast_flush_timeout);
FD_ZERO(&readfds);
......@@ -593,11 +593,11 @@ main(int argc, char **argv)
sleep(1);
}
} else {
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
if(net->ifindex == sin6.sin6_scope_id) {
parse_packet((unsigned char*)&sin6.sin6_addr, net,
if(ifp->ifindex == sin6.sin6_scope_id) {
parse_packet((unsigned char*)&sin6.sin6_addr, ifp,
receive_buffer, rc);
VALGRIND_MAKE_MEM_UNDEFINED(receive_buffer,
receive_buffer_size);
......@@ -647,7 +647,7 @@ main(int argc, char **argv)
}
if(kernel_link_changed || kernel_addr_changed) {
check_networks();
check_interfaces();
kernel_link_changed = 0;
}
......@@ -671,7 +671,7 @@ main(int argc, char **argv)
}
if(now.tv_sec >= expiry_time) {
check_networks();
check_interfaces();
expire_routes();
expire_resend();
expiry_time = now.tv_sec + roughly(30);
......@@ -682,15 +682,15 @@ main(int argc, char **argv)
source_expiry_time = now.tv_sec + roughly(300);
}
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
if(timeval_compare(&now, &net->hello_timeout) >= 0)
send_hello(net);
if(timeval_compare(&now, &net->update_timeout) >= 0)
send_update(net, 0, NULL, 0);
if(timeval_compare(&now, &net->update_flush_timeout) >= 0)
flushupdates(net);
if(timeval_compare(&now, &ifp->hello_timeout) >= 0)
send_hello(ifp);
if(timeval_compare(&now, &ifp->update_timeout) >= 0)
send_update(ifp, 0, NULL, 0);
if(timeval_compare(&now, &ifp->update_flush_timeout) >= 0)
flushupdates(ifp);
}
if(resend_time.tv_sec != 0) {
......@@ -703,12 +703,12 @@ main(int argc, char **argv)
flush_unicast(1);
}
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
if(net->flush_timeout.tv_sec != 0) {
if(timeval_compare(&now, &net->flush_timeout) >= 0)
flushbuf(net);
if(ifp->flush_timeout.tv_sec != 0) {
if(timeval_compare(&now, &ifp->flush_timeout) >= 0)
flushbuf(ifp);
}
}
......@@ -726,31 +726,31 @@ main(int argc, char **argv)
while(numroutes > 0) {
if(routes[0].installed)
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]);
}
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
send_wildcard_retraction(net);
send_wildcard_retraction(ifp);
/* Make sure that we expire quickly from our neighbours'
association caches. */
send_hello_noupdate(net, 10);
flushbuf(net);
send_hello_noupdate(ifp, 10);
flushbuf(ifp);
usleep(roughly(1000));
gettime(&now);
}
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
/* Make sure they got it. */
send_wildcard_retraction(net);
send_hello_noupdate(net, 1);
flushbuf(net);
send_wildcard_retraction(ifp);
send_hello_noupdate(ifp, 1);
flushbuf(ifp);
usleep(roughly(10000));
gettime(&now);
network_up(net, 0);
interface_up(ifp, 0);
}
kernel_setup_socket(0);
kernel_setup(0);
......@@ -802,10 +802,10 @@ main(int argc, char **argv)
exit(1);
fail:
FOR_ALL_NETS(net) {
if(!net_up(net))
FOR_ALL_INTERFACES(ifp) {
if(!if_up(ifp))
continue;
network_up(net, 0);
interface_up(ifp, 0);
}
kernel_setup_socket(0);
kernel_setup(0);
......@@ -936,12 +936,12 @@ dump_tables(FILE *out)
FOR_ALL_NEIGHBOURS(neigh) {
fprintf(out, "Neighbour %s dev %s reach %04x rxcost %d txcost %d chan %d%s.\n",
format_address(neigh->address),
neigh->network->ifname,
neigh->ifp->name,
neigh->reach,
neighbour_rxcost(neigh),
neigh->txcost,
neigh->network->channel,
net_up(neigh->network) ? "" : " (down)");
neigh->ifp->channel,
if_up(neigh->ifp) ? "" : " (down)");
}
for(i = 0; i < numxroutes; i++) {
fprintf(out, "%s metric %d (exported)\n",
......@@ -980,7 +980,7 @@ dump_tables(FILE *out)
(int)routes[i].seqno,
channels,
(int)(now.tv_sec - routes[i].time),
routes[i].neigh->network->ifname,
routes[i].neigh->ifp->name,
format_address(routes[i].neigh->address),
nexthop ? " nexthop " : "",
nexthop ? format_address(nexthop) : "",
......
......@@ -40,7 +40,7 @@ THE SOFTWARE.
struct filter *input_filters = NULL;
struct filter *output_filters = NULL;
struct filter *redistribute_filters = NULL;
struct network_conf *network_confs = NULL;
struct interface_conf *interface_confs = NULL;
/* get_next_char callback */
typedef int (*gnc_t)(void*);
......@@ -370,15 +370,15 @@ parse_filter(gnc_t gnc, void *closure)
return NULL;
}
static struct network_conf *
parse_nconf(gnc_t gnc, void *closure)
static struct interface_conf *
parse_ifconf(gnc_t gnc, void *closure)
{
int c;
char *token;
struct network_conf *nconf;
struct interface_conf *if_conf;
nconf = calloc(1, sizeof(struct network_conf));
if(nconf == NULL)
if_conf = calloc(1, sizeof(struct interface_conf));
if(if_conf == NULL)
goto error;
c = gnc(closure);
......@@ -393,7 +393,7 @@ parse_nconf(gnc_t gnc, void *closure)
if(c < -1 || token == NULL)
goto error;
nconf->ifname = token;
if_conf->ifname = token;
while(c >= 0 && c != '\n') {
c = skip_whitespace(c, gnc, closure);
......@@ -410,43 +410,43 @@ parse_nconf(gnc_t gnc, void *closure)
c = getint(c, &cost, gnc, closure);
if(c < -1 || cost <= 0 || cost > 0xFFFF)
goto error;
nconf->cost = cost;
if_conf->cost = cost;
} else if(strcmp(token, "hello-interval") == 0) {
int interval;
c = getmsec(c, &interval, gnc, closure);
if(c < -1 || interval <= 0 || interval > 10 * 0xFFFF)
goto error;
nconf->hello_interval = interval;
if_conf->hello_interval = interval;
} else if(strcmp(token, "update-interval") == 0) {
int interval;
c = getmsec(c, &interval, gnc, closure);
if(c < -1 || interval <= 0 || interval > 10 * 0xFFFF)
goto error;
nconf->update_interval = interval;
if_conf->update_interval = interval;
} else if(strcmp(token, "wired") == 0) {
int v;
c = getbool(c, &v, gnc, closure);
if(c < -1)
goto error;
nconf->wired = v;
if_conf->wired = v;
} else if(strcmp(token, "faraway") == 0) {
int v;
c = getbool(c, &v, gnc, closure);
if(c < -1)
goto error;
nconf->faraway = v;
if_conf->faraway = v;
} else if(strcmp(token, "link-quality") == 0) {
int v;
c = getbool(c, &v, gnc, closure);
if(c < -1)
goto error;
nconf->lq = v;
if_conf->lq = v;
} else if(strcmp(token, "split-horizon") == 0) {
int v;
c = getbool(c, &v, gnc, closure);
if(c < -1)
goto error;
nconf->split_horizon = v;
if_conf->split_horizon = v;
} else if(strcmp(token, "channel") == 0) {
char *t, *end;
......@@ -455,19 +455,19 @@ parse_nconf(gnc_t gnc, void *closure)
goto error;
if(strcmp(t, "noninterfering") == 0)
nconf->channel = NET_CHANNEL_NONINTERFERING;
if_conf->channel = IF_CHANNEL_NONINTERFERING;
else if(strcmp(t, "interfering") == 0)
nconf->channel = NET_CHANNEL_INTERFERING;
if_conf->channel = IF_CHANNEL_INTERFERING;
else {
nconf->channel = strtol(t, &end, 0);
if_conf->channel = strtol(t, &end, 0);
if(*end != '\0')
goto error;
}
free(t);
if((nconf->channel < 1 || nconf->channel > 254) &&
nconf->channel != NET_CHANNEL_NONINTERFERING)
if((if_conf->channel < 1 || if_conf->channel > 254) &&
if_conf->channel != IF_CHANNEL_NONINTERFERING)
goto error;
} else {
goto error;
......@@ -475,10 +475,10 @@ parse_nconf(gnc_t gnc, void *closure)
free(token);
}
return nconf;
return if_conf;
error:
free(nconf);
free(if_conf);
return NULL;
}
......@@ -499,7 +499,7 @@ add_filter(struct filter *filter, struct filter **filters)
}
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);
......@@ -520,24 +520,24 @@ merge_nconf(struct network_conf *dest, struct network_conf *src)
}
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) {
nconf->next = NULL;
*nconfs = nconf;
if(*if_confs == NULL) {
if_conf->next = NULL;
*if_confs = if_conf;
} else {
struct network_conf *n;
n = *nconfs;
while(n->next) {
if(strcmp(n->ifname, nconf->ifname) == 0) {
merge_nconf(n, nconf);
free(nconf);
struct interface_conf *if_c;
if_c = *if_confs;
while(if_c->next) {
if(strcmp(if_c->ifname, if_conf->ifname) == 0) {
merge_ifconf(if_c, if_conf);
free(if_conf);
return;
}
n = n->next;
if_c = if_c->next;
}
nconf->next = NULL;
n->next = nconf;
if_conf->next = NULL;
if_c->next = if_conf;
}
}
......@@ -582,11 +582,11 @@ parse_config(gnc_t gnc, void *closure)
return -1;
add_filter(filter, &redistribute_filters);
} else if(strcmp(token, "interface") == 0) {
struct network_conf *nconf;
nconf = parse_nconf(gnc, closure);
if(nconf == NULL)
struct interface_conf *if_conf;
if_conf = parse_ifconf(gnc, closure);
if(if_conf == NULL)
return -1;
add_nconf(nconf, &network_confs);
add_ifconf(if_conf, &interface_confs);
} else {
return -1;
}
......@@ -759,15 +759,15 @@ finalise_config()
filter->plen_le = 128;
add_filter(filter, &redistribute_filters);
while(network_confs) {
struct network_conf *n;
while(interface_confs) {
struct interface_conf *if_conf;
void *vrc;
n = network_confs;
network_confs = network_confs->next;
n->next = NULL;
vrc = add_network(n->ifname, n);
if_conf = interface_confs;
interface_confs = interface_confs->next;
if_conf->next = NULL;
vrc = add_interface(if_conf->ifname, if_conf);
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;
}
}
......
......@@ -1239,7 +1239,7 @@ filter_link(struct nlmsghdr *nh, void *data)
int ifindex;
char *ifname;
unsigned int ifflags;
struct network *net;
struct interface *ifp;
len = nh->nlmsg_len;
......@@ -1257,8 +1257,8 @@ filter_link(struct nlmsghdr *nh, void *data)
return 0;
kdebugf("filter_interfaces: link change on if %s(%d): 0x%x\n",
ifname, ifindex, (unsigned)ifflags);
FOR_ALL_NETS(net) {
if (strcmp(net->ifname, ifname) == 0)
FOR_ALL_INTERFACES(ifp) {
if (strcmp(ifp->name, ifname) == 0)
return 1;
}
return 0;
......
......@@ -140,7 +140,7 @@ local_notify_neighbour(struct neighbour *neigh, int kind)
address as a unique identifier. */
(unsigned long int)neigh,
format_address(neigh->address),
neigh->network->ifname,
neigh->ifp->name,
neigh->reach,
neighbour_rxcost(neigh),
neighbour_txcost(neigh),
......@@ -207,7 +207,7 @@ local_notify_route(struct route *route, int kind)
format_eui64(route->src->id),
route_metric(route), route->refmetric,
format_address(route->neigh->address),
route->neigh->network->ifname);
route->neigh->ifp->name);
if(rc < 0 || rc >= 512)
goto fail;
......
This diff is collapsed.
......@@ -50,29 +50,29 @@ extern unsigned char packet_header[4];
extern struct neighbour *unicast_neighbour;
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);
void flushbuf(struct network *net);
void flushupdates(struct network *net);
void flushbuf(struct interface *ifp);
void flushupdates(struct interface *ifp);
void send_ack(struct neighbour *neigh, unsigned short nonce,
unsigned short interval);
void send_hello_noupdate(struct network *net, unsigned interval);
void send_hello(struct network *net);
void send_hello_noupdate(struct interface *ifp, unsigned interval);
void send_hello(struct interface *ifp);
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);
void send_update_resend(struct network *net,
void send_update_resend(struct interface *ifp,
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 send_self_update(struct network *net);
void send_ihu(struct neighbour *neigh, struct network *net);
void send_marginal_ihu(struct network *net);
void send_request(struct network *net,
void send_self_update(struct interface *ifp);
void send_ihu(struct neighbour *neigh, struct interface *ifp);
void send_marginal_ihu(struct interface *ifp);
void send_request(struct interface *ifp,
const unsigned char *prefix, unsigned char plen);
void send_unicast_request(struct neighbour *neigh,
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,
unsigned short seqno, const unsigned char *id,
unsigned short hop_count);
......
......@@ -39,12 +39,12 @@ THE SOFTWARE.
struct neighbour *neighs = NULL;
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;
FOR_ALL_NEIGHBOURS(neigh) {
if(memcmp(address, neigh->address, 16) == 0 &&
neigh->network == net)
neigh->ifp == ifp)
return neigh;
}
return NULL;
......@@ -71,17 +71,17 @@ flush_neighbour(struct neighbour *neigh)
}
struct neighbour *
find_neighbour(const unsigned char *address, struct network *net)
find_neighbour(const unsigned char *address, struct interface *ifp)
{
struct neighbour *neigh;
const struct timeval zero = {0, 0};
neigh = find_neighbour_nocreate(address, net);
neigh = find_neighbour_nocreate(address, ifp);
if(neigh)
return neigh;
debugf("Creating neighbour %s on %s.\n",
format_address(address), net->ifname);
format_address(address), ifp->name);
neigh = malloc(sizeof(struct neighbour));
if(neigh == NULL) {
......@@ -97,11 +97,11 @@ find_neighbour(const unsigned char *address, struct network *net)
neigh->hello_time = zero;
neigh->hello_interval = 0;
neigh->ihu_interval = 0;
neigh->network = net;
neigh->ifp = ifp;
neigh->next = neighs;
neighs = neigh;
local_notify_neighbour(neigh, LOCAL_ADD);
send_hello(net);
send_hello(ifp);
return neigh;
}
......@@ -174,14 +174,14 @@ update_neighbour(struct neighbour *neigh, int hello, int hello_interval)
/* Make sure to give neighbours some feedback early after association */
if((neigh->reach & 0xBF00) == 0x8000) {
/* A new neighbour */
send_hello(neigh->network);
send_hello(neigh->ifp);
} else {
/* Don't send hellos, in order to avoid a positive feedback loop. */
int a = (neigh->reach & 0xC000);
int b = (neigh->reach & 0x3000);
if((a == 0xC000 && b == 0) || (a == 0 && b == 0x3000)) {
/* 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)
if((reach & 0xFFF0) == 0 || delay >= 180000) {
return INFINITY;
} else if((neigh->network->flags & NET_LQ)) {
} else if((neigh->ifp->flags & IF_LQ)) {
int sreach =
((reach & 0x8000) >> 2) +
((reach & 0x4000) >> 1) +
(reach & 0x3FFF);
/* 0 <= sreach <= 0x7FFF */
int cost = (0x8000 * neigh->network->cost) / (sreach + 1);
/* cost >= network->cost */
int cost = (0x8000 * neigh->ifp->cost) / (sreach + 1);
/* cost >= interface->cost */
if(delay >= 40000)
cost = (cost * (delay - 20000) + 10000) / 20000;
return MIN(cost, INFINITY);
} else {
/* To lose one hello is a misfortune, to lose two is carelessness. */
if((reach & 0xC000) == 0xC000)
return neigh->network->cost;
return neigh->ifp->cost;
else if((reach & 0xC000) == 0)
return INFINITY;
else if((reach & 0x2000))
return neigh->network->cost;
return neigh->ifp->cost;
else
return INFINITY;
}
......@@ -298,7 +298,7 @@ neighbour_cost(struct neighbour *neigh)
{
unsigned a, b;
if(!net_up(neigh->network))
if(!if_up(neigh->ifp))
return INFINITY;
a = neighbour_txcost(neigh);
......@@ -310,7 +310,7 @@ neighbour_cost(struct neighbour *neigh)
if(b >= 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;
} else {
/* a = 256/alpha, b = 256/beta, where alpha and beta are the expected
......
......@@ -31,7 +31,7 @@ struct neighbour {
struct timeval ihu_time;
unsigned short hello_interval; /* in centiseconds */
unsigned short ihu_interval; /* in centiseconds */
struct network *network;
struct interface *ifp;
};
extern struct neighbour *neighs;
......@@ -42,7 +42,7 @@ extern struct neighbour *neighs;
int neighbour_valid(struct neighbour *neigh);
void flush_neighbour(struct neighbour *neigh);
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);
unsigned check_neighbours(void);
unsigned neighbour_txcost(struct neighbour *neigh);
......
This diff is collapsed.
......@@ -27,7 +27,7 @@ struct buffered_update {
unsigned char pad[3];
};
struct network_conf {
struct interface_conf {
char *ifname;
unsigned hello_interval;
unsigned update_interval;
......@@ -37,27 +37,27 @@ struct network_conf {
char lq;
char faraway;
int channel;
struct network_conf *next;
struct interface_conf *next;
};
#define CONFIG_DEFAULT 0
#define CONFIG_NO 1
#define CONFIG_YES 2
#define NET_UP (1 << 0)
#define NET_WIRED (1<<1)
#define NET_SPLIT_HORIZON (1 << 2)
#define NET_LQ (1 << 3)
#define NET_FARAWAY (1 << 4)
#define IF_UP (1 << 0)
#define IF_WIRED (1<<1)
#define IF_SPLIT_HORIZON (1 << 2)
#define IF_LQ (1 << 3)
#define IF_FARAWAY (1 << 4)
/* Only INTERFERING can appear on the wire. */
#define NET_CHANNEL_UNKNOWN 0
#define NET_CHANNEL_INTERFERING 255
#define NET_CHANNEL_NONINTERFERING -2
#define IF_CHANNEL_UNKNOWN 0