]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_updgrp.c
Merge pull request #3394 from karamalla0406/frr3360
[mirror_frr.git] / bgpd / bgp_updgrp.c
index 7f7b4a893fc83c167866057739578f73918c0c1e..2e2ad883144f38dea36d334dd55eab9eaf52a27a 100644 (file)
@@ -152,6 +152,7 @@ static void conf_copy(struct peer *dst, struct peer *src, afi_t afi,
        dst->af_cap[afi][safi] = src->af_cap[afi][safi];
        dst->afc_nego[afi][safi] = src->afc_nego[afi][safi];
        dst->orf_plist[afi][safi] = src->orf_plist[afi][safi];
+       dst->addpath_type[afi][safi] = src->addpath_type[afi][safi];
        dst->local_as = src->local_as;
        dst->change_local_as = src->change_local_as;
        dst->shared_network = src->shared_network;
@@ -322,6 +323,7 @@ static unsigned int updgrp_hash_key_make(void *p)
        key = jhash_1word(peer->sort, key); /* EBGP or IBGP */
        key = jhash_1word((peer->flags & PEER_UPDGRP_FLAGS), key);
        key = jhash_1word((flags & PEER_UPDGRP_AF_FLAGS), key);
+       key = jhash_1word((uint32_t)peer->addpath_type[afi][safi], key);
        key = jhash_1word((peer->cap & PEER_UPDGRP_CAP_FLAGS), key);
        key = jhash_1word((peer->af_cap[afi][safi] & PEER_UPDGRP_AF_CAP_FLAGS),
                          key);
@@ -393,7 +395,7 @@ static unsigned int updgrp_hash_key_make(void *p)
        return key;
 }
 
-static int updgrp_hash_cmp(const void *p1, const void *p2)
+static bool updgrp_hash_cmp(const void *p1, const void *p2)
 {
        const struct update_group *grp1;
        const struct update_group *grp2;
@@ -407,7 +409,7 @@ static int updgrp_hash_cmp(const void *p1, const void *p2)
        safi_t safi;
 
        if (!p1 || !p2)
-               return 0;
+               return false;
 
        grp1 = p1;
        grp2 = p2;
@@ -422,68 +424,71 @@ static int updgrp_hash_cmp(const void *p1, const void *p2)
 
        /* put EBGP and IBGP peers in different update groups */
        if (pe1->sort != pe2->sort)
-               return 0;
+               return false;
 
        /* check peer flags */
        if ((pe1->flags & PEER_UPDGRP_FLAGS)
            != (pe2->flags & PEER_UPDGRP_FLAGS))
-               return 0;
+               return false;
 
        /* If there is 'local-as' configured, it should match. */
        if (pe1->change_local_as != pe2->change_local_as)
-               return 0;
+               return false;
 
        /* flags like route reflector client */
        if ((flags1 & PEER_UPDGRP_AF_FLAGS) != (flags2 & PEER_UPDGRP_AF_FLAGS))
+               return false;
+
+       if (pe1->addpath_type[afi][safi] != pe2->addpath_type[afi][safi])
                return 0;
 
        if ((pe1->cap & PEER_UPDGRP_CAP_FLAGS)
            != (pe2->cap & PEER_UPDGRP_CAP_FLAGS))
-               return 0;
+               return false;
 
        if ((pe1->af_cap[afi][safi] & PEER_UPDGRP_AF_CAP_FLAGS)
            != (pe2->af_cap[afi][safi] & PEER_UPDGRP_AF_CAP_FLAGS))
-               return 0;
+               return false;
 
        if (pe1->v_routeadv != pe2->v_routeadv)
-               return 0;
+               return false;
 
        if (pe1->group != pe2->group)
-               return 0;
+               return false;
 
        /* route-map names should be the same */
        if ((fl1->map[RMAP_OUT].name && !fl2->map[RMAP_OUT].name)
            || (!fl1->map[RMAP_OUT].name && fl2->map[RMAP_OUT].name)
            || (fl1->map[RMAP_OUT].name && fl2->map[RMAP_OUT].name
                && strcmp(fl1->map[RMAP_OUT].name, fl2->map[RMAP_OUT].name)))
-               return 0;
+               return false;
 
        if ((fl1->dlist[FILTER_OUT].name && !fl2->dlist[FILTER_OUT].name)
            || (!fl1->dlist[FILTER_OUT].name && fl2->dlist[FILTER_OUT].name)
            || (fl1->dlist[FILTER_OUT].name && fl2->dlist[FILTER_OUT].name
                && strcmp(fl1->dlist[FILTER_OUT].name,
                          fl2->dlist[FILTER_OUT].name)))
-               return 0;
+               return false;
 
        if ((fl1->plist[FILTER_OUT].name && !fl2->plist[FILTER_OUT].name)
            || (!fl1->plist[FILTER_OUT].name && fl2->plist[FILTER_OUT].name)
            || (fl1->plist[FILTER_OUT].name && fl2->plist[FILTER_OUT].name
                && strcmp(fl1->plist[FILTER_OUT].name,
                          fl2->plist[FILTER_OUT].name)))
-               return 0;
+               return false;
 
        if ((fl1->aslist[FILTER_OUT].name && !fl2->aslist[FILTER_OUT].name)
            || (!fl1->aslist[FILTER_OUT].name && fl2->aslist[FILTER_OUT].name)
            || (fl1->aslist[FILTER_OUT].name && fl2->aslist[FILTER_OUT].name
                && strcmp(fl1->aslist[FILTER_OUT].name,
                          fl2->aslist[FILTER_OUT].name)))
-               return 0;
+               return false;
 
        if ((fl1->usmap.name && !fl2->usmap.name)
            || (!fl1->usmap.name && fl2->usmap.name)
            || (fl1->usmap.name && fl2->usmap.name
                && strcmp(fl1->usmap.name, fl2->usmap.name)))
-               return 0;
+               return false;
 
        if ((pe1->default_rmap[afi][safi].name
             && !pe2->default_rmap[afi][safi].name)
@@ -493,19 +498,19 @@ static int updgrp_hash_cmp(const void *p1, const void *p2)
                && pe2->default_rmap[afi][safi].name
                && strcmp(pe1->default_rmap[afi][safi].name,
                          pe2->default_rmap[afi][safi].name)))
