8 #include <boost/foreach.hpp>
24 #include "bgp/routing-instance/routing_instance_analytics_types.h"
27 using std::unique_ptr;
35 uint32_t data = prefix.
originator().to_ulong();
39 uint32_t data = prefix.
asn();
46 :
BgpTable(db, name), manager_(NULL) {
64 const string &key_str)
const {
66 return unique_ptr<DBEntry> (
new MvpnRoute(prefix));
104 manager_ = BgpStaticObjectFactory::Create<MvpnManager>(
this, pm->
table());
124 if (!
server()->mvpn_ipv4_enable())
127 tbb::mutex::scoped_lock lock(rtinstance->
manager()->
mutex());
132 pair<MvpnProjectManagerNetworks::iterator, bool> ret =
135 ret.first->second.insert(rtinstance->
name());
141 MvpnProjectManagerNetworks::iterator iter =
147 BOOST_FOREACH(
const string &mvpn_network, iter->second) {
161 if (!
server()->mvpn_ipv4_enable())
166 MvpnProjectManagerNetworks::iterator iter =
171 if (iter->second.empty())
187 if (pm_network.empty())
197 return table->mvpn_project_manager();
202 if (pm_network.empty())
206 if (!rtinstance || rtinstance->
deleted())
213 if (!
table->mvpn_project_manager() ||
228 return manager->GetPartition(part_id);
251 if (!spmsi_rt || !spmsi_rt->
IsUsable())
262 mvpn_rt, secondary_tables);
286 if (dest_route == NULL) {
288 rtp->
Add(dest_route);
338 server()->autonomous_system(), group, source);
350 server()->autonomous_system());
400 src_path, community);
406 src_path, community);
417 if (!mvpn_state || !mvpn_state->spmsi_rt() ||
418 !mvpn_state->spmsi_rt()->IsUsable()) {
421 if (mvpn_state->spmsi_rt()->table() !=
this)
428 src_path, community);
440 bool vit_found =
false;
442 ext_community->communities()) {
445 if (rtarget == vit) {
453 MVPN_RT_LOG(src_rt,
"Route was not replicated as rt-import "
454 "extended-community was not found");
462 src_path, ext_community);
479 MVPN_RT_LOG(src_rt,
"Route was not replicated as source_rd is zero");
484 bool source_as_found =
false;
489 source_as_found =
true;
495 if (!source_as_found) {
496 MVPN_RT_LOG(src_rt,
"Route was not replicated as source_as is zero");
525 if (dest_route == NULL) {
527 rtp->
Add(dest_route);
545 comm->communities()) {
548 rtarget.push_back(value);
554 if (rtarget.size() == 1) {
556 ReplaceRTargetAndLocate(new_attr->ext_community(), rtarget);
558 src_path->
GetAttr(), ext_community.get());
561 "Could not find <originator>:0 route-target community");
569 if (dest_path != NULL) {
589 MVPN_RT_LOG(src_rt,
"Route was successfully replicated");
601 uinfo_slist->push_front(*uinfo);
608 MVPN_RT_LOG(mvpn_route,
"Route was exported as update_info could not "
612 uinfo_slist->push_front(*uinfo);
620 int current_index = iter.
index();
623 for (Route::PathList::const_iterator it = route->
GetPathList().begin();
625 const BgpPath *path =
static_cast<const BgpPath *
>(it.operator->());
627 new_peerset->
set(current_index);
647 MVPN_RT_LOG(route,
"Route was exported as ProjectManager was "
653 GetPeerSet(ribout, route, peerset, &new_peerset);
655 if (new_peerset.
empty())
660 uinfo->
target = new_peerset;
boost::asio::ip::address_v4 Ip4Address
std::size_t hash_value(BgpAttr const &attr)
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
#define MVPN_RT_LOG(rt,...)
boost::intrusive_ptr< MvpnState > MvpnStatePtr
BgpAttrPtr ReplaceNexthopAndLocate(const BgpAttr *attr, const IpAddress &addr)
BgpAttrPtr ReplaceExtCommunityAndLocate(const BgpAttr *attr, ExtCommunityPtr extcomm)
const RouteDistinguisher & source_rd() const
const ExtCommunity * ext_community() const
uint32_t GetLabel() const
uint32_t GetFlags() const
const uint32_t GetPathId() const
virtual bool IsReplicated() const
const BgpAttr * GetAttr() const
PathSource GetSource() const
const BgpAttr * GetOriginalAttr() const
const BgpPath * BestPath() const
bool RemoveSecondaryPath(const BgpRoute *src_rt, BgpPath::PathSource src, const IPeer *peer, uint32_t path_id)
BgpPath * FindSecondaryPath(BgpRoute *src_rt, BgpPath::PathSource src, const IPeer *peer, uint32_t path_id)
void InsertPath(BgpPath *path)
void SetReplicateInfo(const BgpTable *table, const BgpRoute *rt)
ExtCommunityDB * extcomm_db()
uint32_t bgp_identifier() const
bool mvpn_ipv4_enable() const
RoutingInstance * routing_instance()
std::set< BgpTable * > TableSet
UpdateInfo * GetUpdateInfo(RibOut *ribout, BgpRoute *route, const RibPeerSet &peerset)
PathResolver * path_resolver()
LifetimeActor * deleter()
DBTablePartBase * get_table_partition() const
const std::string & name() const
void Notify(DBEntryBase *entry)
virtual void Add(DBEntry *entry)
DBEntry * Find(const DBEntry *entry)
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
static void RegisterFactory(const std::string &prefix, CreateFunction create_fn)
static size_t HashFunction(const Ip4Prefix &addr)
virtual void Initialize()
virtual void UpdateSecondaryTablesForReplication(MvpnRoute *rt, BgpTable::TableSet *secondary_tables) const
void SetLeafADPrefixFromSPMSIPrefix(const MvpnPrefix &prefix)
void SetSPMSIPrefixFromLeafADPrefix(const MvpnPrefix &prefix)
Ip4Address source() const
static MvpnPrefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
Ip4Address GetType3OriginatorFromType4Route() const
Ip4Address originator() const
const RouteDistinguisher & route_distinguisher() const
UpdateInfo * GetUpdateInfo(MvpnRoute *route)
MvpnStatePtr GetState(MvpnRoute *route) const
const MvpnPrefix & GetPrefix() const
const MvpnManager * manager() const
bool IsProjectManagerUsable() const
static const int kPartitionCount
const MvpnProjectManager * GetProjectManager() const
MvpnRoute * LocateType4LeafADRoute(const MvpnRoute *type3_spmsi_rt)
MvpnPrefix CreateLocalType7Prefix(MvpnRoute *rt) const
MvpnRoute * LocateType3SPMSIRoute(const MvpnRoute *type7_join_rt)
MvpnRoute * LocateType1ADRoute()
BgpRoute * ReplicateType7SourceTreeJoin(BgpServer *server, MvpnTable *src_table, MvpnRoute *src_rt, const BgpPath *src_path, ExtCommunityPtr ext_community)
MvpnRoute * FindType1ADRoute()
MvpnPrefix CreateType4LeafADRoutePrefix(const MvpnRoute *type3_rt)
static DBTableBase * CreateTable(DB *db, const std::string &name)
MvpnPrefix CreateType3SPMSIRoutePrefix(const MvpnRoute *type7_rt)
size_t HashFunction(const MvpnPrefix &prefix) const
void UpdateSecondaryTablesForReplication(BgpRoute *rt, TableSet *secondary_tables)
virtual std::unique_ptr< DBEntry > AllocEntryStr(const std::string &key) const
virtual bool Export(RibOut *ribout, Route *route, const RibPeerSet &peerset, UpdateInfoSList &info_slist)
BgpRoute * ReplicatePath(BgpServer *server, const MvpnPrefix &mprefix, MvpnTable *src_table, MvpnRoute *src_rt, const BgpPath *src_path, ExtCommunityPtr comm)
void CreateMvpnManagers()
const MvpnRoute * FindType7SourceTreeJoinRoute(MvpnRoute *rt) const
PathResolver * CreatePathResolver()
void GetPeerSet(RibOut *ribout, MvpnRoute *route, const RibPeerSet &peerset, RibPeerSet *new_peerset)
const MvpnProjectManagerPartition * GetProjectManagerPartition(BgpRoute *route) const
MvpnRoute * LocateRoute(const MvpnPrefix &prefix)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *key) const
MvpnPrefix CreateType1ADRoutePrefix()
MvpnPrefix CreateType2ADRoutePrefix()
MvpnPrefix CreateType7SourceTreeJoinRoutePrefix(MvpnRoute *rt) const
virtual size_t Hash(const DBEntry *entry) const
UpdateInfo * GetMvpnUpdateInfo(RibOut *ribout, MvpnRoute *route, const RibPeerSet &peerset)
virtual BgpRoute * TableFind(DBTablePartition *rtp, const DBRequestKey *prefix)
const MvpnTable * table() const
virtual BgpRoute * RouteReplicate(BgpServer *server, BgpTable *src_table, BgpRoute *src_rt, const BgpPath *path, ExtCommunityPtr ptr)
MvpnTable(DB *db, const std::string &name)
MvpnRoute * FindRoute(const MvpnPrefix &prefix)
void set_nexthop_longest_match(bool flag)
bool IsEncodingXmpp() const
static RouteDistinguisher kZeroRd
const PathList & GetPathList() const
RoutingInstance * GetRoutingInstance(const std::string &name)
const MvpnProjectManagerNetworks & mvpn_project_managers() const
const std::string & name() const
const RoutingInstanceMgr * manager() const
const RouteDistinguisher * GetRD() const
const std::string & mvpn_project_manager_network() const
BgpTable * GetTable(Address::Family fmly)
bool IsMasterRoutingInstance() const
MODULE_INITIALIZER(RegisterFactory)
static void RegisterFactory()