diff options
| -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. */ | 
