summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2017-03-10 14:20:40 +0100
committerDavid Lamparter <equinox@opensourcerouting.org>2017-03-10 14:20:40 +0100
commit098c0eb8f4c2922e5f8ef4b0a6f99f7114d23b4d (patch)
tree97cf019431f59e58e9bb03958e02a13e883206ef
parent17791cc09ac79a1ee54de1626f85f95039fb506e (diff)
parentb32cba291bcf4661b5c4853ed76087580ba763eb (diff)
Merge branch 'stable/2.0'
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
-rw-r--r--bgpd/bgp_route.c4
-rw-r--r--bgpd/bgpd.c4
-rw-r--r--lib/vty.c2
-rw-r--r--zebra/zebra_rnh.c38
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;
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 */
+ }
}
}