9 #include <boost/foreach.hpp>
25 #include "bgp/routing-instance/routing_instance_analytics_types.h"
28 using std::unique_ptr;
36 uint32_t data = prefix.
originator().to_ulong();
40 uint32_t data = prefix.
asn();
47 :
BgpTable(db, name), manager_(NULL) {
65 const string &key_str)
const {
67 return unique_ptr<DBEntry> (
new MvpnRoute(prefix));
105 manager_ = BgpStaticObjectFactory::Create<MvpnManager>(
this, pm->
table());
125 if (!
server()->mvpn_ipv4_enable())
133 pair<MvpnProjectManagerNetworks::iterator, bool> ret =
136 ret.first->second.insert(rtinstance->
name());
142 MvpnProjectManagerNetworks::iterator iter =
148 BOOST_FOREACH(
const string &mvpn_network, iter->second) {
162 if (!
server()->mvpn_ipv4_enable())
167 MvpnProjectManagerNetworks::iterator iter =
172 if (iter->second.empty())
188 if (pm_network.empty())
198 return table->mvpn_project_manager();
203 if (pm_network.empty())
207 if (!rtinstance || rtinstance->
deleted())
214 if (!
table->mvpn_project_manager() ||
229 return manager->GetPartition(part_id);
252 if (!spmsi_rt || !spmsi_rt->
IsUsable())
263 mvpn_rt, secondary_tables);
287 if (dest_route == NULL) {
289 rtp->
Add(dest_route);
339 server()->autonomous_system(), group, source);
351 server()->autonomous_system());
401 src_path, community);
407 src_path, community);
418 if (!mvpn_state || !mvpn_state->spmsi_rt() ||
419 !mvpn_state->spmsi_rt()->IsUsable()) {
422 if (mvpn_state->spmsi_rt()->table() !=
this)
429 src_path, community);
441 bool vit_found =
false;
443 ext_community->communities()) {
446 if (rtarget == vit) {
454 MVPN_RT_LOG(src_rt,
"Route was not replicated as rt-import "
455 "extended-community was not found");
463 src_path, ext_community);
480 MVPN_RT_LOG(src_rt,
"Route was not replicated as source_rd is zero");
485 bool source_as_found =
false;
490 source_as_found =
true;
496 if (!source_as_found) {
497 MVPN_RT_LOG(src_rt,
"Route was not replicated as source_as is zero");
526 if (dest_route == NULL) {
528 rtp->
Add(dest_route);
546 comm->communities()) {
549 rtarget.push_back(value);
555 if (rtarget.size() == 1) {
557 ReplaceRTargetAndLocate(new_attr->ext_community(), rtarget);
559 src_path->
GetAttr(), ext_community.get());
562 "Could not find <originator>:0 route-target community");
570 if (dest_path != NULL) {
590 MVPN_RT_LOG(src_rt,
"Route was successfully replicated");
602 uinfo_slist->push_front(*uinfo);
609 MVPN_RT_LOG(mvpn_route,
"Route was exported as update_info could not "
613 uinfo_slist->push_front(*uinfo);
621 int current_index = iter.
index();
624 for (Route::PathList::const_iterator it = route->
GetPathList().begin();
626 const BgpPath *path =
static_cast<const BgpPath *
>(it.operator->());
628 new_peerset->
set(current_index);
648 MVPN_RT_LOG(route,
"Route was exported as ProjectManager was "
654 GetPeerSet(ribout, route, peerset, &new_peerset);
656 if (new_peerset.
empty())
661 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()