aboutsummaryrefslogtreecommitdiffstats
path: root/nest
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2020-07-16 15:02:10 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2020-07-16 15:02:10 +0200
commitc0e1f534c95f5f395fda62b01ea1c245323e3aed (patch)
treef2fecb667261ec068c282fea210c92197ccf078c /nest
parentc26c6bc2d78a2fe76f27dcc9fbb5afc95c3a7626 (diff)
downloadbird-c0e1f534c95f5f395fda62b01ea1c245323e3aed.tar.gz
Nest: Keep route ordering during route updates
Put new non-best routes to the end of list instead of the second position. Put updated routes to their old position. Position is changed just by best route selection.
Diffstat (limited to 'nest')
-rw-r--r--nest/rt-table.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/nest/rt-table.c b/nest/rt-table.c
index ae5a8444..eff25e5c 100644
--- a/nest/rt-table.c
+++ b/nest/rt-table.c
@@ -1133,6 +1133,9 @@ rte_recalculate(struct channel *c, net *net, rte *new, struct rte_src *src)
before_old = old;
}
+ /* Save the last accessed position */
+ rte **pos = k;
+
if (!old)
before_old = NULL;
@@ -1229,6 +1232,7 @@ rte_recalculate(struct channel *c, net *net, rte *new, struct rte_src *src)
new->next = *k;
*k = new;
+
table->rt_count++;
}
}
@@ -1247,6 +1251,7 @@ rte_recalculate(struct channel *c, net *net, rte *new, struct rte_src *src)
new->next = net->routes;
net->routes = new;
+
table->rt_count++;
}
else if (old == old_best)
@@ -1261,8 +1266,9 @@ rte_recalculate(struct channel *c, net *net, rte *new, struct rte_src *src)
/* Add the new route to the list */
if (new)
{
- new->next = net->routes;
- net->routes = new;
+ new->next = *pos;
+ *pos = new;
+
table->rt_count++;
}
@@ -1286,11 +1292,11 @@ rte_recalculate(struct channel *c, net *net, rte *new, struct rte_src *src)
/* The third case - the new route is not better than the old
best route (therefore old_best != NULL) and the old best
route was not removed (therefore old_best == net->routes).
- We just link the new route after the old best route. */
+ We just link the new route to the old/last position. */
+
+ new->next = *pos;
+ *pos = new;
- ASSERT(net->routes != NULL);
- new->next = net->routes->next;
- net->routes->next = new;
table->rt_count++;
}
/* The fourth (empty) case - suboptimal route was removed, nothing to do */