From a8d9c1f9caae29410b74f138f81d9b07645c47ce Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 25 Jan 2006 06:31:04 +0000 Subject: [zebra] Fix incorrect changes made in RIB metric selection patch 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). --- zebra/ChangeLog | 6 ++++++ zebra/zebra_rib.c | 30 ++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) (limited to 'zebra') diff --git a/zebra/ChangeLog b/zebra/ChangeLog index fab26480..9f892c83 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 a591776a..f377400f 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. */ -- cgit v1.2.1