7 #include <boost/foreach.hpp>
20 return addr.to_string();
24 const BgpAttrPtr ptr, uint32_t flags, uint32_t label,
26 : peer_(peer), path_id_(path_id), source_(src), attr_(ptr),
27 original_attr_(ptr), flags_(flags), label_(label), l3_label_(l3_label) {
31 uint32_t flags, uint32_t label, uint32_t l3_label)
32 : peer_(peer), path_id_(0), source_(src), attr_(ptr), original_attr_(ptr),
33 flags_(flags), label_(label), l3_label_(l3_label) {
37 uint32_t flags, uint32_t label, uint32_t l3_label)
38 : peer_(NULL), path_id_(path_id), source_(src), attr_(ptr),
39 original_attr_(ptr), flags_(flags), label_(label), l3_label_(l3_label) {
43 uint32_t flags, uint32_t label, uint32_t l3_label)
44 : peer_(NULL), path_id_(0), source_(src), attr_(ptr), original_attr_(ptr),
45 flags_(flags), label_(label), l3_label_(l3_label) {
49 #define BOOL_COMPARE(CondA, CondB) \
52 if (!(CondB)) return -1; \
54 if (CondB) return 1; \
77 bool llgr_stale =
attr_->community() &&
attr_->community()->ContainsValue(
101 (
attr_->neighbor_as() &&
142 uint32_t orig_id =
attr_->originator_id().to_ulong();
152 if (lpeer != NULL && rpeer != NULL) {
182 if (!
attr_->source_rd().IsZero())
183 return attr_->source_rd();
192 vector<string> flag_names;
194 flag_names.push_back(
"None");
201 vector<PathFlag> flags;
203 flags.push_back(AsPathLooped);
205 flags.push_back(NoNeighborAs);
207 flags.push_back(Stale);
209 flags.push_back(NoTunnelEncap);
211 flags.push_back(OriginatorIdLooped);
213 flags.push_back(ResolveNexthop);
215 flags.push_back(ResolvedPath);
217 flags.push_back(RoutingPolicyReject);
219 flags.push_back(LlgrStale);
221 flags.push_back(ClusterListLooped);
223 flags.push_back(AliasedPath);
225 flags.push_back(CheckGlobalErmVpnRoute);
227 for (
auto flag : flags) {
230 flag_names.push_back(
"AsPathLooped");
233 flag_names.push_back(
"NoNeighborAs");
236 flag_names.push_back(
"Stale");
239 flag_names.push_back(
"NoTunnelEncap");
241 case OriginatorIdLooped:
242 flag_names.push_back(
"OriginatorIdLooped");
245 flag_names.push_back(
"ResolveNexthop");
248 flag_names.push_back(
"ResolvedPath");
250 case RoutingPolicyReject:
251 flag_names.push_back(
"RoutingPolicyReject");
254 flag_names.push_back(
"LlgrStale");
256 case ClusterListLooped:
257 flag_names.push_back(
"ClusterListLooped");
260 flag_names.push_back(
"AliasedPath");
262 case CheckGlobalErmVpnRoute:
263 flag_names.push_back(
"CheckGlobalErmVpnRoute");
275 if (combine_bgp_and_xmpp) {
283 return "ServiceChain";
285 return "StaticRoute";
297 :
BgpPath(peer, path_id, src, ptr, flags, label, l3_label) {
311 ReplaceSubClusterAndLocate(ext_community.get(),
312 sc.GetExtCommunity());
314 ReplaceExtCommunityAndLocate(attr, ext_community);
322 SetAttr(modified_attr, modified_attr);
const Community * community() const
BgpPath(const IPeer *peer, uint32_t path_id, PathSource src, const BgpAttrPtr ptr, uint32_t flags, uint32_t label, uint32_t l3_label=0)
uint32_t local_pref() const
virtual void UpdatePrimaryPathCount(int count, Address::Family family=Address::UNSPEC) const =0
virtual bool IsXmppPeer() const =0
virtual uint32_t bgp_identifier() const =0
virtual BgpProto::BgpPeerType PeerType() const =0
static std::string PathIdString(uint32_t path_id)
#define KEY_COMPARE(x, y)
BgpGlobalSystemConfig * global_config()
const OriginVnPath * origin_vn_path() const
const Ip4Address & originator_id() const
virtual std::string ToString() const
RouteDistinguisher GetPrimaryRouteDistinguisher() const
std::string GetSourceString(bool combine_bgp_and_xmpp=false) const
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
bool always_compare_med() const
const BgpPeerKey & peer_key() const
BgpSecondaryPath(const IPeer *peer, uint32_t path_id, PathSource src, const BgpAttrPtr attr, uint32_t flags, uint32_t label, uint32_t l3_label=0)
PathSource GetSource() const
ExtCommunityDB * extcomm_db()
virtual const std::string & ToString() const =0
size_t cluster_list_length() const
void UpdatePeerRefCount(int count, Address::Family family) const
static RouteDistinguisher kZeroRd
int PathCompare(const BgpPath &rhs, bool allow_ecmp) const
boost::asio::ip::address_v4 Ip4Address
virtual void UpdateTotalPathCount(int count) const =0
const BgpAttr * GetOriginalAttr() const
#define BOOL_COMPARE(CondA, CondB)
const ExtCommunity * ext_community() const
void AddExtCommunitySubCluster(uint32_t subcluster_id)
int max_as_path_count() const
BgpAttrOrigin::OriginType origin() const
const BgpRoute * src_entry_
const BgpAttr * GetAttr() const
std::vector< std::string > GetFlagsStringList() const
uint32_t sequence_number() const
bool ignore_aspath() const
RouteDistinguisher GetSourceRouteDistinguisher() const
virtual bool IsReplicated() const
as_t autonomous_system() const
bool evpn_sticky_mac() const
void SetAttr(const BgpAttrPtr attr, const BgpAttrPtr original_attr)
bool PathSameNeighborAs(const BgpPath &rhs) const
virtual RouteDistinguisher GetRouteDistinguisher() const