diff options
Diffstat (limited to 'zebra')
| -rw-r--r-- | zebra/zebra_rib.c | 20 | 
1 files changed, 13 insertions, 7 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index ccccd0ad..05ff1e10 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -759,12 +759,18 @@ nexthop_active_update (struct route_node *rn, struct rib *rib, int set)    for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)      {        active = CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE); -      rib->nexthop_active_num += nexthop_active_check (rn, rib, nexthop, set); -      if (active != CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE)) -	SET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED); + +      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++;      }    return rib->nexthop_active_num;  } +  #define RIB_SYSTEM_ROUTE(R) \          ((R)->type == ZEBRA_ROUTE_KERNEL || (R)->type == ZEBRA_ROUTE_CONNECT) @@ -1298,7 +1304,6 @@ static_install_ipv4 (struct prefix *p, struct static_ipv4 *si)      {        /* Same distance static route is there.  Update it with new           nexthop. */ -      rib_uninstall (rn, rib);        route_unlock_node (rn);        switch (si->type)          { @@ -1417,7 +1422,8 @@ static_uninstall_ipv4 (struct prefix *p, struct static_ipv4 *si)      }    else      { -      rib_uninstall (rn, rib); +      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)) +        rib_uninstall (rn, rib);        nexthop_delete (rib, nexthop);        nexthop_free (nexthop);        rib_process (rn, rib); @@ -1860,7 +1866,6 @@ static_install_ipv6 (struct prefix *p, struct static_ipv6 *si)      {        /* Same distance static route is there.  Update it with new           nexthop. */ -      rib_uninstall (rn, rib);        route_unlock_node (rn);        switch (si->type) @@ -1980,7 +1985,8 @@ static_uninstall_ipv6 (struct prefix *p, struct static_ipv6 *si)      }    else      { -      rib_uninstall (rn, rib); +      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)) +        rib_uninstall (rn, rib);        nexthop_delete (rib, nexthop);        nexthop_free (nexthop);        rib_process (rn, rib);  | 
