OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bgp_server.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "bgp/bgp_server.h"
6 
7 #include <sys/resource.h>
8 
9 #include <boost/foreach.hpp>
10 #include <boost/tuple/tuple.hpp>
11 
12 #include "base/connection_info.h"
13 #include "base/misc_utils.h"
14 #include "base/task_annotations.h"
16 #include "bgp/bgp_factory.h"
17 #include "bgp/bgp_lifetime.h"
18 #include "bgp/bgp_log.h"
19 #include "bgp/bgp_membership.h"
20 #include "bgp/bgp_peer.h"
21 #include "bgp/bgp_ribout_updates.h"
24 #include "bgp/bgp_update_sender.h"
25 #include "bgp/peer_stats.h"
33 
34 #include "config-client-mgr/config_client_show_types.h"
35 #include "control-node/sandesh/control_node_types.h"
36 
37 using boost::system::error_code;
38 using boost::tie;
40 using std::boolalpha;
41 using std::make_pair;
42 using std::map;
43 using std::noboolalpha;
44 using std::sort;
45 using std::string;
46 
47 // The ConfigUpdater serves as glue between the BgpConfigManager and the
48 // BgpServer.
50 public:
51  explicit ConfigUpdater(BgpServer *server) : server_(server) {
54  this, _1, _2);
56  this, _1, _2);
58  this, _1, _2);
60  this, _1, _2);
62  this, _1, _2);
63  obs.qos = boost::bind(&ConfigUpdater::ProcessGlobalQosConfig,
64  this, _1, _2);
65  server->config_manager()->RegisterObservers(obs);
66  }
67 
70  if (qos->control_dscp() != server_->global_qos()->control_dscp()) {
73  }
75  }
76 
79  bool clear_peers = false;
80 
81  if (server_->global_config()->gr_enable() != new_config->gr_enable()) {
82  server_->global_config()->set_gr_enable(new_config->gr_enable());
83  clear_peers = true;
84  }
85  if (server_->global_config()->gr_time() != new_config->gr_time()) {
86  server_->global_config()->set_gr_time(new_config->gr_time());
87  clear_peers = true;
88  }
89  if (server_->global_config()->llgr_time() != new_config->llgr_time()) {
90  server_->global_config()->set_llgr_time(new_config->llgr_time());
91  clear_peers = true;
92  }
94  new_config->end_of_rib_timeout()) {
96  new_config->end_of_rib_timeout());
97  clear_peers = true;
98  }
100  new_config->gr_bgp_helper()) {
102  new_config->gr_bgp_helper());
103  clear_peers = true;
104  }
106  new_config->enable_4byte_as()) {
108  new_config->enable_4byte_as());
109  clear_peers = true;
110  }
111 
112  if (server_->global_config()->fc_enabled() !=
113  new_config->fc_enabled()) {
115  new_config->fc_enabled());
116  clear_peers = true;
117  }
118 
120  new_config->nh_check_enabled()) {
122  new_config->nh_check_enabled());
123  clear_peers = true;
124  }
125 
126  // Clear peers if there's a change in always-compare-med knob.
128  new_config->always_compare_med()) {
130  new_config->always_compare_med());
131  clear_peers = true;
132  }
133 
134  // Process a change in rd-cluster-seed knob.
136  new_config->rd_cluster_seed()) {
138  new_config->rd_cluster_seed());
139  }
140 
141  // Process a change in xmpp-hold-time knob.
143  new_config->xmpp_hold_time()) {
145  new_config->xmpp_hold_time());
146  }
147 
148  // Process a change in all-tags-are-global knob.
150  new_config->all_tags_are_global()) {
152  new_config->all_tags_are_global());
153  }
154 
155  bool clear_bgpaas_peers = false;
156 
157  // Clear bgpaas peers if there's a change in bgpaas-port-start.
159  new_config->bgpaas_port_start()) {
161  new_config->bgpaas_port_start());
162  clear_bgpaas_peers = true;
163  }
164 
165  // Clear bgpaas peers if there's a change in bgpaas-port-end.
167  new_config->bgpaas_port_end()) {
169  new_config->bgpaas_port_end());
170  clear_bgpaas_peers = true;
171  }
172 
173  if (clear_peers) {
176  assert(rti);
177  PeerManager *peer_manager = rti->LocatePeerManager();
178  peer_manager->ClearAllPeers();
179  }
180 
181  if (clear_peers || clear_bgpaas_peers)
183  }
184 
185  void ProcessProtocolConfig(const BgpProtocolConfig *protocol_config,
187  const string &instance_name = protocol_config->instance_name();
188 
189  // We only support BGP sessions in master instance for now.
190  if (instance_name != BgpConfigManager::kMasterInstance) {
191  return;
192  }
193 
194  if (event == BgpConfigManager::CFG_ADD ||
195  event == BgpConfigManager::CFG_CHANGE) {
196  BgpServerConfigUpdate(instance_name, protocol_config);
197  } else if (event == BgpConfigManager::CFG_DELETE) {
198  BgpServerConfigUpdate(instance_name, NULL);
199  } else {
200  assert(false);
201  }
202  }
203 
204  void BgpServerConfigUpdate(string instance_name,
205  const BgpProtocolConfig *config) {
206  boost::system::error_code ec;
207  uint32_t config_identifier = 0;
208  uint32_t config_autonomous_system = 0;
209  uint32_t config_local_autonomous_system = 0;
210  uint32_t config_hold_time = 0;
211  uint32_t config_cluster_id = 0;
212  bool config_admin_down = false;
213  if (config) {
214  config_admin_down = config->admin_down();
215  config_identifier = config->identifier();
216  config_autonomous_system = config->autonomous_system();
217  config_local_autonomous_system = config->local_autonomous_system();
218  config_cluster_id = config->cluster_id();
219  config_hold_time = config->hold_time();
220  }
221 
222  if (server_->admin_down_ != config_admin_down) {
223  if (server_->admin_down_) {
224  BGP_LOG_STR(BgpConfig, SandeshLevel::SYS_DEBUG,
225  BGP_LOG_FLAG_SYSLOG, "Updated Admin Down from " <<
226  boolalpha << server_->admin_down_ << noboolalpha <<
227  " to " <<
228  boolalpha << config_admin_down << noboolalpha);
229  } else {
231  "Updated Admin Down from " <<
232  boolalpha << server_->admin_down_ << noboolalpha <<
233  " to " <<
234  boolalpha << config_admin_down << noboolalpha);
235  }
236  server_->admin_down_ = config_admin_down;
237  if (server_->admin_down_)
239  }
240 
241  // We currently do not support bind failures or changes to listen port
242  // in production mode.
243  if (config && !server_->session_manager()->Initialize(config->port()) &&
245  // Disable core file generation and exit.
246  rlimit new_core_limit;
247  new_core_limit.rlim_cur = 0;
248  new_core_limit.rlim_max = 0;
249  setrlimit(RLIMIT_CORE, &new_core_limit);
251  "Process exit! due to tcp server port " << config->port() <<
252  " bind failure");
254  kill(getpid(), SIGTERM);
255  }
256 
257  Ip4Address identifier(ntohl(config_identifier));
258  if (server_->bgp_identifier_ != identifier) {
259  if (!server_->bgp_identifier_.is_unspecified()) {
261  "Updated Router ID from " <<
262  server_->bgp_identifier_.to_string() << " to " <<
263  identifier.to_string());
264  } else {
265  BGP_LOG_STR(BgpConfig, SandeshLevel::SYS_DEBUG,
266  BGP_LOG_FLAG_SYSLOG, "Updated Router ID from " <<
267  server_->bgp_identifier_.to_string() << " to " <<
268  identifier.to_string());
269  }
270  server_->UpdateBgpIdentifier(identifier);
271  }
272 
273  bool notify_asn_update = false;
274  uint32_t old_asn = server_->autonomous_system_;
275  uint32_t old_local_asn = server_->local_autonomous_system_;
276  server_->autonomous_system_ = config_autonomous_system;
277  if (config_local_autonomous_system) {
278  server_->local_autonomous_system_ = config_local_autonomous_system;
279  } else {
280  server_->local_autonomous_system_ = config_autonomous_system;
281  }
282 
283  if (server_->autonomous_system_ != old_asn) {
284  if (old_asn != 0) {
286  "Updated Autonomous System from " << old_asn <<
287  " to " << server_->autonomous_system_);
288  } else {
289  BGP_LOG_STR(BgpConfig, SandeshLevel::SYS_DEBUG,
291  "Updated Autonomous System from " << old_asn <<
292  " to " << server_->autonomous_system_);
293  }
294  notify_asn_update = true;
295  }
296 
297  if (server_->local_autonomous_system_ != old_local_asn) {
298  if (old_local_asn != 0) {
300  "Updated Local Autonomous System from " <<
301  old_local_asn << " to " <<
303  } else {
304  BGP_LOG_STR(BgpConfig, SandeshLevel::SYS_DEBUG,
306  "Updated Local Autonomous System from " <<
307  old_local_asn << " to " <<
309  }
310  notify_asn_update = true;
311  }
312 
313  if (notify_asn_update) {
314  server_->NotifyASNUpdate(old_asn, old_local_asn);
315  }
316 
317  if (server_->hold_time_ != config_hold_time) {
318  BGP_LOG_STR(BgpConfig, SandeshLevel::SYS_DEBUG, BGP_LOG_FLAG_SYSLOG,
319  "Updated Hold Time from " <<
320  server_->hold_time_ << " to " << config_hold_time);
321  server_->hold_time_ = config_hold_time;
322  }
323 
324  if (server_->cluster_id() != config_cluster_id) {
325  BGP_LOG_STR(BgpConfig, SandeshLevel::SYS_DEBUG, BGP_LOG_FLAG_SYSLOG,
326  "Updated Cluster Id from " <<
327  server_->cluster_id() << " to " << config_cluster_id);
328  server_->set_cluster_id(config_cluster_id);
331  assert(rti);
332  PeerManager *peer_manager = rti->LocatePeerManager();
333  peer_manager->ClearAllInternalPeers();
334  }
335 
336  ConnectionState::GetInstance()->Update();
337  }
338 
339  void ProcessNeighborConfig(const BgpNeighborConfig *neighbor_config,
341  string instance_name = neighbor_config->instance_name();
343  RoutingInstance *rti = ri_mgr->GetRoutingInstance(instance_name);
344  if (!rti)
345  return;
346 
347  if (event == BgpConfigManager::CFG_ADD ||
348  event == BgpConfigManager::CFG_CHANGE) {
349  if (rti->deleted())
350  return;
351  PeerManager *peer_manager = rti->LocatePeerManager();
352  BgpPeer *peer = peer_manager->PeerLocate(server_, neighbor_config);
353  if (peer) {
354  server_->RemovePeer(peer->endpoint(), peer);
355  peer->ConfigUpdate(neighbor_config);
356  server_->InsertPeer(peer->endpoint(), peer);
357  }
358  } else if (event == BgpConfigManager::CFG_DELETE) {
359  PeerManager *peer_manager = rti->peer_manager();
360  if (!peer_manager)
361  return;
362  BgpPeer *peer = peer_manager->TriggerPeerDeletion(neighbor_config);
363  if (peer) {
364  server_->RemovePeer(peer->endpoint(), peer);
365  }
366  }
367  }
368 
372  if (event == BgpConfigManager::CFG_ADD) {
373  mgr->CreateRoutingPolicy(policy_config);
374  } else if (event == BgpConfigManager::CFG_CHANGE) {
375  mgr->UpdateRoutingPolicy(policy_config);
376  } else if (event == BgpConfigManager::CFG_DELETE) {
377  mgr->DeleteRoutingPolicy(policy_config->name());
378  }
379  }
380 
381  void ProcessInstanceConfig(const BgpInstanceConfig *instance_config,
384  if (event == BgpConfigManager::CFG_ADD ||
385  event == BgpConfigManager::CFG_CHANGE) {
386  mgr->LocateRoutingInstance(instance_config->name());
387  } else if (event == BgpConfigManager::CFG_DELETE) {
388  mgr->DeleteRoutingInstance(instance_config->name());
389  }
390  }
391 
392 private:
394 };
395 
397 public:
398  explicit DeleteActor(BgpServer *server)
399  : LifetimeActor(server->lifetime_manager()), server_(server) {
400  }
401  virtual bool MayDelete() const {
402  CHECK_CONCURRENCY("bgp::Config");
403  return server_->session_manager()->MayDelete();
404  }
405  virtual void Shutdown() {
406  CHECK_CONCURRENCY("bgp::Config");
408  }
409  virtual void Destroy() {
410  CHECK_CONCURRENCY("bgp::Config");
414  server_->session_mgr_ = NULL;
416  }
417 
418 private:
420 };
421 
422 bool BgpServer::IsDeleted() const {
423  return deleter_->IsDeleted();
424 }
425 
427  if (!deleter_->IsDeleted())
428  return;
429  deleter_->RetryDelete();
430 }
431 
433  CHECK_CONCURRENCY("bgp::Config");
434 
435  static TaskScheduler *scheduler = TaskScheduler::GetInstance();
436  static int db_table_task_id = scheduler->GetTaskId("db::DBTable");
437  static int resolver_path_task_id =
438  scheduler->GetTaskId("bgp::ResolverPath");
439  static int resolver_nexthop_task_id =
440  scheduler->GetTaskId("bgp::ResolverNexthop");
441 
442  // Check if any PathResolver is active.
443  // Need to ensure that there's no pending deletes of BgpPaths added by
444  // PathResolver since they hold pointers to IPeer.
445  if (!scheduler->IsTaskGroupEmpty(resolver_path_task_id) ||
446  !scheduler->IsTaskGroupEmpty(resolver_nexthop_task_id)) {
447  return false;
448  }
449 
450  // Check if the membership manager queue is empty.
451  if (!membership_mgr_->IsQueueEmpty()) {
452  return false;
453  }
454 
455  // Check if the Service Chain Manager Work Queues are empty.
456  if (!inet_service_chain_mgr_->IsQueueEmpty() ||
457  !inet6_service_chain_mgr_->IsQueueEmpty() ||
458  !evpn_service_chain_mgr_->IsQueueEmpty() ||
459  !evpn6_service_chain_mgr_->IsQueueEmpty()) {
460  return false;
461  }
462 
463  // Check if the DB requests queue and change list is empty.
464  if (!db_.IsDBQueueEmpty()) {
465  return false;
466  }
467 
468  // Check if the RTargetGroupManager has processed all RTargetRoute updates.
469  // This is done to ensure that the InterestedPeerList of RtargetGroup gets
470  // updated before allowing the peer to get deleted.
471  if (!rtarget_group_mgr_->IsRTargetRoutesProcessed()) {
472  return false;
473  }
474 
475  // Check if any db::DBTable task is active.
476  // Need to ensure that there's no pending deletes of BgpPaths added by
477  // the Evpn aliasing module since they hold pointers to IPeer.
478  if (!scheduler->IsTaskGroupEmpty(db_table_task_id)) {
479  return false;
480  }
481 
482  return true;
483 }
484 
486  : admin_down_(false),
487  cluster_id_(0),
488  autonomous_system_(0),
489  local_autonomous_system_(0),
490  bgp_identifier_(0),
491  bgp_identifier_u32_(0),
492  hold_time_(0),
493  gr_helper_disable_(false),
494  lifetime_manager_(BgpStaticObjectFactory::Create<BgpLifetimeManager>(this,
495  TaskScheduler::GetInstance()->GetTaskId("bgp::Config"))),
496  deleter_(new DeleteActor(this)),
497  destroyed_(false),
498  logging_disabled_(false),
499  mvpn_ipv4_enable_(false),
500  ignore_aspath_(false),
501  aspath_db_(new AsPathDB(this)),
502  aspath_4byte_db_(new AsPath4ByteDB(this)),
503  as4path_db_(new As4PathDB(this)),
504  olist_db_(new BgpOListDB(this)),
505  cluster_list_db_(new ClusterListDB(this)),
506  comm_db_(new CommunityDB(this)),
507  edge_discovery_db_(new EdgeDiscoveryDB(this)),
508  edge_forwarding_db_(new EdgeForwardingDB(this)),
509  extcomm_db_(new ExtCommunityDB(this)),
510  ovnpath_db_(new OriginVnPathDB(this)),
511  pmsi_tunnel_db_(new PmsiTunnelDB(this)),
512  attr_db_(new BgpAttrDB(this)),
513  session_mgr_(BgpStaticObjectFactory::Create<BgpSessionManager>(evm, this)),
514  update_sender_(new BgpUpdateSender(this)),
515  inst_mgr_(BgpStaticObjectFactory::Create<RoutingInstanceMgr>(this)),
516  policy_mgr_(BgpStaticObjectFactory::Create<RoutingPolicyMgr>(this)),
517  rtarget_group_mgr_(BgpStaticObjectFactory::Create<RTargetGroupMgr>(this)),
518  membership_mgr_(BgpStaticObjectFactory::Create<BgpMembershipManager>(this)),
519  inet_condition_listener_(new BgpConditionListener(this)),
520  inet6_condition_listener_(new BgpConditionListener(this)),
521  evpn_condition_listener_(new BgpConditionListener(this)),
522  evpn6_condition_listener_(new BgpConditionListener(this)),
523  inetvpn_replicator_(new RoutePathReplicator(this, Address::INETVPN)),
524  ermvpn_replicator_(new RoutePathReplicator(this, Address::ERMVPN)),
525  mvpn_replicator_(new RoutePathReplicator(this, Address::MVPN)),
526  evpn_replicator_(new RoutePathReplicator(this, Address::EVPN)),
527  inet6vpn_replicator_(new RoutePathReplicator(this, Address::INET6VPN)),
528  inet_service_chain_mgr_(
529  BgpStaticObjectFactory::Create<IServiceChainMgr, SCAddress::INET>(this)),
530  inet6_service_chain_mgr_(
531  BgpStaticObjectFactory::Create<IServiceChainMgr, SCAddress::INET6>(this)),
532  evpn_service_chain_mgr_(
533  BgpStaticObjectFactory::Create<IServiceChainMgr, SCAddress::EVPN>(this)),
534  evpn6_service_chain_mgr_(
535  BgpStaticObjectFactory::Create<IServiceChainMgr, SCAddress::EVPN6>(this)),
536  global_config_(new BgpGlobalSystemConfig()),
537  global_qos_(new BgpGlobalQosConfig()),
538  config_mgr_(BgpStaticObjectFactory::Create<BgpConfigManager>(this)),
539  updater_(new ConfigUpdater(this)) {
540  bgp_count_ = 0;
541  num_up_peer_ = 0;
542  deleting_count_ = 0;
543  bgpaas_count_ = 0;
547 }
548 
550  assert(deleting_count_ == 0);
551  assert(deleting_bgpaas_count_ == 0);
552  assert(srt_manager_list_.empty());
553 }
554 
557 }
558 
561 }
562 
563 string BgpServer::ToString() const {
564  return bgp_identifier_.to_string();
565 }
566 
568  deleter_->Delete();
569 }
570 
572  return deleter_.get();
573 }
574 
576  if (!bgp_identifier_u32())
577  return false;
579  return false;
580  if (!autonomous_system())
581  return false;
582  return true;
583 }
584 
586  CHECK_CONCURRENCY("bgp::Config");
587 
588  if (peer->IsRouterTypeBGPaaS()) {
589  bgpaas_count_++;
590  } else {
591  bgp_count_++;
592  }
593 
594  BgpPeerList::iterator loc;
595  bool result;
596  tie(loc, result) = peer_list_.insert(make_pair(peer->peer_name(), peer));
597  assert(result);
598  assert(loc->second == peer);
599 
600  size_t bit = peer_bmap_.find_first();
601  if (bit == peer_bmap_.npos) {
602  bit = peer_bmap_.size();
603  peer_bmap_.resize(bit + 1, true);
604  }
605  peer_bmap_.reset(bit);
606  return bit;
607 }
608 
610  CHECK_CONCURRENCY("bgp::Config");
611 
612  if (peer->IsRouterTypeBGPaaS()) {
613  assert(bgpaas_count_);
614  bgpaas_count_--;
615  } else {
616  assert(bgp_count_);
617  bgp_count_--;
618  }
619 
620  BgpPeerList::iterator loc = peer_list_.find(peer->peer_name());
621  assert(loc != peer_list_.end());
622  peer_list_.erase(loc);
623 
624  peer_bmap_.set(peer->GetIndex());
625  for (size_t i = peer_bmap_.size(); i != 0; i--) {
626  if (peer_bmap_[i-1] != true) {
627  if (i != peer_bmap_.size()) {
628  peer_bmap_.resize(i);
629  }
630  return;
631  }
632  }
633  peer_bmap_.clear();
634 }
635 
636 BgpPeer *BgpServer::FindPeer(const string &name) {
637  BgpPeerList::iterator loc = peer_list_.find(name);
638  return (loc != peer_list_.end() ? loc->second : NULL);
639 }
640 
641 BgpPeer *BgpServer::FindNextPeer(const string &name) {
642  BgpPeerList::iterator loc = peer_list_.upper_bound(name);
643  return (loc != peer_list_.end() ? loc->second : NULL);
644 }
645 
647  if (!remote.port() && remote.address().is_unspecified())
648  return;
649  endpoint_peer_list_.insert(make_pair(remote, peer));
650 }
651 
653  EndpointPeerList::iterator loc = endpoint_peer_list_.lower_bound(remote);
654  while (loc != endpoint_peer_list_.end() && loc->first == remote) {
655  if (loc->second == peer) {
656  endpoint_peer_list_.erase(loc);
657  break;
658  }
659  ++loc;
660  }
661 }
662 
664  for (auto &i : endpoint_peer_list_) {
666  }
667 }
668 
670  EndpointPeerList::const_iterator loc = endpoint_peer_list_.find(remote);
671  return (loc == endpoint_peer_list_.end() ? NULL : loc->second);
672 }
673 
675  EndpointPeerList::const_iterator loc =
676  endpoint_peer_list_.lower_bound(peer->endpoint());
677  while (loc != endpoint_peer_list_.end() && loc->first == peer->endpoint()) {
678  if (loc->second == peer)
679  return loc->second;
680  ++loc;
681  }
682  return NULL;
683 }
684 
685 const string &BgpServer::localname() const {
686  return config_mgr_->localname();
687 }
688 
689 boost::asio::io_context *BgpServer::ioservice() {
691 }
692 
694  return (global_config_->fc_enabled());
695 }
696 
698  if (!global_config_->fc_enabled())
699  return false;
700  return (global_config_->nh_check_enabled());
701 }
702 
704  if (!global_config_->gr_enable())
705  return 0;
706  return global_config_->gr_time();
707 }
708 
710  if (!global_config_->gr_enable())
711  return 0;
712  return global_config_->llgr_time();
713 }
714 
715 uint16_t BgpServer::GetXmppHoldTime() const {
716  if (!global_config_->fc_enabled())
717  return XMPP_HOLD_TIME_DEFAULT;
718  return global_config_->xmpp_hold_time();
719 }
720 
722  return global_config_->end_of_rib_timeout();
723 }
724 
726  return global_config_->end_of_rib_timeout();
727 }
728 
731 }
732 
734  return global_config()->enable_4byte_as();
735 }
736 
739 }
740 
742 
743  // Check if disabled in .conf file.
744  if (gr_helper_disable_)
745  return false;
746 
747  // Check if GR is disabled..
748  if (!global_config_->gr_enable())
749  return false;
750 
751  // Check from configuration.
752  return global_config_->gr_bgp_helper();
753 }
754 
756  assert(inst_mgr_.get());
757  return inst_mgr_->count();
758 }
759 
761  assert(inst_mgr_.get());
762  return inst_mgr_->deleted_count();
763 }
764 
766  uint32_t out_q_depth = 0;
768  rit != inst_mgr_->end(); ++rit) {
769  RoutingInstance::RouteTableList const rt_list =
770  rit->second->GetTables();
771  for (RoutingInstance::RouteTableList::const_iterator it =
772  rt_list.begin(); it != rt_list.end(); ++it) {
773  BgpTable *table = it->second;
774  size_t markers;
775  out_q_depth += table->GetPendingRiboutsCount(&markers);
776  }
777  }
778  return out_q_depth;
779 }
780 
782  return inet_service_chain_mgr_->PendingQueueSize() +
783  inet_service_chain_mgr_->ResolvedQueueSize() +
784  inet6_service_chain_mgr_->PendingQueueSize() +
785  inet6_service_chain_mgr_->ResolvedQueueSize() +
786  evpn_service_chain_mgr_->PendingQueueSize() +
787  evpn_service_chain_mgr_->ResolvedQueueSize() +
788  evpn6_service_chain_mgr_->PendingQueueSize() +
789  evpn6_service_chain_mgr_->ResolvedQueueSize();
790 }
791 
793  return inet_service_chain_mgr_->PendingQueueSize() +
794  inet_service_chain_mgr_->GetDownServiceChainCount() +
795  inet6_service_chain_mgr_->PendingQueueSize() +
796  inet6_service_chain_mgr_->GetDownServiceChainCount() +
797  evpn_service_chain_mgr_->PendingQueueSize() +
798  evpn_service_chain_mgr_->GetDownServiceChainCount() +
799  evpn6_service_chain_mgr_->PendingQueueSize() +
800  evpn6_service_chain_mgr_->GetDownServiceChainCount();
801 }
802 
804  return GetStaticRouteCount();
805 }
806 
808  return GetDownStaticRouteCount();
809 }
810 
812  for (BgpPeerList::const_iterator loc = peer_list_.begin();
813  loc != peer_list_.end(); ++loc) {
814  fn(loc->second);
815  }
816 }
817 
819  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
820  size_t i = admin_down_bmap_.find_first();
821  if (i == admin_down_bmap_.npos) {
822  i = admin_down_listeners_.size();
823  admin_down_listeners_.push_back(callback);
824  } else {
825  admin_down_bmap_.reset(i);
826  if (admin_down_bmap_.none()) {
827  admin_down_bmap_.clear();
828  }
829  admin_down_listeners_[i] = callback;
830  }
831  return i;
832 }
833 
835  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
836  admin_down_listeners_[listener] = NULL;
837  if ((size_t) listener == admin_down_listeners_.size() - 1) {
838  while (!admin_down_listeners_.empty() &&
839  admin_down_listeners_.back() == NULL) {
840  admin_down_listeners_.pop_back();
841  }
842  if (admin_down_bmap_.size() > admin_down_listeners_.size()) {
844  }
845  } else {
846  if ((size_t) listener >= admin_down_bmap_.size()) {
847  admin_down_bmap_.resize(listener + 1);
848  }
849  admin_down_bmap_.set(listener);
850  }
851 }
852 
854  tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
855  for (AdminDownListenersList::iterator iter = admin_down_listeners_.begin();
856  iter != admin_down_listeners_.end(); ++iter) {
857  if (*iter != NULL) {
858  AdminDownCb cb = *iter;
859  (cb)();
860  }
861  }
862 }
863 
865  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
866  size_t i = asn_bmap_.find_first();
867  if (i == asn_bmap_.npos) {
868  i = asn_listeners_.size();
869  asn_listeners_.push_back(callback);
870  } else {
871  asn_bmap_.reset(i);
872  if (asn_bmap_.none()) {
873  asn_bmap_.clear();
874  }
875  asn_listeners_[i] = callback;
876  }
877  return i;
878 }
879 
881  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
882  asn_listeners_[listener] = NULL;
883  if ((size_t) listener == asn_listeners_.size() - 1) {
884  while (!asn_listeners_.empty() && asn_listeners_.back() == NULL) {
885  asn_listeners_.pop_back();
886  }
887  if (asn_bmap_.size() > asn_listeners_.size()) {
888  asn_bmap_.resize(asn_listeners_.size());
889  }
890  } else {
891  if ((size_t) listener >= asn_bmap_.size()) {
892  asn_bmap_.resize(listener + 1);
893  }
894  asn_bmap_.set(listener);
895  }
896 }
897 
898 void BgpServer::NotifyASNUpdate(as_t old_asn, as_t old_local_asn) {
899  tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
900  for (ASNUpdateListenersList::iterator iter = asn_listeners_.begin();
901  iter != asn_listeners_.end(); ++iter) {
902  if (*iter != NULL) {
903  ASNUpdateCb cb = *iter;
904  (cb)(old_asn, old_local_asn);
905  }
906  }
907 }
908 
910  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
911  size_t i = dscp_bmap_.find_first();
912  if (i == dscp_bmap_.npos) {
913  i = dscp_listeners_.size();
914  dscp_listeners_.push_back(callback);
915  } else {
916  dscp_bmap_.reset(i);
917  if (dscp_bmap_.none()) {
918  dscp_bmap_.clear();
919  }
920  dscp_listeners_[i] = callback;
921  }
922  return i;
923 }
924 
926  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
927  dscp_listeners_[listener] = NULL;
928  if ((size_t) listener == dscp_listeners_.size() - 1) {
929  while (!dscp_listeners_.empty() && dscp_listeners_.back() == NULL) {
930  dscp_listeners_.pop_back();
931  }
932  if (dscp_bmap_.size() > dscp_listeners_.size()) {
933  dscp_bmap_.resize(dscp_listeners_.size());
934  }
935  } else {
936  if ((size_t) listener >= dscp_bmap_.size()) {
937  dscp_bmap_.resize(listener + 1);
938  }
939  dscp_bmap_.set(listener);
940  }
941 }
942 
943 void BgpServer::NotifyDSCPUpdate(int new_dscp_value) {
944  tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
945  for (DSCPUpdateListenersList::iterator iter = dscp_listeners_.begin();
946  iter != dscp_listeners_.end(); ++iter) {
947  if (*iter != NULL) {
948  DSCPUpdateCb cb = *iter;
949  (cb)(new_dscp_value);
950  }
951  }
952 }
953 
955  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
956  size_t i = id_bmap_.find_first();
957  if (i == id_bmap_.npos) {
958  i = id_listeners_.size();
959  id_listeners_.push_back(callback);
960  } else {
961  id_bmap_.reset(i);
962  if (id_bmap_.none()) {
963  id_bmap_.clear();
964  }
965  id_listeners_[i] = callback;
966  }
967  return i;
968 }
969 
971  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
972  id_listeners_[listener] = NULL;
973  if ((size_t) listener == id_listeners_.size() - 1) {
974  while (!id_listeners_.empty() && id_listeners_.back() == NULL) {
975  id_listeners_.pop_back();
976  }
977  if (id_bmap_.size() > id_listeners_.size()) {
978  id_bmap_.resize(id_listeners_.size());
979  }
980  } else {
981  if ((size_t) listener >= id_bmap_.size()) {
982  id_bmap_.resize(listener + 1);
983  }
984  id_bmap_.set(listener);
985  }
986 }
987 
989  tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
990  for (IdentifierUpdateListenersList::iterator iter = id_listeners_.begin();
991  iter != id_listeners_.end(); ++iter) {
992  if (*iter != NULL) {
993  IdentifierUpdateCb cb = *iter;
994  (cb)(old_identifier);
995  }
996  }
997 }
998 
1000  CHECK_CONCURRENCY("bgp::Config", "bgp::ConfigHelper");
1001  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
1002  srt_manager_list_.insert(srt_manager);
1003 }
1004 
1006  CHECK_CONCURRENCY("bgp::Config", "bgp::ConfigHelper");
1007  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
1008  srt_manager_list_.erase(srt_manager);
1009 }
1010 
1012  CHECK_CONCURRENCY("bgp::Config", "bgp::ConfigHelper");
1013  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
1014  for (StaticRouteMgrList::iterator it = srt_manager_list_.begin();
1015  it != srt_manager_list_.end(); ++it) {
1016  IStaticRouteMgr *srt_manager = *it;
1017  srt_manager->NotifyAllRoutes();
1018  }
1019 }
1020 
1022  CHECK_CONCURRENCY("bgp::ShowCommand");
1023  uint32_t count = 0;
1024  for (StaticRouteMgrList::iterator it = srt_manager_list_.begin();
1025  it != srt_manager_list_.end(); ++it) {
1026  IStaticRouteMgr *srt_manager = *it;
1027  count += srt_manager->GetRouteCount();
1028  }
1029  return count;
1030 }
1031 
1033  CHECK_CONCURRENCY("bgp::ShowCommand");
1034  uint32_t count = 0;
1035  for (StaticRouteMgrList::iterator it = srt_manager_list_.begin();
1036  it != srt_manager_list_.end(); ++it) {
1037  IStaticRouteMgr *srt_manager = *it;
1038  count += srt_manager->GetDownRouteCount();
1039  }
1040  return count;
1041 }
1042 
1043 void BgpServer::FillPeerStats(const BgpPeer *peer) const {
1044  PeerStatsInfo stats;
1045  PeerStats::FillPeerDebugStats(peer->peer_stats(), &stats);
1046 
1047  BgpPeerInfoData peer_info;
1048  peer_info.set_name(peer->ToUVEKey());
1049  peer_info.set_peer_stats_info(stats);
1050  assert(!peer_info.get_name().empty());
1051  BGP_UVE_SEND(BGPPeerInfo, peer_info);
1052 
1053  PeerStatsData peer_stats_data;
1054  peer_stats_data.set_name(peer->ToUVEKey());
1055  peer_stats_data.set_encoding("BGP");
1056  PeerStats::FillPeerUpdateStats(peer->peer_stats(), &peer_stats_data);
1057  assert(!peer_stats_data.get_name().empty());
1058  BGP_UVE_SEND2(PeerStatsUve, peer_stats_data, "ObjectBgpPeer");
1059 
1060  PeerFlapInfo flap_info;
1061  flap_info.set_flap_count(peer->flap_count());
1062  flap_info.set_flap_time(peer->last_flap());
1063 
1064  PeerFlapData peer_flap_data;
1065  peer_flap_data.set_name(peer->ToUVEKey());
1066  peer_flap_data.set_encoding("BGP");
1067  peer_flap_data.set_flap_info(flap_info);
1068  assert(!peer_flap_data.get_name().empty());
1069  BGP_UVE_SEND2(PeerFlap, peer_flap_data, "ObjectBgpPeer");
1070 }
1071 
1072 bool BgpServer::CollectStats(BgpRouterState *state, bool first) const {
1073  CHECK_CONCURRENCY("bgp::ShowCommand");
1074 
1075  VisitBgpPeers(boost::bind(&BgpServer::FillPeerStats, this, _1));
1076  bool change = false;
1077  uint32_t is_admin_down = admin_down();
1078  if (first || is_admin_down != state->get_admin_down()) {
1079  state->set_admin_down(is_admin_down);
1080  change = true;
1081  }
1082 
1083  string router_id = bgp_identifier_string();
1084  if (first || router_id != state->get_router_id()) {
1085  state->set_router_id(router_id);
1086  change = true;
1087  }
1088 
1089  uint32_t local_asn = local_autonomous_system();
1090  if (first || local_asn != state->get_local_asn()) {
1091  state->set_local_asn(local_asn);
1092  change = true;
1093  }
1094 
1095  uint32_t global_asn = autonomous_system();
1096  if (first || global_asn != state->get_global_asn()) {
1097  state->set_global_asn(global_asn);
1098  change = true;
1099  }
1100 
1101  uint32_t num_bgp = num_bgp_peer();
1102  if (first || num_bgp != state->get_num_bgp_peer()) {
1103  state->set_num_bgp_peer(num_bgp);
1104  change = true;
1105  }
1106 
1107  uint32_t num_up_bgp_peer = NumUpPeer();
1108  if (first || num_up_bgp_peer != state->get_num_up_bgp_peer()) {
1109  state->set_num_up_bgp_peer(num_up_bgp_peer);
1110  change = true;
1111  }
1112 
1113  uint32_t deleting_bgp_peer = num_deleting_bgp_peer();
1114  if (first || deleting_bgp_peer != state->get_num_deleting_bgp_peer()) {
1115  state->set_num_deleting_bgp_peer(deleting_bgp_peer);
1116  change = true;
1117  }
1118 
1119  uint32_t num_bgpaas = num_bgpaas_peer();
1120  if (first || num_bgpaas != state->get_num_bgpaas_peer()) {
1121  state->set_num_bgpaas_peer(num_bgpaas);
1122  change = true;
1123  }
1124 
1125  uint32_t num_up_bgpaas_peer = NumUpBgpaasPeer();
1126  if (first || num_up_bgpaas_peer != state->get_num_up_bgpaas_peer()) {
1127  state->set_num_up_bgpaas_peer(num_up_bgpaas_peer);
1128  change = true;
1129  }
1130 
1131  uint32_t deleting_bgpaas_peer = num_deleting_bgpaas_peer();
1132  if (first || deleting_bgpaas_peer !=
1133  state->get_num_deleting_bgpaas_peer()) {
1134  state->set_num_deleting_bgpaas_peer(deleting_bgpaas_peer);
1135  change = true;
1136  }
1137 
1138  uint32_t num_ri = num_routing_instance();
1139  if (first || num_ri != state->get_num_routing_instance()) {
1140  state->set_num_routing_instance(num_ri);
1141  change = true;
1142  }
1143 
1144  uint32_t num_deleted_ri = num_deleted_routing_instance();
1145  if (first || num_deleted_ri != state->get_num_deleted_routing_instance()) {
1146  state->set_num_deleted_routing_instance(num_deleted_ri);
1147  change = true;
1148  }
1149 
1150  uint32_t service_chains = num_service_chains();
1151  if (first || service_chains != state->get_num_service_chains()) {
1152  state->set_num_service_chains(service_chains);
1153  change = true;
1154  }
1155 
1156  uint32_t down_service_chains = num_down_service_chains();
1157  if (first || down_service_chains != state->get_num_down_service_chains()) {
1158  state->set_num_down_service_chains(down_service_chains);
1159  change = true;
1160  }
1161 
1162  uint32_t static_routes = num_static_routes();
1163  if (first || static_routes != state->get_num_static_routes()) {
1164  state->set_num_static_routes(static_routes);
1165  change = true;
1166  }
1167 
1168  uint32_t down_static_routes = num_down_static_routes();
1169  if (first || down_static_routes != state->get_num_down_static_routes()) {
1170  state->set_num_down_static_routes(down_static_routes);
1171  change = true;
1172  }
1173 
1174  uint32_t out_load = inst_mgr_->SendTableStatsUve();
1175  if (first || out_load != state->get_output_queue_depth()) {
1176  state->set_output_queue_depth(out_load);
1177  change = true;
1178  }
1179 
1180  vector<string> bgp_config_peer_list;
1181  BOOST_FOREACH(BgpConfigManager::NeighborMap::value_type value,
1182  config_mgr_->NeighborMapItems(BgpConfigManager::kMasterInstance)) {
1183  const BgpNeighborConfig *neighbor = value.second;
1184  string name(BgpConfigManager::kMasterInstance);
1185  name += ":";
1186  name += localname();
1187  name += ":";
1188  name += neighbor->name();
1189  bgp_config_peer_list.push_back(name);
1190  }
1191  sort(bgp_config_peer_list.begin(), bgp_config_peer_list.end());
1192  if (first || bgp_config_peer_list != state->get_bgp_config_peer_list()) {
1193  state->set_bgp_config_peer_list(bgp_config_peer_list);
1194  change = true;
1195  }
1196 
1197  vector<string> bgp_oper_peer_list;
1198  const RoutingInstance *rtinstance = inst_mgr_->GetDefaultRoutingInstance();
1199  const PeerManager *peer_manager = rtinstance->peer_manager();
1200  for (const BgpPeer *peer = peer_manager->NextPeer(BgpPeerKey());
1201  peer != NULL; peer = peer_manager->NextPeer(peer->peer_key())) {
1202  bgp_oper_peer_list.push_back(peer->ToUVEKey());
1203  }
1204  sort(bgp_oper_peer_list.begin(), bgp_oper_peer_list.end());
1205  if (first || bgp_oper_peer_list != state->get_bgp_oper_peer_list()) {
1206  state->set_bgp_oper_peer_list(bgp_oper_peer_list);
1207  change = true;
1208  }
1209 
1210  return change;
1211 }
1212 
1214  const RoutingInstanceMgr *ri_mgr = routing_instance_mgr();
1215  const RTargetTable *rtarget_table = dynamic_cast<const RTargetTable *>(
1217  return rtarget_table->last_updated();
1218 }
1219 
1221  Ip4Address old_identifier = bgp_identifier_;
1222  bgp_identifier_ = identifier;
1223  bgp_identifier_u32_ = identifier.to_ulong();
1224  NotifyIdentifierUpdate(old_identifier);
1225 }
void ProcessInstanceConfig(const BgpInstanceConfig *instance_config, BgpConfigManager::EventType event)
Definition: bgp_server.cc:381
int port() const
Definition: bgp_config.h:579
bool IsNextHopCheckEnabled() const
Definition: bgp_server.cc:697
ConfigUpdater(BgpServer *server)
Definition: bgp_server.cc:51
BgpGlobalSystemConfigObserver system
Definition: bgp_config.h:755
time_t last_updated() const
Definition: rtarget_table.h:47
LifetimeActor * deleter()
Definition: bgp_server.cc:571
boost::dynamic_bitset dscp_bmap_
Definition: bgp_server.h:341
boost::asio::ip::tcp::endpoint Endpoint
Definition: tcp_session.h:62
void ClearAllInternalPeers()
bool nh_check_enabled() const
Definition: bgp_config.h:646
uint64_t flap_count() const
Definition: bgp_peer.h:249
boost::scoped_ptr< RTargetGroupMgr > rtarget_group_mgr_
Definition: bgp_server.h:383
BgpTable * GetTable(Address::Family fmly)
void UnregisterAdminDownCallback(int listener)
Definition: bgp_server.cc:834
boost::dynamic_bitset id_bmap_
Definition: bgp_server.h:339
boost::scoped_ptr< BgpConfigManager > config_mgr_
Definition: bgp_server.h:402
bool gr_helper_disable_
Definition: bgp_server.h:343
uint32_t hold_time() const
Definition: bgp_config.h:582
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
BgpPeerList peer_list_
Definition: bgp_server.h:354
PeerManager * peer_manager()
boost::dynamic_bitset peer_bmap_
Definition: bgp_server.h:347
RoutingInstance * GetRoutingInstance(const std::string &name)
uint32_t NumUpPeer() const
Definition: bgp_server.h:252
tbb::spin_rw_mutex rw_mutex_
Definition: bgp_server.h:327
uint8_t control_dscp() const
Definition: bgp_config.h:710
BgpServer(EventManager *evm)
Definition: bgp_server.cc:485
AdminDownListenersList admin_down_listeners_
Definition: bgp_server.h:329
bool IsServerStartingUp() const
Definition: bgp_server.cc:729
const std::string & name() const
Definition: bgp_config.h:162
as_t local_autonomous_system_
Definition: bgp_server.h:333
void set_gr_time(uint16_t gr_time)
Definition: bgp_config.h:625
BgpInstanceObserver instance
Definition: bgp_config.h:752
uint32_t bgp_identifier_u32() const
Definition: bgp_server.h:209
void UnregisterASNUpdateCallback(int listener)
Definition: bgp_server.cc:880
uint32_t num_static_routes() const
Definition: bgp_server.cc:803
const std::string & instance_name() const
Definition: bgp_config.h:168
uint32_t autonomous_system() const
Definition: bgp_config.h:567
boost::function< void(as_t, as_t)> ASNUpdateCb
Definition: bgp_server.h:62
BgpPeer * TriggerPeerDeletion(const BgpNeighborConfig *config)
Definition: peer_manager.cc:85
bool gr_bgp_helper() const
Definition: bgp_config.h:632
void set_destroyed()
Definition: bgp_server.h:198
void ProcessGlobalSystemConfig(const BgpGlobalSystemConfig *new_config, BgpConfigManager::EventType event)
Definition: bgp_server.cc:77
tbb::atomic< uint32_t > deleting_bgpaas_count_
Definition: bgp_server.h:353
bool IsDBQueueEmpty() const
Definition: db.cc:91
uint32_t num_deleting_bgp_peer() const
Definition: bgp_server.h:223
boost::scoped_ptr< IServiceChainMgr > evpn6_service_chain_mgr_
Definition: bgp_server.h:397
void set_always_compare_med(bool always_compare_med)
Definition: bgp_config.h:653
uint32_t NumUpBgpaasPeer() const
Definition: bgp_server.h:262
static const char * kMasterInstance
Definition: bgp_config.h:770
void InsertStaticRouteMgr(IStaticRouteMgr *srt_manager)
Definition: bgp_server.cc:999
void VisitBgpPeers(BgpServer::VisitorFn) const
Definition: bgp_server.cc:811
ASNUpdateListenersList asn_listeners_
Definition: bgp_server.h:334
bool IsReadyForDeletion()
Definition: bgp_server.cc:432
void ProcessNeighborConfig(const BgpNeighborConfig *neighbor_config, BgpConfigManager::EventType event)
Definition: bgp_server.cc:339
BgpGlobalSystemConfig * global_config()
Definition: bgp_server.h:290
void RegisterObservers(const Observers &obs)
Definition: bgp_config.h:778
uint16_t rd_cluster_seed() const
Definition: bgp_config.h:662
virtual void DeleteRoutingInstance(const std::string &name)
uint32_t GetLongLivedGracefulRestartTime() const
Definition: bgp_server.cc:709
void NotifyASNUpdate(as_t old_asn, as_t old_local_asn)
Definition: bgp_server.cc:898
BgpGlobalQosConfig * global_qos()
Definition: bgp_server.h:294
virtual void DeleteRoutingPolicy(const std::string &name)
boost::asio::io_context * io_service()
Definition: event_manager.h:42
static void Terminate()
Definition: bgp_server.cc:559
tbb::atomic< uint32_t > num_up_bgpaas_peer_
Definition: bgp_server.h:352
RoutingInstanceMgr * routing_instance_mgr()
Definition: bgp_server.h:102
virtual uint32_t GetRouteCount() const =0
Ip4Address bgp_identifier_
Definition: bgp_server.h:336
#define BGP_UVE_SEND(type, object)
Definition: bgp_log.h:46
time_t GetRTargetTableLastUpdatedTimeStamp() const
Definition: bgp_server.cc:1213
uint32_t get_output_queue_depth() const
Definition: bgp_server.cc:765
void Shutdown()
Definition: bgp_server.cc:567
bool IsRouterTypeBGPaaS() const
Definition: bgp_peer.h:358
BgpPeer * FindExactPeer(const BgpPeer *peer) const
Definition: bgp_server.cc:674
RoutingInstance * GetDefaultRoutingInstance()
EventManager * event_manager()
Definition: tcp_server.h:76
bool IsFastConvergenceEnabled() const
Definition: bgp_server.cc:693
BgpPeer * FindPeer(const std::string &name)
uint32_t hold_time_
Definition: bgp_server.h:342
static time_t GetUpTimeSeconds()
Definition: misc_utils.cc:169
BgpProtocolObserver protocol
Definition: bgp_config.h:751
uint32_t local_autonomous_system() const
Definition: bgp_config.h:572
void ProcessRoutingPolicyConfig(const BgpRoutingPolicyConfig *policy_config, BgpConfigManager::EventType event)
Definition: bgp_server.cc:369
boost::scoped_ptr< BgpGlobalSystemConfig > global_config_
Definition: bgp_server.h:400
int RegisterDSCPUpdateCallback(DSCPUpdateCb cb)
Definition: bgp_server.cc:909
uint32_t as_t
Definition: bgp_common.h:21
bool IsGRHelperModeEnabled() const
Definition: bgp_server.cc:741
tbb::atomic< uint64_t > message_build_error_
Definition: bgp_server.h:405
virtual void Destroy()
Definition: bgp_server.cc:409
void NotifyAllStaticRoutes()
Definition: bgp_server.cc:1011
DeleteActor(BgpServer *server)
Definition: bgp_server.cc:398
int GetTaskId(const std::string &name)
Definition: task.cc:856
bool admin_down() const
Definition: bgp_config.h:546
void RetryDelete()
Definition: bgp_server.cc:426
#define BGP_LOG_STR(obj, level, flags, arg)
Definition: bgp_log.h:89
void FillPeerStats(const BgpPeer *peer) const
Definition: bgp_server.cc:1043
void ConfigUpdate(const BgpNeighborConfig *config)
Definition: bgp_peer.cc:992
uint32_t num_routing_instance() const
Definition: bgp_server.cc:755
as_t local_autonomous_system() const
Definition: bgp_server.h:207
tbb::atomic< uint32_t > deleting_count_
Definition: bgp_server.h:350
static void FillPeerUpdateStats(const IPeerDebugStats *peer_stats, PeerStatsData *peer_stats_data)
Definition: peer_stats.cc:54
const BgpPeer * NextPeer(const BgpPeerKey &key) const
uint32_t GetDownStaticRouteCount() const
Definition: bgp_server.cc:1032
RoutingPolicyMgr * routing_policy_mgr()
Definition: bgp_server.h:106
boost::function< void(uint8_t)> DSCPUpdateCb
Definition: bgp_server.h:61
const std::string & name() const
Definition: bgp_config.h:405
bool always_compare_med() const
Definition: bgp_config.h:652
std::string bgp_identifier_string() const
Definition: bgp_server.h:211
uint32_t GetEndOfRibReceiveTime() const
Definition: bgp_server.cc:721
#define XMPP_HOLD_TIME_DEFAULT
Definition: bgp_common.h:26
uint16_t gr_time() const
Definition: bgp_config.h:624
int RegisterIdentifierUpdateCallback(IdentifierUpdateCb callback)
Definition: bgp_server.cc:954
boost::scoped_ptr< IServiceChainMgr > evpn_service_chain_mgr_
Definition: bgp_server.h:396
bool admin_down() const
Definition: bgp_server.h:202
IdentifierUpdateListenersList id_listeners_
Definition: bgp_server.h:338
#define BGP_LOG_FLAG_SYSLOG
Definition: bgp_log.h:42
tbb::atomic< uint32_t > num_up_peer_
Definition: bgp_server.h:349
bool unit_test()
Definition: bgp_log.cc:53
bool fc_enabled() const
Definition: bgp_config.h:640
uint32_t identifier() const
Definition: bgp_config.h:552
void BgpServerConfigUpdate(string instance_name, const BgpProtocolConfig *config)
Definition: bgp_server.cc:204
const std::string & peer_name() const
Definition: bgp_peer.h:168
static TaskScheduler * GetInstance()
Definition: task.cc:547
boost::function< void(Ip4Address)> IdentifierUpdateCb
Definition: bgp_server.h:63
BgpConfigManager * config_manager()
Definition: bgp_server.h:100
boost::dynamic_bitset admin_down_bmap_
Definition: bgp_server.h:330
virtual IPeerDebugStats * peer_stats()
Definition: bgp_peer.cc:1298
BgpSessionManager * session_mgr_
Definition: bgp_server.h:379
void ProcessProtocolConfig(const BgpProtocolConfig *protocol_config, BgpConfigManager::EventType event)
Definition: bgp_server.cc:185
uint32_t bgp_identifier_u32_
Definition: bgp_server.h:337
void NotifyDSCPUpdate(int new_dscp_value)
Definition: bgp_server.cc:943
bool all_tags_are_global() const
Definition: bgp_config.h:676
as_t autonomous_system_
Definition: bgp_server.h:332
BgpGlobalQosConfigObserver qos
Definition: bgp_config.h:756
virtual bool Initialize(unsigned short port)
StaticRouteMgrList srt_manager_list_
Definition: bgp_server.h:344
int RegisterASNUpdateCallback(ASNUpdateCb callback)
Definition: bgp_server.cc:864
boost::scoped_ptr< DeleteActor > deleter_
Definition: bgp_server.h:358
#define CHECK_CONCURRENCY(...)
virtual void NotifyAllRoutes()=0
void set_analytics_dscp(uint8_t value)
Definition: bgp_config.h:713
void RemovePeer(TcpSession::Endpoint remote, BgpPeer *peer)
Definition: bgp_server.cc:652
int RegisterPeer(BgpPeer *peer)
Definition: bgp_server.cc:585
virtual void Shutdown()
Definition: bgp_server.cc:405
bool CollectStats(BgpRouterState *state, bool first) const
Definition: bgp_server.cc:1072
static void Initialize()
BgpNeighborObserver neighbor
Definition: bgp_config.h:753
uint16_t GetXmppHoldTime() const
Definition: bgp_server.cc:715
uint32_t num_deleting_bgpaas_peer() const
Definition: bgp_server.h:231
BgpSessionManager * session_manager()
Definition: bgp_server.h:97
boost::scoped_ptr< IServiceChainMgr > inet6_service_chain_mgr_
Definition: bgp_server.h:395
uint16_t end_of_rib_timeout() const
Definition: bgp_config.h:630
static void DeleteServer(TcpServer *server)
Definition: tcp_server.cc:656
void set_enable_4byte_as(bool as_4byte)
Definition: bgp_config.h:639
boost::scoped_ptr< BgpMembershipManager > membership_mgr_
Definition: bgp_server.h:384
tbb::atomic< uint32_t > bgp_count_
Definition: bgp_server.h:348
#define BGP_LOG_WARNING_STR(obj, flags, arg)
Definition: bgp_log.h:107
void UpdateBgpIdentifier(const Ip4Address &identifier)
Definition: bgp_server.cc:1220
uint32_t num_service_chains() const
Definition: bgp_server.cc:781
uint32_t num_deleted_routing_instance() const
Definition: bgp_server.cc:760
void UpdateRoutingPolicy(const BgpRoutingPolicyConfig *config)
LifetimeManager * lifetime_manager()
Definition: bgp_server.h:99
uint32_t num_down_service_chains() const
Definition: bgp_server.cc:792
tbb::atomic< uint32_t > bgpaas_count_
Definition: bgp_server.h:351
void LocateRoutingInstance(const BgpInstanceConfig *config)
virtual const std::string & ToUVEKey() const
Definition: bgp_peer.h:101
boost::function< void()> AdminDownCb
Definition: bgp_server.h:60
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
void InsertPeer(TcpSession::Endpoint remote, BgpPeer *peer)
Definition: bgp_server.cc:646
uint16_t bgpaas_port_start() const
Definition: bgp_config.h:668
std::map< std::string, BgpTable * > RouteTableList
size_t GetPendingRiboutsCount(size_t *markers) const
Definition: bgp_table.cc:1088
bool HasSelfConfiguration() const
Definition: bgp_server.cc:575
void UnregisterDSCPUpdateCallback(int listener)
Definition: bgp_server.cc:925
void NotifyIdentifierUpdate(Ip4Address old_identifier)
Definition: bgp_server.cc:988
void set_llgr_time(uint64_t llgr_time)
Definition: bgp_config.h:627
uint8_t analytics_dscp() const
Definition: bgp_config.h:712
static void FillPeerDebugStats(const IPeerDebugStats *peer_stats, PeerStatsInfo *stats)
Definition: peer_stats.cc:64
boost::asio::io_context * ioservice()
Definition: bgp_server.cc:689
#define BGP_UVE_SEND2(type, object, arg)
Definition: bgp_log.h:52
virtual RoutingPolicy * CreateRoutingPolicy(const BgpRoutingPolicyConfig *config)
bool admin_down_
Definition: bgp_server.h:328
uint32_t GetEndOfRibSendTime() const
Definition: bgp_server.cc:725
int RegisterAdminDownCallback(AdminDownCb callback)
Definition: bgp_server.cc:818
uint32_t num_down_static_routes() const
Definition: bgp_server.cc:807
uint8_t xmpp_hold_time() const
Definition: bgp_config.h:656
void set_fc_enabled(bool enable)
Definition: bgp_config.h:643
uint16_t bgpaas_port_end() const
Definition: bgp_config.h:672
void set_rd_cluster_seed(uint16_t seed)
Definition: bgp_config.h:665
void set_gr_bgp_helper(bool helper)
Definition: bgp_config.h:633
void UnregisterPeer(BgpPeer *peer)
Definition: bgp_server.cc:609
virtual ~BgpServer()
Definition: bgp_server.cc:549
void ProcessGlobalQosConfig(const BgpGlobalQosConfig *qos, BgpConfigManager::EventType event)
Definition: bgp_server.cc:68
BgpRoutingPolicyObserver policy
Definition: bgp_config.h:754
boost::scoped_ptr< IServiceChainMgr > inet_service_chain_mgr_
Definition: bgp_server.h:394
void set_bgpaas_port_start(uint16_t bgpaas_port_start)
Definition: bgp_config.h:669
static void Initialize()
Definition: bgp_server.cc:555
virtual uint32_t GetDownRouteCount() const =0
uint32_t GetStaticRouteCount() const
Definition: bgp_server.cc:1021
void set_enable_4byte_as(bool flag)
Definition: bgp_server.cc:737
void set_gr_enable(bool enable)
Definition: bgp_config.h:637
bool enable_4byte_as() const
Definition: bgp_server.cc:733
EndpointPeerList endpoint_peer_list_
Definition: bgp_server.h:355
void set_all_tags_are_global(bool all_tags_are_global)
Definition: bgp_config.h:677
BgpPeer * FindNextPeer(const std::string &name=std::string())
Definition: bgp_server.cc:641
bool enable_4byte_as() const
Definition: bgp_config.h:638
uint32_t num_bgp_peer() const
Definition: bgp_server.h:222
virtual std::string ToString() const
Definition: bgp_server.cc:563
static void Terminate()
virtual bool MayDelete() const
Definition: bgp_server.cc:401
void ClearAllPeers()
void set_xmpp_hold_time(uint8_t hold_time)
Definition: bgp_config.h:659
uint32_t num_bgpaas_peer() const
Definition: bgp_server.h:230
uint32_t cluster_id() const
Definition: bgp_server.h:203
uint16_t GetGracefulRestartTime() const
Definition: bgp_server.cc:703
void ClearBgpaaSPeers()
Definition: bgp_server.cc:663
virtual BgpPeer * PeerLocate(BgpServer *server, const BgpNeighborConfig *config)
Definition: peer_manager.cc:28
uint64_t last_flap() const
Definition: bgp_peer.h:250
bool IsTaskGroupEmpty(int task_id) const
Check if there are any Tasks in the given TaskGroup. Assumes that all task ids are mutually exclusive...
Definition: task.cc:574
bool deleted() const
bool IsDeleted() const
Definition: bgp_server.cc:422
const std::string & instance_name() const
Definition: bgp_config.h:540
const std::string & name() const
Definition: bgp_config.h:432
#define BGP_LOG_NOTICE_STR(obj, flags, arg)
Definition: bgp_log.h:116
uint32_t llgr_time() const
Definition: bgp_config.h:626
as_t autonomous_system() const
Definition: bgp_server.h:205
int GetIndex() const
Definition: bgp_peer.h:205
PeerManager * LocatePeerManager()
TcpSession::Endpoint endpoint() const
Definition: bgp_peer.h:171
DSCPUpdateListenersList dscp_listeners_
Definition: bgp_server.h:340
void set_end_of_rib_timeout(uint16_t time)
Definition: bgp_config.h:631
void UnregisterIdentifierUpdateCallback(int listener)
Definition: bgp_server.cc:970
bool gr_enable() const
Definition: bgp_config.h:636
boost::dynamic_bitset asn_bmap_
Definition: bgp_server.h:335
void set_cluster_id(uint32_t id)
Definition: bgp_server.h:204
RoutingInstanceList::iterator RoutingInstanceIterator
boost::function< void(BgpPeer *)> VisitorFn
Definition: bgp_server.h:64
boost::scoped_ptr< RoutingInstanceMgr > inst_mgr_
Definition: bgp_server.h:381
void set_bgpaas_port_end(uint16_t bgpaas_port_end)
Definition: bgp_config.h:673
static EventManager evm
void NotifyAdminDown()
Definition: bgp_server.cc:853
uint32_t cluster_id() const
Definition: bgp_config.h:549
void RemoveStaticRouteMgr(IStaticRouteMgr *srt_manager)
Definition: bgp_server.cc:1005
virtual void Terminate()=0
void set_nh_check_enabled(bool enable)
Definition: bgp_config.h:649
const std::string & localname() const
Definition: bgp_server.cc:685
void set_control_dscp(uint8_t value)
Definition: bgp_config.h:711