forked from Mirror/frr
lib: convert vrf code to use red-black trees as well
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
parent
c7fdd84f36
commit
1a1a70655c
35
lib/if.c
35
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))
|
||||
{
|
||||
|
|
199
lib/vrf.c
199
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. */
|
||||
|
|
45
lib/vrf.h
45
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
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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) ||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue