bgpd: refactored bmp_route_update & cleanup TODOs

TODOs that are done/un-necessary now deleted
refactored bmp_route_update to use a modified bmp_process_one function call instead of duplicating similar code

Signed-off-by: Maxence Younsi <mx.yns@outlook.fr>
This commit is contained in:
Maxou 2022-08-08 14:32:38 +02:00 committed by Maxence Younsi
parent 0a09b4905e
commit 6da477b395
2 changed files with 24 additions and 70 deletions

View File

@ -1102,7 +1102,6 @@ afibreak:
prefix_copy(&bmp->syncpos, bgp_dest_get_prefix(bn)); prefix_copy(&bmp->syncpos, bgp_dest_get_prefix(bn));
} }
/* TODO BMP add BMP_MON_LOC_RIB case */
if (bmp->targets->afimon[afi][safi] & BMP_MON_POSTPOLICY if (bmp->targets->afimon[afi][safi] & BMP_MON_POSTPOLICY
|| bmp->targets->afimon[afi][safi] & BMP_MON_LOC_RIB) { || bmp->targets->afimon[afi][safi] & BMP_MON_LOC_RIB) {
for (bpiter = bgp_dest_get_bgp_path_info(bn); bpiter; for (bpiter = bgp_dest_get_bgp_path_info(bn); bpiter;
@ -1236,7 +1235,6 @@ static bool bmp_wrqueue_locrib(struct bmp *bmp, struct pullwr *pullwr)
goto out; goto out;
} }
switch (bmp->afistate[afi][safi]) { switch (bmp->afistate[afi][safi]) {
case BMP_AFI_INACTIVE: case BMP_AFI_INACTIVE:
case BMP_AFI_NEEDSYNC: case BMP_AFI_NEEDSYNC:
@ -1248,9 +1246,6 @@ static bool bmp_wrqueue_locrib(struct bmp *bmp, struct pullwr *pullwr)
*/ */
break; break;
/* TODO BMP_MON_LOCRIB check if this is true after implenting
* LOCRIB syncing
*/
/* currently syncing & haven't reached this prefix yet /* currently syncing & haven't reached this prefix yet
* => it'll be sent as part of the table sync, no need here * => it'll be sent as part of the table sync, no need here
*/ */
@ -1271,14 +1266,12 @@ static bool bmp_wrqueue_locrib(struct bmp *bmp, struct pullwr *pullwr)
goto out; goto out;
} }
bn = bgp_node_lookup(bmp->targets->bgp->rib[afi][safi], &bqe->p); bool is_vpn = (bqe->afi == AFI_L2VPN && bqe->safi == SAFI_EVPN) ||
struct prefix_rd *prd = NULL; (bqe->safi == SAFI_MPLS_VPN);
bool is_vpn = (bqe->afi == AFI_L2VPN && bqe->safi == SAFI_EVPN) || (bqe->safi == SAFI_MPLS_VPN); struct prefix_rd *prd = is_vpn ? &bqe->rd : NULL;
if (is_vpn) { bn = bgp_safi_node_lookup(bmp->targets->bgp->rib[afi][safi], safi,
prd = &bqe->rd; &bqe->p, prd);
bn = bgp_safi_node_lookup(bmp->targets->bgp->rib[afi][safi], afi, safi, &bqe->p, &bqe->rd);
}
struct bgp_path_info *bpi; struct bgp_path_info *bpi;
@ -1351,7 +1344,6 @@ static bool bmp_wrqueue(struct bmp *bmp, struct pullwr *pullwr)
bn = bgp_safi_node_lookup(bmp->targets->bgp->rib[afi][safi], safi, bn = bgp_safi_node_lookup(bmp->targets->bgp->rib[afi][safi], safi,
&bqe->p, prd); &bqe->p, prd);
/* TODO BMP add MON_BGP_LOC_RIB case */
if (bmp->targets->afimon[afi][safi] & BMP_MON_POSTPOLICY) { if (bmp->targets->afimon[afi][safi] & BMP_MON_POSTPOLICY) {
struct bgp_path_info *bpi; struct bgp_path_info *bpi;
@ -1427,7 +1419,7 @@ static void bmp_wrerr(struct bmp *bmp, struct pullwr *pullwr, bool eof)
bmp_free(bmp); bmp_free(bmp);
} }
static void bmp_process_one(struct bmp_targets *bt, struct bgp *bgp, afi_t afi, static struct bmp_queue_entry* bmp_process_one(struct bmp_targets *bt, struct bmp_qhash_head* updhash, struct bmp_qlist_head* updlist, struct bgp *bgp, afi_t afi,
safi_t safi, struct bgp_dest *bn, struct peer *peer) safi_t safi, struct bgp_dest *bn, struct peer *peer)
{ {
struct bmp *bmp; struct bmp *bmp;
@ -1449,26 +1441,26 @@ static void bmp_process_one(struct bmp_targets *bt, struct bgp *bgp, afi_t afi,
prefix_copy(&bqeref.rd, prefix_copy(&bqeref.rd,
(struct prefix_rd *)bgp_dest_get_prefix(bn->pdest)); (struct prefix_rd *)bgp_dest_get_prefix(bn->pdest));
bqe = bmp_qhash_find(&bt->updhash, &bqeref); bqe = bmp_qhash_find(updhash, &bqeref);
if (bqe) { if (bqe) {
if (bqe->refcount >= refcount) if (bqe->refcount >= refcount)
/* nothing to do here */ /* nothing to do here */
return; return;
bmp_qlist_del(&bt->updlist, bqe); bmp_qlist_del(updlist, bqe);
} else { } else {
bqe = XMALLOC(MTYPE_BMP_QUEUE, sizeof(*bqe)); bqe = XMALLOC(MTYPE_BMP_QUEUE, sizeof(*bqe));
memcpy(bqe, &bqeref, sizeof(*bqe)); memcpy(bqe, &bqeref, sizeof(*bqe));
bmp_qhash_add(&bt->updhash, bqe); bmp_qhash_add(updhash, bqe);
} }
bqe->refcount = refcount; bqe->refcount = refcount;
bmp_qlist_add_tail(&bt->updlist, bqe); bmp_qlist_add_tail(updlist, bqe);
frr_each (bmp_session, &bt->sessions, bmp) return bqe;
if (!bmp->queuepos)
bmp->queuepos = bqe; /* need to update correct queue pos for all sessions of the target after a call to this function */
} }
static int bmp_process(struct bgp *bgp, afi_t afi, safi_t safi, static int bmp_process(struct bgp *bgp, afi_t afi, safi_t safi,
@ -1490,12 +1482,16 @@ static int bmp_process(struct bgp *bgp, afi_t afi, safi_t safi,
return 0; return 0;
frr_each(bmp_targets, &bmpbgp->targets, bt) { frr_each(bmp_targets, &bmpbgp->targets, bt) {
if (!bt->afimon[afi][safi]) /* check if any monitoring is enabled (ignoring loc-rib since it uses another hook & queue */
if (!(bt->afimon[afi][safi] & ~BMP_MON_LOC_RIB))
continue; continue;
bmp_process_one(bt, bgp, afi, safi, bn, peer); struct bmp_queue_entry* last_item = bmp_process_one(bt, &bt->updhash, &bt->updlist, bgp, afi, safi, bn, peer);
frr_each(bmp_session, &bt->sessions, bmp) { frr_each(bmp_session, &bt->sessions, bmp) {
if (!bmp->queuepos)
bmp->queuepos = last_item;
pullwr_bump(bmp->pullwr); pullwr_bump(bmp->pullwr);
} }
} }
@ -2388,8 +2384,8 @@ DEFPY(bmp_stats_cfg,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
DEFPY(bmp_monitor_cfg, bmp_monitor_cmd, DEFPY(bmp_monitor_cfg,
/* TODO BMP add loc-rib option */ bmp_monitor_cmd,
"[no] bmp monitor <ipv4|ipv6|l2vpn> <unicast|multicast|evpn|vpn> <pre-policy|post-policy|loc-rib>$policy", "[no] bmp monitor <ipv4|ipv6|l2vpn> <unicast|multicast|evpn|vpn> <pre-policy|post-policy|loc-rib>$policy",
NO_STR BMP_STR NO_STR BMP_STR
"Send BMP route monitoring messages\n" BGP_AF_STR BGP_AF_STR BGP_AF_STR "Send BMP route monitoring messages\n" BGP_AF_STR BGP_AF_STR BGP_AF_STR
@ -2409,11 +2405,8 @@ DEFPY(bmp_monitor_cfg, bmp_monitor_cmd,
argv_find_and_parse_afi(argv, argc, &index, &afi); argv_find_and_parse_afi(argv, argc, &index, &afi);
argv_find_and_parse_safi(argv, argc, &index, &safi); argv_find_and_parse_safi(argv, argc, &index, &safi);
/* TODO BMP set right flag */
if (policy[0] == 'l') { if (policy[0] == 'l') {
flag = BMP_MON_LOC_RIB; flag = BMP_MON_LOC_RIB;
vty_out(vty,
"changing loc rib monitoring config for this target\n");
} else if (policy[1] == 'r') } else if (policy[1] == 'r')
flag = BMP_MON_PREPOLICY; flag = BMP_MON_PREPOLICY;
else else
@ -2762,48 +2755,11 @@ static int bmp_route_update(struct bgp *bgp, afi_t afi, safi_t safi,
frr_each(bmp_targets, &bmpbgp->targets, bt) { frr_each(bmp_targets, &bmpbgp->targets, bt) {
if (bt->afimon[afi][safi] & BMP_MON_LOC_RIB) { if (bt->afimon[afi][safi] & BMP_MON_LOC_RIB) {
struct bmp_queue_entry *bqe, bqeref; struct bmp_queue_entry *last_item = bmp_process_one(bt, &bt->locupdhash, &bt->locupdlist, bgp, afi, safi, bn, peer);
size_t refcount;
refcount = bmp_session_count(&bt->sessions);
if (refcount == 0)
return 0;
memset(&bqeref, 0, sizeof(bqeref));
prefix_copy(&bqeref.p, prefix);
bqeref.peerid = peer->qobj_node.nid;
bqeref.afi = afi;
bqeref.safi = safi;
if ((afi == AFI_L2VPN && safi == SAFI_EVPN &&
bn->pdest) ||
(safi == SAFI_MPLS_VPN))
prefix_copy(
&bqeref.rd,
(struct prefix_rd *)bgp_dest_get_prefix(
bn->pdest));
bqe = bmp_qhash_find(&bt->locupdhash, &bqeref);
uint32_t key = bmp_qhash_hkey(&bqeref);
if (bqe) {
if (bqe->refcount >= refcount)
/* nothing to do here */
return 0;
bmp_qlist_del(&bt->locupdlist, bqe);
} else {
bqe = XMALLOC(MTYPE_BMP_QUEUE, sizeof(*bqe));
memcpy(bqe, &bqeref, sizeof(*bqe));
bmp_qhash_add(&bt->locupdhash, bqe);
}
bqe->refcount = refcount;
bmp_qlist_add_tail(&bt->locupdlist, bqe);
frr_each (bmp_session, &bt->sessions, bmp) { frr_each (bmp_session, &bt->sessions, bmp) {
if (!bmp->locrib_queuepos) if (!bmp->locrib_queuepos)
bmp->locrib_queuepos = bqe; bmp->locrib_queuepos = last_item;
pullwr_bump(bmp->pullwr); pullwr_bump(bmp->pullwr);
}; };

View File

@ -3453,10 +3453,8 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest,
UNSET_FLAG(new_select->flags, BGP_PATH_LINK_BW_CHG); UNSET_FLAG(new_select->flags, BGP_PATH_LINK_BW_CHG);
} }
/* call bmp hook for loc-rib route update / withdraw after flags were set */
if (old_select || new_select) { if (old_select || new_select) {
zlog_info("old_select==NULL %s | new_select==NULL %s",
old_select == NULL ? "YES" : "NO",
new_select == NULL ? "YES" : "NO");
if (old_select) /* route is not installed in locrib anymore */ if (old_select) /* route is not installed in locrib anymore */
old_select->rib_uptime = (time_t)(-1L); old_select->rib_uptime = (time_t)(-1L);