X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=bgpd%2Fbgp_updgrp.c;h=2e2ad883144f38dea36d334dd55eab9eaf52a27a;hb=76a20aa982ca514e15ec0400d3f8ac58b7d3c3e3;hp=c607c4577d34dbb8cf7de6cbe3e046e48b8c4604;hpb=b5e3687b1d069f49aa8379b7135795699df1653b;p=mirror_frr.git diff --git a/bgpd/bgp_updgrp.c b/bgpd/bgp_updgrp.c index c607c4577..2e2ad8831 100644 --- a/bgpd/bgp_updgrp.c +++ b/bgpd/bgp_updgrp.c @@ -47,6 +47,7 @@ #include "bgpd/bgpd.h" #include "bgpd/bgp_table.h" #include "bgpd/bgp_debug.h" +#include "bgpd/bgp_errors.h" #include "bgpd/bgp_fsm.h" #include "bgpd/bgp_advertise.h" #include "bgpd/bgp_packet.h" @@ -151,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; @@ -321,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); @@ -392,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; @@ -406,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; @@ -421,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) @@ -492,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) @@ -905,7 +911,7 @@ static void update_subgroup_add_peer(struct update_subgroup *subgrp, static void update_subgroup_remove_peer_internal(struct update_subgroup *subgrp, struct peer_af *paf) { - assert(subgrp && paf); + assert(subgrp && paf && subgrp->update_group); if (bgp_debug_peer_updout_enabled(paf->peer->host)) { UPDGRP_PEER_DBG_DIS(subgrp->update_group); @@ -1181,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; } /* @@ -1630,7 +1638,8 @@ void update_group_adjust_peer(struct peer_af *paf) if (!updgrp) { updgrp = update_group_create(paf); if (!updgrp) { - zlog_err("couldn't create update group for peer %s", + flog_err(EC_BGP_UPDGRP_CREATE, + "couldn't create update group for peer %s", paf->peer->host); return; } @@ -1896,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; -}