From: Renato Westphal Date: Fri, 4 Jan 2019 21:08:10 +0000 (-0200) Subject: ripngd: simplify cleaning up of routing instance X-Git-Tag: 7.1_pulled~99^2~23 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=a9caf6e9399536bfe0383e9ab0a7b6f83972a2e5;p=matthieu%2Ffrr.git ripngd: simplify cleaning up of routing instance * Call ripng_clean() only when RIPng is configured, this way we can remove one indentation level from this function. * ripng_redistribute_clean() is only called on shutdown, so there's no need to call ripng_redistribute_withdraw() there since the RIPng table is already cleaned up elsewhere. * Deallocate the ripng structure only at the end of the function. This prepares the ground for the next commits where all global variables will be moved to the ripng structure. Signed-off-by: Renato Westphal --- diff --git a/ripngd/ripng_main.c b/ripngd/ripng_main.c index 10e19efe77..b7e5739ed2 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 e3f42edf51..7b74561973 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 03383bc26d..13e3606946 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)