lib: convert vrf code to use red-black trees as well

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
Renato Westphal 2016-10-29 14:37:11 -02:00
parent c7fdd84f36
commit 1a1a70655c
14 changed files with 188 additions and 371 deletions

View file

@ -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))
{

195
lib/vrf.c
View file

@ -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))
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)
while ((vrf = RB_ROOT (&vrfs_by_id)) != NULL)
vrf_delete (vrf);
route_table_finish (vrf_table);
vrf_table = NULL;
}
/* Create a socket for the VRF. */

View file

@ -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
*/

View 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_out (vty, "%s\tVRF %u%s%s", VTY_NEWLINE, vrf->vrf_id,
VTY_NEWLINE, VTY_NEWLINE);
if_show_description (vty, vrf_iter2id (iter));
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;

View 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;

View 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)

View 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;

View 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) ||

View 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)

View file

@ -2052,25 +2052,25 @@ 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))
{
if (((zvrf = vrf_iter2info (iter)) != NULL) &&
(zvrf->flags & ZEBRA_VRF_RIB_SCHEDULED))
RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
{
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. */
zvrf = vrf_info_lookup(VRF_DEFAULT);
@ -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,18 +3207,17 @@ 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;
vrf = RB_NEXT (vrf_id_head, &vrfs_by_id, vrf);
if (vrf) {
*next_id_p = vrf->vrf_id;
return 1;
}
}
return 0;
}

View 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;

View 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));
}
}

View 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;

View 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);