diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index ced587e738..1fa3e8bc44 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2058,7 +2058,7 @@ bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi) return; if (bm->process_main_queue == NULL) - bgp_process_queue_init (); + return; pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE, sizeof (struct bgp_process_queue)); @@ -2083,7 +2083,7 @@ bgp_add_eoiu_mark (struct bgp *bgp) struct bgp_process_queue *pqnode; if (bm->process_main_queue == NULL) - bgp_process_queue_init (); + return; pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE, sizeof (struct bgp_process_queue)); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 9d76b3d58b..ce0718df5a 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -2533,14 +2533,14 @@ peer_group_delete (struct peer_group *group) XFREE(MTYPE_PEER_GROUP_HOST, group->name); group->name = NULL; + bfd_info_free(&(group->conf->bfd_info)); + group->conf->group = NULL; peer_delete (group->conf); /* Delete from all peer_group list. */ listnode_delete (bgp->group, group); - bfd_info_free(&(group->conf->bfd_info)); - peer_group_free (group); return 0; diff --git a/lib/vty.c b/lib/vty.c index 4d34fead8b..c6fc1e1b14 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -3121,6 +3121,8 @@ vty_terminate (void) vty_reset (); vector_free (vtyvec); vector_free (Vvty_serv_thread); + vtyvec = NULL; + Vvty_serv_thread = NULL; } } diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c index 71ee8975b5..67859fd46b 100644 --- a/zebra/zebra_rnh.c +++ b/zebra/zebra_rnh.c @@ -629,9 +629,6 @@ zebra_rnh_eval_nexthop_entry (vrf_id_t vrfid, int family, int force, */ if (!prefix_same(&rnh->resolved_route, &prn->p)) { - if (rib) - UNSET_FLAG(rib->status, RIB_ENTRY_NEXTHOPS_CHANGED); - if (prn) prefix_copy(&rnh->resolved_route, &prn->p); else @@ -642,9 +639,6 @@ zebra_rnh_eval_nexthop_entry (vrf_id_t vrfid, int family, int force, } else if (compare_state(rib, rnh->state)) { - if (rib) - UNSET_FLAG(rib->status, RIB_ENTRY_NEXTHOPS_CHANGED); - copy_state(rnh, rib, nrn); state_changed = 1; } @@ -701,6 +695,30 @@ zebra_rnh_evaluate_entry (vrf_id_t vrfid, int family, int force, rnh_type_t type nrn, rnh, prn, rib); } +/* + * Clear the RIB_ENTRY_NEXTHOPS_CHANGED flag + * from the rib entries. + * + * Please note we are doing this *after* we have + * notified the world about each nexthop as that + * we can have a situation where one rib entry + * covers multiple nexthops we are interested in. + */ +static void +zebra_rnh_clear_nhc_flag (vrf_id_t vrfid, int family, rnh_type_t type, + struct route_node *nrn) +{ + struct rnh *rnh; + struct rib *rib; + struct route_node *prn; + + rnh = nrn->info; + + rib = zebra_rnh_resolve_entry (vrfid, family, type, nrn, rnh, &prn); + + if (rib) + UNSET_FLAG (rib->status, RIB_ENTRY_NEXTHOPS_CHANGED); +} /* Evaluate all tracked entries (nexthops or routes for import into BGP) * of a particular VRF and address-family or a specific prefix. @@ -722,6 +740,7 @@ zebra_evaluate_rnh (vrf_id_t vrfid, int family, int force, rnh_type_t type, nrn = route_node_lookup (rnh_table, p); if (nrn && nrn->info) zebra_rnh_evaluate_entry (vrfid, family, force, type, nrn); + if (nrn) route_unlock_node (nrn); } @@ -735,6 +754,13 @@ zebra_evaluate_rnh (vrf_id_t vrfid, int family, int force, rnh_type_t type, zebra_rnh_evaluate_entry (vrfid, family, force, type, nrn); nrn = route_next(nrn); /* this will also unlock nrn */ } + nrn = route_top (rnh_table); + while (nrn) + { + if (nrn->info) + zebra_rnh_clear_nhc_flag (vrfid, family, type, nrn); + nrn = route_next(nrn); /* this will also unlock nrn */ + } } }