diff --git a/zebra/ChangeLog b/zebra/ChangeLog index fab2648073..9f892c8333 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -1,3 +1,9 @@ +2006-01-25 Gunnar Stigen + + * 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 * (general) More solaris PF_ROUTE hacks. The IFF_UP mangling diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index a591776a5b..f377400f09 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -927,15 +927,37 @@ rib_process (struct work_queue *wq, void *data) } /* 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. */