diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2017-03-10 14:20:40 +0100 |
|---|---|---|
| committer | David Lamparter <equinox@opensourcerouting.org> | 2017-03-10 14:20:40 +0100 |
| commit | 098c0eb8f4c2922e5f8ef4b0a6f99f7114d23b4d (patch) | |
| tree | 97cf019431f59e58e9bb03958e02a13e883206ef | |
| parent | 17791cc09ac79a1ee54de1626f85f95039fb506e (diff) | |
| parent | b32cba291bcf4661b5c4853ed76087580ba763eb (diff) | |
Merge branch 'stable/2.0'
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
| -rw-r--r-- | bgpd/bgp_route.c | 4 | ||||
| -rw-r--r-- | bgpd/bgpd.c | 4 | ||||
| -rw-r--r-- | lib/vty.c | 2 | ||||
| -rw-r--r-- | zebra/zebra_rnh.c | 38 |
4 files changed, 38 insertions, 10 deletions
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; @@ -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 */ + } } } |
