Merge branch 'stable/2.0'

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2017-03-10 14:20:40 +01:00
commit 098c0eb8f4
4 changed files with 38 additions and 10 deletions

View File

@ -2058,7 +2058,7 @@ bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
return; return;
if (bm->process_main_queue == NULL) if (bm->process_main_queue == NULL)
bgp_process_queue_init (); return;
pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE, pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
sizeof (struct bgp_process_queue)); sizeof (struct bgp_process_queue));
@ -2083,7 +2083,7 @@ bgp_add_eoiu_mark (struct bgp *bgp)
struct bgp_process_queue *pqnode; struct bgp_process_queue *pqnode;
if (bm->process_main_queue == NULL) if (bm->process_main_queue == NULL)
bgp_process_queue_init (); return;
pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE, pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
sizeof (struct bgp_process_queue)); sizeof (struct bgp_process_queue));

View File

@ -2533,14 +2533,14 @@ peer_group_delete (struct peer_group *group)
XFREE(MTYPE_PEER_GROUP_HOST, group->name); XFREE(MTYPE_PEER_GROUP_HOST, group->name);
group->name = NULL; group->name = NULL;
bfd_info_free(&(group->conf->bfd_info));
group->conf->group = NULL; group->conf->group = NULL;
peer_delete (group->conf); peer_delete (group->conf);
/* Delete from all peer_group list. */ /* Delete from all peer_group list. */
listnode_delete (bgp->group, group); listnode_delete (bgp->group, group);
bfd_info_free(&(group->conf->bfd_info));
peer_group_free (group); peer_group_free (group);
return 0; return 0;

View File

@ -3121,6 +3121,8 @@ vty_terminate (void)
vty_reset (); vty_reset ();
vector_free (vtyvec); vector_free (vtyvec);
vector_free (Vvty_serv_thread); vector_free (Vvty_serv_thread);
vtyvec = NULL;
Vvty_serv_thread = NULL;
} }
} }

View File

@ -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 (!prefix_same(&rnh->resolved_route, &prn->p))
{ {
if (rib)
UNSET_FLAG(rib->status, RIB_ENTRY_NEXTHOPS_CHANGED);
if (prn) if (prn)
prefix_copy(&rnh->resolved_route, &prn->p); prefix_copy(&rnh->resolved_route, &prn->p);
else 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)) else if (compare_state(rib, rnh->state))
{ {
if (rib)
UNSET_FLAG(rib->status, RIB_ENTRY_NEXTHOPS_CHANGED);
copy_state(rnh, rib, nrn); copy_state(rnh, rib, nrn);
state_changed = 1; 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); 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) /* Evaluate all tracked entries (nexthops or routes for import into BGP)
* of a particular VRF and address-family or a specific prefix. * 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); nrn = route_node_lookup (rnh_table, p);
if (nrn && nrn->info) if (nrn && nrn->info)
zebra_rnh_evaluate_entry (vrfid, family, force, type, nrn); zebra_rnh_evaluate_entry (vrfid, family, force, type, nrn);
if (nrn) if (nrn)
route_unlock_node (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); zebra_rnh_evaluate_entry (vrfid, family, force, type, nrn);
nrn = route_next(nrn); /* this will also unlock 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 */
}
} }
} }