]> git.proxmox.com Git - mirror_frr.git/commitdiff
ripd: clear list of peers when RIP is deconfigured
authorRenato Westphal <renato@opensourcerouting.org>
Fri, 4 Jan 2019 21:08:10 +0000 (19:08 -0200)
committerRenato Westphal <renato@opensourcerouting.org>
Fri, 18 Jan 2019 18:15:41 +0000 (16:15 -0200)
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>
ripd/rip_peer.c
ripd/ripd.c
ripd/ripd.h

index ca3f25e9499bbb3eb4061c4642b93790d6748322..07b295030edfb9fd787554adcd9540332ba8b8ab 100644 (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);
+}
index 49787db2bbc26c19f36f0d74b0b23681b9528952..a6cfd9b151d772cde5ca46a81bd5d13e1d30ce90 100644 (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();
index 6936ad12378696b394d412a2bdd19ee9f5b2c646..af0d3021a6f1a01b21ea894f7ed16f0f326d4cdd 100644 (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);