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);
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);
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);
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);
}
#endif
-
-struct route_table *rip_distance_table;
-
struct rip_distance *rip_distance_new(void)
{
return XCALLOC(MTYPE_RIP_DISTANCE, sizeof(struct rip_distance));
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. */
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);
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,
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);
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();
}