OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
rtarget_group.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
6 
7 #include <boost/assign/list_of.hpp>
8 #include <boost/foreach.hpp>
9 
10 #include <utility>
11 
12 #include "sandesh/sandesh_trace.h"
13 #include "bgp/bgp_peer.h"
14 #include "bgp/bgp_peer_types.h"
15 #include "bgp/bgp_table.h"
17 #include "db/db.h"
18 
19 using boost::assign::list_of;
20 using std::pair;
21 using std::string;
22 using std::vector;
23 
25  : rt_(rt), dep_(RTargetDepRouteList(DB::PartitionCount())) {
26  vector<Address::Family> vpn_family_list = list_of
28  (Address::MVPN);
29  BOOST_FOREACH(Address::Family vpn_family, vpn_family_list) {
30  import_[vpn_family] = RtGroupMemberList();
31  export_[vpn_family] = RtGroupMemberList();
32  }
33 }
34 
35 bool RtGroup::MayDelete() const {
37 }
38 
40  Address::Family family) const {
41  return import_.at(family);
42 }
43 
45  Address::Family family) const {
46  return export_.at(family);
47 }
48 
50  bool first = import_[family].empty();
51  import_[family].insert(tbl);
52  return first;
53 }
54 
56  bool first = export_[family].empty();
57  export_[family].insert(tbl);
58  return first;
59 }
60 
62  import_[family].erase(tbl);
63  return import_[family].empty();
64 }
65 
67  export_[family].erase(tbl);
68  return export_[family].empty();
69 }
70 
72  BOOST_FOREACH(const RtGroupMembers::value_type &family_members, import_) {
73  if (!family_members.second.empty())
74  return true;
75  }
76  BOOST_FOREACH(const RtGroupMembers::value_type &family_members, export_) {
77  if (!family_members.second.empty())
78  return true;
79  }
80  return false;
81 }
82 
84  const BgpTable *table;
85 
86  const RtGroupMemberList &import_list = import_.at(family);
87  if (import_list.size() > 1)
88  return true;
89  table = *import_list.begin();
90  if (table && !table->IsVpnTable())
91  return true;
92 
93  const RtGroupMemberList &export_list = export_.at(family);
94  if (export_list.size() > 1)
95  return true;
96  table = *export_list.begin();
97  if (table && !table->IsVpnTable())
98  return true;
99 
100  return false;
101 }
102 
104  return rt_;
105 }
106 
107 void RtGroup::AddDepRoute(int part_id, BgpRoute *rt) {
108  dep_[part_id].insert(rt);
109 }
110 
111 void RtGroup::RemoveDepRoute(int part_id, BgpRoute *rt) {
112  dep_[part_id].erase(rt);
113 }
114 
115 void RtGroup::NotifyDepRoutes(int part_id) {
116  BOOST_FOREACH(BgpRoute *route, dep_[part_id]) {
117  DBTablePartBase *dbpart = route->get_table_partition();
118  dbpart->Notify(route);
119  }
120 }
121 
122 bool RtGroup::HasDepRoutes() const {
123  for (RTargetDepRouteList::const_iterator it = dep_.begin();
124  it != dep_.end(); ++it) {
125  if (!it->empty()) {
126  return true;
127  }
128  }
129  return false;
130 }
131 
133  return interested_peers_;
134 }
135 
137  InterestedPeerList::iterator it = peer_list_.find(peer);
138  if (it == peer_list_.end()) {
139  it = peer_list_.insert(peer_list_.begin(),
140  pair<const BgpPeer *, RTargetRouteList>(peer, RTargetRouteList()));
141  assert(peer->GetIndex() >= 0);
142  interested_peers_.set(peer->GetIndex());
143  }
144  it->second.insert(rt);
145 }
146 
148  InterestedPeerList::iterator it = peer_list_.find(peer);
149  if (it == peer_list_.end()) return;
150  it->second.erase(rt);
151  if (it->second.empty()) {
152  peer_list_.erase(peer);
153  assert(peer->GetIndex() >= 0);
155  }
156 }
157 
159  return !peer_list_.empty();
160 }
161 
162 bool RtGroup::HasInterestedPeer(const string &name) const {
163  BOOST_FOREACH(const InterestedPeerList::value_type &peer, peer_list_) {
164  if (peer.first->peer_basename() == name)
165  return true;
166  }
167  return false;
168 }
169 
171  vector<ShowRtGroupMemberTableList> *member_list) const {
172  BOOST_FOREACH(const RtGroupMembers::value_type &rt_tables, rt_members) {
173  ShowRtGroupMemberTableList member;
174  vector<string> table_names;
175  BOOST_FOREACH(BgpTable *table, rt_tables.second) {
176  table_names.push_back(table->name());
177  }
178  member.set_family(Address::FamilyToString(rt_tables.first));
179  member.set_tables(table_names);
180  member_list->push_back(member);
181  }
182 }
183 
184 void RtGroup::FillInterestedPeers(vector<string> *interested_peers) const {
185  BOOST_FOREACH(const InterestedPeerList::value_type &peer, peer_list_) {
186  interested_peers->push_back(peer.first->peer_basename());
187  }
188 }
189 
190 void RtGroup::FillDependentRoutes(vector<string> *rtlist) const {
191  for (RTargetDepRouteList::const_iterator dep_it = dep_.begin();
192  dep_it != dep_.end(); ++dep_it) {
193  for (RouteList::const_iterator dep_rt_it = dep_it->begin();
194  dep_rt_it != dep_it->end(); ++dep_rt_it) {
195  rtlist->push_back((*dep_rt_it)->ToString());
196  }
197  }
198 }
199 
200 void RtGroup::FillShowInfoCommon(ShowRtGroupInfo *info,
201  bool fill_peers, bool fill_routes) const {
202  info->set_rtarget(ToString());
203 
204  vector<ShowRtGroupMemberTableList> import_members;
205  FillMemberTables(import_, &import_members);
206  info->set_import_members(import_members);
207  vector<ShowRtGroupMemberTableList> export_members;
208  FillMemberTables(export_, &export_members);
209  info->set_export_members(export_members);
210 
211  if (fill_peers) {
212  vector<string> interested_peers;
213  FillInterestedPeers(&interested_peers);
214  info->set_peers_interested(interested_peers);
215  }
216  if (fill_routes) {
217  vector<string> rtlist;
218  FillDependentRoutes(&rtlist);
219  info->set_dep_route(rtlist);
220  }
221 }
222 
223 void RtGroup::FillShowInfo(ShowRtGroupInfo *info) const {
224  FillShowInfoCommon(info, true, true);
225 }
226 
227 void RtGroup::FillShowSummaryInfo(ShowRtGroupInfo *info) const {
228  FillShowInfoCommon(info, true, false);
229 }
230 
231 void RtGroup::FillShowPeerInfo(ShowRtGroupInfo *info) const {
232  FillShowInfoCommon(info, false, true);
233 }
void FillShowPeerInfo(ShowRtGroupInfo *info) const
std::set< RTargetRoute * > RTargetRouteList
Definition: rtarget_group.h:67
bool RemoveImportTable(Address::Family family, BgpTable *tbl)
void RemoveDepRoute(int part_id, BgpRoute *rt)
std::set< BgpTable * > RtGroupMemberList
Definition: rtarget_group.h:63
void FillShowInfoCommon(ShowRtGroupInfo *info, bool fill_peers, bool fill_routes) const
void FillMemberTables(const RtGroupMembers &rt_members, std::vector< ShowRtGroupMemberTableList > *member_list) const
bool AddExportTable(Address::Family family, BgpTable *tbl)
const RtGroupMemberList & GetExportTables(Address::Family family) const
bool HasDepRoutes() const
BitSet & reset(size_t pos)
Definition: bitset.cc:136
virtual bool IsVpnTable() const
Definition: bgp_table.h:110
Family
Definition: address.h:24
RouteTarget rt_
const RtGroupMemberList & GetImportTables(Address::Family family) const
void FillInterestedPeers(std::vector< std::string > *interested_peers) const
InterestedPeerList peer_list_
RtGroupInterestedPeerSet interested_peers_
void AddDepRoute(int part_id, BgpRoute *rt)
const RtGroupInterestedPeerSet & GetInterestedPeers() const
Definition: db.h:24
void FillShowSummaryInfo(ShowRtGroupInfo *info) const
bool HasVrfTables(Address::Family family) const
void FillDependentRoutes(std::vector< std::string > *rtlist) const
const std::string & name() const
Definition: db_table.h:110
bool MayDelete() const
bool HasInterestedPeers() const
bool AddImportTable(Address::Family family, BgpTable *tbl)
bool HasInterestedPeer(const std::string &name) const
static std::string FamilyToString(Family fmly)
Definition: address.cc:63
BitSet & set(size_t pos)
Definition: bitset.cc:125
RtGroupMembers export_
RtGroupMembers import_
bool HasImportExportTables() const
std::string ToString() const
Definition: rtarget_group.h:72
std::vector< RouteList > RTargetDepRouteList
Definition: rtarget_group.h:66
RtGroup(const RouteTarget &rt)
void NotifyDepRoutes(int part_id)
std::map< Address::Family, RtGroupMemberList > RtGroupMembers
Definition: rtarget_group.h:64
void AddInterestedPeer(const BgpPeer *peer, RTargetRoute *rt)
RTargetDepRouteList dep_
DBTablePartBase * get_table_partition() const
Definition: db_entry.cc:115
void Notify(DBEntryBase *entry)
bool RemoveExportTable(Address::Family family, BgpTable *tbl)
const RouteTarget & rt()
void FillShowInfo(ShowRtGroupInfo *info) const
int GetIndex() const
Definition: bgp_peer.h:205
void RemoveInterestedPeer(const BgpPeer *peer, RTargetRoute *rt)