Merged own patch for bug #390 (rewrite zebra/zebra_rib.c:nexthop_active_update())

This commit is contained in:
Denis Ovsienko 2007-08-14 09:46:48 +00:00
parent dc95824ae1
commit 03e232a458
2 changed files with 22 additions and 12 deletions

View File

@ -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 2007-08-13 Denis Ovsienko
* kernel_socket.c: normalize rtm_type_str so it can be handled * kernel_socket.c: normalize rtm_type_str so it can be handled

View File

@ -881,27 +881,32 @@ nexthop_active_check (struct route_node *rn, struct rib *rib,
return CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE); 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 static int
nexthop_active_update (struct route_node *rn, struct rib *rib, int set) nexthop_active_update (struct route_node *rn, struct rib *rib, int set)
{ {
struct nexthop *nexthop; struct nexthop *nexthop;
int active; int prev_active, new_active;
rib->nexthop_active_num = 0; rib->nexthop_active_num = 0;
UNSET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED); UNSET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED);
for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next) for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
{ {
active = CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE); prev_active = CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE);
if ((new_active = nexthop_active_check (rn, rib, nexthop, set)))
nexthop_active_check (rn, rib, nexthop, set); rib->nexthop_active_num++;
if ((MULTIPATH_NUM == 0 || rib->nexthop_active_num < MULTIPATH_NUM) if (prev_active != new_active)
&& active != CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE)) SET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED);
SET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED); }
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
rib->nexthop_active_num++;
}
return rib->nexthop_active_num; return rib->nexthop_active_num;
} }