From: Denis Ovsienko Date: Tue, 14 Aug 2007 09:46:48 +0000 (+0000) Subject: Merged own patch for bug #390 (rewrite zebra/zebra_rib.c:nexthop_active_update()) X-Git-Tag: frr-2.0-rc1~2477 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=03e232a4588187992f3538985d541289dc272464;p=mirror%2Ffrr.git Merged own patch for bug #390 (rewrite zebra/zebra_rib.c:nexthop_active_update()) --- diff --git a/zebra/ChangeLog b/zebra/ChangeLog index 17e929eec7..7a23ace42d 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -1,3 +1,8 @@ +2007-08-14 Denis Ovsienko + + * zebra_rib.c: (nexthop_active_update) Added a comment + and rewrote nexthop iteration. + 2007-08-13 Denis Ovsienko * kernel_socket.c: normalize rtm_type_str so it can be handled diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index f61cbe319f..e5cce1e881 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -881,27 +881,32 @@ nexthop_active_check (struct route_node *rn, struct rib *rib, return CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE); } +/* Iterate over all nexthops of the given RIB entry and refresh their + * ACTIVE flag. rib->nexthop_active_num is updated accordingly. If any + * nexthop is found to toggle the ACTIVE flag, the whole rib structure + * is flagged with ZEBRA_FLAG_CHANGED. The 4th 'set' argument is + * transparently passed to nexthop_active_check(). + * + * Return value is the new number of active nexthops. + */ + static int nexthop_active_update (struct route_node *rn, struct rib *rib, int set) { struct nexthop *nexthop; - int active; + int prev_active, new_active; rib->nexthop_active_num = 0; UNSET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED); for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next) - { - active = CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE); - - nexthop_active_check (rn, rib, nexthop, set); - if ((MULTIPATH_NUM == 0 || rib->nexthop_active_num < MULTIPATH_NUM) - && active != CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE)) - SET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED); - - if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE)) - rib->nexthop_active_num++; - } + { + prev_active = CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE); + if ((new_active = nexthop_active_check (rn, rib, nexthop, set))) + rib->nexthop_active_num++; + if (prev_active != new_active) + SET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED); + } return rib->nexthop_active_num; }