[zebra] Fix incorrect changes made in RIB metric selection patch

2006-01-25 Gunnar Stigen <gunnar.stigen@axxessit.no>

	* zebra_rib.c: (rib_process) Application of Gunnar's earlier
	  metric selection RIB change included incorrect tidy-ups made
	  by commiter. Fix. (NB: any errors here are again due to paul).
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index fab2648..9f892c8 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,9 @@
+2006-01-25 Gunnar Stigen <gunnar.stigen@axxessit.no>
+
+	* zebra_rib.c: (rib_process) Application of Gunnar's earlier
+	  metric selection RIB change included incorrect tidy-ups made
+	  by commiter. Fix. (NB: any errors here are again due to paul).
+
 2006-01-25 Paul Jakma <paul.jakma@sun.com>
 
 	* (general) More solaris PF_ROUTE hacks. The IFF_UP mangling
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index a591776..f377400 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -927,15 +927,37 @@
         }
       
       /* filter route selection in following order:
-       * - lower distance beats higher
        * - connected beats other types
+       * - lower distance beats higher
        * - lower metric beats higher for equal distance
        * - last, hence oldest, route wins tie break.
        */
-      if ((rib->type == ZEBRA_ROUTE_CONNECT)
-          || (rib->distance <= select->distance))
-        if (rib->metric <= select->metric)
+      if (rib->type == ZEBRA_ROUTE_CONNECT)
+        {
+          if (select->type != ZEBRA_ROUTE_CONNECT 
+              || rib->metric <= select->metric)
+            {
+              select = rib;
+              continue;
+            }
+        }
+      else if (select->type == ZEBRA_ROUTE_CONNECT)
+        continue;
+      
+      /* higher distance loses */
+      if (rib->distance > select->distance)
+        continue;
+      
+      /* lower wins */
+      if (rib->distance < select->distance)
+        {
           select = rib;
+          continue;
+        }
+      
+      /* metric tie-breaks equal distance */
+      if (rib->metric <= select->metric)
+        select = rib;
     }
   
   /* Deleted route check. */