diff options
-rw-r--r-- | ripngd/ripng_main.c | 3 | ||||
-rw-r--r-- | ripngd/ripng_zebra.c | 3 | ||||
-rw-r--r-- | ripngd/ripngd.c | 102 |
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) |