summaryrefslogtreecommitdiff
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
parentc26c6bc2d78a2fe76f27dcc9fbb5afc95c3a7626 (diff)
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.
-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 */