From 871d39b32536cc0139d1265acda371d574842121 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 3 May 2016 20:17:29 -0400 Subject: [PATCH] zebra: Save the zvrf in a zvrf_list The zebra vrf needs to be saved in a zvrf_list so that we can tell when things start/stop correctly Ticket: CM-10139 Signed-off-by: Don Slice Signed-off-by: Donald Sharp Reviewed-by: Vivek Venkatraman --- zebra/zebra_vrf.c | 40 +++++++++++++++++++++++++++++++++++----- zebra/zebra_vrf.h | 1 + 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c index f76bc98190..04aa16f71b 100644 --- a/zebra/zebra_vrf.c +++ b/zebra/zebra_vrf.c @@ -31,6 +31,7 @@ #include "zebra/router-id.h" extern struct zebra_t zebrad; +struct list *zvrf_list; /* VRF information update. */ static void @@ -82,10 +83,20 @@ zebra_vrf_new (vrf_id_t vrf_id, const char *name, void **info) 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) @@ -231,8 +242,9 @@ zebra_vrf_delete (vrf_id_t vrf_id, const char *name, void **info) 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; } @@ -326,6 +338,22 @@ zebra_vrf_lookup (vrf_id_t vrf_id) 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) @@ -399,5 +427,7 @@ zebra_vrf_init (void) vrf_add_hook (VRF_DISABLE_HOOK, zebra_vrf_disable); vrf_add_hook (VRF_DELETE_HOOK, zebra_vrf_delete); + zvrf_list = list_new (); + vrf_init (); } diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h index 54f8bdc744..e9653410c6 100644 --- a/zebra/zebra_vrf.h +++ b/zebra/zebra_vrf.h @@ -83,6 +83,7 @@ zebra_vrf_table_with_table_id (afi_t afi, safi_t safi, 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); -- 2.39.5