LCOV - code coverage report
Current view: top level - bgp/routing-instance - rtarget_group_mgr.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 311 312 99.7 %
Date: 2026-06-18 01:51:13 Functions: 39 39 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       3             :  */
       4             : #include "bgp/routing-instance/rtarget_group_mgr.h"
       5             : 
       6             : #include <boost/foreach.hpp>
       7             : 
       8             : #include <utility>
       9             : 
      10             : #include "base/map_util.h"
      11             : #include "base/set_util.h"
      12             : #include "base/task_annotations.h"
      13             : #include "base/task_trigger.h"
      14             : #include "bgp/bgp_config.h"
      15             : #include "bgp/bgp_peer.h"
      16             : #include "bgp/bgp_ribout.h"
      17             : #include "bgp/bgp_server.h"
      18             : #include "bgp/bgp_table.h"
      19             : #include "bgp/routing-instance/routing_instance.h"
      20             : #include "bgp/rtarget/rtarget_route.h"
      21             : 
      22             : using std::pair;
      23             : 
      24      499548 : void VpnRouteState::AddRouteTarget(RTargetGroupMgr *mgr, int part_id,
      25             :     BgpRoute *rt, RTargetList::const_iterator it) {
      26      499548 :     pair<RTargetList::iterator, bool> result;
      27      499540 :     result = list_.insert(*it);
      28      499655 :     assert(result.second);
      29      499655 :     RtGroup *rtgroup = mgr->LocateRtGroup(*it);
      30      499668 :     rtgroup->AddDepRoute(part_id, rt);
      31      499662 : }
      32             : 
      33      499418 : void VpnRouteState::DeleteRouteTarget(RTargetGroupMgr *mgr, int part_id,
      34             :     BgpRoute *rt, RTargetList::const_iterator it) {
      35      499418 :     RtGroup *rtgroup = mgr->GetRtGroup(*it);
      36      499657 :     rtgroup->RemoveDepRoute(part_id, rt);
      37      499634 :     mgr->RemoveRtGroup(*it);
      38      499655 :     list_.erase(it);
      39      499620 : }
      40             : 
      41       27018 : void RTargetState::AddInterestedPeer(RTargetGroupMgr *mgr, RtGroup *rtgroup,
      42             :     RTargetRoute *rt, RtGroup::InterestedPeerList::const_iterator it) {
      43       27018 :     pair<RtGroup::InterestedPeerList::iterator, bool> result;
      44       27018 :     result = list_.insert(*it);
      45       27018 :     assert(result.second);
      46       27018 :     rtgroup->AddInterestedPeer(it->first, rt);
      47       27018 :     mgr->NotifyRtGroupUnlocked(rtgroup->rt());
      48       27018 : }
      49             : 
      50       27018 : void RTargetState::DeleteInterestedPeer(RTargetGroupMgr *mgr, RtGroup *rtgroup,
      51             :     RTargetRoute *rt, RtGroup::InterestedPeerList::iterator it) {
      52       27018 :     rtgroup->RemoveInterestedPeer(it->first, rt);
      53       27018 :     mgr->NotifyRtGroupUnlocked(rtgroup->rt());
      54       27018 :     list_.erase(it);
      55       27018 : }
      56             : 
      57        9742 : RTargetGroupMgr::RTargetGroupMgr(BgpServer *server) : server_(server),
      58       19484 :     rtarget_route_trigger_(new TaskTrigger(
      59             :            boost::bind(&RTargetGroupMgr::ProcessRTargetRouteList, this),
      60       19484 :            TaskScheduler::GetInstance()->GetTaskId("bgp::RTFilter"), 0)),
      61       19484 :     remove_rtgroup_trigger_(new TaskTrigger(
      62             :            boost::bind(&RTargetGroupMgr::ProcessRtGroupList, this),
      63       19484 :            TaskScheduler::GetInstance()->GetTaskId("bgp::RTFilter"), 0)),
      64        9742 :     rtarget_trigger_lists_(DB::PartitionCount()),
      65       29226 :     master_instance_delete_ref_(this, NULL) {
      66       48185 :     for (int i = 0; i < DB::PartitionCount(); i++) {
      67      115329 :         rtarget_dep_triggers_.push_back(boost::shared_ptr<TaskTrigger>(new
      68             :                TaskTrigger(boost::bind(&RTargetGroupMgr::ProcessRouteTargetList,
      69             :                                        this, i),
      70       76886 :                TaskScheduler::GetInstance()->GetTaskId("db::DBTable"), i)));
      71             :     }
      72        9742 : }
      73             : 
      74      102890 : void RTargetGroupMgr::RTargetPeerSync(BgpTable *table, RTargetRoute *rt,
      75             :     DBTableBase::ListenerId id, RTargetState *dbstate,
      76             :     const RtGroup::InterestedPeerList *future) {
      77      102890 :     CHECK_CONCURRENCY("bgp::RTFilter");
      78             : 
      79      102890 :     RouteTarget rtarget = rt->GetPrefix().rtarget();
      80      102890 :     RtGroup *rtgroup = LocateRtGroup(rtarget);
      81      102890 :     assert(rtgroup);
      82             : 
      83      102890 :     map_synchronize(dbstate->GetMutableList(), future,
      84             :         boost::bind(&RTargetState::AddInterestedPeer, dbstate, this, rtgroup,
      85             :             rt, _1),
      86             :         boost::bind(&RTargetState::DeleteInterestedPeer, dbstate, this, rtgroup,
      87             :             rt, _1));
      88             : 
      89      102890 :     if (dbstate->GetList()->empty()) {
      90       64415 :         rt->ClearState(table, id);
      91       64415 :         delete dbstate;
      92       64415 :         RemoveRtGroup(rtarget);
      93             :     }
      94      102890 : }
      95             : 
      96      102890 : void RTargetGroupMgr::BuildRTargetDistributionGraph(BgpTable *table,
      97             :     RTargetRoute *rt, DBTableBase::ListenerId id) {
      98      102890 :     CHECK_CONCURRENCY("bgp::RTFilter");
      99             : 
     100             :     RTargetState *dbstate =
     101      102890 :         static_cast<RTargetState *>(rt->GetState(table, id));
     102             : 
     103      102890 :     RtGroup::InterestedPeerList peer_list;
     104             : 
     105      179969 :     if (rt->IsDeleted() || !rt->BestPath() ||
     106       77079 :         !rt->BestPath()->IsFeasible()) {
     107       25811 :         RTargetPeerSync(table, rt, id, dbstate, &peer_list);
     108       25811 :         return;
     109             :     }
     110             : 
     111       77079 :     const BgpPath *best_ebgp_path = NULL;
     112      223840 :     for (Route::PathList::iterator it = rt->GetPathList().begin();
     113      447680 :          it != rt->GetPathList().end(); it++) {
     114      146761 :         BgpPath *path = static_cast<BgpPath *>(it.operator->());
     115      146761 :         if (!path->IsFeasible())
     116           0 :             break;
     117      146761 :         if (!path->GetPeer() || path->GetPeer()->IsXmppPeer())
     118      107016 :             continue;
     119             : 
     120       39813 :         const BgpPeer *peer = static_cast<const BgpPeer *>(path->GetPeer());
     121       39813 :         if (peer->PeerType() == BgpProto::EBGP) {
     122       17213 :             if (!best_ebgp_path) {
     123       17035 :                 best_ebgp_path = path;
     124         178 :             } else if (!best_ebgp_path->PathSameNeighborAs(*path)) {
     125          68 :                 continue;
     126             :             }
     127             :         }
     128             : 
     129             :         std::pair<RtGroup::InterestedPeerList::iterator, bool> ret =
     130       39745 :             peer_list.insert(std::pair<const BgpPeer *,
     131       79490 :                  RtGroup::RTargetRouteList>(peer, RtGroup::RTargetRouteList()));
     132       39745 :         assert(ret.second);
     133       39745 :         ret.first->second.insert(rt);
     134             :     }
     135             : 
     136       77079 :     RTargetPeerSync(table, rt, id, dbstate, &peer_list);
     137      102890 : }
     138             : 
     139      161651 : bool RTargetGroupMgr::ProcessRouteTargetList(int part_id) {
     140      161651 :     CHECK_CONCURRENCY("db::DBTable");
     141             : 
     142      753624 :     BOOST_FOREACH(const RouteTarget &rtarget, rtarget_trigger_lists_[part_id]) {
     143      295229 :         RtGroup *rtgroup = GetRtGroup(rtarget);
     144      297891 :         if (!rtgroup)
     145       27644 :             continue;
     146      270247 :         rtgroup->NotifyDepRoutes(part_id);
     147             :     }
     148             : 
     149      161962 :     rtarget_trigger_lists_[part_id].clear();
     150      161996 :     return true;
     151             : }
     152             : 
     153      186646 : void RTargetGroupMgr::AddRouteTargetToLists(const RouteTarget &rtarget) {
     154      916388 :     for (int idx = 0; idx < DB::PartitionCount(); ++idx) {
     155      729742 :         rtarget_trigger_lists_[idx].insert(rtarget);
     156      729742 :         rtarget_dep_triggers_[idx]->Set();
     157             :     }
     158      186646 : }
     159             : 
     160           8 : void RTargetGroupMgr::DisableRouteTargetProcessing() {
     161          40 :     for (int idx = 0; idx < DB::PartitionCount(); ++idx) {
     162          32 :         rtarget_dep_triggers_[idx]->set_disable();
     163             :     }
     164           8 : }
     165             : 
     166           8 : void RTargetGroupMgr::EnableRouteTargetProcessing() {
     167          40 :     for (int idx = 0; idx < DB::PartitionCount(); ++idx) {
     168          32 :         rtarget_dep_triggers_[idx]->set_enable();
     169             :     }
     170           8 : }
     171             : 
     172          20 : bool RTargetGroupMgr::IsRouteTargetOnList(const RouteTarget &rtarget) const {
     173          56 :     for (int idx = 0; idx < DB::PartitionCount(); ++idx) {
     174          47 :         if (rtarget_trigger_lists_[idx].find(rtarget) !=
     175          94 :             rtarget_trigger_lists_[idx].end()) {
     176          11 :             return true;
     177             :         }
     178             :     }
     179           9 :     return false;
     180             : }
     181             : 
     182       41209 : bool RTargetGroupMgr::ProcessRTargetRouteList() {
     183       41209 :     CHECK_CONCURRENCY("bgp::RTFilter");
     184             : 
     185       41209 :     RoutingInstanceMgr *mgr = server()->routing_instance_mgr();
     186       41209 :     RoutingInstance *master = mgr->GetDefaultRoutingInstance();
     187       41209 :     BgpTable *table = master->GetTable(Address::RTARGET);
     188             : 
     189             :     // Get the Listener id
     190       41209 :     DBTableBase::ListenerId id = GetListenerId(table);
     191             : 
     192       41209 :     for (RTargetRouteTriggerList::iterator it = rtarget_route_list_.begin();
     193      144099 :          it != rtarget_route_list_.end(); it++) {
     194      102890 :         BuildRTargetDistributionGraph(table, *it, id);
     195             :     }
     196             : 
     197       41209 :     rtarget_route_list_.clear();
     198       41209 :     return true;
     199             : }
     200             : 
     201           8 : void RTargetGroupMgr::DisableRTargetRouteProcessing() {
     202           8 :     rtarget_route_trigger_->set_disable();
     203           8 : }
     204             : 
     205           8 : void RTargetGroupMgr::EnableRTargetRouteProcessing() {
     206           8 :     rtarget_route_trigger_->set_enable();
     207           8 : }
     208             : 
     209          19 : bool RTargetGroupMgr::IsRTargetRouteOnList(RTargetRoute *rt) const {
     210          19 :     return rtarget_route_list_.find(rt) != rtarget_route_list_.end();
     211             : }
     212             : 
     213        6509 : void RTargetGroupMgr::Initialize() {
     214        6509 :     assert(table_state_.empty());
     215        6509 :     RoutingInstanceMgr *mgr = server()->routing_instance_mgr();
     216        6509 :     RoutingInstance *master = mgr->GetDefaultRoutingInstance();
     217        6509 :     assert(master);
     218             : 
     219        6509 :     master_instance_delete_ref_.Reset(master->deleter());
     220             : 
     221        6509 :     RoutingInstance::RouteTableList const table_list = master->GetTables();
     222             :     DBTableBase::ListenerId id;
     223        6509 :     RtGroupMgrTableState *ts = NULL;
     224        6509 :     for (RoutingInstance::RouteTableList::const_iterator it =
     225       71599 :          table_list.begin(); it != table_list.end(); ++it) {
     226       58581 :         if (!it->second->IsVpnTable()) continue;
     227             : 
     228       32545 :         BgpTable *vpntable = it->second;
     229       32545 :         id = vpntable->Register(
     230             :             boost::bind(&RTargetGroupMgr::VpnRouteNotify, this, _1, _2),
     231             :             "RTargetGroupMgr");
     232       32545 :         ts = new RtGroupMgrTableState(vpntable, id);
     233       32545 :         table_state_.insert(std::make_pair(vpntable, ts));
     234             :     }
     235             : 
     236        6509 :     BgpTable *rttable = master->GetTable(Address::RTARGET);
     237        6509 :     id = rttable->Register(
     238             :         boost::bind(&RTargetGroupMgr::RTargetRouteNotify, this, _1, _2),
     239             :         "RTargetGroupMgr");
     240        6509 :     ts = new RtGroupMgrTableState(rttable, id);
     241        6509 :     table_state_.insert(std::make_pair(rttable, ts));
     242        6509 : }
     243             : 
     244        6509 : void RTargetGroupMgr::ManagedDelete() {
     245        6509 :     if (rtgroup_map_.empty()) remove_rtgroup_trigger_->Set();
     246        6509 : }
     247             : 
     248             : void
     249      591250 : RTargetGroupMgr::RTargetDepSync(DBTablePartBase *root, BgpRoute *rt,
     250             :                                 DBTableBase::ListenerId id,
     251             :                                 VpnRouteState *dbstate,
     252             :                                 const VpnRouteState::RTargetList *future) {
     253      591250 :     CHECK_CONCURRENCY("db::DBTable");
     254             : 
     255      591112 :     BgpTable *table = static_cast<BgpTable *>(root->parent());
     256      591108 :     if (!dbstate) {
     257      184738 :         dbstate = new VpnRouteState();
     258      184741 :         rt->SetState(table, id, dbstate);
     259             :     }
     260             : 
     261      591117 :     int part_id = root->index();
     262      591116 :     set_synchronize(dbstate->GetMutableList(), future,
     263             :         boost::bind(
     264             :             &VpnRouteState::AddRouteTarget, dbstate, this, part_id, rt, _1),
     265             :         boost::bind(
     266             :             &VpnRouteState::DeleteRouteTarget, dbstate, this, part_id, rt, _1));
     267             : 
     268      591165 :     if (dbstate->GetList()->empty()) {
     269      184748 :         rt->ClearState(root->parent(), id);
     270      184748 :         delete dbstate;
     271             :     }
     272      591174 : }
     273             : 
     274      751055 : DBTableBase::ListenerId RTargetGroupMgr::GetListenerId(BgpTable *table) {
     275      751055 :     RtGroupMgrTableStateList::iterator loc = table_state_.find(table);
     276      750958 :     assert(loc != table_state_.end());
     277      750941 :     RtGroupMgrTableState *ts = loc->second;
     278      750941 :     DBTableBase::ListenerId id = ts->GetListenerId();
     279      750937 :     assert(id != DBTableBase::kInvalidId);
     280      750937 :     return id;
     281             : }
     282             : 
     283      591310 : bool RTargetGroupMgr::VpnRouteNotify(DBTablePartBase *root,
     284             :                                      DBEntryBase *entry) {
     285      591310 :     CHECK_CONCURRENCY("db::DBTable");
     286             : 
     287      591183 :     BgpTable *table = static_cast<BgpTable *>(root->parent());
     288      591174 :     BgpRoute *rt = static_cast<BgpRoute *>(entry);
     289             :     // Get the Listener id
     290      591174 :     DBTableBase::ListenerId id = GetListenerId(table);
     291             : 
     292             :     // Get the dbstate
     293             :     VpnRouteState *dbstate =
     294      591074 :         static_cast<VpnRouteState *>(rt->GetState(table, id));
     295             : 
     296      591489 :     VpnRouteState::RTargetList list;
     297             : 
     298      997922 :     if (entry->IsDeleted() || !rt->BestPath() ||
     299      406530 :         !rt->BestPath()->IsFeasible()) {
     300      184848 :         if (!dbstate)
     301         133 :             return true;
     302      184715 :         RTargetDepSync(root, rt, id, dbstate, &list);
     303      184723 :         return true;
     304             :     }
     305             : 
     306      406499 :     const BgpPath *path = rt->BestPath();
     307      406448 :     const BgpAttr *attr = path->GetAttr();
     308      406439 :     const ExtCommunity *ext_community = attr->ext_community();
     309             : 
     310      406429 :     if (ext_community) {
     311             :         // Gather all Route Target
     312     7473857 :         BOOST_FOREACH(const ExtCommunity::ExtCommunityValue &comm,
     313             :                       ext_community->communities()) {
     314     3532816 :             if (ExtCommunity::is_route_target(comm)) {
     315     2868334 :                 list.insert(RouteTarget(comm));
     316             :             }
     317             :         }
     318             :     }
     319             : 
     320      406542 :     RTargetDepSync(root, rt, id, dbstate, &list);
     321      406454 :     return true;
     322      591310 : }
     323             : 
     324      118683 : bool RTargetGroupMgr::RTargetRouteNotify(DBTablePartBase *root,
     325             :                                          DBEntryBase *entry) {
     326      118683 :     CHECK_CONCURRENCY("db::DBTable");
     327             : 
     328      118683 :     BgpTable *table = static_cast<BgpTable *>(root->parent());
     329      118683 :     RTargetRoute *rt = static_cast<RTargetRoute *>(entry);
     330             :     // Get the Listener id
     331      118683 :     DBTableBase::ListenerId id = GetListenerId(table);
     332             : 
     333             :     // Get the dbstate
     334             :     RTargetState *dbstate =
     335      118683 :         static_cast<RTargetState *>(rt->GetState(table, id));
     336             : 
     337      118683 :     if (!dbstate) {
     338       78708 :         if (rt->IsDeleted()) return true;
     339       64415 :         dbstate = new RTargetState();
     340       64415 :         rt->SetState(table, id, dbstate);
     341             :     }
     342      104390 :     if (rtarget_route_list_.empty())
     343       41209 :         rtarget_route_trigger_->Set();
     344      104390 :     rtarget_route_list_.insert(rt);
     345      104390 :     return true;
     346             : }
     347             : 
     348       18646 : RTargetGroupMgr::~RTargetGroupMgr() {
     349        9742 :     assert(rtgroup_map_.empty());
     350       18646 : }
     351             : 
     352             : // Search a RtGroup
     353     6424524 : RtGroup *RTargetGroupMgr::GetRtGroup(const RouteTarget &rt) {
     354     6424524 :     std::scoped_lock lock(mutex_);
     355     6429019 :     RtGroupMap::iterator loc = rtgroup_map_.find(rt);
     356     6428224 :     if (loc != rtgroup_map_.end()) {
     357     6078680 :         return loc->second;
     358             :     }
     359      349436 :     return NULL;
     360     6428002 : }
     361             : 
     362             : // Search a RtGroup
     363     4381346 : RtGroup *RTargetGroupMgr::GetRtGroup(const ExtCommunity::ExtCommunityValue
     364             :                                         &community) {
     365     4381346 :     RouteTarget rt(community);
     366     8763931 :     return GetRtGroup(rt);
     367             : }
     368             : 
     369     1531155 : RtGroup *RTargetGroupMgr::LocateRtGroup(const RouteTarget &rt) {
     370     1531155 :     std::scoped_lock lock(mutex_);
     371     1531337 :     RtGroupMap::iterator loc = rtgroup_map_.find(rt);
     372     1531326 :     RtGroup *group = (loc != rtgroup_map_.end()) ? loc->second : NULL;
     373     1531325 :     if (group == NULL) {
     374      108827 :         group = new RtGroup(rt);
     375      108826 :         rtgroup_map_.insert(rt, group);
     376             :     }
     377     1531337 :     return group;
     378     1531325 : }
     379             : 
     380      186646 : void RTargetGroupMgr::NotifyRtGroupUnlocked(const RouteTarget &rt) {
     381      186646 :     CHECK_CONCURRENCY("bgp::RTFilter", "bgp::Config", "bgp::ConfigHelper");
     382             : 
     383      186646 :     AddRouteTargetToLists(rt);
     384      186646 :     if (!rt.IsNull())
     385      186630 :         return;
     386             : 
     387          16 :     for (RtGroupMgrTableStateList::iterator it = table_state_.begin();
     388         112 :          it != table_state_.end(); ++it) {
     389          96 :         BgpTable *table = it->first;
     390          96 :         if (!table->IsVpnTable())
     391          16 :             continue;
     392          80 :         table->NotifyAllEntries();
     393             :     }
     394             : }
     395             : 
     396      132610 : void RTargetGroupMgr::NotifyRtGroup(const RouteTarget &rt) {
     397      132610 :     CHECK_CONCURRENCY("bgp::Config", "bgp::ConfigHelper");
     398      132610 :     std::scoped_lock lock(mutex_);
     399      132610 :     NotifyRtGroupUnlocked(rt);
     400      132610 : }
     401             : 
     402      994067 : void RTargetGroupMgr::RemoveRtGroup(const RouteTarget &rt) {
     403      994067 :     std::scoped_lock lock(mutex_);
     404      994082 :     RtGroupMap::iterator loc = rtgroup_map_.find(rt);
     405      994059 :     RtGroup *rtgroup = (loc != rtgroup_map_.end()) ? loc->second : NULL;
     406      994051 :     assert(rtgroup);
     407             : 
     408      994051 :     rtgroup_remove_list_.insert(rtgroup);
     409      994104 :     remove_rtgroup_trigger_->Set();
     410      994103 : }
     411             : 
     412      319811 : void RTargetGroupMgr::GetRibOutInterestedPeers(RibOut *ribout,
     413             :              const ExtCommunity *ext_community,
     414             :              const RibPeerSet &peerset, RibPeerSet *new_peerset) {
     415      319811 :     RtGroupInterestedPeerSet peer_set;
     416      319810 :     RtGroup *null_rtgroup = GetRtGroup(RouteTarget::null_rtarget);
     417      320008 :     if (null_rtgroup) peer_set = null_rtgroup->GetInterestedPeers();
     418     6127181 :     BOOST_FOREACH(const ExtCommunity::ExtCommunityValue &comm,
     419             :                   ext_community->communities()) {
     420     2903594 :         if (ExtCommunity::is_route_target(comm)) {
     421     2247737 :             RtGroup *rtgroup = GetRtGroup(comm);
     422     2248026 :             if (!rtgroup) continue;
     423     2248026 :             peer_set |= rtgroup->GetInterestedPeers();
     424             :         }
     425             :     }
     426      319997 :     RibOut::PeerIterator iter(ribout, peerset);
     427      643687 :     while (iter.HasNext()) {
     428      323694 :         int current_index = iter.index();
     429      323694 :         IPeerUpdate *peer = iter.Next();
     430      323684 :         BgpPeer *tmp = dynamic_cast<BgpPeer *>(peer);
     431      323684 :         assert(tmp);
     432      323684 :         if (tmp->IsFamilyNegotiated(Address::RTARGET)) {
     433      315912 :             if (!peer_set.test(tmp->GetIndex())) {
     434       20627 :                 new_peerset->reset(current_index);
     435             :             }
     436             :         }
     437             :     }
     438      319951 : }
     439             : 
     440       10917 : void RTargetGroupMgr::UnregisterTables() {
     441       10917 :     CHECK_CONCURRENCY("bgp::RTFilter");
     442             : 
     443       10917 :     if (rtgroup_map_.empty()) {
     444       10917 :         RoutingInstanceMgr *mgr = server()->routing_instance_mgr();
     445       10917 :         RoutingInstance *master = mgr->GetDefaultRoutingInstance();
     446       10917 :         if (master && master->deleted()) {
     447        7962 :             for (RtGroupMgrTableStateList::iterator it =
     448       54978 :                  table_state_.begin(), itnext; it != table_state_.end();
     449       39054 :                  it = itnext) {
     450       39054 :                 itnext = it;
     451       39054 :                 itnext++;
     452       39054 :                 RtGroupMgrTableState *ts = it->second;
     453       39054 :                 DBTableBase::ListenerId id = ts->GetListenerId();
     454       39054 :                 BgpTable *bgptable = it->first;
     455       39054 :                 bgptable->Unregister(id);
     456       39054 :                 table_state_.erase(it);
     457       39054 :                 delete ts;
     458             :             }
     459        7962 :             master_instance_delete_ref_.Reset(NULL);
     460             :         }
     461             :     }
     462       10917 : }
     463             : 
     464      140452 : bool RTargetGroupMgr::ProcessRtGroupList() {
     465      140452 :     CHECK_CONCURRENCY("bgp::RTFilter");
     466      785098 :     BOOST_FOREACH(RtGroup *rtgroup, rtgroup_remove_list_) {
     467      322323 :         if (!rtgroup->MayDelete())
     468      213496 :             continue;
     469      108827 :         RouteTarget rt = rtgroup->rt();
     470      108827 :         rtgroup_map_.erase(rt);
     471             :     }
     472      140452 :     rtgroup_remove_list_.clear();
     473             : 
     474      140452 :     if (rtgroup_map_.empty()) UnregisterTables();
     475             : 
     476      140452 :     return true;
     477             : }
     478             : 
     479           3 : void RTargetGroupMgr::DisableRtGroupProcessing() {
     480           3 :     remove_rtgroup_trigger_->set_disable();
     481           3 : }
     482             : 
     483           3 : void RTargetGroupMgr::EnableRtGroupProcessing() {
     484           3 :     remove_rtgroup_trigger_->set_enable();
     485           3 : }
     486             : 
     487          12 : bool RTargetGroupMgr::IsRtGroupOnList(RtGroup *rtgroup) const {
     488          12 :     return rtgroup_remove_list_.find(rtgroup) != rtgroup_remove_list_.end();
     489             : }
     490             : 
     491       39054 : RtGroupMgrTableState::RtGroupMgrTableState(BgpTable *table,
     492       39054 :                                            DBTableBase::ListenerId id)
     493       39054 :     : id_(id), table_delete_ref_(this, table->deleter()) {
     494       39054 :     assert(table->deleter() != NULL);
     495       39054 : }
     496             : 
     497       39054 : RtGroupMgrTableState::~RtGroupMgrTableState() {
     498       39054 : }
     499             : 
     500       34500 : void RtGroupMgrTableState::ManagedDelete() {
     501       34500 : }

Generated by: LCOV version 1.14