]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merged own patch for bug #390 (rewrite zebra/zebra_rib.c:nexthop_active_update())
authorDenis Ovsienko <linux@pilot.org.ua>
Tue, 14 Aug 2007 09:46:48 +0000 (09:46 +0000)
committerDenis Ovsienko <linux@pilot.org.ua>
Tue, 14 Aug 2007 09:46:48 +0000 (09:46 +0000)
zebra/ChangeLog
zebra/zebra_rib.c

index 17e929eec76ed84cd71b0c9c2f986477821810e2..7a23ace42df610e77ad706550322c4bec5d1cffc 100644 (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
 
        * kernel_socket.c: normalize rtm_type_str so it can be handled
index f61cbe319f16b36c5f30bcd69acad48dec6ff878..e5cce1e881a2b5e5ca5f3e76bde4f527dbc12575 100644 (file)
@@ -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;
 }