afi_t afi = bqe->afi;
safi_t safi = bqe->safi;
+ if (!CHECK_FLAG(bmp->targets->afimon[afi][safi], BMP_MON_LOC_RIB)) {
+ zlog_info("bmp: loc rib monitoring not enabled, ignoring");
+ goto out;
+ }
+
+
switch (bmp->afistate[afi][safi]) {
case BMP_AFI_INACTIVE:
case BMP_AFI_NEEDSYNC:
goto out;
}
+ zlog_info("bmp: for prefix=%pFX in vrf=%d afi/safi is %s", &bqe->p, bmp->targets->bgp->vrf_id, get_afi_safi_str(afi, safi, false));
bn = bgp_node_lookup(bmp->targets->bgp->rib[afi][safi], &bqe->p);
struct prefix_rd *prd = NULL;
- if ((bqe->afi == AFI_L2VPN && bqe->safi == SAFI_EVPN) ||
- (bqe->safi == SAFI_MPLS_VPN))
+ bool is_vpn = (bqe->afi == AFI_L2VPN && bqe->safi == SAFI_EVPN) || (bqe->safi == SAFI_MPLS_VPN);
+ if (is_vpn) {
prd = &bqe->rd;
+ bn = bgp_safi_node_lookup(bmp->targets->bgp->rib[afi][safi], afi, safi, &bqe->p, &bqe->rd);
+ }
- if (bmp->targets->afimon[afi][safi] & BMP_MON_LOC_RIB) {
- zlog_info("bmp: loc rib monitoring on");
- struct bgp_path_info *bpi;
-
- /* TODO BMP_MON_LOC_RIB understand this part more, why iterate
- * through the table ?
- */
- for (bpi = bn ? bgp_dest_get_bgp_path_info(bn) : NULL; bpi;
- bpi = bpi->next) {
- if (!CHECK_FLAG(bpi->flags, BGP_PATH_SELECTED))
- continue;
- if (bpi->peer == peer)
- break;
+ zlog_info("bmp: loc rib monitoring on");
+ struct bgp_path_info *bpi;
+
+ struct bgp_path_info *pathinfo = NULL;
+ pathinfo = bgp_dest_get_bgp_path_info(bn);
+ if (!pathinfo)
+ zlog_info("bmp: no info on path %pRN", bn);
+
+
+ for (bpi = bn ? bgp_dest_get_bgp_path_info(bn) : NULL; bpi;
+ bpi = bpi->next) {
+ zlog_info("bmp: path info for dest(bn)=%pRN", bn);
+ zlog_info("bmp: is null? %s", bpi == NULL ? "yes" : "no");
+ if (bpi) {
+ zlog_info("bmp: type=%d, subtype=%d", bpi->type, bpi->sub_type);
+ if (bpi->peer)
+ zlog_info("bmp: peer=%pBP", bpi->peer);
+ if (bpi->attr) {
+ zlog_info("bmp: has attr");
+ zlog_info("bmp: nh=%pI4", &bpi->attr->nexthop);
+ }
}
+ if (!CHECK_FLAG(bpi->flags, BGP_PATH_SELECTED))
+ continue;
+ if (bpi->peer == peer)
+ break;
+ }
- uint8_t peer_distinguisher[8] = {0};
- if (bmp->targets->bgp->inst_type != VRF_DEFAULT) {
- memcpy(peer_distinguisher, &bmp->targets->bgp->vrf_id, sizeof(vrf_id_t));
- }
- bmp_monitor(bmp, peer, 0, BMP_PEER_TYPE_LOC_RIB_INSTANCE, peer_distinguisher,
- &bqe->p, prd, bpi ? bpi->attr : NULL,
- afi, safi, bpi ? bpi->uptime : monotime(NULL));
- written = true;
+ uint8_t peer_distinguisher[8] = {0};
+ if (bmp->targets->bgp->inst_type != VRF_DEFAULT) {
+ memcpy(peer_distinguisher, &bmp->targets->bgp->vrf_id, sizeof(vrf_id_t));
}
+ bmp_monitor(bmp, peer, 0, BMP_PEER_TYPE_LOC_RIB_INSTANCE, peer_distinguisher,
+ &bqe->p, prd, bpi ? bpi->attr : NULL,
+ afi, safi, bpi ? bpi->uptime : monotime(NULL));
+ written = true;
+
out:
if (!bqe->refcount)
XFREE(MTYPE_BMP_QUEUE, bqe);
if (!peer_established(peer->connection))
goto out;
+
bool is_vpn = (bqe->afi == AFI_L2VPN && bqe->safi == SAFI_EVPN) ||
(bqe->safi == SAFI_MPLS_VPN);
bn = bgp_safi_node_lookup(bmp->targets->bgp->rib[afi][safi], safi,
&bqe->p, prd);
-
/* TODO BMP add MON_BGP_LOC_RIB case */
if (bmp->targets->afimon[afi][safi] & BMP_MON_POSTPOLICY) {
struct bgp_path_info *bpi;
zlog_info("before afi/safi check");
if ((afi == AFI_L2VPN && safi == SAFI_EVPN &&
bn->pdest) ||
- (safi == SAFI_MPLS_VPN))
+ (safi == SAFI_MPLS_VPN)) {
+ zlog_info("bmp: added prefix rd info to bqe");
prefix_copy(
&bqeref.rd,
(struct prefix_rd *)bgp_dest_get_prefix(
bn->pdest));
+ }
zlog_info("bmp: before hash check");
bqe = bmp_qhash_find(&bt->locupdhash, &bqeref);