OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bgp_router.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <cmn/agent.h>
6 #include <vnc_cfg_types.h>
7 #include <bgp_schema_types.h>
8 #include <oper_db.h>
9 #include <bgp_router.h>
10 #include <config_manager.h>
11 
12 #define INET_LABELED "inet-labeled"
13 
15 // ControlNodeZone routines
17 ControlNodeZone::ControlNodeZone(const std::string &name,
18  const std::string &display_name,
19  const boost::uuids::uuid &uuid) :
20  name_(name), display_name_(display_name), uuid_(uuid) {
21 }
22 
24 }
25 
27 // BgpRouter routines
29 BgpRouter::BgpRouter(const std::string &name,
30  const std::string &ipv4_address,
31  const uint32_t &port, autogen::BgpRouterParams &params) :
32  name_(name), port_(port) ,params_(params) {
33  boost::system::error_code ec;
34  ipv4_address_ = Ip4Address::from_string(ipv4_address, ec);
35  if (ec.value() != 0) {
37  }
38  if ( std::find(params.address_families.begin(),
39  params.address_families.end(), INET_LABELED) !=
40  params.address_families.end() ) {
42  } else {
44  }
45 }
46 
47 void BgpRouter::set_ip_address_port(const std::string &ip_address,
48  const uint32_t &port) {
49  boost::system::error_code ec;
50  ipv4_address_ = Ip4Address::from_string(ip_address, ec);
51  if (ec.value() != 0) {
53  }
54  port_ = port;
55 }
56 
58  const std::string &control_node_zone_name) {
60 }
61 
62 void BgpRouter::set_inet_labeled_af(const autogen::BgpRouterParams params) {
63  if ( std::find(params.address_families.begin(),
64  params.address_families.end(), INET_LABELED) !=
65  params.address_families.end() ) {
67  } else {
69  }
70 }
71 
72 
74 }
75 
77 // BgpRouterConfig routines
80  OperIFMapTable(agent), inet_labeled_af_enabled_(false) {
81 }
82 
84  const std::string &xmpp_server) {
85  boost::system::error_code ec;
86  bool xmpp_server_ip_presence = true;
87  Ip4Address ipv4_address = Ip4Address::from_string(xmpp_server, ec);
88  if (ec.value() != 0) {
89  xmpp_server_ip_presence = false;
90  }
91  BgpRouterPtr entry;
92  tbb::mutex::scoped_lock lock(mutex_);
93  BgpRouterTree::const_iterator it = bgp_router_tree_.begin();
94  for ( ;it != bgp_router_tree_.end(); it++) {
95  entry = it->second;
96  if (xmpp_server_ip_presence) {
97  if (entry->ipv4_address() == ipv4_address)
98  return entry;
99  } else {
100  std::string fqdn_name = entry->name();
101  size_t pos = fqdn_name.rfind(":");
102  if (pos != std::string::npos)
103  pos = pos + 1;
104  else
105  pos = 0;
106  std::string bgp_router_name =
107  fqdn_name.substr(pos, fqdn_name.length());
108  if (bgp_router_name == xmpp_server)
109  return entry;
110  }
111  }
112  return BgpRouterPtr();
113 }
114 
116  const std::string &cnz_name) {
117  tbb::mutex::scoped_lock lock(mutex_);
118  ControlNodeZoneTree::const_iterator cnz_it =
119  control_node_zone_tree_.find(cnz_name);
120  if (cnz_it != control_node_zone_tree_.end()) {
121  ControlNodeZonePtr entry = cnz_it->second;
122  int count = 0;
123  int index = rand() % entry->bgp_router_tree_.size();
124  BgpRouterTree::const_iterator it = entry->bgp_router_tree_.begin();
125  for ( ;it != entry->bgp_router_tree_.end(); it++) {
126  if (count == index)
127  return it->second;
128  count++;
129  }
130  }
131  return BgpRouterPtr();
132 }
133 
134 uint32_t BgpRouterConfig::GetBgpRouterCount(const std::string &cnz_name) {
135  tbb::mutex::scoped_lock lock(mutex_);
136  ControlNodeZoneTree::const_iterator cnz_it =
137  control_node_zone_tree_.find(cnz_name);
138  if (cnz_it != control_node_zone_tree_.end()) {
139  ControlNodeZonePtr entry = cnz_it->second;
140  return entry->bgp_router_tree_.size();
141  }
142  return 0;
143 }
144 
146  BgpRouterPtr bgp_router) {
147  std::string cnz_name = bgp_router->control_node_zone_name();
148  if (cnz_name.empty())
149  return;
150  ControlNodeZoneTree::const_iterator it =
151  control_node_zone_tree_.find(cnz_name);
152  if (it != control_node_zone_tree_.end()) {
153  ControlNodeZonePtr entry = it->second;
154  entry->bgp_router_tree_.erase(bgp_router->name());
155  if (entry->bgp_router_tree_.size() == 0) {
156  control_node_zone_tree_.erase(cnz_name);
157  entry.reset();
158  }
159  }
160 }
161 
163  BgpRouterPtr bgp_router) {
164  std::string cnz_node_name;
165  IFMapNode *cnz_node = NULL;
166  IFMapAgentTable *bgp_router_table =
167  static_cast<IFMapAgentTable *>(bgp_router_node->table());
168  DBGraph *graph = bgp_router_table->GetGraph();
169  DBGraphVertex::adjacency_iterator iter = bgp_router_node->begin(graph);
170  while (iter != bgp_router_node->end(graph)) {
171  IFMapNode *node = static_cast<IFMapNode *>(iter.operator->());
172  if (strcmp(node->table()->Typename(),
174  cnz_node = node;
175  cnz_node_name = cnz_node->name();
176  break;
177  }
178  iter++;
179  }
180 
181  std::string cnz_name = bgp_router->control_node_zone_name();
182  if (strcmp(cnz_name.c_str(), cnz_node_name.c_str()) == 0) {
183  return;
184  }
185 
186  DeleteControlNodeZoneConfig(bgp_router_node, bgp_router);
187  bgp_router->set_control_node_zone_name(cnz_node_name);
188  if (cnz_node == NULL)
189  return;
190 
191  ControlNodeZonePtr entry;
192  ControlNodeZoneTree::const_iterator it =
193  control_node_zone_tree_.find(cnz_node->name());
194  if (it != control_node_zone_tree_.end()) {
195  entry = it->second;
196  entry->bgp_router_tree_.insert(
197  std::make_pair(bgp_router->name(), bgp_router));
198  } else {
199  autogen::ControlNodeZone *cfg =
200  static_cast<autogen::ControlNodeZone *>(cnz_node->GetObject());
201  autogen::IdPermsType id_perms = cfg->id_perms();
203  CfgUuidSet(id_perms.uuid.uuid_mslong, id_perms.uuid.uuid_lslong, uuid);
204  ControlNodeZonePtr cnz(
205  new ControlNodeZone(cnz_node_name, cfg->display_name(), uuid));
206  entry = cnz;
207  entry->bgp_router_tree_.insert(
208  std::make_pair(bgp_router->name(), bgp_router));
209  control_node_zone_tree_.insert(std::make_pair(cnz_node_name, entry));
210  }
211 }
212 
214  bool inet_labeled_flag = false;
215  BgpRouterPtr entry;
216  BgpRouterTree::const_iterator it = bgp_router_tree_.begin();
217  while (it != bgp_router_tree_.end()) {
218  entry = it->second;
219  if (entry->get_inet_labeled_af()) {
220  inet_labeled_flag = true;
221  break;
222  }
223  it++;
224  }
225 
226  if (inet_labeled_af_enabled_ != inet_labeled_flag) {
227  inet_labeled_af_enabled_ = inet_labeled_flag;
229 
230  }
231 }
232 
233 
234 
236  if (node->IsDeleted())
237  return;
238  autogen::BgpRouter *bgp_router_cfg =
239  static_cast<autogen::BgpRouter *>(node->GetObject());
240  if (bgp_router_cfg == NULL)
241  return;
242  autogen::BgpRouterParams params = bgp_router_cfg->parameters();
243  if ((strcmp(params.router_type.c_str(), BGP_ROUTER_TYPE) != 0) &&
244  (strcmp(params.router_type.c_str(), BGP_ROUTER_EXT_TYPE) != 0))
245  return;
246 
247  std::string name = node->name();
248  BgpRouterPtr entry;
249  tbb::mutex::scoped_lock lock(mutex_);
250  BgpRouterTree::const_iterator it = bgp_router_tree_.find(name);
251  if (it != bgp_router_tree_.end()) {
252  entry = it->second;
253  entry->set_ip_address_port(params.address, params.port);
254  entry->set_inet_labeled_af(params);
255  } else {
256  BgpRouterPtr bgp_router(
257  new BgpRouter(name, params.address, params.port, params));
258  entry = bgp_router;
259  bgp_router_tree_.insert(std::make_pair(name, entry));
260  }
261  //TODO: optimize calling this function
263  UpdateControlNodeZoneConfig(node, entry);
264 
265  return;
266 }
267 
269  autogen::BgpRouter *bgp_router_cfg =
270  static_cast<autogen::BgpRouter *>(node->GetObject());
271  if (bgp_router_cfg == NULL)
272  return;
273  autogen::BgpRouterParams params = bgp_router_cfg->parameters();
274  if ((strcmp(params.router_type.c_str(), BGP_ROUTER_TYPE) != 0) &&
275  (strcmp(params.router_type.c_str(), BGP_ROUTER_EXT_TYPE) != 0))
276  return;
277 
278  std::string name = node->name();
279  tbb::mutex::scoped_lock lock(mutex_);
280  BgpRouterTree::const_iterator it = bgp_router_tree_.find(name);
281  if (it != bgp_router_tree_.end()) {
282  BgpRouterPtr entry = it->second;
283  DeleteControlNodeZoneConfig(node, entry);
284  entry.reset();
285  bgp_router_tree_.erase(it->first);
286  }
287 }
288 
291 }
292 
294 }
295 
296 void BgpRouterSandeshReq::HandleRequest() const {
297  BgpRouterSandeshResp *resp = new BgpRouterSandeshResp();
298  resp->set_context(context());
299  std::string filter = get_name();
300  std::vector<BgpRouterSandeshList> bgp_router_sandesh_list;
301  Agent *agent = Agent::GetInstance();
302  BgpRouterConfig *bgp_router_cfg = agent->oper_db()->bgp_router_config();
303  BgpRouterTree bgp_router_tree = bgp_router_cfg->bgp_router_tree();
304  BgpRouterTree::const_iterator it = bgp_router_tree.begin();
305  for ( ;it != bgp_router_tree.end(); it++) {
306  BgpRouterPtr bgp_router_entry = it->second;
307  BgpRouterSandeshList bgp_router_sandesh_entry;
308  std::string bgp_router_name = bgp_router_entry->name();
309  if (filter.size()) {
310  if (bgp_router_name.find(filter) == std::string::npos) {
311  continue;
312  }
313  }
314  bgp_router_sandesh_entry.set_name(bgp_router_entry->name());
315  std::stringstream ss;
316  ss << bgp_router_entry->ipv4_address()
317  << ":"<< bgp_router_entry->port();
318  bgp_router_sandesh_entry.set_ipv4_address_port(ss.str());
319  bgp_router_sandesh_entry.set_control_node_zone(
320  bgp_router_entry->control_node_zone_name());
321  bgp_router_sandesh_list.push_back(bgp_router_sandesh_entry);
322  }
323  resp->set_bgp_router_list(bgp_router_sandesh_list);
324  resp->Response();
325 }
326 
327 void ControlNodeZoneSandeshReq::HandleRequest() const {
328  ControlNodeZoneSandeshResp *resp = new ControlNodeZoneSandeshResp();
329  resp->set_context(context());
330  std::string filter = get_name();
331  std::vector<ControlNodeZoneSandeshList> cnz_sandesh_list;
332  Agent *agent = Agent::GetInstance();
333  BgpRouterConfig *bgp_router_cfg = agent->oper_db()->bgp_router_config();
334  ControlNodeZoneTree cnz_tree = bgp_router_cfg->control_node_zone_tree();
335  ControlNodeZoneTree::const_iterator it = cnz_tree.begin();
336  for ( ;it != cnz_tree.end(); it++) {
337  ControlNodeZonePtr cnz_entry = it->second;
338  ControlNodeZoneSandeshList cnz_sandesh_entry;
339  std::string cnz_name = cnz_entry->name();
340  if (filter.size()) {
341  if (cnz_name.find(filter) == std::string::npos) {
342  continue;
343  }
344  }
345  cnz_sandesh_entry.set_name(cnz_entry->name());
346  BgpRouterTree bgp_router_tree = cnz_entry->bgp_router_tree();
347  BgpRouterTree::const_iterator it = bgp_router_tree.begin();
348  std::vector<BgpRouterSandeshList> bgp_router_list;
349  for ( ;it != bgp_router_tree.end(); it++) {
350  BgpRouterPtr bgp_router_entry = it->second;
351  BgpRouterSandeshList bgp_router_sandesh_entry;
352  bgp_router_sandesh_entry.set_name(bgp_router_entry->name());
353  std::stringstream ss;
354  ss << bgp_router_entry->ipv4_address()
355  << ":" << bgp_router_entry->port();
356  bgp_router_sandesh_entry.set_ipv4_address_port(ss.str());
357  bgp_router_sandesh_entry.set_control_node_zone(
358  bgp_router_entry->control_node_zone_name());
359  bgp_router_list.push_back(bgp_router_sandesh_entry);
360  }
361  cnz_sandesh_entry.set_bgp_router_list(bgp_router_list);
362  cnz_sandesh_list.push_back(cnz_sandesh_entry);
363  }
364  resp->set_control_node_zone_list(cnz_sandesh_list);
365  resp->Response();
366 }
BgpRouterPtr GetBgpRouterFromControlNodeZone(const std::string &cnz_name)
Definition: bgp_router.cc:115
bool inet_labeled_af_enabled_
Definition: bgp_router.h:112
void UpdateBgpRouterConfigAf()
Definition: bgp_router.cc:213
void AddBgpRouterConfigNode(IFMapNode *node)
const std::string & control_node_zone_name() const
Definition: bgp_router.h:39
static Agent * GetInstance()
Definition: agent.h:436
void set_control_node_zone_name(const std::string &contol_node_zone_name)
Definition: bgp_router.cc:57
static void CfgUuidSet(uint64_t ms_long, uint64_t ls_long, boost::uuids::uuid &u)
Definition: agent_cmn.h:67
Agent * agent() const
Definition: oper_db.h:245
ControlNodeZone(const std::string &name, const std::string &display_name, const boost::uuids::uuid &uuid)
Definition: bgp_router.cc:17
tbb::mutex mutex_
Definition: bgp_router.h:109
bool IsDeleted() const
Definition: db_entry.h:49
ConfigManager * config_manager() const
Definition: agent.cc:889
ControlNodeZoneTree control_node_zone_tree_
Definition: bgp_router.h:111
void UpdateControlNodeZoneConfig(IFMapNode *bgp_router_node, BgpRouterPtr bgp_router)
Definition: bgp_router.cc:162
const ControlNodeZoneTree & control_node_zone_tree() const
Definition: bgp_router.h:90
virtual const char * Typename() const =0
#define INET_LABELED
Definition: bgp_router.cc:12
boost::shared_ptr< BgpRouter > BgpRouterPtr
Definition: bgp_router.h:19
boost::uuids::uuid uuid
adjacency_iterator end(DBGraph *graph)
IFMapTable * table()
Definition: ifmap_node.h:29
uint32_t port_
Definition: bgp_router.h:48
virtual ~BgpRouterConfig()
Definition: bgp_router.cc:293
OperDB * oper_db() const
Definition: agent.cc:1013
const DBGraph * GetGraph() const
#define BGP_ROUTER_EXT_TYPE
Definition: bgp_router.h:13
BgpRouterConfig * bgp_router_config() const
Definition: operdb_init.h:55
void ConfigManagerEnqueue(IFMapNode *node)
Definition: bgp_router.cc:289
uint32_t GetBgpRouterCount()
Definition: bgp_router.h:80
void ConfigAddChange(IFMapNode *node)
Definition: bgp_router.cc:235
Definition: agent.h:358
BgpRouterPtr GetBgpRouterFromXmppServer(const std::string &xmpp_server)
Definition: bgp_router.cc:83
#define BGP_ROUTER_TYPE
Definition: bgp_router.h:12
BgpRouterConfig(Agent *agent)
Definition: bgp_router.cc:79
const BgpRouterTree & bgp_router_tree() const
Definition: bgp_router.h:86
BgpRouter(const std::string &name, const std::string &ipv4_address, const uint32_t &port, autogen::BgpRouterParams &params)
Definition: bgp_router.cc:29
const std::string & name() const
Definition: ifmap_node.h:48
std::string control_node_zone_name_
Definition: bgp_router.h:50
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
void ConfigDelete(IFMapNode *node)
Definition: bgp_router.cc:268
IFMapObject * GetObject()
Definition: ifmap_node.cc:63
BgpRouterTree bgp_router_tree_
Definition: bgp_router.h:110
void DeleteControlNodeZoneConfig(IFMapNode *bgp_router_node, BgpRouterPtr bgp_router)
Definition: bgp_router.cc:145
void set_inet_labeled_flag(bool flag)
Definition: agent.h:1373
std::map< std::string, BgpRouterPtr > BgpRouterTree
Definition: bgp_router.h:23
boost::shared_ptr< ControlNodeZone > ControlNodeZonePtr
Definition: bgp_router.h:22
bool inet_labeled_af_enable_
Definition: bgp_router.h:49
void set_inet_labeled_af(const autogen::BgpRouterParams params)
Definition: bgp_router.cc:62
#define CONTROL_NODE_ZONE_CONFIG_NAME
Definition: bgp_router.h:14
Ip4Address ipv4_address_
Definition: bgp_router.h:47
adjacency_iterator begin(DBGraph *graph)
void set_ip_address_port(const std::string &ip_address, const uint32_t &port)
Definition: bgp_router.cc:47
std::map< std::string, ControlNodeZonePtr > ControlNodeZoneTree
Definition: bgp_router.h:24
const uint32_t & port() const
Definition: bgp_router.h:38