summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2020-01-21 13:36:30 +0100
committerGitHub <noreply@github.com>2020-01-21 13:36:30 +0100
commitc3996e08c5d2e087f85783564f73a66988d435a9 (patch)
tree3d64922a6fbc4d41b9b0cd18702659805298ba64
parent14c56d646c91b8ddfae4c186776c38ffd0112ed7 (diff)
parentdef2c27e49125ad523cd36ed16dd787946640dba (diff)
bgpd: [7.1] add addpath ID to adj_out tree sort (#5691)stable/7.1
bgpd: [7.1] add addpath ID to adj_out tree sort
-rw-r--r--bgpd/bgp_updgrp_adv.c34
1 files changed, 13 insertions, 21 deletions
diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c
index b64c51f341..dc20234fd7 100644
--- a/bgpd/bgp_updgrp_adv.c
+++ b/bgpd/bgp_updgrp_adv.c
@@ -64,6 +64,12 @@ static int bgp_adj_out_compare(const struct bgp_adj_out *o1,
if (o1->subgroup > o2->subgroup)
return 1;
+ if (o1->addpath_tx_id < o2->addpath_tx_id)
+ return -1;
+
+ if (o1->addpath_tx_id > o2->addpath_tx_id)
+ return 1;
+
return 0;
}
RB_GENERATE(bgp_adj_out_rb, bgp_adj_out, adj_entry, bgp_adj_out_compare);
@@ -72,32 +78,17 @@ static inline struct bgp_adj_out *adj_lookup(struct bgp_node *rn,
struct update_subgroup *subgrp,
uint32_t addpath_tx_id)
{
- struct bgp_adj_out *adj, lookup;
- struct peer *peer;
- afi_t afi;
- safi_t safi;
- int addpath_capable;
+ struct bgp_adj_out lookup;
if (!rn || !subgrp)
return NULL;
- peer = SUBGRP_PEER(subgrp);
- afi = SUBGRP_AFI(subgrp);
- safi = SUBGRP_SAFI(subgrp);
- addpath_capable = bgp_addpath_encode_tx(peer, afi, safi);
-
/* update-groups that do not support addpath will pass 0 for
- * addpath_tx_id so do not both matching against it */
+ * addpath_tx_id. */
lookup.subgroup = subgrp;
- adj = RB_FIND(bgp_adj_out_rb, &rn->adj_out, &lookup);
- if (adj) {
- if (addpath_capable) {
- if (adj->addpath_tx_id == addpath_tx_id)
- return adj;
- } else
- return adj;
- }
- return NULL;
+ lookup.addpath_tx_id = addpath_tx_id;
+
+ return RB_FIND(bgp_adj_out_rb, &rn->adj_out, &lookup);
}
static void adj_free(struct bgp_adj_out *adj)
@@ -402,13 +393,14 @@ struct bgp_adj_out *bgp_adj_out_alloc(struct update_subgroup *subgrp,
adj = XCALLOC(MTYPE_BGP_ADJ_OUT, sizeof(struct bgp_adj_out));
adj->subgroup = subgrp;
+ adj->addpath_tx_id = addpath_tx_id;
+
if (rn) {
RB_INSERT(bgp_adj_out_rb, &rn->adj_out, adj);
bgp_lock_node(rn);
adj->rn = rn;
}
- adj->addpath_tx_id = addpath_tx_id;
TAILQ_INSERT_TAIL(&(subgrp->adjq), adj, subgrp_adj_train);
SUBGRP_INCR_STAT(subgrp, adj_count);
return adj;