]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: modify bmp_get_peer_distinguisher to support AFI_UNSPEC
authorPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 30 Oct 2024 21:20:30 +0000 (22:20 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 11 Dec 2024 10:29:37 +0000 (11:29 +0100)
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 <philippe.guibert@6wind.com>
bgpd/bgp_bmp.c

index e86e80ba274270cf936aafde01551eb3f68764ee..56d4c55246bf6aa1d7d98b1f02768f6ae5f7dfbe 100644 (file)
@@ -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;
        }