Fix a route lifetime bug

There is a bug in the current route purge routine which would
result in a route's lifetime getting decremented more than once
during the same pass. This commit fixes it

The bug is documented here:
http://thread.gmane.org/gmane.os.contiki.devel/16209
This commit is contained in:
George Oikonomou 2012-12-19 22:22:14 +00:00
parent b8f79b9da3
commit 68f59113d6

View File

@ -62,14 +62,31 @@ rpl_purge_routes(void)
{
uip_ds6_route_t *r;
/* First pass, decrement lifetime */
r = uip_ds6_route_list_head();
while(r != NULL) {
if(r->state.lifetime <= 1) {
if(r->state.lifetime >= 1) {
/*
* If a route is at lifetime == 1, set it to 0, scheduling it for
* immediate removal below. This achieves the same as the original code,
* which would delete lifetime <= 1
*/
r->state.lifetime--;
}
r = list_item_next(r);
}
/* Second pass, remove dead routes */
r = uip_ds6_route_list_head();
while(r != NULL) {
if(r->state.lifetime < 1) {
/* Routes with lifetime == 1 have only just been decremented from 2 to 1,
* thus we want to keep them. Hence < and not <= */
uip_ds6_route_rm(r);
r = uip_ds6_route_list_head();
} else {
r->state.lifetime--;
r = list_item_next(r);
}
}