Commit da59d46e authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

First tack at multihop requests.

parent c75fc69a
......@@ -64,6 +64,8 @@ int wired_hello_interval = -1;
int idle_hello_interval = -1;
int update_interval = -1;
int max_hopcount = 25;
struct network nets[MAXNETS];
int numnets = 0;
......@@ -367,14 +369,14 @@ main(int argc, char **argv)
/* Make some noise so others notice us */
for(i = 0; i < numnets; i++) {
send_hello(&nets[i]);
send_request(&nets[i], NULL);
send_request(&nets[i], NULL, 0);
}
for(i = 0; i < numnets; i++) {
usleep(50000 + random() % 100000);
flushbuf(&nets[i]);
send_hello(&nets[i]);
send_self_update(&nets[i], 0);
send_request(&nets[i], NULL);
send_request(&nets[i], NULL, 0);
}
debugf("Entering main loop.\n");
......@@ -740,7 +742,7 @@ expire_routes(void)
if(route->installed && route->refmetric < INFINITY) {
if(route->time < now.tv_sec - MAX(5, route_timeout_delay - 25))
send_unicast_request(route->nexthop, route->dest);
send_unicast_request(route->nexthop, route->dest, 0);
}
i++;
}
......
......@@ -96,5 +96,6 @@ extern int protocol_port;
extern unsigned char protocol_group[16];
extern int protocol_socket;
extern int kernel_socket;
extern int max_hopcount;
void update_hello_interval(struct network *net);
......@@ -294,13 +294,13 @@ send_hello(struct network *net)
}
void
send_request(struct network *net, struct destination *dest)
send_request(struct network *net, struct destination *dest, int hopcount)
{
int i;
if(net == NULL) {
for(i = 0; i < numnets; i++)
send_request(&nets[i], dest);
send_request(&nets[i], dest, hopcount);
return;
}
......@@ -308,8 +308,14 @@ send_request(struct network *net, struct destination *dest)
net->ifname, dest ? format_address(dest->address) : "::/0");
start_message(net, 20);
accumulate_byte(net, 1);
if(hopcount > 0 && dest) {
accumulate_byte(net, dest->seqno);
accumulate_byte(net, hopcount);
} else {
accumulate_byte(net, 0);
accumulate_byte(net, 0);
}
accumulate_byte(net, 0);
accumulate_short(net, 0);
accumulate_data(net, dest ? dest->address : zeroes, 16);
schedule_flush(net);
}
......@@ -340,7 +346,8 @@ send_unicast_packet(struct neighbour *neigh, unsigned char *buf, int buflen)
void
send_unicast_request(struct neighbour *neigh, struct destination *dest)
send_unicast_request(struct neighbour *neigh, struct destination *dest,
int hopcount)
{
unsigned char buf[20];
......@@ -350,8 +357,13 @@ send_unicast_request(struct neighbour *neigh, struct destination *dest)
dest ? format_address(dest->address) : "::/0");
buf[0] = 1;
if(hopcount > 0 && dest) {
buf[1] = dest->seqno;
buf[2] = hopcount;
} else {
buf[1] = 0;
buf[2] = 0;
}
buf[3] = 0;
if(dest == NULL)
memset(buf + 4, 0, 16);
......
......@@ -39,8 +39,10 @@ void parse_packet(const unsigned char *from, struct network *net,
const unsigned char *packet, int len);
void flushbuf(struct network *net);
void send_hello(struct network *net);
void send_request(struct network *net, struct destination *dest);
void send_unicast_request(struct neighbour *neigh, struct destination *dest);
void send_request(struct network *net, struct destination *dest,
int hopcount);
void send_unicast_request(struct neighbour *neigh, struct destination *dest,
int hopcount);
void send_update(struct destination *dest, struct network *net);
void send_self_update(struct network *net, int force_seqno);
void send_self_retract(struct network *net);
......
......@@ -174,7 +174,7 @@ update_neighbour(struct neighbour *neigh, int hello, int hello_interval)
if(dest)
route = find_best_route(dest);
if(!route || route->nexthop == neigh)
send_unicast_request(neigh, NULL);
send_unicast_request(neigh, NULL, 0);
}
}
......
......@@ -100,7 +100,7 @@ flush_route(struct route *route)
dest->seqno = (dest->seqno + 1) & 0xFF;
}
send_update(route->dest, NULL);
send_request(NULL, route->dest);
send_request(NULL, route->dest, max_hopcount);
}
}
}
......@@ -431,6 +431,6 @@ send_triggered_update(struct route *route, int oldmetric)
if(route->metric - oldmetric >= 384) {
/* This route's metric has increased a lot -- let's hope we find
something better */
send_request(NULL, route->dest);
send_request(NULL, route->dest, 0);
}
}
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