]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: bestpath failure when you have a singlepath not in holddown 17251/head
authorDonald Sharp <sharpd@nvidia.com>
Fri, 25 Oct 2024 21:17:53 +0000 (17:17 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Fri, 25 Oct 2024 21:22:13 +0000 (17:22 -0400)
When you have multiple paths to a particular route and a single
path changes.  In addition of the other paths are either in
hold down or not established or really just not selected you
could end up with a situation where the bestpath choosen
was a path that was in hold down.

Modify the code such that when there is nothing worse
in bestpath selection for the choosen path, but were
unable to do any sorting, just put the path on the top
of the list and declare it the winner.  Else just
do the original and put it at the end.

Signed-off-by: Chirag Shah <chirag@nvidia.com>
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
bgpd/bgp_route.c

index d1b3919d72d696b2c6639eb2557e616a0c806d51..d4f3d7dcb94f8e22da5b326da8fcc5c2e2ddc674 100644 (file)
@@ -3198,15 +3198,23 @@ void bgp_best_selection(struct bgp *bgp, struct bgp_dest *dest,
                        struct bgp_path_info *end =
                                bgp_dest_get_bgp_path_info(dest);
 
-                       for (; end && end->next != NULL; end = end->next)
-                               ;
+                       if (end && any_comparisons) {
+                               for (; end && end->next != NULL; end = end->next)
+                                       ;
 
-                       if (end)
-                               end->next = first;
-                       else
+                               if (end)
+                                       end->next = first;
+                               else
+                                       bgp_dest_set_bgp_path_info(dest, first);
+                               first->prev = end;
+                               first->next = NULL;
+                       } else {
                                bgp_dest_set_bgp_path_info(dest, first);
-                       first->prev = end;
-                       first->next = NULL;
+                               if (end)
+                                       end->prev = first;
+                               first->next = end;
+                               first->prev = NULL;
+                       }
 
                        dest->reason = first->reason;
                } else {