From b7059a8fd9bf3d9161669c20be218c13e5972a3b Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Wed, 30 Oct 2024 22:20:30 +0100 Subject: [PATCH] bgpd: modify bmp_get_peer_distinguisher to support AFI_UNSPEC If a given L3VRF instance requests a peer distinguisher for a peer up/down message, the AFI_UNSPEC afi parameter will be used; no RD is chosen for this AFI. Fix this by priorizing the AFI_IP value before the AFI_IP6 value. For instance, a router with both RD set for each address-family, peer up/down messages will be sent with the RD set to the one for AFI_IP. Signed-off-by: Philippe Guibert --- bgpd/bgp_bmp.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/bgpd/bgp_bmp.c b/bgpd/bgp_bmp.c index e86e80ba27..56d4c55246 100644 --- a/bgpd/bgp_bmp.c +++ b/bgpd/bgp_bmp.c @@ -279,6 +279,8 @@ static inline int bmp_get_peer_distinguisher(struct bmp *bmp, afi_t afi, uint8_t peer_type, uint64_t *result_ref) { + /* use RD if set in VRF config */ + struct prefix_rd *prd; /* remove this check when the other peer types get correct peer dist. *(RFC7854) impl. @@ -294,11 +296,16 @@ static inline int bmp_get_peer_distinguisher(struct bmp *bmp, afi_t afi, if (bgp->inst_type == VRF_DEFAULT) return (*result_ref = 0); - /* use RD if set in VRF config for this AFI */ - struct prefix_rd *prd = &bgp->vpn_policy[afi].tovpn_rd; + prd = &bgp->vpn_policy[AFI_IP].tovpn_rd; + if ((afi == AFI_IP || afi == AFI_UNSPEC) && + CHECK_FLAG(bgp->vpn_policy[AFI_IP].flags, BGP_VPN_POLICY_TOVPN_RD_SET)) { + memcpy(result_ref, prd->val, sizeof(prd->val)); + return 0; + } - if (CHECK_FLAG(bgp->vpn_policy[afi].flags, - BGP_VPN_POLICY_TOVPN_RD_SET)) { + prd = &bgp->vpn_policy[AFI_IP6].tovpn_rd; + if ((afi == AFI_IP6 || afi == AFI_UNSPEC) && + CHECK_FLAG(bgp->vpn_policy[AFI_IP6].flags, BGP_VPN_POLICY_TOVPN_RD_SET)) { memcpy(result_ref, prd->val, sizeof(prd->val)); return 0; }