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-10-19 02:12:28 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      499570 : void VpnRouteState::AddRouteTarget(RTargetGroupMgr *mgr, int part_id,
      25             :     BgpRoute *rt, RTargetList::const_iterator it) {
      26      499570 :     pair<RTargetList::iterator, bool> result;
      27      499563 :     result = list_.insert(*it);
      28      499672 :     assert(result.second);
      29      499672 :     RtGroup *rtgroup = mgr->LocateRtGroup(*it);
      30      499709 :     rtgroup->AddDepRoute(part_id, rt);
      31      499687 : }
      32             : 
      33      499459 : void VpnRouteState::DeleteRouteTarget(RTargetGroupMgr *mgr, int part_id,
      34             :     BgpRoute *rt, RTargetList::const_iterator it) {
      35      499459 :     RtGroup *rtgroup = mgr->GetRtGroup(*it);
      36      499702 :     rtgroup->RemoveDepRoute(part_id, rt);
      37      499649 :     mgr->RemoveRtGroup(*it);
      38      499696 :     list_.erase(it);
      39      499657 : }
      40             : 
      41       26983 : void RTargetState::AddInterestedPeer(RTargetGroupMgr *mgr, RtGroup *rtgroup,
      42             :     RTargetRoute *rt, RtGroup::InterestedPeerList::const_iterator it) {
      43       26983 :     pair<RtGroup::InterestedPeerList::iterator, bool> result;
      44       26983 :     result = list_.insert(*it);
      45       26983 :     assert(result.second);
      46       26983 :     rtgroup->AddInterestedPeer(it->first, rt);
      47       26983 :     mgr->NotifyRtGroupUnlocked(rtgroup->rt());
      48       26983 : }
      49             : 
      50       26983 : void RTargetState::DeleteInterestedPeer(RTargetGroupMgr *mgr, RtGroup *rtgroup,
      51             :     RTargetRoute *rt, RtGroup::InterestedPeerList::iterator it) {
      52       26983 :     rtgroup->RemoveInterestedPeer(it->first, rt);
      53       26983 :     mgr->NotifyRtGroupUnlocked(rtgroup->rt());
      54       26983 :     list_.erase(it);
      55       26983 : }
      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      102315 : void RTargetGroupMgr::RTargetPeerSync(BgpTable *table, RTargetRoute *rt,
      75             :     DBTableBase::ListenerId id, RTargetState *dbstate,
      76             :     const RtGroup::InterestedPeerList *future) {
      77      102315 :     CHECK_CONCURRENCY("bgp::RTFilter");
      78             : 
      79      102315 :     RouteTarget rtarget = rt->GetPrefix().rtarget();
      80      102315 :     RtGroup *rtgroup = LocateRtGroup(rtarget);
      81      102315 :     assert(rtgroup);
      82             : 
      83      102315 :     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      102315 :     if (dbstate->GetList()->empty()) {
      90       64356 :         rt->ClearState(table, id);
      91       64356 :         delete dbstate;
      92       64356 :         RemoveRtGroup(rtarget);
      93             :     }
      94      102315 : }
      95             : 
      96      102315 : void RTargetGroupMgr::BuildRTargetDistributionGraph(BgpTable *table,
      97             :     RTargetRoute *rt, DBTableBase::ListenerId id) {
      98      102315 :     CHECK_CONCURRENCY("bgp::RTFilter");
      99             : 
     100             :     RTargetState *dbstate =
     101      102315 :         static_cast<RTargetState *>(rt->GetState(table, id));
     102             : 
     103      102315 :     RtGroup::InterestedPeerList peer_list;
     104             : 
     105      178816 :     if (rt->IsDeleted() || !rt->BestPath() ||
     106       76501 :         !rt->BestPath()->IsFeasible()) {
     107       25814 :         RTargetPeerSync(table, rt, id, dbstate, &peer_list);
     108       25814 :         return;
     109             :     }
     110             : 
     111       76501 :     const BgpPath *best_ebgp_path = NULL;
     112      222466 :     for (Route::PathList::iterator it = rt->GetPathList().begin();
     113      444932 :          it != rt->GetPathList().end(); it++) {
     114      145965 :         BgpPath *path = static_cast<BgpPath *>(it.operator->());
     115      145965 :         if (!path->IsFeasible())
     116           0 :             break;
     117      145965 :         if (!path->GetPeer() || path->GetPeer()->IsXmppPeer())
     118      106741 :             continue;
     119             : 
     120       39292 :         const BgpPeer *peer = static_cast<const BgpPeer *>(path->GetPeer());
     121       39292 :         if (peer->PeerType() == BgpProto::EBGP) {
     122       17272 :             if (!best_ebgp_path) {
     123       17096 :                 best_ebgp_path = path;
     124         176 :             } else if (!best_ebgp_path->PathSameNeighborAs(*path)) {
     125          68 :                 continue;
     126             :             }
     127             :         }
     128             : 
     129             :         std::pair<RtGroup::InterestedPeerList::iterator, bool> ret =
     130       39224 :             peer_list.insert(std::pair<const BgpPeer *,
     131       78448 :                  RtGroup::RTargetRouteList>(peer, RtGroup::RTargetRouteList()));
     132       39224 :         assert(ret.second);
     133       39224 :         ret.first->second.insert(rt);
     134             :     }
     135             : 
     136       76501 :     RTargetPeerSync(table, rt, id, dbstate, &peer_list);
     137      102315 : }
     138             : 
     139      163647 : bool RTargetGroupMgr::ProcessRouteTargetList(int part_id) {
     140      163647 :     CHECK_CONCURRENCY("db::DBTable");
     141             : 
     142      759082 :     BOOST_FOREACH(const RouteTarget &rtarget, rtarget_trigger_lists_[part_id]) {
     143      297271 :         RtGroup *rtgroup = GetRtGroup(rtarget);
     144      298994 :         if (!rtgroup)
     145       28465 :             continue;
     146      270529 :         rtgroup->NotifyDepRoutes(part_id);
     147             :     }
     148             : 
     149      163710 :     rtarget_trigger_lists_[part_id].clear();
     150      163731 :     return true;
     151             : }
     152             : 
     153      186481 : void RTargetGroupMgr::AddRouteTargetToLists(const RouteTarget &rtarget) {
     154      915545 :     for (int idx = 0; idx < DB::PartitionCount(); ++idx) {
     155      729064 :         rtarget_trigger_lists_[idx].insert(rtarget);
     156      729064 :         rtarget_dep_triggers_[idx]->Set();
     157             :     }
     158      186481 : }
     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       41378 : bool RTargetGroupMgr::ProcessRTargetRouteList() {
     183       41378 :     CHECK_CONCURRENCY("bgp::RTFilter");
     184             : 
     185       41378 :     RoutingInstanceMgr *mgr = server()->routing_instance_mgr();
     186       41378 :     RoutingInstance *master = mgr->GetDefaultRoutingInstance();
     187       41378 :     BgpTable *table = master->GetTable(Address::RTARGET);
     188             : 
     189             :     // Get the Listener id
     190       41378 :     DBTableBase::ListenerId id = GetListenerId(table);
     191             : 
     192       41378 :     for (RTargetRouteTriggerList::iterator it = rtarget_route_list_.begin();
     193      143693 :          it != rtarget_route_list_.end(); it++) {
     194      102315 :         BuildRTargetDistributionGraph(table, *it, id);
     195             :     }
     196             : 
     197       41378 :     rtarget_route_list_.clear();
     198       41378 :     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      616308 : RTargetGroupMgr::RTargetDepSync(DBTablePartBase *root, BgpRoute *rt,
     250             :                                 DBTableBase::ListenerId id,
     251             :                                 VpnRouteState *dbstate,
     252             :                                 const VpnRouteState::RTargetList *future) {
     253      616308 :     CHECK_CONCURRENCY("db::DBTable");
     254             : 
     255      616219 :     BgpTable *table = static_cast<BgpTable *>(root->parent());
     256      616210 :     if (!dbstate) {
     257      184749 :         dbstate = new VpnRouteState();
     258      184750 :         rt->SetState(table, id, dbstate);
     259             :     }
     260             : 
     261      616223 :     int part_id = root->index();
     262      616201 :     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      616252 :     if (dbstate->GetList()->empty()) {
     269      184762 :         rt->ClearState(root->parent(), id);
     270      184765 :         delete dbstate;
     271             :     }
     272      616250 : }
     273             : 
     274      775981 : DBTableBase::ListenerId RTargetGroupMgr::GetListenerId(BgpTable *table) {
     275      775981 :     RtGroupMgrTableStateList::iterator loc = table_state_.find(table);
     276      775848 :     assert(loc != table_state_.end());
     277      775829 :     RtGroupMgrTableState *ts = loc->second;
     278      775833 :     DBTableBase::ListenerId id = ts->GetListenerId();
     279      775829 :     assert(id != DBTableBase::kInvalidId);
     280      775829 :     return id;
     281             : }
     282             : 
     283      616340 : bool RTargetGroupMgr::VpnRouteNotify(DBTablePartBase *root,
     284             :                                      DBEntryBase *entry) {
     285      616340 :     CHECK_CONCURRENCY("db::DBTable");
     286             : 
     287      616277 :     BgpTable *table = static_cast<BgpTable *>(root->parent());
     288      616269 :     BgpRoute *rt = static_cast<BgpRoute *>(entry);
     289             :     // Get the Listener id
     290      616269 :     DBTableBase::ListenerId id = GetListenerId(table);
     291             : 
     292             :     // Get the dbstate
     293             :     VpnRouteState *dbstate =
     294      616111 :         static_cast<VpnRouteState *>(rt->GetState(table, id));
     295             : 
     296      616593 :     VpnRouteState::RTargetList list;
     297             : 
     298     1048001 :     if (entry->IsDeleted() || !rt->BestPath() ||
     299      431527 :         !rt->BestPath()->IsFeasible()) {
     300      184862 :         if (!dbstate)
     301         139 :             return true;
     302      184723 :         RTargetDepSync(root, rt, id, dbstate, &list);
     303      184743 :         return true;
     304             :     }
     305             : 
     306      431497 :     const BgpPath *path = rt->BestPath();
     307      431463 :     const BgpAttr *attr = path->GetAttr();
     308      431447 :     const ExtCommunity *ext_community = attr->ext_community();
     309             : 
     310      431431 :     if (ext_community) {
     311             :         // Gather all Route Target
     312     7900447 :         BOOST_FOREACH(const ExtCommunity::ExtCommunityValue &comm,
     313             :                       ext_community->communities()) {
     314     3733392 :             if (ExtCommunity::is_route_target(comm)) {
     315     3017850 :                 list.insert(RouteTarget(comm));
     316             :             }
     317             :         }
     318             :     }
     319             : 
     320      431593 :     RTargetDepSync(root, rt, id, dbstate, &list);
     321      431506 :     return true;
     322      616388 : }
     323             : 
     324      118355 : bool RTargetGroupMgr::RTargetRouteNotify(DBTablePartBase *root,
     325             :                                          DBEntryBase *entry) {
     326      118355 :     CHECK_CONCURRENCY("db::DBTable");
     327             : 
     328      118355 :     BgpTable *table = static_cast<BgpTable *>(root->parent());
     329      118355 :     RTargetRoute *rt = static_cast<RTargetRoute *>(entry);
     330             :     // Get the Listener id
     331      118355 :     DBTableBase::ListenerId id = GetListenerId(table);
     332             : 
     333             :     // Get the dbstate
     334             :     RTargetState *dbstate =
     335      118355 :         static_cast<RTargetState *>(rt->GetState(table, id));
     336             : 
     337      118355 :     if (!dbstate) {
     338       78537 :         if (rt->IsDeleted()) return true;
     339       64356 :         dbstate = new RTargetState();
     340       64356 :         rt->SetState(table, id, dbstate);
     341             :     }
     342      104174 :     if (rtarget_route_list_.empty())
     343       41378 :         rtarget_route_trigger_->Set();
     344      104174 :     rtarget_route_list_.insert(rt);
     345      104174 :     return true;
     346             : }
     347             : 
     348       18646 : RTargetGroupMgr::~RTargetGroupMgr() {
     349        9742 :     assert(rtgroup_map_.empty());
     350       18646 : }
     351             : 
     352             : // Search a RtGroup
     353     6459150 : RtGroup *RTargetGroupMgr::GetRtGroup(const RouteTarget &rt) {
     354     6459150 :     std::scoped_lock lock(mutex_);
     355     6462832 :     RtGroupMap::iterator loc = rtgroup_map_.find(rt);
     356     6462278 :     if (loc != rtgroup_map_.end()) {
     357     6115618 :         return loc->second;
     358             :     }
     359      346560 :     return NULL;
     360     6462132 : }
     361             : 
     362             : // Search a RtGroup
     363     4417915 : RtGroup *RTargetGroupMgr::GetRtGroup(const ExtCommunity::ExtCommunityValue
     364             :                                         &community) {
     365     4417915 :     RouteTarget rt(community);
     366     8837203 :     return GetRtGroup(rt);
     367             : }
     368             : 
     369     1530281 : RtGroup *RTargetGroupMgr::LocateRtGroup(const RouteTarget &rt) {
     370     1530281 :     std::scoped_lock lock(mutex_);
     371     1530522 :     RtGroupMap::iterator loc = rtgroup_map_.find(rt);
     372     1530510 :     RtGroup *group = (loc != rtgroup_map_.end()) ? loc->second : NULL;
     373     1530506 :     if (group == NULL) {
     374      108811 :         group = new RtGroup(rt);
     375      108811 :         rtgroup_map_.insert(rt, group);
     376             :     }
     377     1530539 :     return group;
     378     1530506 : }
     379             : 
     380      186481 : void RTargetGroupMgr::NotifyRtGroupUnlocked(const RouteTarget &rt) {
     381      186481 :     CHECK_CONCURRENCY("bgp::RTFilter", "bgp::Config", "bgp::ConfigHelper");
     382             : 
     383      186481 :     AddRouteTargetToLists(rt);
     384      186481 :     if (!rt.IsNull())
     385      186465 :         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      132515 : void RTargetGroupMgr::NotifyRtGroup(const RouteTarget &rt) {
     397      132515 :     CHECK_CONCURRENCY("bgp::Config", "bgp::ConfigHelper");
     398      132515 :     std::scoped_lock lock(mutex_);
     399      132515 :     NotifyRtGroupUnlocked(rt);
     400      132515 : }
     401             : 
     402      993880 : void RTargetGroupMgr::RemoveRtGroup(const RouteTarget &rt) {
     403      993880 :     std::scoped_lock lock(mutex_);
     404      993934 :     RtGroupMap::iterator loc = rtgroup_map_.find(rt);
     405      993904 :     RtGroup *rtgroup = (loc != rtgroup_map_.end()) ? loc->second : NULL;
     406      993879 :     assert(rtgroup);
     407             : 
     408      993879 :     rtgroup_remove_list_.insert(rtgroup);
     409      993949 :     remove_rtgroup_trigger_->Set();
     410      993947 : }
     411             : 
     412      315998 : void RTargetGroupMgr::GetRibOutInterestedPeers(RibOut *ribout,
     413             :              const ExtCommunity *ext_community,
     414             :              const RibPeerSet &peerset, RibPeerSet *new_peerset) {
     415      315998 :     RtGroupInterestedPeerSet peer_set;
     416      316017 :     RtGroup *null_rtgroup = GetRtGroup(RouteTarget::null_rtarget);
     417      316318 :     if (null_rtgroup) peer_set = null_rtgroup->GetInterestedPeers();
     418     6078925 :     BOOST_FOREACH(const ExtCommunity::ExtCommunityValue &comm,
     419             :                   ext_community->communities()) {
     420     2881168 :         if (ExtCommunity::is_route_target(comm)) {
     421     2233102 :             RtGroup *rtgroup = GetRtGroup(comm);
     422     2233470 :             if (!rtgroup) continue;
     423     2233470 :             peer_set |= rtgroup->GetInterestedPeers();
     424             :         }
     425             :     }
     426      316278 :     RibOut::PeerIterator iter(ribout, peerset);
     427      636318 :     while (iter.HasNext()) {
     428      320050 :         int current_index = iter.index();
     429      320050 :         IPeerUpdate *peer = iter.Next();
     430      320042 :         BgpPeer *tmp = dynamic_cast<BgpPeer *>(peer);
     431      320042 :         assert(tmp);
     432      320042 :         if (tmp->IsFamilyNegotiated(Address::RTARGET)) {
     433      312326 :             if (!peer_set.test(tmp->GetIndex())) {
     434       20123 :                 new_peerset->reset(current_index);
     435             :             }
     436             :         }
     437             :     }
     438      316268 : }
     439             : 
     440       10789 : void RTargetGroupMgr::UnregisterTables() {
     441       10789 :     CHECK_CONCURRENCY("bgp::RTFilter");
     442             : 
     443       10789 :     if (rtgroup_map_.empty()) {
     444       10789 :         RoutingInstanceMgr *mgr = server()->routing_instance_mgr();
     445       10789 :         RoutingInstance *master = mgr->GetDefaultRoutingInstance();
     446       10789 :         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       10789 : }
     463             : 
     464      141944 : bool RTargetGroupMgr::ProcessRtGroupList() {
     465      141944 :     CHECK_CONCURRENCY("bgp::RTFilter");
     466      794462 :     BOOST_FOREACH(RtGroup *rtgroup, rtgroup_remove_list_) {
     467      326259 :         if (!rtgroup->MayDelete())
     468      217448 :             continue;
     469      108811 :         RouteTarget rt = rtgroup->rt();
     470      108811 :         rtgroup_map_.erase(rt);
     471             :     }
     472      141944 :     rtgroup_remove_list_.clear();
     473             : 
     474      141944 :     if (rtgroup_map_.empty()) UnregisterTables();
     475             : 
     476      141944 :     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       34488 : void RtGroupMgrTableState::ManagedDelete() {
     501       34488 : }

Generated by: LCOV version 1.14