diff options
| -rw-r--r-- | babeld/babel_main.c | 2 | ||||
| -rw-r--r-- | bgpd/bgp_fsm.c | 2 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 10 | ||||
| -rw-r--r-- | bgpd/bgp_routemap.c | 3 | ||||
| -rw-r--r-- | eigrpd/eigrp_main.c | 2 | ||||
| -rw-r--r-- | isisd/isis_affinitymap.c | 4 | ||||
| -rw-r--r-- | isisd/isis_affinitymap.h | 1 | ||||
| -rw-r--r-- | isisd/isis_main.c | 4 | ||||
| -rw-r--r-- | lib/affinitymap.c | 9 | ||||
| -rw-r--r-- | lib/affinitymap.h | 2 | ||||
| -rw-r--r-- | ripd/rip_main.c | 1 | ||||
| -rw-r--r-- | zebra/main.c | 2 |
12 files changed, 40 insertions, 2 deletions
diff --git a/babeld/babel_main.c b/babeld/babel_main.c index ddc75f7182..77658eb57d 100644 --- a/babeld/babel_main.c +++ b/babeld/babel_main.c @@ -19,6 +19,7 @@ Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek #include "memory.h" #include "libfrr.h" #include "lib_errors.h" +#include "plist.h" #include "babel_main.h" #include "babeld.h" @@ -313,6 +314,7 @@ babel_exit_properly(void) debugf(BABEL_DEBUG_COMMON, "Done."); vrf_terminate(); + prefix_list_reset(); frr_fini(); exit(0); diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 478f8c9136..940d93a8df 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -1260,7 +1260,7 @@ void bgp_fsm_change_status(struct peer_connection *connection, /* Transition into Clearing or Deleted must /always/ clear all routes.. * (and must do so before actually changing into Deleted.. */ - if (status >= Clearing && (peer->established || peer == bgp->peer_self)) { + if (status >= Clearing && (peer->established || peer != bgp->peer_self)) { bgp_clear_route_all(peer); /* If no route was queued for the clear-node processing, diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 003a9a4d4d..71a1149d10 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -4323,9 +4323,14 @@ static void early_meta_queue_free(struct meta_queue *mq, struct bgp_dest_queue * struct bgp_dest *dest; while (!STAILQ_EMPTY(l)) { + struct bgp_table *table; + dest = STAILQ_FIRST(l); STAILQ_REMOVE_HEAD(l, pq); STAILQ_NEXT(dest, pq) = NULL; /* complete unlink */ + + table = bgp_dest_table(dest); + bgp_table_unlock(table); mq->size--; } } @@ -4336,9 +4341,14 @@ static void other_meta_queue_free(struct meta_queue *mq, struct bgp_dest_queue * struct bgp_dest *dest; while (!STAILQ_EMPTY(l)) { + struct bgp_table *table; + dest = STAILQ_FIRST(l); STAILQ_REMOVE_HEAD(l, pq); STAILQ_NEXT(dest, pq) = NULL; /* complete unlink */ + + table = bgp_dest_table(dest); + bgp_table_unlock(table); mq->size--; } } diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index c7c8f157ca..15ad921ad0 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -2615,6 +2615,9 @@ route_set_aspath_exclude(void *rule, const struct prefix *dummy, void *object) path->attr->aspath = aspath_filter_exclude_acl(new_path, ase->exclude_aspath_acl); + else + aspath_free(new_path); + return RMAP_OKAY; } diff --git a/eigrpd/eigrp_main.c b/eigrpd/eigrp_main.c index 089e18439f..c9ce018966 100644 --- a/eigrpd/eigrp_main.c +++ b/eigrpd/eigrp_main.c @@ -99,6 +99,8 @@ static void sigint(void) keychain_terminate(); route_map_finish(); + prefix_list_reset(); + eigrp_terminate(); exit(0); diff --git a/isisd/isis_affinitymap.c b/isisd/isis_affinitymap.c index 595091db27..a6b9cf9d4c 100644 --- a/isisd/isis_affinitymap.c +++ b/isisd/isis_affinitymap.c @@ -64,4 +64,8 @@ void isis_affinity_map_init(void) affinity_map_set_update_hook(isis_affinity_map_update); } +void isis_affinity_map_terminate(void) +{ + affinity_map_terminate(); +} #endif /* ifndef FABRICD */ diff --git a/isisd/isis_affinitymap.h b/isisd/isis_affinitymap.h index c432e99f51..525ee0467a 100644 --- a/isisd/isis_affinitymap.h +++ b/isisd/isis_affinitymap.h @@ -15,6 +15,7 @@ extern "C" { #endif extern void isis_affinity_map_init(void); +extern void isis_affinity_map_terminate(void); #ifdef __cplusplus } diff --git a/isisd/isis_main.c b/isisd/isis_main.c index 0d9b3df39c..c36c531a17 100644 --- a/isisd/isis_main.c +++ b/isisd/isis_main.c @@ -109,6 +109,10 @@ static __attribute__((__noreturn__)) void terminate(int i) isis_master_terminate(); route_map_finish(); + prefix_list_reset(); +#ifndef FABRICD + isis_affinity_map_terminate(); +#endif vrf_terminate(); frr_fini(); diff --git a/lib/affinitymap.c b/lib/affinitymap.c index 6ff8e83f91..10b339364b 100644 --- a/lib/affinitymap.c +++ b/lib/affinitymap.c @@ -127,3 +127,12 @@ void affinity_map_set_update_hook(void (*func)(const char *affmap_name, { affinity_map_master.update_hook = func; } + +void affinity_map_terminate(void) +{ + struct affinity_map *map; + struct listnode *node, *nnode; + + for (ALL_LIST_ELEMENTS(affinity_map_master.maps, node, nnode, map)) + affinity_map_free(map); +} diff --git a/lib/affinitymap.h b/lib/affinitymap.h index ebe2659bf7..efac1d6423 100644 --- a/lib/affinitymap.h +++ b/lib/affinitymap.h @@ -71,7 +71,7 @@ void affinity_map_set_update_hook(void (*func)(const char *affmap_name, uint16_t new_pos)); void affinity_map_init(void); - +void affinity_map_terminate(void); #ifdef __cplusplus } diff --git a/ripd/rip_main.c b/ripd/rip_main.c index cfe4a7e437..431e967131 100644 --- a/ripd/rip_main.c +++ b/ripd/rip_main.c @@ -94,6 +94,7 @@ static void sigint(void) rip_zclient_stop(); route_map_finish(); + prefix_list_reset(); keychain_terminate(); frr_fini(); diff --git a/zebra/main.c b/zebra/main.c index 5c169bb839..af3998e384 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -247,6 +247,8 @@ void zebra_finalize(struct event *dummy) label_manager_terminate(); + affinity_map_terminate(); + ns_walk_func(zebra_ns_final_shutdown, NULL, NULL); ns_terminate(); |
