summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_route.c104
-rw-r--r--bgpd/bgp_route.h1
-rw-r--r--bgpd/bgp_routemap.c1
-rw-r--r--lib/if.c41
-rw-r--r--lib/plist.c8
-rw-r--r--zebra/zebra_nhg.c19
6 files changed, 40 insertions, 134 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 88d7704ac9..beb5f40b8b 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -7934,44 +7934,6 @@ static bool aggr_unsuppress_path(struct bgp_aggregate *aggregate,
return false;
}
-static bool bgp_aggregate_info_same(struct bgp_path_info *pi, uint8_t origin,
- struct aspath *aspath,
- struct community *comm,
- struct ecommunity *ecomm,
- struct lcommunity *lcomm)
-{
- static struct aspath *ae = NULL;
- enum asnotation_mode asnotation;
-
- asnotation = bgp_get_asnotation(NULL);
-
- if (!aspath)
- ae = aspath_empty(asnotation);
-
- if (!pi)
- return false;
-
- if (origin != pi->attr->origin)
- return false;
-
- if (!aspath_cmp(pi->attr->aspath, (aspath) ? aspath : ae))
- return false;
-
- if (!community_cmp(bgp_attr_get_community(pi->attr), comm))
- return false;
-
- if (!ecommunity_cmp(bgp_attr_get_ecommunity(pi->attr), ecomm))
- return false;
-
- if (!lcommunity_cmp(bgp_attr_get_lcommunity(pi->attr), lcomm))
- return false;
-
- if (!CHECK_FLAG(pi->flags, BGP_PATH_VALID))
- return false;
-
- return true;
-}
-
static void bgp_aggregate_install(
struct bgp *bgp, afi_t afi, safi_t safi, const struct prefix *p,
uint8_t origin, struct aspath *aspath, struct community *community,
@@ -7980,7 +7942,7 @@ static void bgp_aggregate_install(
{
struct bgp_dest *dest;
struct bgp_table *table;
- struct bgp_path_info *pi, *orig, *new;
+ struct bgp_path_info *pi, *new;
struct attr *attr;
bool debug = bgp_debug_aggregate(p);
@@ -7991,7 +7953,7 @@ static void bgp_aggregate_install(
dest = bgp_node_get(table, p);
- for (orig = pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
+ for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
if (pi->peer == bgp->peer_self && pi->type == ZEBRA_ROUTE_BGP
&& pi->sub_type == BGP_ROUTE_AGGREGATE)
break;
@@ -8008,19 +7970,23 @@ static void bgp_aggregate_install(
* If the aggregate information has not changed
* no need to re-install it again.
*/
- if (pi && (!aggregate->rmap.changed &&
- bgp_aggregate_info_same(pi, origin, aspath, community,
- ecommunity, lcommunity))) {
+ attr = bgp_attr_aggregate_intern(bgp, origin, aspath, community, ecommunity,
+ lcommunity, aggregate, atomic_aggregate, p);
+ if (!attr) {
+ aspath_free(aspath);
+ community_free(&community);
+ ecommunity_free(&ecommunity);
+ lcommunity_free(&lcommunity);
bgp_dest_unlock_node(dest);
+ bgp_aggregate_delete(bgp, p, afi, safi, aggregate);
+ if (debug)
+ zlog_debug("%s: %pFX null attribute", __func__, p);
+ return;
+ }
- if (aspath)
- aspath_free(aspath);
- if (community)
- community_free(&community);
- if (ecommunity)
- ecommunity_free(&ecommunity);
- if (lcommunity)
- lcommunity_free(&lcommunity);
+ if (pi && CHECK_FLAG(pi->flags, BGP_PATH_VALID) && attrhash_cmp(pi->attr, attr)) {
+ bgp_attr_unintern(&attr);
+ bgp_dest_unlock_node(dest);
if (debug)
zlog_debug(" aggregate %pFX: duplicate", p);
return;
@@ -8036,21 +8002,6 @@ static void bgp_aggregate_install(
zlog_debug(" aggregate %pFX: existing, removed", p);
}
- attr = bgp_attr_aggregate_intern(
- bgp, origin, aspath, community, ecommunity, lcommunity,
- aggregate, atomic_aggregate, p);
-
- if (!attr) {
- aspath_free(aspath);
- community_free(&community);
- ecommunity_free(&ecommunity);
- lcommunity_free(&lcommunity);
- bgp_dest_unlock_node(dest);
- bgp_aggregate_delete(bgp, p, afi, safi, aggregate);
- if (debug)
- zlog_debug("%s: %pFX null attribute", __func__, p);
- return;
- }
new = info_make(ZEBRA_ROUTE_BGP, BGP_ROUTE_AGGREGATE, 0,
bgp->peer_self, attr, dest);
@@ -8063,19 +8014,13 @@ static void bgp_aggregate_install(
zlog_debug(" aggregate %pFX: installed", p);
} else {
uninstall_aggregate_route:
- for (pi = orig; pi; pi = pi->next)
- if (pi->peer == bgp->peer_self
- && pi->type == ZEBRA_ROUTE_BGP
- && pi->sub_type == BGP_ROUTE_AGGREGATE)
- break;
-
- /* Withdraw static BGP route from routing table. */
- if (pi) {
- bgp_path_info_delete(dest, pi);
- bgp_process(bgp, dest, pi, afi, safi);
- if (debug)
- zlog_debug(" aggregate %pFX: uninstall", p);
- }
+ /* Withdraw the aggregate route from routing table. */
+ if (pi) {
+ bgp_path_info_delete(dest, pi);
+ bgp_process(bgp, dest, pi, afi, safi);
+ if (debug)
+ zlog_debug(" aggregate %pFX: uninstall", p);
+ }
}
bgp_dest_unlock_node(dest);
@@ -9010,7 +8955,6 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi,
aggregate->rmap.name =
XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap);
aggregate->rmap.map = route_map_lookup_by_name(rmap);
- aggregate->rmap.changed = true;
route_map_counter_increment(aggregate->rmap.map);
}
diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h
index c071120de9..43033c8c39 100644
--- a/bgpd/bgp_route.h
+++ b/bgpd/bgp_route.h
@@ -449,7 +449,6 @@ struct bgp_aggregate {
struct {
char *name;
struct route_map *map;
- bool changed;
} rmap;
/* Suppress-count. */
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c
index ce236f87b6..f0bc84ce36 100644
--- a/bgpd/bgp_routemap.c
+++ b/bgpd/bgp_routemap.c
@@ -4684,7 +4684,6 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
route_map_counter_increment(map);
aggregate->rmap.map = map;
- aggregate->rmap.changed = true;
matched = true;
}
diff --git a/lib/if.c b/lib/if.c
index 586fc1d5cd..864c82bbf2 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -858,47 +858,6 @@ struct nbr_connected *nbr_connected_check(struct interface *ifp,
return NULL;
}
-/* Print if_addr structure. */
-static void __attribute__((unused))
-connected_log(struct connected *connected, char *str)
-{
- struct prefix *p;
- struct interface *ifp;
- char logbuf[BUFSIZ];
- char buf[BUFSIZ];
-
- ifp = connected->ifp;
- p = connected->address;
-
- snprintf(logbuf, sizeof(logbuf), "%s interface %s vrf %s(%u) %s %pFX ",
- str, ifp->name, ifp->vrf->name, ifp->vrf->vrf_id,
- prefix_family_str(p), p);
-
- p = connected->destination;
- if (p) {
- strlcat(logbuf, inet_ntop(p->family, &p->u.prefix, buf, BUFSIZ),
- BUFSIZ);
- }
- zlog_info("%s", logbuf);
-}
-
-/* Print if_addr structure. */
-static void __attribute__((unused))
-nbr_connected_log(struct nbr_connected *connected, char *str)
-{
- struct prefix *p;
- struct interface *ifp;
- char logbuf[BUFSIZ];
-
- ifp = connected->ifp;
- p = connected->address;
-
- snprintf(logbuf, sizeof(logbuf), "%s interface %s %s %pFX ", str,
- ifp->name, prefix_family_str(p), p);
-
- zlog_info("%s", logbuf);
-}
-
/* count the number of connected addresses that are in the given family */
unsigned int connected_count_by_family(struct interface *ifp, int family)
{
diff --git a/lib/plist.c b/lib/plist.c
index 6950ab5761..713eee25ed 100644
--- a/lib/plist.c
+++ b/lib/plist.c
@@ -1536,7 +1536,6 @@ int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
if (use_json) {
json = json_object_new_object();
json_prefix = json_object_new_object();
- json_list = json_object_new_object();
json_object_int_add(json_prefix, "prefixListCounter",
plist->count);
@@ -1544,10 +1543,7 @@ int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
plist->name);
for (pentry = plist->head; pentry; pentry = pentry->next) {
- struct prefix *p = &pentry->prefix;
- char buf_a[BUFSIZ];
-
- snprintf(buf_a, sizeof(buf_a), "%pFX", p);
+ json_list = json_object_new_object();
json_object_int_add(json_list, "seq", pentry->seq);
json_object_string_add(json_list, "seqPrefixListType",
@@ -1560,7 +1556,7 @@ int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
json_object_int_add(json_list, "le",
pentry->le);
- json_object_object_add(json_prefix, buf_a, json_list);
+ json_object_object_addf(json_prefix, json_list, "%pFX", &pentry->prefix);
}
if (afi == AFI_IP)
json_object_object_add(json, "ipPrefixList",
diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c
index a32fc2bb14..6a43fe0c84 100644
--- a/zebra/zebra_nhg.c
+++ b/zebra/zebra_nhg.c
@@ -3089,7 +3089,7 @@ static struct nhg_hash_entry *zebra_nhg_rib_compare_old_nhe(
int nexthop_active_update(struct route_node *rn, struct route_entry *re,
struct route_entry *old_re)
{
- struct nhg_hash_entry *curr_nhe;
+ struct nhg_hash_entry *curr_nhe, *remove;
uint32_t curr_active = 0, backup_active = 0;
if (PROTO_OWNED(re->nhe))
@@ -3143,16 +3143,25 @@ backups_done:
new_nhe = zebra_nhg_rib_find_nhe(curr_nhe, rt_afi);
+ remove = new_nhe;
+
if (old_re && old_re->type == re->type &&
old_re->instance == re->instance)
new_nhe = zebra_nhg_rib_compare_old_nhe(rn, re, new_nhe,
old_re->nhe);
if (IS_ZEBRA_DEBUG_NHG_DETAIL)
- zlog_debug(
- "%s: re %p CHANGED: nhe %p (%pNG) => new_nhe %p (%pNG)",
- __func__, re, re->nhe, re->nhe, new_nhe,
- new_nhe);
+ zlog_debug("%s: re %p CHANGED: nhe %p (%pNG) => new_nhe %p (%pNG) rib_find_nhe returned %p (%pNG) refcnt: %d",
+ __func__, re, re->nhe, re->nhe, new_nhe, new_nhe, remove, remove,
+ remove ? remove->refcnt : 0);
+
+ /*
+ * if the results from zebra_nhg_rib_find_nhe is being
+ * dropped and it was generated in that function
+ * (refcnt of 0) then we know we can clean it up
+ */
+ if (remove && remove != new_nhe && remove != re->nhe && remove->refcnt == 0)
+ zebra_nhg_handle_uninstall(remove);
route_entry_update_nhe(re, new_nhe);
}