-               return 0;
+               return false;
 
        if ((afi == AFI_IP6) && (pe1->shared_network != pe2->shared_network))
-               return 0;
+               return false;
 
        if ((CHECK_FLAG(pe1->flags, PEER_FLAG_LONESOUL)
             || CHECK_FLAG(pe1->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
             || CHECK_FLAG(pe1->af_cap[afi][safi],
                           PEER_CAP_ORF_PREFIX_SM_OLD_RCV))
            && !sockunion_same(&pe1->su, &pe2->su))
-               return 0;
+               return false;
 
-       return 1;
+       return true;
 }
 
 static void peer_lonesoul_or_not(struct peer *peer, int set)
@@ -1182,6 +1187,8 @@ static void update_subgroup_copy_adj_out(struct update_subgroup *source,
                aout_copy->attr =
                        aout->attr ? bgp_attr_intern(aout->attr) : NULL;
        }
+
+       dest->scount = source->scount;
 }
 
 /*
@@ -1898,22 +1905,3 @@ int bgp_addpath_encode_tx(struct peer *peer, afi_t afi, safi_t safi)
                && CHECK_FLAG(peer->af_cap[afi][safi],
                              PEER_CAP_ADDPATH_AF_RX_RCV));
 }
-
-/*
- * Return true if this is a path we should advertise due to a
- * configured addpath-tx knob
- */
-int bgp_addpath_tx_path(struct peer *peer, afi_t afi, safi_t safi,
-                       struct bgp_info *ri)
-{
-       if (CHECK_FLAG(peer->af_flags[afi][safi],
-                      PEER_FLAG_ADDPATH_TX_ALL_PATHS))
-               return 1;
-
-       if (CHECK_FLAG(peer->af_flags[afi][safi],
-                      PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS)
-           && CHECK_FLAG(ri->flags, BGP_INFO_DMED_SELECTED))
-               return 1;
-
-       return 0;
-}