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())
202 if (pm_network.empty())
206 if (!rtinstance || rtinstance->
deleted())
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");
512 return ReplicatePath(server, prefix, src_table, src_rt, src_path,
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;
MvpnStatePtr GetState(MvpnRoute *route) const
virtual void Initialize()
BgpTable * GetTable(Address::Family fmly)
const BgpPath * BestPath() const
const RouteDistinguisher * GetRD() const
RoutingInstance * GetRoutingInstance(const std::string &name)
UpdateInfo * GetUpdateInfo(RibOut *ribout, BgpRoute *route, const RibPeerSet &peerset)
bool RemoveSecondaryPath(const BgpRoute *src_rt, BgpPath::PathSource src, const IPeer *peer, uint32_t path_id)
MvpnRoute * LocateRoute(const MvpnPrefix &prefix)
DBEntry * Find(const DBEntry *entry)
size_t HashFunction(const MvpnPrefix &prefix) const
static void RegisterFactory()
virtual bool Export(RibOut *ribout, Route *route, const RibPeerSet &peerset, UpdateInfoSList &info_slist)
RoutingInstance * routing_instance()
BgpRoute * ReplicatePath(BgpServer *server, const MvpnPrefix &mprefix, MvpnTable *src_table, MvpnRoute *src_rt, const BgpPath *src_path, ExtCommunityPtr comm)
virtual std::unique_ptr< DBEntry > AllocEntryStr(const std::string &key) const
MvpnProjectManager * mvpn_project_manager()
MvpnPrefix CreateType3SPMSIRoutePrefix(const MvpnRoute *type7_rt)
BgpAttrPtr ReplaceNexthopAndLocate(const BgpAttr *attr, const IpAddress &addr)
void SetLeafADPrefixFromSPMSIPrefix(const MvpnPrefix &prefix)
const uint32_t GetPathId() const
MvpnRoute * LocateType4LeafADRoute(const MvpnRoute *type3_spmsi_rt)
MvpnPrefix CreateType2ADRoutePrefix()
const std::string & name() const
virtual BgpRoute * RouteReplicate(BgpServer *server, BgpTable *src_table, BgpRoute *src_rt, const BgpPath *path, ExtCommunityPtr ptr)
const RouteDistinguisher & source_rd() const
uint32_t GetFlags() const
virtual void UpdateSecondaryTablesForReplication(MvpnRoute *rt, BgpTable::TableSet *secondary_tables) const
const std::string & mvpn_project_manager_network() const
void UpdateSecondaryTablesForReplication(BgpRoute *rt, TableSet *secondary_tables)
MvpnRoute * FindType1ADRoute()
BgpAttrPtr ReplaceExtCommunityAndLocate(const BgpAttr *attr, ExtCommunityPtr extcomm)
void CreateMvpnManagers()
const MvpnManager * manager() const
MvpnRoute * FindRoute(const MvpnPrefix &prefix)
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
void SetReplicateInfo(const BgpTable *table, const BgpRoute *rt)
boost::intrusive_ptr< MvpnState > MvpnStatePtr
virtual size_t Hash(const DBEntry *entry) const
MvpnPrefix CreateType1ADRoutePrefix()
PathSource GetSource() const
PathResolver * CreatePathResolver()
const MvpnRoute * FindType7SourceTreeJoinRoute(MvpnRoute *rt) const
BgpRoute * ReplicateType7SourceTreeJoin(BgpServer *server, MvpnTable *src_table, MvpnRoute *src_rt, const BgpPath *src_path, ExtCommunityPtr ext_community)
ExtCommunityDB * extcomm_db()
bool mvpn_ipv4_enable() const
std::set< BgpTable * > TableSet
const LifetimeActor * deleter() const
const MvpnTable * table() const
virtual BgpRoute * TableFind(DBTablePartition *rtp, const DBRequestKey *prefix)
static size_t HashFunction(const Ip4Prefix &addr)
MvpnProjectManagerPartition * GetPartition(int part_id)
const std::string & name() const
static RouteDistinguisher kZeroRd
uint32_t GetLabel() const
void GetPeerSet(RibOut *ribout, MvpnRoute *route, const RibPeerSet &peerset, RibPeerSet *new_peerset)
static const int kPartitionCount
MvpnPrefix CreateType4LeafADRoutePrefix(const MvpnRoute *type3_rt)
MvpnPrefix CreateType7SourceTreeJoinRoutePrefix(MvpnRoute *rt) const
boost::asio::ip::address_v4 Ip4Address
UpdateInfo * GetUpdateInfo(MvpnRoute *route)
void InsertPath(BgpPath *path)
const BgpAttr * GetOriginalAttr() const
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
const RoutingInstanceMgr * manager() const
void SetSPMSIPrefixFromLeafADPrefix(const MvpnPrefix &prefix)
uint32_t bgp_identifier() const
bool IsMasterRoutingInstance() const
BgpPath * FindSecondaryPath(BgpRoute *src_rt, BgpPath::PathSource src, const IPeer *peer, uint32_t path_id)
UpdateInfo * GetMvpnUpdateInfo(RibOut *ribout, MvpnRoute *route, const RibPeerSet &peerset)
const ExtCommunity * ext_community() const
const MvpnProjectManager * GetProjectManager() const
const MvpnProjectManagerPartition * GetProjectManagerPartition(BgpRoute *route) const
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *key) const
const BgpAttr * GetAttr() const
bool IsEncodingXmpp() const
MvpnTable(DB *db, const std::string &name)
void set_nexthop_longest_match(bool flag)
const MvpnProjectManagerNetworks & mvpn_project_managers() const
virtual void Add(DBEntry *entry)
MvpnPrefix CreateLocalType7Prefix(MvpnRoute *rt) const
DBTablePartBase * get_table_partition() const
void Notify(DBEntryBase *entry)
std::size_t hash_value(BgpAttr const &attr)
static MvpnPrefix FromString(const std::string &str, boost::system::error_code *errorp=NULL)
Ip4Address source() const
const MvpnPrefix & GetPrefix() const
const RouteDistinguisher & route_distinguisher() const
Ip4Address originator() const
MvpnRoute * LocateType3SPMSIRoute(const MvpnRoute *type7_join_rt)
virtual bool IsReplicated() const
static DBTableBase * CreateTable(DB *db, const std::string &name)
bool IsProjectManagerUsable() const
#define MVPN_RT_LOG(rt,...)
Ip4Address GetType3OriginatorFromType4Route() const
#define MODULE_INITIALIZER(Func)
MvpnRoute * LocateType1ADRoute()
PathResolver * path_resolver()
static void RegisterFactory(const std::string &prefix, CreateFunction create_fn)
const PathList & GetPathList() const