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