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/zebra_rib.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'zebra/zebra_rib.c') 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