]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: convert vrf code to use red-black trees as well
authorRenato Westphal <renato@opensourcerouting.org>
Sat, 29 Oct 2016 16:37:11 +0000 (14:37 -0200)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 28 Nov 2016 18:18:35 +0000 (16:18 -0200)
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
14 files changed:
lib/if.c
lib/vrf.c
lib/vrf.h
zebra/interface.c
zebra/irdp_main.c
zebra/router-id.c
zebra/rt_netlink.c
zebra/rtadv.c
zebra/zebra_ptm.c
zebra/zebra_rib.c
zebra/zebra_routemap.c
zebra/zebra_vrf.c
zebra/zebra_vty.c
zebra/zserv.c

index 70304e584cb2f3980d4f3245c57c705a69514025..6df4942296f7ac96eff57a9d9bd054d4766d3453 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -308,13 +308,11 @@ if_lookup_by_name_vrf (const char *name, vrf_id_t vrf_id)
 struct interface *
 if_lookup_by_name_all_vrf (const char *name)
 {
+  struct vrf *vrf;
   struct interface *ifp;
-  struct vrf *vrf = NULL;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      vrf = vrf_iter2vrf (iter);
       ifp = if_lookup_by_name_vrf (name, vrf->vrf_id);
       if (ifp)
        return ifp;
@@ -490,18 +488,16 @@ struct interface *
 if_get_by_name_len_vrf (const char *name, size_t namelen, vrf_id_t vrf_id, int vty)
 {
   struct interface *ifp;
+  struct vrf *vrf;
   struct listnode *node;
-  struct vrf *vrf = NULL;
-  vrf_iter_t iter;
 
   ifp = if_lookup_by_name_len_vrf (name, namelen, vrf_id);
   if (ifp)
     return ifp;
 
   /* Didn't find the interface on that vrf. Defined on a different one? */ 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      vrf = vrf_iter2vrf(iter);
       for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf->vrf_id), node, ifp))
        {
          if (!memcmp(name, ifp->name, namelen) && (ifp->name[namelen] == '\0'))
@@ -666,14 +662,13 @@ if_dump (const struct interface *ifp)
 void
 if_dump_all (void)
 {
-  struct list *intf_list;
+  struct vrf *vrf;
   struct listnode *node;
   void *p;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((intf_list = vrf_iter2iflist (iter)) != NULL)
-      for (ALL_LIST_ELEMENTS_RO (intf_list, node, p))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if (vrf->iflist != NULL)
+      for (ALL_LIST_ELEMENTS_RO (vrf->iflist, node, p))
         if_dump (p);
 }
 
@@ -885,24 +880,22 @@ DEFUN (show_address_vrf_all,
        "address\n"
        VRF_ALL_CMD_HELP_STR)
 {
-  struct list *intf_list;
+  struct vrf *vrf;
   struct listnode *node;
   struct listnode *node2;
   struct interface *ifp;
   struct connected *ifc;
   struct prefix *p;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      intf_list = vrf_iter2iflist (iter);
-      if (!intf_list || !listcount (intf_list))
+      if (!vrf->iflist || !listcount (vrf->iflist))
         continue;
 
-      vty_out (vty, "%sVRF %u%s%s", VTY_NEWLINE, vrf_iter2id (iter),
-               VTY_NEWLINE, VTY_NEWLINE);
+      vty_out (vty, "%sVRF %u%s%s", VTY_NEWLINE, vrf->vrf_id, VTY_NEWLINE,
+              VTY_NEWLINE);
 
-      for (ALL_LIST_ELEMENTS_RO (intf_list, node, ifp))
+      for (ALL_LIST_ELEMENTS_RO (vrf->iflist, node, ifp))
         {
           for (ALL_LIST_ELEMENTS_RO (ifp->connected, node2, ifc))
             {
index 13884aba62040162ad920a091f244688c3d8a6d3..79885ff3e398e91211b3c16f580d69555a5fce5b 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -35,6 +35,12 @@ DEFINE_MTYPE_STATIC(LIB, VRF_BITMAP, "VRF bit-map")
 
 DEFINE_QOBJ_TYPE(vrf)
 
+static __inline int vrf_id_compare (struct vrf *, struct vrf *);
+
+RB_GENERATE (vrf_id_head, vrf, id_entry, vrf_id_compare)
+
+struct vrf_id_head vrfs_by_id = RB_INITIALIZER (&vrfs_by_id);
+
 /*
  * Turn on/off debug code
  * for vrf.
@@ -50,9 +56,6 @@ struct vrf_master
   int (*vrf_disable_hook) (vrf_id_t, const char *, void **);
 } vrf_master = {0,};
 
-/* VRF table */
-struct route_table *vrf_table = NULL;
-
 /* VRF is part of a list too to store it before its actually active */
 struct list *vrf_list;
 
@@ -75,13 +78,10 @@ vrf_list_lookup_by_name (const char *name)
   return NULL;
 }
 
-/* Build the table key */
-static void
-vrf_build_key (vrf_id_t vrf_id, struct prefix *p)
+static __inline int
+vrf_id_compare (struct vrf *a, struct vrf *b)
 {
-  p->family = AF_INET;
-  p->prefixlen = IPV4_MAX_BITLEN;
-  p->u.prefix4.s_addr = vrf_id;
+  return (a->vrf_id - b->vrf_id);
 }
 
 /* Get a VRF. If not found, create one.
@@ -94,9 +94,7 @@ vrf_build_key (vrf_id_t vrf_id, struct prefix *p)
 struct vrf *
 vrf_get (vrf_id_t vrf_id, const char *name)
 {
-  struct prefix p;
-  struct route_node *rn = NULL;
-  struct vrf *vrf = NULL;
+  struct vrf *vrf;
 
   if (debug_vrf)
     zlog_debug ("VRF_GET: %s(%d)", name, vrf_id);
@@ -156,17 +154,8 @@ vrf_get (vrf_id_t vrf_id, const char *name)
          if (vrf->vrf_id == vrf_id)
            return vrf;
 
-         /*
-          * Now we have a situation where we've had a
-          * vrf created, but not yet created the vrf_id route
-          * node, let's do so and match the code up.
-           */
-         vrf_build_key (vrf_id, &p);
-         rn = route_node_get (vrf_table, &p);
-
-         rn->info = vrf;
-         vrf->node = rn;
          vrf->vrf_id = vrf_id;
+         RB_INSERT (vrf_id_head, &vrfs_by_id, vrf);
          if (vrf_master.vrf_new_hook)
            (*vrf_master.vrf_new_hook) (vrf_id, name, &vrf->info);
 
@@ -182,12 +171,9 @@ vrf_get (vrf_id_t vrf_id, const char *name)
           * We've already been told about the vrf_id
           * or we haven't.
           */
-         vrf_build_key (vrf_id, &p);
-          rn = route_node_get (vrf_table, &p);
-         if (rn->info)
+         vrf = vrf_lookup (vrf_id);
+         if (vrf)
            {
-             vrf = rn->info;
-             route_unlock_node (rn);
              /*
               * We know at this point that the vrf->name is not
               * right because we would have caught it above.
@@ -209,12 +195,10 @@ vrf_get (vrf_id_t vrf_id, const char *name)
          else
            {
              vrf = XCALLOC (MTYPE_VRF, sizeof (struct vrf));
-
-             rn->info = vrf;
-             vrf->node = rn;
              vrf->vrf_id = vrf_id;
              strcpy (vrf->name, name);
              listnode_add_sort (vrf_list, vrf);
+             RB_INSERT (vrf_id_head, &vrfs_by_id, vrf);
              if_init (&vrf->iflist);
              QOBJ_REG (vrf, vrf);
              if (vrf_master.vrf_new_hook)
@@ -237,23 +221,18 @@ vrf_get (vrf_id_t vrf_id, const char *name)
    */
   else if (!name)
     {
-      vrf_build_key (vrf_id, &p);
-      rn = route_node_get (vrf_table, &p);
+      vrf = vrf_lookup (vrf_id);
       if (debug_vrf)
-        zlog_debug("Vrf found: %p", rn->info);
+        zlog_debug("Vrf found: %p", vrf);
 
-      if (rn->info)
-        {
-           route_unlock_node (rn);
-          return (rn->info);
-       }
+      if (vrf)
+       return vrf;
       else
        {
          vrf = XCALLOC (MTYPE_VRF, sizeof (struct vrf));
-          rn->info = vrf;
-         vrf->node = rn;
          vrf->vrf_id = vrf_id;
           if_init (&vrf->iflist);
+         RB_INSERT (vrf_id_head, &vrfs_by_id, vrf);
           QOBJ_REG (vrf, vrf);
          if (debug_vrf)
             zlog_debug("Vrf Created: %p", vrf);
@@ -284,12 +263,8 @@ vrf_delete (struct vrf *vrf)
   QOBJ_UNREG (vrf);
   if_terminate (&vrf->iflist);
 
-  if (vrf->node)
-    {
-      vrf->node->info = NULL;
-      route_unlock_node(vrf->node);
-    }
-
+  if (vrf->vrf_id != VRF_UNKNOWN)
+    RB_REMOVE (vrf_id_head, &vrfs_by_id, vrf);
   listnode_delete (vrf_list, vrf);
 
   XFREE (MTYPE_VRF, vrf);
@@ -299,18 +274,9 @@ vrf_delete (struct vrf *vrf)
 struct vrf *
 vrf_lookup (vrf_id_t vrf_id)
 {
-  struct prefix p;
-  struct route_node *rn;
-  struct vrf *vrf = NULL;
-
-  vrf_build_key (vrf_id, &p);
-  rn = route_node_lookup (vrf_table, &p);
-  if (rn)
-    {
-      vrf = (struct vrf *)rn->info;
-      route_unlock_node (rn); /* lookup */
-    }
-  return vrf;
+  struct vrf vrf;
+  vrf.vrf_id = vrf_id;
+  return (RB_FIND (vrf_id_head, &vrfs_by_id, &vrf));
 }
 
 /*
@@ -401,112 +367,15 @@ vrf_add_hook (int type, int (*func)(vrf_id_t, const char *, void **))
   }
 }
 
-/* Return the iterator of the first VRF. */
-vrf_iter_t
-vrf_first (void)
-{
-  struct route_node *rn;
-
-  for (rn = route_top (vrf_table); rn; rn = route_next (rn))
-    if (rn->info)
-      {
-        route_unlock_node (rn); /* top/next */
-        return (vrf_iter_t)rn;
-      }
-  return VRF_ITER_INVALID;
-}
-
-/* Return the next VRF iterator to the given iterator. */
-vrf_iter_t
-vrf_next (vrf_iter_t iter)
-{
-  struct route_node *rn = NULL;
-
-  /* Lock it first because route_next() will unlock it. */
-  if (iter != VRF_ITER_INVALID)
-    rn = route_next (route_lock_node ((struct route_node *)iter));
-
-  for (; rn; rn = route_next (rn))
-    if (rn->info)
-      {
-        route_unlock_node (rn); /* next */
-        return (vrf_iter_t)rn;
-      }
-  return VRF_ITER_INVALID;
-}
-
-/* Return the VRF iterator of the given VRF ID. If it does not exist,
- * the iterator of the next existing VRF is returned. */
-vrf_iter_t
-vrf_iterator (vrf_id_t vrf_id)
-{
-  struct prefix p;
-  struct route_node *rn;
-
-  vrf_build_key (vrf_id, &p);
-  rn = route_node_get (vrf_table, &p);
-  if (rn->info)
-    {
-      /* OK, the VRF exists. */
-      route_unlock_node (rn); /* get */
-      return (vrf_iter_t)rn;
-    }
-
-  /* Find the next VRF. */
-  for (rn = route_next (rn); rn; rn = route_next (rn))
-    if (rn->info)
-      {
-        route_unlock_node (rn); /* next */
-        return (vrf_iter_t)rn;
-      }
-
-  return VRF_ITER_INVALID;
-}
-
-/* Obtain the VRF ID from the given VRF iterator. */
-vrf_id_t
-vrf_iter2id (vrf_iter_t iter)
-{
-  struct route_node *rn = (struct route_node *) iter;
-  return (rn && rn->info) ? ((struct vrf *)rn->info)->vrf_id : VRF_DEFAULT;
-}
-
-struct vrf *
-vrf_iter2vrf (vrf_iter_t iter)
-{
-  struct route_node *rn = (struct route_node *) iter;
-  return (rn && rn->info) ? (struct vrf *)rn->info : NULL;
-}
-
-/* Obtain the data pointer from the given VRF iterator. */
-void *
-vrf_iter2info (vrf_iter_t iter)
-{
-  struct route_node *rn = (struct route_node *) iter;
-  return (rn && rn->info) ? ((struct vrf *)rn->info)->info : NULL;
-}
-
-/* Obtain the interface list from the given VRF iterator. */
-struct list *
-vrf_iter2iflist (vrf_iter_t iter)
-{
-  struct route_node *rn = (struct route_node *) iter;
-  return (rn && rn->info) ? ((struct vrf *)rn->info)->iflist : NULL;
-}
-
 /* Look up a VRF by name. */
 struct vrf *
 vrf_lookup_by_name (const char *name)
 {
-  struct vrf *vrf = NULL;
-  vrf_iter_t iter;
+  struct vrf *vrf;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    {
-      vrf = vrf_iter2vrf (iter);
-      if (vrf && !strcmp(vrf->name, name))
-        return vrf;
-    }
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if (!strcmp(vrf->name, name))
+      return vrf;
 
   return NULL;
 }
@@ -693,9 +562,6 @@ vrf_init (void)
   vrf_list = list_new ();
   vrf_list->cmp = (int (*)(void *, void *))vrf_cmp_func;
 
-  /* Allocate VRF table.  */
-  vrf_table = route_table_init ();
-
   /* The default VRF always exists. */
   default_vrf = vrf_get (VRF_DEFAULT, VRF_DEFAULT_NAME);
   if (!default_vrf)
@@ -716,18 +582,13 @@ vrf_init (void)
 void
 vrf_terminate (void)
 {
-  struct route_node *rn;
   struct vrf *vrf;
 
   if (debug_vrf)
     zlog_debug ("%s: Shutting down vrf subsystem", __PRETTY_FUNCTION__);
 
-  for (rn = route_top (vrf_table); rn; rn = route_next (rn))
-    if ((vrf = rn->info) != NULL)
-      vrf_delete (vrf);
-
-  route_table_finish (vrf_table);
-  vrf_table = NULL;
+  while ((vrf = RB_ROOT (&vrfs_by_id)) != NULL)
+    vrf_delete (vrf);
 }
 
 /* Create a socket for the VRF. */
index 127b7082e90cbb29fd0b5e2b0d673ce004667b89..f093f4fbd8a846076d905fabfe106c19bee16f72 100644 (file)
--- a/lib/vrf.h
+++ b/lib/vrf.h
@@ -23,6 +23,7 @@
 #ifndef _ZEBRA_VRF_H
 #define _ZEBRA_VRF_H
 
+#include "openbsd-tree.h"
 #include "linklist.h"
 #include "qobj.h"
 
@@ -69,18 +70,18 @@ enum {
 
 struct vrf
 {
+  RB_ENTRY(vrf) id_entry;
+
   /* Identifier, same as the vector index */
   vrf_id_t vrf_id;
-  /* Name */
 
+  /* Name */
   char name[VRF_NAMSIZ + 1];
 
   /* Zebra internal VRF status */
   u_char status;
 #define VRF_ACTIVE     (1 << 0)
 
-  struct route_node *node;
-
   /* Master list of interfaces belonging to this VRF */
   struct list *iflist;
 
@@ -89,9 +90,12 @@ struct vrf
 
   QOBJ_FIELDS
 };
+RB_HEAD (vrf_id_head, vrf);
+RB_PROTOTYPE (vrf_id_head, vrf, id_entry, vrf_id_compare)
 DECLARE_QOBJ_TYPE(vrf)
 
 
+extern struct vrf_id_head vrfs_by_id;
 extern struct list *vrf_list;
 
 /*
@@ -104,13 +108,6 @@ extern struct list *vrf_list;
  */
 extern void vrf_add_hook (int, int (*)(vrf_id_t, const char *, void **));
 
-/*
- * VRF iteration
- */
-
-typedef void *              vrf_iter_t;
-#define VRF_ITER_INVALID    NULL    /* invalid value of the iterator */
-
 extern struct vrf *vrf_lookup (vrf_id_t);
 extern struct vrf *vrf_lookup_by_name (const char *);
 extern struct vrf *vrf_list_lookup_by_name (const char *);
@@ -135,34 +132,6 @@ extern vrf_id_t vrf_name_to_id (const char *);
       (V) = vrf->vrf_id; \
   } while (0)
 
-/*
- * VRF iteration utilities. Example for the usage:
- *
- *   vrf_iter_t iter = vrf_first();
- *   for (; iter != VRF_ITER_INVALID; iter = vrf_next (iter))
- *
- * or
- *
- *   vrf_iter_t iter = vrf_iterator (<a given VRF ID>);
- *   for (; iter != VRF_ITER_INVALID; iter = vrf_next (iter))
- */
-
-/* Return the iterator of the first VRF. */
-extern vrf_iter_t vrf_first (void);
-/* Return the next VRF iterator to the given iterator. */
-extern vrf_iter_t vrf_next (vrf_iter_t);
-/* Return the VRF iterator of the given VRF ID. If it does not exist,
- * the iterator of the next existing VRF is returned. */
-extern vrf_iter_t vrf_iterator (vrf_id_t);
-
-/*
- * VRF iterator to properties
- */
-extern vrf_id_t vrf_iter2id (vrf_iter_t);
-extern struct vrf *vrf_iter2vrf (vrf_iter_t);
-extern void *vrf_iter2info (vrf_iter_t);
-extern struct list *vrf_iter2iflist (vrf_iter_t);
-
 /*
  * Utilities to obtain the user data
  */
index dd1f8a146bab5e1192338b0d250cc6e46b9ba643..75040a87f0f77ab155c984c9bf901c42a7d67bf2 100644 (file)
@@ -1325,15 +1325,15 @@ DEFUN (show_interface_vrf_all, show_interface_vrf_all_cmd,
        "Interface status and configuration\n"
        VRF_ALL_CMD_HELP_STR)
 {
+  struct vrf *vrf;
   struct listnode *node;
   struct interface *ifp;
-  vrf_iter_t iter;
 
   interface_update_stats ();
 
   /* All interface print. */
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    for (ALL_LIST_ELEMENTS_RO (vrf_iter2iflist (iter), node, ifp))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    for (ALL_LIST_ELEMENTS_RO (vrf->iflist, node, ifp))
       if_dump_vty (vty, ifp);
 
   return CMD_SUCCESS;
@@ -1378,17 +1378,17 @@ DEFUN (show_interface_name_vrf_all, show_interface_name_vrf_all_cmd,
        "Interface name\n"
        VRF_ALL_CMD_HELP_STR)
 {
+  struct vrf *vrf;
   struct interface *ifp;
-  vrf_iter_t iter;
   int found = 0;
 
   interface_update_stats ();
 
   /* All interface print. */
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
       /* Specified interface print. */
-      ifp = if_lookup_by_name_vrf (argv[0], vrf_iter2id (iter));
+      ifp = if_lookup_by_name_vrf (argv[0], vrf->vrf_id);
       if (ifp)
         {
           if_dump_vty (vty, ifp);
@@ -1484,15 +1484,14 @@ DEFUN (show_interface_desc_vrf_all,
        "Interface description\n"
        VRF_ALL_CMD_HELP_STR)
 {
-  vrf_iter_t iter;
+  struct vrf *vrf;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if (!list_isempty (vrf_iter2iflist (iter)))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if (!list_isempty (vrf->iflist))
       {
-        vty_out (vty, "%s\tVRF %u%s%s", VTY_NEWLINE,
-                 vrf_iter2id (iter),
-                 VTY_NEWLINE, VTY_NEWLINE);
-        if_show_description (vty, vrf_iter2id (iter));
+        vty_out (vty, "%s\tVRF %u%s%s", VTY_NEWLINE, vrf->vrf_id,
+                VTY_NEWLINE, VTY_NEWLINE);
+        if_show_description (vty, vrf->vrf_id);
       }
 
   return CMD_SUCCESS;
@@ -2818,14 +2817,14 @@ link_params_config_write (struct vty *vty, struct interface *ifp)
 static int
 if_config_write (struct vty *vty)
 {
+  struct vrf *vrf;
   struct listnode *node;
   struct interface *ifp;
-  vrf_iter_t iter;
 
   zebra_ptm_write (vty);
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-  for (ALL_LIST_ELEMENTS_RO (vrf_iter2iflist (iter), node, ifp))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+  for (ALL_LIST_ELEMENTS_RO (vrf->iflist, node, ifp))
     {
       struct zebra_if *if_data;
       struct listnode *addrnode;
index cc3a4abaf3787895d2760c5c6382d468c2c9cb3d..7fa4ad4cbe8b5716aecc7070405e7d6d5936bfd9 100644 (file)
@@ -304,17 +304,16 @@ void process_solicit (struct interface *ifp)
 
 void irdp_finish()
 {
-
+  struct vrf *vrf;
   struct listnode *node, *nnode;
   struct interface *ifp;
   struct zebra_if *zi;
   struct irdp_interface *irdp;
-  vrf_iter_t iter;
 
   zlog_info("IRDP: Received shutdown notification.");
  
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter)) 
-    for (ALL_LIST_ELEMENTS (vrf_iter2iflist (iter), node, nnode, ifp))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    for (ALL_LIST_ELEMENTS (vrf->iflist, node, nnode, ifp))
       {
         zi = ifp->info;
 
index d5d9652c5993f75f4e09074835fdb6440f180f71..155a8e3939d52fa108f5ee5824df0f4f152669e8 100644 (file)
@@ -195,11 +195,11 @@ router_id_del_address (struct connected *ifc)
 void
 router_id_write (struct vty *vty)
 {
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       if (zvrf->rid_user_assigned.u.prefix4.s_addr)
         {
           if (zvrf->vrf_id == VRF_DEFAULT)
index f16fd55c981f13bb3d05749bb2ef39a9e59f1883..b18bf1ef7afd9c4f197829450d3e5a9239457062 100644 (file)
@@ -98,12 +98,12 @@ Pending: create an efficient table_id (in a tree/hash) based lookup)
 static vrf_id_t
 vrf_lookup_by_table (u_int32_t table_id)
 {
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (zvrf->table_id != table_id))
         continue;
 
index 3e0a19870226079d6381e336abbe17b8a96e9381..1ab7ac147c0b8a2e3fe93c59cab460fe61590025 100644 (file)
@@ -373,7 +373,7 @@ static int
 rtadv_timer (struct thread *thread)
 {
   struct zebra_ns *zns = THREAD_ARG (thread);
-  vrf_iter_t iter;
+  struct vrf *vrf;
   struct listnode *node, *nnode;
   struct interface *ifp;
   struct zebra_if *zif;
@@ -391,8 +391,8 @@ rtadv_timer (struct thread *thread)
       rtadv_event (zns, RTADV_TIMER_MSEC, 10 /* 10 ms */);
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    for (ALL_LIST_ELEMENTS (vrf_iter2iflist (iter), node, nnode, ifp))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    for (ALL_LIST_ELEMENTS (vrf->iflist, node, nnode, ifp))
       {
         if (if_is_loopback (ifp) ||
             CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK) ||
index 28e6c42ec6b38ca277b13ac47d4c03596acbf9f6..4fc1173241f1578adc3e09a585da21f25fac16e2 100644 (file)
@@ -258,15 +258,15 @@ DEFUN (zebra_ptm_enable,
        "ptm-enable",
        "Enable neighbor check with specified topology\n")
 {
+  struct vrf *vrf;
   struct listnode *i;
   struct interface *ifp;
   struct zebra_if *if_data;
-  vrf_iter_t iter;
 
   ptm_cb.ptm_enable = ZEBRA_IF_PTM_ENABLE_ON;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    for (ALL_LIST_ELEMENTS_RO (vrf_iter2iflist (iter), i, ifp))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    for (ALL_LIST_ELEMENTS_RO (vrf->iflist, i, ifp))
       if (!ifp->ptm_enable)
         {
           if_data = (struct zebra_if *)ifp->info;
@@ -1112,13 +1112,13 @@ zebra_ptm_send_status_req(void)
 void
 zebra_ptm_reset_status(int ptm_disable)
 {
+  struct vrf *vrf;
   struct listnode *i;
   struct interface *ifp;
   int send_linkup;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    for (ALL_LIST_ELEMENTS_RO (vrf_iter2iflist (iter), i, ifp))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    for (ALL_LIST_ELEMENTS_RO (vrf->iflist, i, ifp))
       {
         send_linkup = 0;
         if (ifp->ptm_enable)
index 394469950dde335618a90bffbd74ee5bcade2eba..ec7d1e7fde8a2c17e3917f680c8d3ee95f3f9874 100644 (file)
@@ -2052,24 +2052,24 @@ process_subq (struct list * subq, u_char qindex)
 static void
 meta_queue_process_complete (struct work_queue *dummy)
 {
-  vrf_iter_t iter;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
 
   /* Evaluate nexthops for those VRFs which underwent route processing. This
    * should limit the evaluation to the necessary VRFs in most common
    * situations.
    */
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if (((zvrf = vrf_iter2info (iter)) != NULL) &&
-          (zvrf->flags & ZEBRA_VRF_RIB_SCHEDULED))
-        {
-          zvrf->flags &= ~ZEBRA_VRF_RIB_SCHEDULED;
-          zebra_evaluate_rnh(zvrf->vrf_id, AF_INET, 0, RNH_NEXTHOP_TYPE, NULL);
-          zebra_evaluate_rnh(zvrf->vrf_id, AF_INET, 0, RNH_IMPORT_CHECK_TYPE, NULL);
-          zebra_evaluate_rnh(zvrf->vrf_id, AF_INET6, 0, RNH_NEXTHOP_TYPE, NULL);
-          zebra_evaluate_rnh(zvrf->vrf_id, AF_INET6, 0, RNH_IMPORT_CHECK_TYPE, NULL);
-        }
+      zvrf = vrf->info;
+      if (zvrf == NULL || !(zvrf->flags & ZEBRA_VRF_RIB_SCHEDULED))
+       continue;
+
+      zvrf->flags &= ~ZEBRA_VRF_RIB_SCHEDULED;
+      zebra_evaluate_rnh(zvrf->vrf_id, AF_INET, 0, RNH_NEXTHOP_TYPE, NULL);
+      zebra_evaluate_rnh(zvrf->vrf_id, AF_INET, 0, RNH_IMPORT_CHECK_TYPE, NULL);
+      zebra_evaluate_rnh(zvrf->vrf_id, AF_INET6, 0, RNH_NEXTHOP_TYPE, NULL);
+      zebra_evaluate_rnh(zvrf->vrf_id, AF_INET6, 0, RNH_IMPORT_CHECK_TYPE, NULL);
     }
 
   /* Schedule LSPs for processing, if needed. */
@@ -3037,11 +3037,11 @@ rib_weed_table (struct route_table *table)
 void
 rib_weed_tables (void)
 {
-  vrf_iter_t iter;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       {
         rib_weed_table (zvrf->table[AFI_IP][SAFI_UNICAST]);
         rib_weed_table (zvrf->table[AFI_IP6][SAFI_UNICAST]);
@@ -3078,11 +3078,11 @@ rib_sweep_table (struct route_table *table)
 void
 rib_sweep_route (void)
 {
-  vrf_iter_t iter;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       {
         rib_sweep_table (zvrf->table[AFI_IP][SAFI_UNICAST]);
         rib_sweep_table (zvrf->table[AFI_IP6][SAFI_UNICAST]);
@@ -3118,12 +3118,12 @@ rib_score_proto_table (u_char proto, u_short instance, struct route_table *table
 unsigned long
 rib_score_proto (u_char proto, u_short instance)
 {
-  vrf_iter_t iter;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
   unsigned long cnt = 0;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       cnt += rib_score_proto_table (proto, instance, zvrf->table[AFI_IP][SAFI_UNICAST])
             +rib_score_proto_table (proto, instance, zvrf->table[AFI_IP6][SAFI_UNICAST]);
 
@@ -3157,20 +3157,20 @@ rib_close_table (struct route_table *table)
 void
 rib_close (void)
 {
-  vrf_iter_t iter;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
   struct listnode *node;
   struct interface *ifp;
   u_int32_t table_id;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) != NULL)
+      if ((zvrf = vrf->info) != NULL)
         {
           rib_close_table (zvrf->table[AFI_IP][SAFI_UNICAST]);
           rib_close_table (zvrf->table[AFI_IP6][SAFI_UNICAST]);
         }
-      for (ALL_LIST_ELEMENTS_RO (vrf_iter2iflist (iter), node, ifp))
+      for (ALL_LIST_ELEMENTS_RO (vrf->iflist, node, ifp))
         if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp);
     }
 
@@ -3207,17 +3207,16 @@ rib_init (void)
 static inline int
 vrf_id_get_next (vrf_id_t vrf_id, vrf_id_t *next_id_p)
 {
-  vrf_iter_t iter = vrf_iterator (vrf_id);
-  struct zebra_vrf *zvrf = vrf_iter2info (iter);
+  struct vrf *vrf;
 
-  /* The same one ? Then find out the next. */
-  if (zvrf && (zvrf->vrf_id == vrf_id))
-    zvrf = vrf_iter2info (vrf_next (iter));
-
-  if (zvrf)
+  vrf = vrf_lookup (vrf_id);
+  if (vrf)
     {
-      *next_id_p = zvrf->vrf_id;
-      return 1;
+      vrf = RB_NEXT (vrf_id_head, &vrfs_by_id, vrf);
+      if (vrf) {
+         *next_id_p = vrf->vrf_id;
+         return 1;
+      }
     }
 
   return 0;
index 25091a3eab46308d48cd2478923fcf1c3f2114b5..3075a61c4a5bec33f172449f4c74b213f1f26c1c 100644 (file)
@@ -633,7 +633,7 @@ DEFUN (set_src,
   struct interface *pif = NULL;
   int family;
   struct prefix p;
-  vrf_iter_t iter;
+  struct vrf *vrf;
 
   if (inet_pton(AF_INET, argv[0], &src.ipv4) != 1)
     {
@@ -660,14 +660,14 @@ DEFUN (set_src,
          return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
       if (family == AF_INET)
         pif = if_lookup_exact_address_vrf ((void *)&src.ipv4, AF_INET,
-                                           vrf_iter2id (iter));
+                                           vrf->vrf_id);
       else if (family == AF_INET6)
         pif = if_lookup_exact_address_vrf ((void *)&src.ipv6, AF_INET6,
-                                           vrf_iter2id (iter));
+                                           vrf->vrf_id);
 
       if (pif != NULL)
         break;
index 915849c057d01a6cc5cb610ebfdc1e2eedaa5b82..4c1bbbb1a0c4de7109350dccbccfce42fa1e5f8b 100644 (file)
@@ -68,11 +68,10 @@ void
 zebra_vrf_update_all (struct zserv *client)
 {
   struct vrf *vrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((vrf = vrf_iter2vrf (iter)) && vrf->vrf_id)
+      if (vrf->vrf_id)
         zsend_vrf_add (client, vrf_info_lookup (vrf->vrf_id));
     }
 }
index 74f64dd05757a68553a02292aaaa8a3e1e080005..444d25135745a1c9ddf0a3e9c7793182f49e04d8 100644 (file)
@@ -2569,11 +2569,11 @@ DEFUN (show_ip_nht_vrf_all,
        "IP nexthop tracking table\n"
        VRF_ALL_CMD_HELP_STR)
 {
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       {
         vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
         zebra_print_rnh_table(zvrf->vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE);
@@ -2614,11 +2614,11 @@ DEFUN (show_ipv6_nht_vrf_all,
        "IPv6 nexthop tracking table\n"
        VRF_ALL_CMD_HELP_STR)
 {
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       {
         vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
         zebra_print_rnh_table(zvrf->vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE);
@@ -3287,14 +3287,14 @@ DEFUN (show_ip_route_vrf_all,
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int first = 1;
   int vrf_header = 1;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -3334,8 +3334,8 @@ DEFUN (show_ip_route_vrf_all_tag,
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int first = 1;
   int vrf_header = 1;
   route_tag_t tag = 0;
@@ -3343,9 +3343,9 @@ DEFUN (show_ip_route_vrf_all_tag,
   if (argv[0])
     tag = atol(argv[0]);
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -3388,8 +3388,8 @@ DEFUN (show_ip_route_vrf_all_prefix_longer,
   struct route_node *rn;
   struct rib *rib;
   struct prefix p;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int ret;
   int first = 1;
   int vrf_header = 1;
@@ -3401,9 +3401,9 @@ DEFUN (show_ip_route_vrf_all_prefix_longer,
       return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -3443,15 +3443,15 @@ DEFUN (show_ip_route_vrf_all_supernets,
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   u_int32_t addr;
   int first = 1;
   int vrf_header = 1;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -3498,8 +3498,8 @@ DEFUN (show_ip_route_vrf_all_protocol,
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int first = 1;
   int vrf_header = 1;
 
@@ -3510,9 +3510,9 @@ DEFUN (show_ip_route_vrf_all_protocol,
       return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -3553,8 +3553,8 @@ DEFUN (show_ip_route_vrf_all_addr,
   struct prefix_ipv4 p;
   struct route_table *table;
   struct route_node *rn;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
   ret = str2prefix_ipv4 (argv[0], &p);
   if (ret <= 0)
@@ -3563,9 +3563,9 @@ DEFUN (show_ip_route_vrf_all_addr,
       return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -3594,8 +3594,8 @@ DEFUN (show_ip_route_vrf_all_prefix,
   struct prefix_ipv4 p;
   struct route_table *table;
   struct route_node *rn;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
   ret = str2prefix_ipv4 (argv[0], &p);
   if (ret <= 0)
@@ -3604,9 +3604,9 @@ DEFUN (show_ip_route_vrf_all_prefix,
       return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -3636,11 +3636,11 @@ DEFUN (show_ip_route_vrf_all_summary,
        VRF_ALL_CMD_HELP_STR
        "Summary of all routes\n")
 {
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       vty_show_ip_route_summary (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
 
   return CMD_SUCCESS;
@@ -3656,11 +3656,11 @@ DEFUN (show_ip_route_vrf_all_summary_prefix,
        "Summary of all routes\n"
        "Prefix routes\n")
 {
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
 
   return CMD_SUCCESS;
@@ -5416,14 +5416,14 @@ DEFUN (show_ipv6_route_vrf_all,
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int first = 1;
   int vrf_header = 1;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -5463,8 +5463,8 @@ DEFUN (show_ipv6_route_vrf_all_tag,
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int first = 1;
   int vrf_header = 1;
   route_tag_t tag = 0;
@@ -5472,9 +5472,9 @@ DEFUN (show_ipv6_route_vrf_all_tag,
   if (argv[0])
     tag = atol(argv[0]);
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -5518,8 +5518,8 @@ DEFUN (show_ipv6_route_vrf_all_prefix_longer,
   struct route_node *rn;
   struct rib *rib;
   struct prefix p;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int ret;
   int first = 1;
   int vrf_header = 1;
@@ -5531,9 +5531,9 @@ DEFUN (show_ipv6_route_vrf_all_prefix_longer,
       return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -5574,8 +5574,8 @@ DEFUN (show_ipv6_route_vrf_all_protocol,
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int first = 1;
   int vrf_header = 1;
 
@@ -5586,9 +5586,9 @@ DEFUN (show_ipv6_route_vrf_all_protocol,
       return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -5629,8 +5629,8 @@ DEFUN (show_ipv6_route_vrf_all_addr,
   struct prefix_ipv6 p;
   struct route_table *table;
   struct route_node *rn;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
   ret = str2prefix_ipv6 (argv[0], &p);
   if (ret <= 0)
@@ -5639,9 +5639,9 @@ DEFUN (show_ipv6_route_vrf_all_addr,
       return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -5670,8 +5670,8 @@ DEFUN (show_ipv6_route_vrf_all_prefix,
   struct prefix_ipv6 p;
   struct route_table *table;
   struct route_node *rn;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
   ret = str2prefix_ipv6 (argv[0], &p);
   if (ret <= 0)
@@ -5680,9 +5680,9 @@ DEFUN (show_ipv6_route_vrf_all_prefix,
       return CMD_WARNING;
     }
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -5712,11 +5712,11 @@ DEFUN (show_ipv6_route_vrf_all_summary,
        VRF_ALL_CMD_HELP_STR
        "Summary of all IPv6 routes\n")
 {
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       vty_show_ip_route_summary (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]);
 
   return CMD_SUCCESS;
@@ -5733,13 +5733,13 @@ DEFUN (show_ipv6_mroute_vrf_all,
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
   int first = 1;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+      if ((zvrf = vrf->info) == NULL ||
           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
         continue;
 
@@ -5768,11 +5768,11 @@ DEFUN (show_ipv6_route_vrf_all_summary_prefix,
        "Summary of all IPv6 routes\n"
        "Prefix routes\n")
 {
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
+    if ((zvrf = vrf->info) != NULL)
       vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]);
 
   return CMD_SUCCESS;
index 0b69af512491e59fbd0757ed2a428fd722fe3420..76fdebb3a56747c4de6e70ba17d773bd31d46caa 100644 (file)
@@ -1005,18 +1005,16 @@ zsend_router_id_update (struct zserv *client, struct prefix *p,
 static int
 zread_interface_add (struct zserv *client, u_short length, struct zebra_vrf *zvrf)
 {
+  struct vrf *vrf;
   struct listnode *ifnode, *ifnnode;
-  vrf_iter_t iter;
   struct interface *ifp;
-  struct zebra_vrf *zvrf_iter;
 
   /* Interface information is needed. */
   vrf_bitmap_set (client->ifinfo, zvrf->vrf_id);
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      zvrf_iter = vrf_iter2info (iter);
-      for (ALL_LIST_ELEMENTS (vrf_iflist (zvrf_iter->vrf_id), ifnode, ifnnode, ifp))
+      for (ALL_LIST_ELEMENTS (vrf->iflist, ifnode, ifnnode, ifp))
         {
           /* Skip pseudo interface. */
           if (! CHECK_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE))
@@ -1724,12 +1722,12 @@ zread_mpls_labels (int command, struct zserv *client, u_short length,
 static void
 zebra_client_close_cleanup_rnh (struct zserv *client)
 {
-  vrf_iter_t iter;
+  struct vrf *vrf;
   struct zebra_vrf *zvrf;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
     {
-      if ((zvrf = vrf_iter2info (iter)) != NULL)
+      if ((zvrf = vrf->info) != NULL)
         {
           zebra_cleanup_rnh_client(zvrf->vrf_id, AF_INET, client, RNH_NEXTHOP_TYPE);
           zebra_cleanup_rnh_client(zvrf->vrf_id, AF_INET6, client, RNH_NEXTHOP_TYPE);