5 #ifndef SRC_BGP_BGP_ATTR_H_
6 #define SRC_BGP_BGP_ATTR_H_
8 #include <boost/intrusive_ptr.hpp>
9 #include <tbb/atomic.h>
58 virtual std::string
ToString()
const;
76 if (ip_nexthop.is_v4()) {
77 nexthop = ip_nexthop.to_v4().to_ulong();
78 }
else if (ip_nexthop.is_v6()) {
86 virtual std::string
ToString()
const;
101 virtual std::string
ToString()
const;
118 virtual std::string
ToString()
const;
129 virtual std::string
ToString()
const;
147 virtual std::string
ToString()
const;
165 virtual std::string
ToString()
const;
183 virtual std::string
ToString()
const;
200 virtual std::string
ToString()
const;
215 virtual std::string
ToString()
const;
249 return ccluster_list->
refcount_.fetch_and_increment();
253 return ccluster_list->
refcount_.fetch_and_decrement();
257 int prev = ccluster_list->
refcount_.fetch_and_decrement();
290 std::vector<uint8_t> nh) :
311 std::vector<BgpProtoPrefix *>
nlri;
347 virtual std::string
ToString()
const;
403 return cpmsi_tunnel->
refcount_.fetch_and_increment();
407 return cpmsi_tunnel->
refcount_.fetch_and_decrement();
411 int prev = cpmsi_tunnel->
refcount_.fetch_and_decrement();
446 virtual std::string
ToString()
const;
452 void GetLabels(uint32_t *first_label, uint32_t *last_label)
const;
453 void SetLabels(uint32_t first_label, uint32_t last_label);
507 return cediscovery->
refcount_.fetch_and_increment();
511 return cediscovery->
refcount_.fetch_and_decrement();
515 int prev = cediscovery->
refcount_.fetch_and_decrement();
535 EdgeDiscoveryCompare,
551 virtual std::string
ToString()
const;
614 return ceforwarding->
refcount_.fetch_and_increment();
618 return ceforwarding->
refcount_.fetch_and_decrement();
622 int prev = ceforwarding->
refcount_.fetch_and_decrement();
643 EdgeForwardingCompare,
655 label_block(label_block) {
660 virtual std::string
ToString()
const;
666 std::vector<std::string>
encap = std::vector<std::string>())
667 : address(address), label(label),
encap(
encap) {
691 virtual std::string
ToString()
const;
729 return colist->
refcount_.fetch_and_increment();
733 return colist->
refcount_.fetch_and_decrement();
737 int prev = colist->
refcount_.fetch_and_decrement();
778 virtual std::string
ToString()
const;
790 virtual std::string
ToString()
const;
802 virtual std::string
ToString()
const;
819 virtual std::string
ToString()
const;
974 return cattrp->
refcount_.fetch_and_increment();
978 return cattrp->
refcount_.fetch_and_decrement();
982 int prev = cattrp->
refcount_.fetch_and_decrement();
1000 BgpAttrCompare, BgpAttrDB> {
1014 uint32_t local_pref);
1030 const std::string &sbp);
1038 #endif // SRC_BGP_BGP_ATTR_H_
virtual ~EdgeForwarding()
const Community * community() const
tbb::atomic< int > refcount_
boost::intrusive_ptr< const AsPath > AsPathPtr
EdgeDiscoveryPtr edge_discovery_
void SetIp4Address(Ip4Address addr)
int intrusive_ptr_add_ref(const AsPath *cpath)
BgpAttrPtr ReplaceLeafOListAndLocate(const BgpAttr *attr, const BgpOListSpec *leaf_olist_spec)
virtual void ToCanonical(BgpAttr *attr)
virtual int CompareTo(const BgpAttribute &rhs_attr) const
std::vector< std::string > encap
Ip4Address GetIdentifier() const
const Ip4Address identifier() const
Ip4Address GetInboundIp4Address() const
static const uint8_t kFlags
std::vector< Edge * > EdgeList
std::vector< uint8_t > value
const BgpOListSpec & olist() const
const ClusterListSpec & cluster_list() const
tbb::atomic< int > refcount_
std::vector< BgpProtoPrefix * > nlri
friend int intrusive_ptr_del_ref(const PmsiTunnel *cpmsi_tunnel)
static const uint8_t kFlags
tbb::atomic< int > refcount_
uint32_t local_pref() const
EdgeForwarding(EdgeForwardingDB *edge_forwarding_db, const EdgeForwardingSpec &efspec)
BgpAttrMultiExitDisc(uint32_t med)
const IpAddress & nexthop() const
void STLDeleteValues(Container *container)
BgpAttrPtr ReplaceOriginatorIdAndLocate(const BgpAttr *attr, Ip4Address originator_id)
ExtCommunityPtr ext_community_
const BgpServer * server() const
void set_pmsi_tunnel(const PmsiTunnelSpec *pmsi_spec)
friend void intrusive_ptr_release(const EdgeDiscovery *ediscovery)
LabelBlockPtr label_block() const
BgpAttrAs4Aggregator(uint32_t as_num, uint32_t address)
std::vector< uint8_t > outbound_address
void GetLabels(uint32_t *first_label, uint32_t *last_label) const
virtual std::string ToString() const
virtual size_t EncodeLength() const
friend void intrusive_ptr_release(const BgpOList *colist)
void set_nexthop(IpAddress nexthop)
boost::intrusive_ptr< PmsiTunnel > PmsiTunnelPtr
virtual int CompareTo(const BgpAttribute &rhs_attr) const
virtual void ToCanonical(BgpAttr *attr)
std::vector< std::string > GetTunnelFlagsStrings() const
std::string sub_protocol_
BgpAttrPtr ReplaceCommunityAndLocate(const BgpAttr *attr, CommunityPtr community)
void set_cluster_list(const ClusterListSpec *spec)
bool operator()(const EdgeDiscovery *lhs, const EdgeDiscovery *rhs)
tbb::atomic< int > refcount_
boost::intrusive_ptr< const As4Path > As4PathPtr
const EdgeForwardingSpec & edge_forwarding() const
static const uint8_t kFlags
RouteDistinguisher source_rd_
virtual int CompareTo(const BgpAttribute &rhs_attr) const
virtual std::string ToString() const
void set_origin(BgpAttrOrigin::OriginType org)
const BgpAttrDB * attr_db() const
virtual void ToCanonical(BgpAttr *attr)
friend std::size_t hash_value(const EdgeDiscovery &edge_discovery)
boost::asio::ip::address IpAddress
BgpAttr4ByteAggregator(uint32_t as_num, uint32_t address)
BgpOListPtr olist() const
EdgeDiscovery(EdgeDiscoveryDB *edge_discovery_db, const EdgeDiscoverySpec &edspec)
PmsiTunnelSpec pmsi_spec_
static const uint8_t kFlags
std::vector< uint8_t > address
PmsiTunnel(PmsiTunnelDB *pmsi_tunnel_db, const PmsiTunnelSpec &pmsi_spec)
void SetOutboundIp4Address(Ip4Address addr)
virtual std::string ToString() const
int CompareTo(const EdgeForwarding &rhs) const
EdgeForwardingSpec efspec_
IpAddress aggregator_address_
boost::intrusive_ptr< LabelBlock > LabelBlockPtr
BgpMpNlri(BgpAttribute::Code code, uint16_t afi, uint8_t safi, std::vector< uint8_t > nh)
BgpAttrPtr ReplaceNexthopAndLocate(const BgpAttr *attr, const IpAddress &addr)
OriginVnPathPtr origin_vn_path_
virtual std::string ToString() const
virtual int CompareTo(const BgpAttribute &rhs_attr) const
LabelBlockPtr label_block
const OriginVnPath * origin_vn_path() const
void set_edge_discovery(const EdgeDiscoverySpec *edspec)
const uint8_t tunnel_type() const
void set_community(CommunityPtr comm)
std::vector< BgpAttribute * > BgpAttrSpec
BgpAttrNextHop(IpAddress ip_nexthop)
static const uint8_t kFlags
const Ip4Address & originator_id() const
BgpAttrOriginatorId(const BgpAttribute &rhs)
BgpAttrEsi(const EthernetSegmentId &esi)
const IpAddress & aggregator_adderess() const
bool operator()(const BgpOList *lhs, const BgpOList *rhs)
friend int intrusive_ptr_add_ref(const ClusterList *ccluster_list)
virtual int CompareTo(const BgpAttribute &rhs_attr) const
BgpAttrSourceRd(const RouteDistinguisher &source_rd)
virtual std::string ToString() const
friend int intrusive_ptr_add_ref(const PmsiTunnel *cpmsi_tunnel)
static const uint8_t kFlags
const RouteDistinguisher & source_rd() const
virtual std::string ToString() const
BgpAttrAtomicAggregate(const BgpAttribute &rhs)
virtual std::string ToString() const
Edge(const EdgeDiscoverySpec::Edge *edge_spec)
static const int kDefault
std::string origin_string() const
tbb::atomic< int > refcount_
std::vector< uint32_t > cluster_list
BgpAttrEsi(const BgpAttribute &rhs)
virtual void ToCanonical(BgpAttr *attr)
virtual std::string ToString() const
virtual void ToCanonical(BgpAttr *attr)
void set_as_path(AsPathPtr aspath)
void set_source_rd(const RouteDistinguisher &source_rd)
Ip4Address originator_id_
BgpAttrPtr ReplaceExtCommunityAndLocate(const BgpAttr *attr, ExtCommunityPtr extcomm)
virtual std::string ToString() const
virtual int CompareTo(const BgpAttribute &rhs_attr) const
void set_aggregator(as_t as_num, IpAddress address)
bool operator<(const Edge &rhs) const
virtual size_t EncodeLength() const
int IsAsPathLoop(as_t asn, uint8_t max_loop_count=0) const
MacAddress mac_address() const
boost::intrusive_ptr< const OriginVnPath > OriginVnPathPtr
std::vector< BgpOListElem * > Elements
virtual int CompareTo(const BgpAttribute &rhs) const
friend int intrusive_ptr_del_ref(const BgpAttr *cattrp)
virtual void ToCanonical(BgpAttr *attr)
boost::intrusive_ptr< const AsPath4Byte > AsPath4BytePtr
virtual int CompareTo(const BgpAttribute &rhs_attr) const
void set_sub_protocol(const std::string &sub_protocol)
friend int intrusive_ptr_del_ref(const EdgeDiscovery *ediscovery)
Ip4Address GetIp4Address() const
void set_esi(const EthernetSegmentId &esi)
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
BgpMpNlri(BgpAttribute::Code code, uint16_t afi, uint8_t safi)
bool operator()(const PmsiTunnel *lhs, const PmsiTunnel *rhs)
Ip4Address inbound_address
const std::string & sub_protocol() const
virtual void ToCanonical(BgpAttr *attr)
BgpAttrSubProtocol(const BgpAttribute &rhs)
virtual std::string ToString() const
Ip4Address GetOutboundIp4Address() const
const uint8_t tunnel_flags() const
BgpAttrLocalPref(const BgpAttribute &rhs)
friend int intrusive_ptr_add_ref(const EdgeForwarding *ceforwarding)
void SetInboundIp4Address(Ip4Address addr)
ClusterListSpec(const BgpAttribute &rhs)
void set_params(uint64_t params)
virtual int CompareTo(const BgpAttribute &rhs_attr) const
BgpAttrPtr ReplaceEsiAndLocate(const BgpAttr *attr, const EthernetSegmentId &esi)
void set_leaf_olist(const BgpOListSpec *leaf_olist_spec)
const AsPath4Byte * aspath_4byte() const
friend std::size_t hash_value(const BgpOList &olist)
std::vector< Edge * > EdgeList
PmsiTunnelPtr pmsi_tunnel_
const ClusterList * cluster_list() const
#define BOOL_KEY_COMPARE(x, y)
bool evpn_single_active() const
BgpAttrOrigin::OriginType origin_
static std::string OriginToString(BgpAttrOrigin::OriginType origin)
bool operator<(const Edge &rhs) const
virtual int CompareTo(const BgpAttribute &rhs_attr) const
void SetLabels(uint32_t first_label, uint32_t last_label)
virtual void ToCanonical(BgpAttr *attr)
const EthernetSegmentId & esi() const
virtual void ToCanonical(BgpAttr *attr)
friend int intrusive_ptr_add_ref(const BgpOList *colist)
BgpAttr4ByteAggregator(const BgpAttribute &rhs)
boost::asio::ip::address_v6 Ip6Address
int CompareTo(const EdgeDiscovery &rhs) const
BgpAttrPtr ReplaceSubProtocolAndLocate(const BgpAttr *attr, const std::string &sbp)
friend int intrusive_ptr_del_ref(const BgpOList *colist)
ClusterList(ClusterListDB *cluster_list_db, const ClusterListSpec &spec)
std::string GetTunnelArTypeString() const
std::vector< Edge * > EdgeList
int CompareTo(const PmsiTunnel &rhs) const
void SetIdentifier(Ip4Address identifier)
std::vector< Edge * > EdgeList
BgpAttrPtr ReplaceLocalPreferenceAndLocate(const BgpAttr *attr, uint32_t local_pref)
BgpAttrLabelBlock(const BgpAttribute &rhs)
int CompareTo(const BgpAttr &rhs) const
int as4_path_count() const
BgpMpNlri(BgpAttribute::Code code)
virtual int CompareTo(const BgpAttribute &rhs_attr) const
friend void intrusive_ptr_release(const PmsiTunnel *cpmsi_tunnel)
EdgeDiscoveryDB(BgpServer *server)
size_t cluster_list_length() const
static const uint8_t kFlags
as_t aggregator_as4_num() const
BgpAttrPtr ReplaceSourceRdAndLocate(const BgpAttr *attr, const RouteDistinguisher &source_rd)
BgpOList(BgpOListDB *olist_db, const BgpOListSpec &olist_spec)
virtual std::string ToString() const
as_t aggregator_as_num() const
friend int intrusive_ptr_add_ref(const EdgeDiscovery *ediscovery)
BgpAttrParams(const BgpAttribute &rhs)
BgpAttrSubProtocol(const std::string &sbp)
const EdgeDiscoverySpec & edge_discovery() const
virtual std::string ToString() const
const As4Path * as4_path() const
static const uint8_t kFlags
virtual std::string ToString() const
BgpAttrNextHop(Ip6Address v6_nexthop)
virtual void ToCanonical(BgpAttr *attr)
friend void intrusive_ptr_release(const BgpAttr *cattrp)
virtual void ToCanonical(BgpAttr *attr)
bool operator()(const Edge *lhs, const Edge *rhs)
ClusterListDB(BgpServer *server)
bool IsAsPathEmpty() const
virtual int CompareTo(const BgpAttribute &rhs_attr) const
BgpAttrPtr ReplaceOriginAndLocate(const BgpAttr *attr, BgpAttrOrigin::OriginType origin)
void SetLabel(uint32_t label, const ExtCommunity *ext)
virtual std::string ToString() const
BgpAttrPtr ReplacePmsiTunnelAndLocate(const BgpAttr *attr, const PmsiTunnelSpec *pmsi_spec)
boost::asio::ip::address_v4 Ip4Address
friend int intrusive_ptr_add_ref(const BgpAttr *cattrp)
const AsPath * as_path() const
void set_local_pref(uint32_t local_pref)
ClusterListSpec(const ClusterListSpec &rhs)
std::vector< uint8_t > identifier
int intrusive_ptr_del_ref(const AsPath *cpath)
virtual std::string ToString() const
void set_edge_forwarding(const EdgeForwardingSpec *efspec)
EdgeDiscoveryDB * edge_discovery_db_
BgpOListElem(Ip4Address address, uint32_t label, std::vector< std::string > encap=std::vector< std::string >())
void set_originator_id(Ip4Address originator_id)
virtual void ToCanonical(BgpAttr *attr)
friend std::size_t hash_value(const PmsiTunnel &pmsi_tunnel)
static BgpAttrOrigin::OriginType OriginFromString(const std::string &bgp_origin_type)
Address::Family nexthop_family() const
bool operator()(const ClusterList *lhs, const ClusterList *rhs)
void set_label_block(LabelBlockPtr label_block)
virtual int CompareTo(const BgpAttribute &rhs_attr) const
BgpAttrSourceRd(const BgpAttribute &rhs)
BgpAttrNextHop(Ip4Address v4_nexthop)
const ExtCommunity * ext_community() const
BgpOListDB(BgpServer *server)
BgpAttrLabelBlock(LabelBlockPtr label_block)
BgpAttrPtr ReplaceAsPathAndLocate(const BgpAttr *attr, AsPathPtr aspath)
Ip4Address outbound_address
boost::intrusive_ptr< ClusterList > ClusterListPtr
static const uint8_t kFlags
const Elements & elements() const
BgpAttrPtr ReplaceOListAndLocate(const BgpAttr *attr, const BgpOListSpec *olist_spec)
virtual int CompareTo(const BgpAttribute &rhs_attr) const
BgpAttrAggregator(const BgpAttribute &rhs)
PmsiTunnelDB(BgpServer *server)
int max_as_path_count() const
friend void intrusive_ptr_release(const ClusterList *ccluster_list)
virtual size_t EncodeLength() const
BgpAttrOrigin::OriginType origin() const
BgpMpNlri(const BgpAttribute &rhs)
BgpAttrOriginatorId(uint32_t originator_id)
ClusterListPtr cluster_list_
friend std::size_t hash_value(const ClusterList &cluster_list)
virtual void ToCanonical(BgpAttr *attr)
int aspath_4byte_count() const
BgpAttrNextHop(const BgpAttribute &rhs)
virtual int CompareTo(const BgpAttribute &rhs_attr) const
void set_med(uint32_t med)
BgpAttrAs4Aggregator(const BgpAttribute &rhs)
EdgeDiscoverySpec edspec_
uint32_t GetLabel(const ExtCommunity *ext) const
BgpAttrAggregator(uint32_t as_num, uint32_t address)
BgpOListSpec(uint8_t subcode)
LabelBlockPtr label_block_
BgpAttrOrigin(const BgpAttribute &rhs)
const PmsiTunnelSpec & pmsi_tunnel() const
void intrusive_ptr_release(const AsPath *cpath)
friend int intrusive_ptr_del_ref(const ClusterList *ccluster_list)
uint32_t sequence_number() const
std::string GetTunnelTypeString() const
BgpAttrNextHop(uint32_t nexthop)
static const uint8_t kFlags
bool operator<(const BgpOListElem &rhs) const
static const uint8_t kFlags
const EdgeForwarding * edge_forwarding() const
virtual void ToCanonical(BgpAttr *attr)
BgpAttrOrigin(int origin)
friend int intrusive_ptr_del_ref(const EdgeForwarding *ceforwarding)
virtual int CompareTo(const BgpAttribute &rhs_attr) const
void set_ext_community(ExtCommunityPtr extcomm)
int as_path_count() const
int CompareTo(const BgpOList &rhs) const
virtual void ToCanonical(BgpAttr *attr)
BgpAttrLocalPref(uint32_t local_pref)
Edge(const EdgeForwardingSpec::Edge *edge_spec)
EdgeForwardingPtr edge_forwarding_
void set_origin_vn_path(OriginVnPathPtr ovnpath)
boost::intrusive_ptr< BgpOList > BgpOListPtr
RouteDistinguisher source_rd
void set_olist(const BgpOListSpec *olist_spec)
static const uint8_t kFlags
virtual int CompareTo(const BgpAttribute &rhs_attr) const
const EdgeDiscovery * edge_discovery() const
bool ClusterListLoop(uint32_t cluster_id) const
std::vector< uint8_t > nexthop
void set_atomic_aggregate(bool ae)
virtual std::string ToString() const
ClusterListDB * cluster_list_db_
void set_aspath_4byte(AsPath4BytePtr aspath)
virtual void ToCanonical(BgpAttr *attr)
LabelBlockPtr label_block
void set_as4_path(As4PathPtr aspath)
const PmsiTunnel * pmsi_tunnel() const
virtual std::string ToString() const
std::vector< uint8_t > inbound_address
static const uint8_t kFlags
bool operator()(const EdgeForwarding *lhs, const EdgeForwarding *rhs)
BgpOListPtr leaf_olist() const
int CompareTo(const ClusterList &rhs) const
tbb::atomic< int > refcount_
static const uint8_t kFlags
virtual std::string ToString() const
friend void intrusive_ptr_release(const EdgeForwarding *ceforwarding)
EdgeForwardingDB * edge_forwarding_db_
BgpAttrMultiExitDisc(const BgpAttribute &rhs)
bool operator()(const BgpOListElem *lhs, const BgpOListElem *rhs)
virtual void ToCanonical(BgpAttr *attr)
BgpAttrDB(BgpServer *server)
virtual std::string ToString() const
std::vector< BgpOListElem > Elements
BgpAttrPtr ReplaceOriginVnPathAndLocate(const BgpAttr *attr, OriginVnPathPtr ovnpath)
friend std::size_t hash_value(BgpAttr const &attr)
bool atomic_aggregate() const
BgpAttrUnknown(const BgpAttribute &rhs)
bool operator()(const Edge *lhs, const Edge *rhs)
bool operator()(const BgpAttr *lhs, const BgpAttr *rhs)
virtual void ToCanonical(BgpAttr *attr)
BgpAttrParams(uint64_t params)
bool evpn_sticky_mac() const
virtual int CompareTo(const BgpAttribute &rhs_attr) const
boost::intrusive_ptr< EdgeDiscovery > EdgeDiscoveryPtr
virtual void ToCanonical(BgpAttr *attr)
uint32_t GetLabel(const ExtCommunity *ext) const
EdgeForwardingDB(BgpServer *server)
AsPath4BytePtr aspath_4byte_
virtual void ToCanonical(BgpAttr *attr)
std::vector< uint32_t > labels
PmsiTunnelDB * pmsi_tunnel_db_
friend std::size_t hash_value(const EdgeForwarding &edge_forwarding)
void set_as4_aggregator(as_t as_num, IpAddress address)
boost::intrusive_ptr< EdgeForwarding > EdgeForwardingPtr
virtual int CompareTo(const BgpAttribute &rhs_attr) const
const uint32_t label() const