summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ripngd/ripng_main.c3
-rw-r--r--ripngd/ripng_zebra.c3
-rw-r--r--ripngd/ripngd.c102
3 files changed, 49 insertions, 59 deletions
diff --git a/ripngd/ripng_main.c b/ripngd/ripng_main.c
index 10e19efe7..b7e5739ed 100644
--- a/ripngd/ripng_main.c
+++ b/ripngd/ripng_main.c
@@ -82,7 +82,8 @@ static void sigint(void)
{
zlog_notice("Terminating on signal");
- ripng_clean();
+ if (ripng)
+ ripng_clean();
ripng_zebra_stop();
frr_fini();
diff --git a/ripngd/ripng_zebra.c b/ripngd/ripng_zebra.c
index e3f42edf5..7b7456197 100644
--- a/ripngd/ripng_zebra.c
+++ b/ripngd/ripng_zebra.c
@@ -173,9 +173,6 @@ void ripng_redistribute_clean()
VRF_DEFAULT);
vrf_bitmap_unset(zclient->redist[AFI_IP6][i], VRF_DEFAULT);
-
- /* Remove the routes from RIP table. */
- ripng_redistribute_withdraw(i);
}
}
diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c
index 03383bc26..13e360694 100644
--- a/ripngd/ripngd.c
+++ b/ripngd/ripngd.c
@@ -1026,9 +1026,6 @@ void ripng_redistribute_withdraw(int type)
struct ripng_info *rinfo = NULL;
struct list *list = NULL;
- if (!ripng)
- return;
-
for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp))
if ((list = rp->info) != NULL) {
rinfo = listgetdata(listhead(list));
@@ -2403,77 +2400,72 @@ static void ripng_distribute_update_all_wrapper(struct access_list *notused)
/* delete all the added ripng routes. */
void ripng_clean()
{
- int i;
struct agg_node *rp;
- struct ripng_info *rinfo;
- struct ripng_aggregate *aggregate;
- struct list *list = NULL;
- struct listnode *listnode = NULL;
- if (ripng) {
- /* Clear RIPng routes */
- for (rp = agg_route_top(ripng->table); rp;
- rp = agg_route_next(rp)) {
- if ((list = rp->info) != NULL) {
- rinfo = listgetdata(listhead(list));
- if (ripng_route_rte(rinfo))
- ripng_zebra_ipv6_delete(rp);
+ /* Clear RIPng routes */
+ for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp)) {
+ struct ripng_aggregate *aggregate;
+ struct list *list;
- for (ALL_LIST_ELEMENTS_RO(list, listnode,
- rinfo)) {
- RIPNG_TIMER_OFF(rinfo->t_timeout);
- RIPNG_TIMER_OFF(
- rinfo->t_garbage_collect);
- ripng_info_free(rinfo);
- }
- list_delete(&list);
- rp->info = NULL;
- agg_unlock_node(rp);
- }
+ if ((list = rp->info) != NULL) {
+ struct ripng_info *rinfo;
+ struct listnode *listnode;
- if ((aggregate = rp->aggregate) != NULL) {
- ripng_aggregate_free(aggregate);
- rp->aggregate = NULL;
- agg_unlock_node(rp);
+ rinfo = listgetdata(listhead(list));
+ if (ripng_route_rte(rinfo))
+ ripng_zebra_ipv6_delete(rp);
+
+ for (ALL_LIST_ELEMENTS_RO(list, listnode, rinfo)) {
+ RIPNG_TIMER_OFF(rinfo->t_timeout);
+ RIPNG_TIMER_OFF(rinfo->t_garbage_collect);
+ ripng_info_free(rinfo);
}
+ list_delete(&list);
+ rp->info = NULL;
+ agg_unlock_node(rp);
}
- /* Cancel the RIPng timers */
- RIPNG_TIMER_OFF(ripng->t_update);
- RIPNG_TIMER_OFF(ripng->t_triggered_update);
- RIPNG_TIMER_OFF(ripng->t_triggered_interval);
-
- /* Cancel the read thread */
- if (ripng->t_read) {
- thread_cancel(ripng->t_read);
- ripng->t_read = NULL;
+ if ((aggregate = rp->aggregate) != NULL) {
+ ripng_aggregate_free(aggregate);
+ rp->aggregate = NULL;
+ agg_unlock_node(rp);
}
+ }
- /* Close the RIPng socket */
- if (ripng->sock >= 0) {
- close(ripng->sock);
- ripng->sock = -1;
- }
+ /* Cancel the RIPng timers */
+ RIPNG_TIMER_OFF(ripng->t_update);
+ RIPNG_TIMER_OFF(ripng->t_triggered_update);
+ RIPNG_TIMER_OFF(ripng->t_triggered_interval);
- for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
- if (ripng->route_map[i].name)
- free(ripng->route_map[i].name);
+ /* Cancel the read thread */
+ if (ripng->t_read) {
+ thread_cancel(ripng->t_read);
+ ripng->t_read = NULL;
+ }
+
+ /* Close the RIPng socket */
+ if (ripng->sock >= 0) {
+ close(ripng->sock);
+ ripng->sock = -1;
+ }
- agg_table_finish(ripng->table);
+ for (int i = 0; i < ZEBRA_ROUTE_MAX; i++)
+ if (ripng->route_map[i].name)
+ free(ripng->route_map[i].name);
- stream_free(ripng->ibuf);
- stream_free(ripng->obuf);
+ agg_table_finish(ripng->table);
+ distribute_list_delete(&ripng->distribute_ctx);
- distribute_list_delete(&ripng->distribute_ctx);
- XFREE(MTYPE_RIPNG, ripng);
- ripng = NULL;
- } /* if (ripng) */
+ stream_free(ripng->ibuf);
+ stream_free(ripng->obuf);
ripng_clean_network();
ripng_passive_interface_clean();
ripng_offset_clean();
ripng_interface_clean();
ripng_redistribute_clean();
+
+ XFREE(MTYPE_RIPNG, ripng);
}
static void ripng_if_rmap_update(struct if_rmap *if_rmap)