ripd: clear list of peers when RIP is deconfigured

This is an old standing bug where the list of RIP peers wasn't
cleared after deconfiguring RIP, which caused the existing peers
to still be present on a newly configured RIP instance (except when
the timed out after ~3 minutes). Fix this.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
Renato Westphal 2019-01-04 19:08:10 -02:00
parent 2826309c11
commit 711915d2cd
3 changed files with 9 additions and 0 deletions

View File

@ -36,6 +36,7 @@ static struct rip_peer *rip_peer_new(void)
static void rip_peer_free(struct rip_peer *peer)
{
RIP_TIMER_OFF(peer->t_timeout);
XFREE(MTYPE_RIP_PEER, peer);
}
@ -174,3 +175,8 @@ int rip_peer_list_cmp(struct rip_peer *p1, struct rip_peer *p2)
return (htonl(p1->addr.s_addr) < htonl(p2->addr.s_addr)) ? -1 : 1;
}
void rip_peer_list_del(void *arg)
{
rip_peer_free(arg);
}

View File

@ -2609,6 +2609,7 @@ 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->peer_list->del = rip_peer_list_del;
rip->distance_table = route_table_init();
rip->distance_table->cleanup = rip_distance_table_node_cleanup;
rip->enable_interface = vector_init(1);
@ -3288,6 +3289,7 @@ void rip_clean(void)
route_table_finish(rip->table);
route_table_finish(rip->neighbor);
list_delete(&rip->peer_list);
distribute_list_delete(&rip->distribute_ctx);
rip_clean_network();

View File

@ -449,6 +449,7 @@ extern void rip_peer_display(struct vty *);
extern struct rip_peer *rip_peer_lookup(struct in_addr *);
extern struct rip_peer *rip_peer_lookup_next(struct in_addr *);
extern int rip_peer_list_cmp(struct rip_peer *p1, struct rip_peer *p2);
extern void rip_peer_list_del(void *arg);
extern void rip_info_free(struct rip_info *);
extern struct rip_distance *rip_distance_new(void);