diff options
author | paul <paul> | 2006-01-25 06:31:04 +0000 |
---|---|---|
committer | paul <paul> | 2006-01-25 06:31:04 +0000 |
commit | a8d9c1f9caae29410b74f138f81d9b07645c47ce (patch) | |
tree | ee5285e9e8932ebf89b16bb051c1af78755ade08 /zebra | |
parent | 5c78b3d006e6926f938796cffa08e8e14fb8e7af (diff) |
[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).
Diffstat (limited to 'zebra')
-rw-r--r-- | zebra/ChangeLog | 6 | ||||
-rw-r--r-- | zebra/zebra_rib.c | 30 |
2 files changed, 32 insertions, 4 deletions
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 <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 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. */ |