diff options
author | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2020-07-16 15:02:10 +0200 |
---|---|---|
committer | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2020-07-16 15:02:10 +0200 |
commit | c0e1f534c95f5f395fda62b01ea1c245323e3aed (patch) | |
tree | f2fecb667261ec068c282fea210c92197ccf078c | |
parent | c26c6bc2d78a2fe76f27dcc9fbb5afc95c3a7626 (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.c | 18 |
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 */ |