XFREE (MTYPE_HOST, host.motdfile);
if (host.config)
XFREE (MTYPE_HOST, host.config);
+
+ qobj_finish ();
}
void qobj_finish (void)
{
+ hash_clean (nodes, NULL);
hash_free (nodes);
nodes = NULL;
}
*
* Default function for creating a route node.
*/
-static struct route_node *
+struct route_node *
route_node_create (route_table_delegate_t *delegate,
struct route_table *table)
{
*
* Default function for destroying a route node.
*/
-static void
+void
route_node_destroy (route_table_delegate_t *delegate,
struct route_table *table, struct route_node *node)
{
extern unsigned long route_table_count (const struct route_table *);
+extern struct route_node *route_node_create (route_table_delegate_t *,
+ struct route_table *);
+extern void route_node_destroy (route_table_delegate_t *,
+ struct route_table *, struct route_node *);
+
extern struct route_node *
route_table_get_next (const struct route_table *table, struct prefix *p);
extern int
static void if_down_del_nbr_connected (struct interface *ifp);
+static void
+zebra_if_node_destroy (route_table_delegate_t *delegate,
+ struct route_table *table, struct route_node *node)
+{
+ if (node->info)
+ list_delete (node->info);
+ route_node_destroy (delegate, table, node);
+}
+
+route_table_delegate_t zebra_if_table_delegate = {
+ .create_node = route_node_create,
+ .destroy_node = zebra_if_node_destroy
+};
+
/* Called when new interface is added. */
static int
if_zebra_new_hook (struct interface *ifp)
#endif /* HAVE_RTADV */
/* Initialize installed address chains tree. */
- zebra_if->ipv4_subnets = route_table_init ();
+ zebra_if->ipv4_subnets = route_table_init_with_delegate (&zebra_if_table_delegate);
ifp->info = zebra_if;
zns = zebra_ns_lookup (NS_DEFAULT);
zebra_ns_disable (0, (void **)&zns);
+
+ access_list_reset ();
+ prefix_list_reset ();
+ route_map_finish ();
+ cmd_terminate ();
+ vty_terminate ();
+ zprivs_terminate (&zserv_privs);
+ list_delete (zebrad.client_list);
+ thread_master_free (zebrad.master);
+ if (zlog_default)
+ closezlog (zlog_default);
+
exit (0);
}
DECLARE_MTYPE(RIB_DEST)
DECLARE_MTYPE(RIB_TABLE_INFO)
DECLARE_MTYPE(RNH)
-DECLARE_MTYPE(NETLINK_NAME)
#endif /* _QUAGGA_ZEBRA_MEMORY_H */
vty_out (vty, "%s", VTY_NEWLINE);
}
- list_delete_all_node(lsp_list);
+ list_delete (lsp_list);
}
/*
}
}
- list_delete_all_node(slsp_list);
+ list_delete (slsp_list);
return (zvrf->slsp_table->count ? 1 : 0);
}
void
zebra_mpls_close_tables (struct zebra_vrf *zvrf)
{
- if (!zvrf)
- return;
hash_iterate(zvrf->lsp_table, lsp_uninstall_from_kernel, NULL);
+ hash_clean(zvrf->lsp_table, NULL);
+ hash_free(zvrf->lsp_table);
+ hash_clean(zvrf->slsp_table, NULL);
+ hash_free(zvrf->slsp_table);
}
/*
#include "zebra_memory.h"
DEFINE_MTYPE(ZEBRA, ZEBRA_NS, "Zebra Name Space")
-DEFINE_MTYPE(ZEBRA, NETLINK_NAME, "Netlink name")
struct zebra_ns *dzns;
zebra_ns_enable (ns_id_t ns_id, void **info)
{
struct zebra_ns *zns = (struct zebra_ns *) (*info);
-#ifdef HAVE_NETLINK
- char nl_name[64];
-#endif
#if defined (HAVE_RTADV)
rtadv_init (zns);
#ifdef HAVE_NETLINK
/* Initialize netlink sockets */
- snprintf (nl_name, 64, "netlink-listen (NS %u)", ns_id);
+ snprintf (zns->netlink.name, sizeof (zns->netlink.name),
+ "netlink-listen (NS %u)", ns_id);
zns->netlink.sock = -1;
- zns->netlink.name = XSTRDUP (MTYPE_NETLINK_NAME, nl_name);
- snprintf (nl_name, 64, "netlink-cmd (NS %u)", ns_id);
+ snprintf (zns->netlink_cmd.name, sizeof (zns->netlink_cmd.name),
+ "netlink-cmd (NS %u)", ns_id);
zns->netlink_cmd.sock = -1;
- zns->netlink_cmd.name = XSTRDUP (MTYPE_NETLINK_NAME, nl_name);
#endif
zns->if_table = route_table_init ();
kernel_init (zns);
{
struct zebra_ns *zns = (struct zebra_ns *) (*info);
+ route_table_finish (zns->if_table);
#if defined (HAVE_RTADV)
rtadv_terminate (zns);
#endif
int sock;
int seq;
struct sockaddr_nl snl;
- const char *name;
+ char name[64];
};
#endif
buffer_flush_all(ptm_cb.wb, ptm_cb.ptm_sock);
+ free (ptm_hdl);
+
if (ptm_cb.out_data)
free(ptm_cb.out_data);