#include "zebra/router-id.h"
extern struct zebra_t zebrad;
+struct list *zvrf_list;
/* VRF information update. */
static void
if (! zvrf)
{
- zvrf = zebra_vrf_alloc (vrf_id, name);
- zvrf->zns = zebra_ns_lookup (NS_DEFAULT); /* Point to the global (single) NS */
- *info = (void *)zvrf;
- router_id_init (zvrf);
+ zvrf = zebra_vrf_list_lookup_by_name (name);
+ if (!zvrf)
+ {
+ zvrf = zebra_vrf_alloc (vrf_id, name);
+ zvrf->zns = zebra_ns_lookup (NS_DEFAULT); /* Point to the global (single) NS */
+ *info = (void *)zvrf;
+ router_id_init (zvrf);
+ listnode_add_sort (zvrf_list, zvrf);
+ }
+ else
+ {
+ *info = (void *)zvrf;
+ router_id_init (zvrf);
+ }
}
if (zvrf->vrf_id == VRF_UNKNOWN)
list_delete_all_node (zvrf->rid_all_sorted_list);
list_delete_all_node (zvrf->rid_lo_sorted_list);
- XFREE (MTYPE_ZEBRA_VRF, zvrf);
+ zvrf->vrf_id = VRF_UNKNOWN;
+ *info = NULL;
return 0;
}
return vrf_info_lookup (vrf_id);
}
+/* Lookup the zvrf in the zvrf_list. */
+struct zebra_vrf *
+zebra_vrf_list_lookup_by_name (const char *name)
+{
+ struct listnode *node;
+ struct zebra_vrf *zvrf;
+
+ if (name)
+ for (ALL_LIST_ELEMENTS_RO (zvrf_list, node, zvrf))
+ {
+ if (strcmp(name, zvrf->name) == 0)
+ return zvrf;
+ }
+ return NULL;
+}
+
/* Lookup the routing table in an enabled VRF. */
struct route_table *
zebra_vrf_table (afi_t afi, safi_t safi, vrf_id_t vrf_id)
vrf_add_hook (VRF_DISABLE_HOOK, zebra_vrf_disable);
vrf_add_hook (VRF_DELETE_HOOK, zebra_vrf_delete);
+ zvrf_list = list_new ();
+
vrf_init ();
}
extern void zebra_vrf_static_route_interface_fixup (struct interface *ifp);
extern void zebra_vrf_update_all (struct zserv *client);
extern struct zebra_vrf *zebra_vrf_lookup (vrf_id_t vrf_id);
+extern struct zebra_vrf *zebra_vrf_list_lookup_by_name (const char *);
extern struct zebra_vrf *zebra_vrf_alloc (vrf_id_t, const char *);
extern struct route_table *zebra_vrf_table (afi_t, safi_t, vrf_id_t);
extern struct route_table *zebra_vrf_static_table (afi_t, safi_t, struct zebra_vrf *zvrf);