From: Renato Westphal Date: Fri, 4 Jan 2019 21:08:10 +0000 (-0200) Subject: ripd: move "rip_distance_table" to the rip structure X-Git-Tag: 7.1_pulled~99^2~26 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=2826309c11e8b2af4593f3460a21e44f906a55a4;p=matthieu%2Ffrr.git ripd: move "rip_distance_table" to the rip structure Signed-off-by: Renato Westphal --- diff --git a/ripd/rip_northbound.c b/ripd/rip_northbound.c index 17ba672614..b0f2b62a5d 100644 --- a/ripd/rip_northbound.c +++ b/ripd/rip_northbound.c @@ -173,7 +173,7 @@ static int ripd_instance_distance_source_create(enum nb_event event, apply_mask_ipv4(&prefix); /* Get RIP distance node. */ - rn = route_node_get(rip_distance_table, (struct prefix *)&prefix); + rn = route_node_get(rip->distance_table, (struct prefix *)&prefix); rn->info = rip_distance_new(); yang_dnode_set_entry(dnode, rn); @@ -191,10 +191,7 @@ static int ripd_instance_distance_source_delete(enum nb_event event, rn = yang_dnode_get_entry(dnode, true); rdistance = rn->info; - if (rdistance->access_list) - free(rdistance->access_list); rip_distance_free(rdistance); - rn->info = NULL; route_unlock_node(rn); diff --git a/ripd/ripd.c b/ripd/ripd.c index 1e92fedb63..49787db2bb 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -58,6 +58,8 @@ static void rip_output_process(struct connected *, struct sockaddr_in *, int, uint8_t); static int rip_triggered_update(struct thread *); static int rip_update_jitter(unsigned long); +static void rip_distance_table_node_cleanup(struct route_table *table, + struct route_node *node); static void rip_distribute_update(struct distribute_ctx *ctx, struct distribute *dist); @@ -2607,6 +2609,8 @@ int rip_create(int socket) rip->neighbor = route_table_init(); rip->peer_list = list_new(); rip->peer_list->cmp = (int (*)(void *, void *))rip_peer_list_cmp; + rip->distance_table = route_table_init(); + rip->distance_table->cleanup = rip_distance_table_node_cleanup; rip->enable_interface = vector_init(1); rip->enable_network = route_table_init(); rip->passive_nondefault = vector_init(1); @@ -2744,9 +2748,6 @@ rip_update_default_metric (void) } #endif - -struct route_table *rip_distance_table; - struct rip_distance *rip_distance_new(void) { return XCALLOC(MTYPE_RIP_DISTANCE, sizeof(struct rip_distance)); @@ -2754,22 +2755,19 @@ struct rip_distance *rip_distance_new(void) void rip_distance_free(struct rip_distance *rdistance) { + if (rdistance->access_list) + free(rdistance->access_list); XFREE(MTYPE_RIP_DISTANCE, rdistance); } -static void rip_distance_reset(void) +static void rip_distance_table_node_cleanup(struct route_table *table, + struct route_node *node) { - struct route_node *rn; struct rip_distance *rdistance; - for (rn = route_top(rip_distance_table); rn; rn = route_next(rn)) - if ((rdistance = rn->info) != NULL) { - if (rdistance->access_list) - free(rdistance->access_list); - rip_distance_free(rdistance); - rn->info = NULL; - route_unlock_node(rn); - } + rdistance = node->info; + if (rdistance) + rip_distance_free(rdistance); } /* Apply RIP information to distance method. */ @@ -2789,7 +2787,7 @@ uint8_t rip_distance_apply(struct rip_info *rinfo) p.prefixlen = IPV4_MAX_BITLEN; /* Check source address. */ - rn = route_node_match(rip_distance_table, (struct prefix *)&p); + rn = route_node_match(rip->distance_table, (struct prefix *)&p); if (rn) { rdistance = rn->info; route_unlock_node(rn); @@ -2824,7 +2822,7 @@ static void rip_distance_show(struct vty *vty) vty_out(vty, " Distance: (default is %u)\n", rip->distance ? rip->distance : ZEBRA_RIP_DISTANCE_DEFAULT); - for (rn = route_top(rip_distance_table); rn; rn = route_next(rn)) + for (rn = route_top(rip->distance_table); rn; rn = route_next(rn)) if ((rdistance = rn->info) != NULL) { if (header) { vty_out(vty, @@ -3299,7 +3297,7 @@ void rip_clean(void) vector_free(rip->passive_nondefault); list_delete(&rip->offset_list_master); rip_interfaces_clean(); - rip_distance_reset(); + route_table_finish(rip->distance_table); rip_redistribute_clean(); XFREE(MTYPE_RIP, rip); @@ -3407,7 +3405,4 @@ void rip_init(void) if_rmap_init(RIP_NODE); if_rmap_hook_add(rip_if_rmap_update); if_rmap_hook_delete(rip_if_rmap_update); - - /* Distance control. */ - rip_distance_table = route_table_init(); } diff --git a/ripd/ripd.h b/ripd/ripd.h index a75e43d5df..6936ad1237 100644 --- a/ripd/ripd.h +++ b/ripd/ripd.h @@ -486,8 +486,6 @@ extern struct thread_master *master; DECLARE_HOOK(rip_ifaddr_add, (struct connected * ifc), (ifc)) DECLARE_HOOK(rip_ifaddr_del, (struct connected * ifc), (ifc)) -extern struct route_table *rip_distance_table; - /* Northbound. */ extern void rip_cli_init(void); extern const struct frr_yang_module_info frr_ripd_info;