7 #include <boost/foreach.hpp>
9 #include "sandesh/sandesh_trace.h"
14 #include "bgp/bgp_peer_types.h"
30 using boost::scoped_ptr;
63 instance_delete_ref_(this, NULL) {
100 RibOutMap::iterator loc =
ribout_map_.find(policy);
101 return (loc !=
ribout_map_.end()) ? loc->second : NULL;
111 RibOutMap::iterator loc =
ribout_map_.find(policy);
125 RibOutMap::iterator loc =
ribout_map_.find(policy);
149 const IPeer* peer)
const {
153 if (!
server()->enable_4byte_as())
173 as_t peer_asn = peer_loop_check ? ribout->
peer_as() : 0;
174 as_t replace_asn = 0;
205 as_t peer_asn = peer_loop_check ? ribout->
peer_as() : 0;
206 as_t replace_asn = 0;
226 as_t peer_asn = peer_loop_check ? ribout->
peer_as() : 0;
227 as_t replace_asn = 0;
278 ribout->
peer_as(), replace_as);
284 ribout->
peer_as(), replace_as);
307 BgpAttr *attr,
bool llgr_stale_comm) {
321 if (ribout->
llgr()) {
322 if (!llgr_stale_comm) {
335 if (llgr_stale_comm) {
355 BOOST_FOREACH(
const string &encap_string,
363 ext_community.get(), encap_list);
430 scoped_ptr<As4PathSpec> new_as_path(
new As4PathSpec);
440 new_as_path->path_segments.push_back(ps4);
463 scoped_ptr<AsPathSpec> new_as_path(
new AsPathSpec);
491 new_as_path->path_segments.push_back(ps);
506 if (as2_count < as4_count) {
511 bool part_segment =
false;
515 int new_as_count = 0;
517 new_as_count < (as2_count - as4_count) ; ++i) {
529 new_as_count < (as2_count - as4_count); ++j) {
534 if (new_as_count == (as2_count - as4_count)) {
541 aspath_4byte->path_segments.push_back(ps4);
549 part_segment =
false;
564 aspath_4byte->path_segments.push_back(ps4);
571 scoped_ptr<AsPath4ByteSpec> as_path_spec(aspath_4byte->Add(local_as));
621 bool llgr_stale_comm = attr->
community() &&
633 if (new_peerset.
empty())
651 for (Route::PathList::iterator it= route->
GetPathList().begin();
656 const BgpPeer *bgp_peer =
dynamic_cast<
664 int current_index = iter.
index();
666 const BgpPeer *bgp_peer =
dynamic_cast<
668 if (bgp_peer && route_peerset.
test(bgp_peer->
GetIndex()))
669 new_peerset.
reset(current_index);
671 if (new_peerset.
empty())
690 if (
server()->cluster_id()) {
697 server()->bgp_identifier()));
704 server()->cluster_id(), &cluster);
709 server()->cluster_id(), NULL);
739 ribout->
nexthop().is_unspecified()) {
747 if (new_peerset.
empty())
758 if (new_peerset.
empty())
771 if (!ribout->
nexthop().is_unspecified())
810 attr = attr_ptr.get();
814 uinfo->
target = new_peerset;
839 uint32_t path_id, uint32_t flags, uint32_t label,
841 bool notify_rt =
false;
854 if ((path->
GetAttr() != attrs.get()) ||
880 bool fc_family =
false;
902 table = master_ri->
GetTable(family);
948 int instance_id = -1;
949 uint64_t subscription_gen_id = 0;
952 &instance_id, &subscription_gen_id);
971 "Insert new BGP path");
979 uint32_t path_id = 0;
982 uint32_t l3_label = 0;
989 path_id = nexthop.
address_.to_v4().to_ulong();
1002 attr, path_id, flags, label, l3_label);
1011 if (rt->
front() == NULL)
1023 "Paused table deletion due to pending listeners");
1030 "Paused table deletion due to pending walkers");
1035 size_t size =
Size();
1038 "Paused table deletion due to " << size <<
1057 "Received request for table deletion");
1093 BOOST_FOREACH(
const RibOutMap::value_type &value,
ribout_map_) {
1094 const RibOut *ribout = value.second;
1117 if (dynamic_cast<const BgpSecondaryPath *>(path)) {
1147 vector<ShowRibOutStatistics> *sros_list)
const {
1148 BOOST_FOREACH(
const RibOutMap::value_type &value,
ribout_map_) {
1149 const RibOut *ribout = value.second;
void UpdatePathCount(const BgpPath *path, int count)
const Community * community() const
tbb::atomic< uint64_t > stale_path_count_
bool IsNextHopCheckEnabled() const
void PrependLocalAs(const RibOut *ribout, BgpAttr *attr, const IPeer *) const
bool remove_private_enabled() const
const ClusterListSpec & cluster_list() const
uint32_t local_pref() const
void RemovePrivate4ByteAs(const RibOut *ribout, BgpAttr *attr) const
BgpTable * GetTable(Address::Family fmly)
const BgpPath * BestPath() const
TypePtr Locate(Type *attr)
void ProcessLlgrState(const RibOut *ribout, const BgpPath *path, BgpAttr *attr, bool llgr_stale_comm)
const AsPathSpec & path() const
void CheckAggregatorAttr(BgpAttr *attr) const
void CreateAsPath2Byte(BgpAttr *attr) const
bool test(size_t pos) const
void set_nexthop(IpAddress nexthop)
virtual bool IsXmppPeer() const =0
virtual uint32_t bgp_identifier() const =0
void InputCommonPostProcess(DBTablePartBase *root, BgpRoute *rt, bool notify_rt)
const IpAddress & nexthop() const
virtual BgpProto::BgpPeerType PeerType() const =0
UpdateInfo * GetUpdateInfo(RibOut *ribout, BgpRoute *route, const RibPeerSet &peerset)
AsPath4ByteSpec * Replace(as_t old_asn, as_t asn) const
size_t queue_size(int queue_id) const
void CreateAs4Path(BgpAttr *attr) const
void set_cluster_list(const ClusterListSpec *spec)
uint32_t cluster_id() const
virtual void Input(DBTablePartition *root, DBClient *client, DBRequest *req)
BitSet & reset(size_t pos)
void PrependAsToAsPath2Byte(BgpAttr *attr, as_t asn) const
RoutingInstance * rtinstance_
std::vector< PathSegment * > path_segments
AsPathSpec * Add(as2_t asn) const
virtual bool IsVpnTable() const
RoutingInstance * routing_instance()
bool as4_supported() const
virtual BgpRoute * TableFind(DBTablePartition *rtp, const DBRequestKey *prefix)=0
const RibExportPolicy & ExportPolicy() const
virtual void UpdateCloseRouteStats(Address::Family family, const BgpPath *old_path, uint32_t path_flags) const =0
BgpProto::BgpPeerType peer_type() const
void RemovePrivateAs(const RibOut *ribout, BgpAttr *attr) const
std::unique_ptr< DBRequestData > data
as_t AsLeftMostPublic() const
#define BGP_LOG_ROUTE(table, peer, route, arg)
void StartPathResolution(BgpRoute *route, const BgpPath *path, BgpTable *nh_table=NULL)
RoutingInstanceMgr * routing_instance_mgr()
const uint32_t GetPathId() const
virtual DBEntry * Add(const DBRequest *req)
std::vector< as_t > path_segment
void ProcessRemovePrivate(const RibOut *ribout, BgpAttr *attr) const
void set_community(CommunityPtr comm)
void LocatePathResolver()
void ProcessAsOverride(const RibOut *ribout, BgpAttr *attr) const
const BgpPath * FindPath(BgpPath::PathSource src) const
RoutingInstance * GetDefaultRoutingInstance()
const Ip4Address & originator_id() const
const IpAddress & aggregator_adderess() const
virtual bool IsReady() const =0
virtual PathResolver * CreatePathResolver()
void Delete(DBEntryBase *)
void PrependAsToAs4Path(BgpAttr *attr, as_t asn) const
virtual Address::Family family() const =0
uint32_t GetFlags() const
tbb::atomic< uint64_t > infeasible_path_count_
size_t queue_marker_count(int queue_id) const
tbb::atomic< uint64_t > llgr_stale_path_count_
void set_as_path(AsPathPtr aspath)
bool GetRegistrationInfo(const IPeer *peer, const BgpTable *table, int *instance_id=NULL, uint64_t *subscription_gen_id=NULL) const
virtual bool MayDelete() const
void set_aggregator(as_t as_num, IpAddress address)
As4PathSpec * Add(as_t asn) const
int IsAsPathLoop(as_t asn, uint8_t max_loop_count=0) const
uint32_t GetL3Label() const
as_t local_autonomous_system() const
std::vector< PathSegment * > path_segments
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
virtual size_t Size() const
void DestroyDBTable(DBTable *table)
bool IsAggregateRoute(const BgpTable *table, const BgpRoute *route) const
bool IsAggregateRoute(const BgpRoute *route) const
virtual bool CheckSplitHorizon(uint32_t cluster_id=0, uint32_t ribout_cid=0) const
BgpTable(DB *db, const std::string &name)
as_t AsLeftMostPublic() const
AsPathSpec * RemovePrivate(bool all, as2_t asn, as2_t peer_as) const
const AsPath4Byte * aspath_4byte() const
virtual bool MayDelete() const
const ClusterList * cluster_list() const
void Reset(LifetimeActor *actor)
virtual void RetryDelete()
void GetSubsetPeerSet(RibPeerSet *peerset, const IPeerUpdate *cpeer) const
boost::scoped_ptr< DeleteActor > deleter_
std::unique_ptr< DBRequestKey > key
void RemovePrivateAs4(const RibOut *ribout, BgpAttr *attr) const
int as4_path_count() const
#define CHECK_CONCURRENCY(...)
bool remove_private_all() const
void DestroyPathResolver()
As4PathSpec * RemovePrivate(bool all, as_t asn, as_t peer_as) const
bool IsContributingRoute(const BgpTable *table, const BgpRoute *route) const
bool IsEncodingBgp() const
RibOut * RibOutLocate(BgpUpdateSender *sender, const RibExportPolicy &policy)
tbb::atomic< uint64_t > primary_path_count_
RibOut * RibOutFind(const RibExportPolicy &policy)
as_t aggregator_as4_num() const
LifetimeRef< BgpTable > instance_delete_ref_
virtual bool IsRouteAggregationSupported() const
AsPath4ByteSpec * Add(as_t asn) const
as_t aggregator_as_num() const
const As4Path * as4_path() const
uint32_t GetLabel() const
int PathCompare(const BgpPath &rhs, bool allow_ecmp) const
void FillStatisticsInfo(std::vector< ShowRibOutStatistics > *sros_list) const
bool IsAsPathEmpty() const
std::vector< as_t > path_segment
LifetimeActor * deleter()
boost::asio::ip::address_v4 Ip4Address
const AsPath * as_path() const
void set_local_pref(uint32_t local_pref)
virtual bool MayDelete() const
void InsertPath(BgpPath *path)
size_t GetPendingRiboutsCount(size_t *markers) const
void set_originator_id(Ip4Address originator_id)
tbb::atomic< uint64_t > secondary_path_count_
Address::Family nexthop_family() const
const Path * front() const
bool IsMasterRoutingInstance() const
bool IsContributingRoute(const BgpRoute *route) const
const ExtCommunity * ext_community() const
const AsPath4ByteSpec & path() const
static bool PathSelection(const Path &path1, const Path &path2)
const bytes_type & GetExtCommunity() const
bool remove_private_replace() const
AsPath4ByteSpec * RemovePrivate(bool all, as_t asn, as_t peer_as) const
void StopPathResolution(int part_id, const BgpPath *path)
const BgpAttr * GetAttr() const
void FillRibOutStatisticsInfo(std::vector< ShowRibOutStatistics > *sros_list) const
bool IsEncodingXmpp() const
bool InputCommon(DBTablePartBase *root, BgpRoute *rt, BgpPath *path, const IPeer *peer, DBRequest *req, DBRequest::DBOperation oper, BgpAttrPtr attrs, uint32_t path_id, uint32_t flags, uint32_t label, uint32_t l3_label)
bool HasListeners() const
void set_med(uint32_t med)
uint64_t subscription_gen_id() const
LifetimeActor * deleter()
virtual void set_routing_instance(RoutingInstance *rtinstance)
void DeletePath(BgpPath *path)
RibOutUpdates * updates(int idx)
BgpMembershipManager * membership_mgr()
void PrependAsToAsPath4Byte(BgpAttr *attr, as_t asn) const
const As4PathSpec & path() const
static int PartitionCount()
void RibOutDelete(const RibExportPolicy &policy)
virtual bool IsRegistrationRequired() const =0
void set_ext_community(ExtCommunityPtr extcomm)
int as_path_count() const
void CreateAsPath4Byte(BgpAttr *attr, as_t local_as) const
bool NeedsResolution() const
std::vector< std::string > default_tunnel_encap_list
bool ClusterListLoop(uint32_t cluster_id) const
uint32_t cluster_id() const
void ProcessDefaultTunnelEncapsulation(const RibOut *ribout, ExtCommunityDB *extcomm_db, BgpAttr *attr) const
void Notify(DBEntryBase *entry)
const NextHop & nexthop()
std::vector< as2_t > path_segment
bool Has4ByteAsn(BgpAttr *attr) const
std::vector< PathSegment * > path_segments
void set_aspath_4byte(AsPath4BytePtr aspath)
void set_as4_path(As4PathPtr aspath)
#define BGP_LOG_TABLE(table, level, flags, arg)
AsPathSpec * Replace(as2_t old_asn, as2_t asn) const
bool remove_private_peer_loop_check() const
DeleteActor(BgpTable *table)
bool DeletePath(DBTablePartBase *root, BgpRoute *rt, BgpPath *path)
virtual void GetRibOutInterestedPeers(RibOut *ribout, const ExtCommunity *ext_community, const RibPeerSet &peerset, RibPeerSet *new_peerset)
virtual BgpAttrPtr GetAttributes(BgpRoute *rt, BgpAttrPtr attrp, const IPeer *peer)
PathResolver * path_resolver_
as2_t AsLeftMostPublic() const
const PathList & GetPathList() const
void set_as4_aggregator(as_t as_num, IpAddress address)
RTargetGroupMgr * rtarget_group_mgr()
As4PathSpec * Replace(as_t old_asn, as_t asn) const