]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Nest: Keep route ordering during route updates
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Thu, 16 Jul 2020 13:02:10 +0000 (15:02 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Thu, 16 Jul 2020 13:02:10 +0000 (15:02 +0200)
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.

nest/rt-table.c

index ae5a844497a7860655512232fa469fe1b68cf522..eff25e5cdb3558481b820967b1986a1612373dad 100644 (file)
@@ -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 */