OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bgp_xmpp_channel.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BGP_BGP_XMPP_CHANNEL_H_
6 #define SRC_BGP_BGP_XMPP_CHANNEL_H_
7 
8 #include <boost/function.hpp>
9 #include <boost/system/error_code.hpp>
10 #include <boost/scoped_ptr.hpp>
11 #include <tbb/mutex.h>
12 
13 #include <map>
14 #include <set>
15 #include <string>
16 #include <utility>
17 
18 #include "base/queue_task.h"
19 #include "bgp/bgp_rib_policy.h"
21 #include "io/tcp_session.h"
22 #include "net/rd.h"
23 #include "schema/xmpp_mvpn_types.h"
24 #include "tbb/atomic.h"
25 #include "xmpp/xmpp_channel.h"
26 
27 namespace pugi {
28 class xml_node;
29 }
30 
32 class BgpRouterState;
33 class BgpServer;
35 struct DBRequest;
36 class IPeer;
37 class PeerCloseManager;
38 class XmppServer;
39 class BgpXmppChannelMock;
41 class BgpXmppChannelManagerMock;
42 class BgpXmppPeerClose;
43 class Timer;
44 class XmppConfigUpdater;
45 class XmppPeerInfoData;
46 class XmppSession;
47 
49 public:
50  static const int kEndOfRibSendRetryTime = 1; // Seconds
51  enum StatsIndex {
52  RX,
53  TX,
54  };
55  struct Stats {
56  Stats() {
57  rt_updates = 0;
58  reach = 0;
59  unreach = 0;
60  end_of_rib = 0;
61  }
62  tbb::atomic<uint64_t> rt_updates;
63  tbb::atomic<uint64_t> reach;
64  tbb::atomic<uint64_t> unreach;
65  tbb::atomic<uint64_t> end_of_rib;
66  };
67  struct ChannelStats {
71  table_subscribe = 0;
75  }
76  tbb::atomic<uint64_t> instance_subscribe;
77  tbb::atomic<uint64_t> instance_unsubscribe;
78  tbb::atomic<uint64_t> table_subscribe;
79  tbb::atomic<uint64_t> table_subscribe_complete;
80  tbb::atomic<uint64_t> table_unsubscribe;
81  tbb::atomic<uint64_t> table_unsubscribe_complete;
82  };
83 
84  struct ErrorStats {
90  }
95  uint64_t get_inet6_rx_bad_xml_token_count() const;
96  uint64_t get_inet6_rx_bad_prefix_count() const;
97  uint64_t get_inet6_rx_bad_nexthop_count() const;
98  uint64_t get_inet6_rx_bad_afi_safi_count() const;
99 
100  tbb::atomic<uint64_t> inet6_rx_bad_xml_token_count;
101  tbb::atomic<uint64_t> inet6_rx_bad_prefix_count;
102  tbb::atomic<uint64_t> inet6_rx_bad_nexthop_count;
103  tbb::atomic<uint64_t> inet6_rx_bad_afi_safi_count;
104  };
105 
108  virtual ~BgpXmppChannel();
109 
110  void Close();
111  IPeer *Peer();
112  const IPeer *Peer() const;
113  virtual TcpSession::Endpoint endpoint() const;
114 
115  const std::string &ToString() const;
116  const std::string &ToUVEKey() const;
117  std::string StateName() const;
120  std::string transport_address_string() const;
121 
122  void set_peer_closed(bool flag);
123  bool peer_deleted() const;
124  uint64_t peer_closed_at() const;
126  size_t GetMembershipRequestQueueSize() const;
127 
128  const XmppSession *GetSession() const;
129  const Stats &rx_stats() const { return stats_[RX]; }
130  const Stats &tx_stats() const { return stats_[TX]; }
132  const ErrorStats &error_stats() const { return error_stats_; }
134  bool deleted() { return deleted_; }
135  void RoutingInstanceCallback(std::string vrf_name, int op);
136  void ASNUpdateCallback(as_t old_asn, as_t old_local_asn);
137  void FillInstanceMembershipInfo(BgpNeighborResp *resp) const;
138  void FillTableMembershipInfo(BgpNeighborResp *resp) const;
139  void FillCloseInfo(BgpNeighborResp *resp) const;
143  void XMPPPeerInfoSend(const XmppPeerInfoData &peer_info) const;
144  const XmppChannel *channel() const { return channel_; }
145  XmppChannel *channel() { return channel_; }
147  void ResetEndOfRibSendState();
149  bool MembershipResponseHandler(std::string table_name);
150  Timer *eor_send_timer() const { return eor_send_timer_; }
151  bool eor_sent() const { return eor_sent_; }
152  size_t table_membership_requests() const;
153  void ClearEndOfRibState();
155 
156  uint64_t get_rx_route_reach() const { return stats_[RX].reach; }
157  uint64_t get_rx_route_unreach() const { return stats_[RX].unreach; }
158  uint64_t get_rx_update() const { return stats_[RX].rt_updates; }
159 
160  uint64_t get_tx_route_reach() const { return stats_[TX].reach; }
161  uint64_t get_tx_route_unreach() const { return stats_[TX].unreach; }
162  uint64_t get_tx_update() const { return stats_[TX].rt_updates; }
163  bool SkipUpdateSend();
164  bool delete_in_progress() const { return delete_in_progress_; }
165  void set_delete_in_progress(bool flag) { delete_in_progress_ = flag; }
166 
168  return rtarget_manager_.get();
169  }
170  bool IsSubscriptionGrStale(RoutingInstance *instance) const;
171  bool IsSubscriptionLlgrStale(RoutingInstance *instance) const;
172  bool IsSubscriptionEmpty() const;
174  RoutingInstance *instance) const;
177  const BgpXmppChannelManager *manager() const { return manager_; }
179  XmppChannel *xmpp_channel() const { return channel_; }
180  void ReceiveEndOfRIB(Address::Family family);
182  int GetPrimaryInstanceID(const std::string &s,
183  bool expect_prefix_len) const;
184 
185 protected:
188  bool no_ribout = false)
190  };
191 
192  int instance_id;
193  bool no_ribout;
194  };
195 
196 
198 
199 private:
200  friend class BgpXmppChannelMock;
201  friend class BgpXmppChannelManager;
202  friend class BgpXmppParseTest;
203  friend class BgpXmppUnitTest;
204  class XmppPeer;
205  class PeerClose;
206  class PeerStats;
207 
208  //
209  // State the instance id received in Membership subscription request
210  // Also remember we received unregister request
211  //
212  enum RequestType {
216  };
219  bool no_ribout = false)
220  : current_req(current),
221  instance_id(id),
222  pending_req(current),
224  }
228  bool no_ribout;
229  };
230 
231  // Map of routing instances to which this BgpXmppChannel is subscribed.
233  enum State {
234  NONE = 0,
235  GR_STALE = 1 << 0,
236  LLGR_STALE = 1 << 1
237  };
238 
241  int index)
242  : targets(targets), index(index), state(NONE) { }
243 
244  bool IsGrStale() const { return((state & GR_STALE) != 0); }
245  void SetGrStale() { state |= GR_STALE; }
246 
248  bool IsLlgrStale() const { return((state & LLGR_STALE) != 0); }
249 
250  void ClearStale() { state &= ~(GR_STALE | LLGR_STALE); }
251 
253  int index;
254  uint32_t state;
255  };
256 
257  typedef std::map<RoutingInstance *, SubscriptionState>
259 
260  // Map of table name to subscription request state.
261  typedef std::map<std::string,
263 
264  // Map of routing-instance name to subscription request state. This map
265  // maintains list of requests that are received for subscription before
266  // routing instance is created or recreated (in case the instance is in
267  // the process of being deleted).
268  typedef std::map<std::string,
270 
271  // The code assumes that multimap preserves insertion order for duplicate
272  // values of same key.
273  typedef std::pair<const std::string, const std::string> VrfTableName;
274  typedef std::multimap<VrfTableName, DBRequest *> DeferQ;
275 
276  virtual void ReceiveUpdate(const XmppStanza::XmppMessage *msg);
277 
278  virtual bool GetMembershipInfo(BgpTable *table,
279  int *instance_id, uint64_t *subscribed_at, RequestType *req_type);
280  bool VerifyMembership(const std::string &vrf_name, Address::Family family,
281  BgpTable **table, int *instance_id, uint64_t *subscribed_at,
282  bool *subscribe_pending, bool add_change);
283 
284  void AddTableMembershipState(const std::string &table_name,
285  TableMembershipRequestState tmr_state);
286  bool DeleteTableMembershipState(const std::string &table_name);
288  const std::string &table_name);
290  const std::string &table_name) const;
291 
292  void AddInstanceMembershipState(const std::string &instance,
294  bool DeleteInstanceMembershipState(const std::string &instance);
296  const std::string &instance) const;
297 
298  bool ProcessItem(std::string vrf_name, const pugi::xml_node &node,
299  bool add_change, int primary_instance_id = 0);
300  bool ProcessInet6Item(std::string vrf_name, const pugi::xml_node &node,
301  bool add_change);
302  bool ProcessMcastItem(std::string vrf_name,
303  const pugi::xml_node &item, bool add_change);
304  bool ProcessMvpnItem(std::string vrf_name,
305  const pugi::xml_node &item, bool add_change);
306  void CreateType7MvpnRouteRequest(IpAddress grp_address,
307  IpAddress src_address, bool add_change, uint64_t subscription_gen_id,
308  DBRequest &req);
309  void CreateType5MvpnRouteRequest(IpAddress grp_address,
310  IpAddress src_address, bool add_change, uint64_t subscription_gen_id,
311  int instance_id, DBRequest &req, const autogen::MvpnNextHopType &nh);
312  bool ProcessEnetItem(std::string vrf_name,
313  const pugi::xml_node &item, bool add_change);
314  void ProcessSubscriptionRequest(std::string rt_instance,
315  const XmppStanza::XmppMessageIq *iq,
316  bool add_change);
317  void AddSubscriptionState(RoutingInstance *rt_instance, int index);
318  void DeleteSubscriptionState(RoutingInstance *rt_instance);
321  RoutingInstance *rt_instance) const;
322 
323  void RegisterTable(int line, BgpTable *table,
324  const TableMembershipRequestState *tmr_state);
325  void UnregisterTable(int line, BgpTable *table);
326  void MembershipRequestCallback(BgpTable *table);
327  void DequeueRequest(const std::string &table_name, DBRequest *request);
328  bool XmppDecodeAddress(int af, const std::string &address,
329  IpAddress *addrp, bool zero_ok = false);
330  bool ResumeClose();
331  void FlushDeferQ(std::string vrf_name);
332  void FlushDeferQ(std::string vrf_name, std::string table_name);
334  const InstanceMembershipRequestState &imr_state);
335  void ClearStaledSubscription(RoutingInstance *rt_instance,
336  SubscriptionState *sub_state);
337  bool ProcessMembershipResponse(std::string table_name,
338  TableMembershipRequestState *tmr_state);
340  void EndOfRibTimerErrorHandler(std::string error_name,
341  std::string error_message);
342  void SendEndOfRIB();
343  virtual time_t GetEndOfRibSendTime() const;
344 
346  boost::scoped_ptr<BgpXmppRTargetManager> rtarget_manager_;
348  boost::scoped_ptr<XmppPeer> peer_;
349  boost::scoped_ptr<BgpXmppPeerClose> peer_close_;
350  boost::scoped_ptr<PeerCloseManager> close_manager_;
351  boost::scoped_ptr<PeerStats> peer_stats_;
353 
354  // DB Requests pending membership request response.
356 
361  bool deleted_;
365  bool eor_sent_;
372 
373  // statistics
377 
378  // Label block manager for multicast labels.
380 
382 };
383 
385 public:
386  typedef std::map<const XmppChannel *, BgpXmppChannel *> XmppChannelMap;
387  typedef std::map<std::string, BgpXmppChannel *> XmppChannelNameMap;
388  typedef XmppChannelNameMap::const_iterator const_name_iterator;
389  typedef boost::function<void(BgpXmppChannel *)> VisitorFn;
390 
392  virtual ~BgpXmppChannelManager();
393 
395  return channel_name_map_.begin();
396  }
398  return channel_name_map_.end();
399  }
400  const_name_iterator name_clower_bound(const std::string &name) const {
401  return channel_name_map_.lower_bound(name);
402  }
403 
406  BgpXmppChannel *FindChannel(const XmppChannel *channel);
407  BgpXmppChannel *FindChannel(std::string client);
408  void RemoveChannel(XmppChannel *channel);
409  virtual void XmppHandleChannelEvent(XmppChannel *channel,
410  xmps::PeerState state);
411 
412  const XmppChannelMap &channel_map() const { return channel_map_; }
413  void Enqueue(BgpXmppChannel *bx_channel) {
414  queue_.Enqueue(bx_channel);
415  }
416  bool IsReadyForDeletion();
417  void SetQueueDisable(bool disabled);
418  size_t GetQueueSize() const;
419  void AdminDownCallback();
420  void ASNUpdateCallback(as_t old_asn, as_t old_local_asn);
421  void IdentifierUpdateCallback(Ip4Address old_identifier);
422  void RoutingInstanceCallback(std::string vrf_name, int op);
423  void DSCPUpdateCallback(uint8_t value);
424 
425  uint32_t count() const {
426  tbb::mutex::scoped_lock lock(mutex_);
427  return channel_map_.size();
428  }
429  uint32_t NumUpPeer() const {
430  tbb::mutex::scoped_lock lock(mutex_);
431  return channel_map_.size();
432  }
433 
434  int32_t deleting_count() const { return deleting_count_; }
437  assert(deleting_count_);
438  deleting_count_--;
439  }
440 
443  const XmppServer *xmpp_server() const { return xmpp_server_; }
445  return subscription_gen_id_.fetch_and_increment();
446  }
447  bool CollectStats(BgpRouterState *state, bool first) const;
448 
449 protected:
450  virtual BgpXmppChannel *CreateChannel(XmppChannel *channel);
451  virtual bool DeleteChannel(BgpXmppChannel *channel);
452 
453 private:
455  friend class BgpXmppUnitTest;
456 
457  void FillPeerInfo(const BgpXmppChannel *channel) const;
458 
462  mutable tbb::mutex mutex_;
465  int id_;
470  tbb::atomic<int32_t> deleting_count_;
471  // Generation number for subscription tracking
472  tbb::atomic<uint64_t> subscription_gen_id_;
473 
475 };
476 
477 #endif // SRC_BGP_BGP_XMPP_CHANNEL_H_
xmps::PeerId peer_id_
void Enqueue(BgpXmppChannel *bx_channel)
bool VerifyMembership(const std::string &vrf_name, Address::Family family, BgpTable **table, int *instance_id, uint64_t *subscribed_at, bool *subscribe_pending, bool add_change)
uint64_t get_tx_update() const
const Stats & rx_stats() const
std::map< std::string, InstanceMembershipRequestState > InstanceMembershipRequestMap
boost::asio::ip::tcp::endpoint Endpoint
Definition: tcp_session.h:62
std::map< const XmppChannel *, BgpXmppChannel * > XmppChannelMap
const XmppChannelMap & channel_map() const
RibExportPolicy bgp_policy_
std::string StateName() const
tbb::atomic< uint64_t > instance_unsubscribe
time_t eor_send_timer_start_time_
TableMembershipRequestState(RequestType current, int id, bool no_ribout=false)
BgpServer * bgp_server_
uint64_t get_subscription_gen_id()
uint64_t peer_closed_at() const
virtual bool DeleteChannel(BgpXmppChannel *channel)
void ASNUpdateCallback(as_t old_asn, as_t old_local_asn)
void StartEndOfRibReceiveTimer()
uint32_t NumUpPeer() const
friend class BgpXmppUnitTest
BgpXmppChannelManager * manager()
bool EndOfRibReceiveTimerExpired()
LabelBlockManagerPtr lb_mgr_
boost::intrusive_ptr< LabelBlockManager > LabelBlockManagerPtr
Definition: label_block.h:15
boost::scoped_ptr< PeerCloseManager > close_manager_
BgpXmppChannelManager(XmppServer *, BgpServer *)
Family
Definition: address.h:24
boost::asio::ip::address IpAddress
Definition: address.h:13
std::multimap< VrfTableName, DBRequest * > DeferQ
void FillCloseInfo(BgpNeighborResp *resp) const
friend class BgpXmppChannelMock
void SetQueueDisable(bool disabled)
void set_peer_closed(bool flag)
void RoutingInstanceCallback(std::string vrf_name, int op)
uint64_t get_inet6_rx_bad_prefix_count() const
void FillInstanceMembershipInfo(BgpNeighborResp *resp) const
void XMPPPeerInfoSend(const XmppPeerInfoData &peer_info) const
tbb::atomic< uint64_t > reach
bool IsSubscriptionEmpty() const
XmppServer * xmpp_server()
TableMembershipRequestState * GetTableMembershipState(const std::string &table_name)
const RoutingInstance::RouteTargetList & GetSubscribedRTargets(RoutingInstance *instance) const
bool ProcessItem(std::string vrf_name, const pugi::xml_node &node, bool add_change, int primary_instance_id=0)
virtual bool GetMembershipInfo(BgpTable *table, int *instance_id, uint64_t *subscribed_at, RequestType *req_type)
std::pair< const std::string, const std::string > VrfTableName
tbb::atomic< uint64_t > inet6_rx_bad_xml_token_count
bool EndOfRibSendTimerExpired()
void DeleteSubscriptionState(RoutingInstance *rt_instance)
uint64_t get_rx_update() const
uint32_t as_t
Definition: bgp_common.h:21
Definition: ipeer.h:186
XmppChannel * channel()
InstanceMembershipRequestState(int instance_id=-1, bool no_ribout=false)
size_t GetMembershipRequestQueueSize() const
BgpXmppChannel * FindChannel(const XmppChannel *channel)
void ProcessDeferredSubscribeRequest(RoutingInstance *rt_instance, const InstanceMembershipRequestState &imr_state)
void RemoveChannel(XmppChannel *channel)
uint64_t get_rx_route_reach() const
uint64_t get_inet6_rx_bad_xml_token_count() const
friend class BgpXmppChannelManagerMock
bool eor_sent() const
const std::string & ToUVEKey() const
size_t GetQueueSize() const
const_name_iterator name_cbegin() const
virtual BgpXmppChannel * CreateChannel(XmppChannel *channel)
size_t table_membership_requests() const
tbb::atomic< uint64_t > table_subscribe_complete
void UnregisterTable(int line, BgpTable *table)
void ASNUpdateCallback(as_t old_asn, as_t old_local_asn)
boost::scoped_ptr< BgpXmppPeerClose > peer_close_
friend class BgpXmppUnitTest
void AddSubscriptionState(RoutingInstance *rt_instance, int index)
virtual time_t GetEndOfRibSendTime() const
ErrorStats & error_stats()
InstanceMembershipRequestMap instance_membership_request_map_
SubscriptionState(const RoutingInstance::RouteTargetList &targets, int index)
tbb::atomic< int32_t > deleting_count_
std::map< std::string, BgpXmppChannel * > XmppChannelNameMap
bool MembershipResponseHandler(std::string table_name)
int GetPrimaryInstanceID(const std::string &s, bool expect_prefix_len) const
const_name_iterator name_cend() const
XmppChannelNameMap::const_iterator const_name_iterator
uint64_t get_rx_route_unreach() const
bool ProcessMvpnItem(std::string vrf_name, const pugi::xml_node &item, bool add_change)
XmppChannel * xmpp_channel() const
bool delete_in_progress() const
WorkQueue< std::string > membership_response_worker_
ChannelStats channel_stats_
void AddTableMembershipState(const std::string &table_name, TableMembershipRequestState tmr_state)
uint32_t count() const
void set_delete_in_progress(bool flag)
boost::scoped_ptr< XmppPeer > peer_
bool ProcessEnetItem(std::string vrf_name, const pugi::xml_node &item, bool add_change)
tbb::atomic< uint64_t > end_of_rib
void FlushDeferQ(std::string vrf_name)
uint64_t get_inet6_rx_bad_afi_safi_count() const
bool DeleteTableMembershipState(const std::string &table_name)
SubscriptionState * GetSubscriptionState(RoutingInstance *rt_instance)
TcpSession::Endpoint remote_endpoint() const
ErrorStats error_stats_
friend class BgpXmppParseTest
std::map< std::string, TableMembershipRequestState > TableMembershipRequestMap
virtual const InstanceMembershipRequestState * GetInstanceMembershipState(const std::string &instance) const
const BgpXmppChannelManager * manager() const
void CreateType7MvpnRouteRequest(IpAddress grp_address, IpAddress src_address, bool add_change, uint64_t subscription_gen_id, DBRequest &req)
XmppChannel * channel_
tbb::atomic< uint64_t > subscription_gen_id_
const_name_iterator name_clower_bound(const std::string &name) const
void ProcessPendingSubscriptions()
bool DeleteInstanceMembershipState(const std::string &instance)
BgpServer * bgp_server()
boost::scoped_ptr< BgpXmppRTargetManager > rtarget_manager_
void DSCPUpdateCallback(uint8_t value)
DISALLOW_COPY_AND_ASSIGN(BgpXmppChannel)
const std::string & ToString() const
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
void ReceiveEndOfRIB(Address::Family family)
tbb::atomic< uint64_t > inet6_rx_bad_prefix_count
virtual void XmppHandleChannelEvent(XmppChannel *channel, xmps::PeerState state)
TcpSession::Endpoint local_endpoint() const
void ProcessSubscriptionRequest(std::string rt_instance, const XmppStanza::XmppMessageIq *iq, bool add_change)
bool peer_deleted() const
uint64_t get_tx_route_unreach() const
static const int kEndOfRibSendRetryTime
BgpXmppChannelManager * manager_
tbb::atomic< uint64_t > inet6_rx_bad_afi_safi_count
const Stats & tx_stats() const
void set_deleted(bool deleted)
bool table_membership_request_map_empty() const
bool ProcessMembershipResponse(std::string table_name, TableMembershipRequestState *tmr_state)
bool CollectStats(BgpRouterState *state, bool first) const
void EndOfRibTimerErrorHandler(std::string error_name, std::string error_message)
XmppChannelMap channel_map_
time_t eor_receive_timer_start_time_
void CreateType5MvpnRouteRequest(IpAddress grp_address, IpAddress src_address, bool add_change, uint64_t subscription_gen_id, int instance_id, DBRequest &req, const autogen::MvpnNextHopType &nh)
void AddInstanceMembershipState(const std::string &instance, InstanceMembershipRequestState imr_state)
bool IsSubscriptionLlgrStale(RoutingInstance *instance) const
tbb::atomic< uint64_t > unreach
void FillPeerInfo(const BgpXmppChannel *channel) const
PeerCloseManager * close_manager()
const ErrorStats & error_stats() const
WorkQueue< BgpXmppChannel * > queue_
bool XmppDecodeAddress(int af, const std::string &address, IpAddress *addrp, bool zero_ok=false)
void StaleCurrentSubscriptions()
tbb::atomic< uint64_t > table_unsubscribe
BgpXmppRTargetManager * rtarget_manager()
tbb::atomic< uint64_t > rt_updates
bool ProcessMcastItem(std::string vrf_name, const pugi::xml_node &item, bool add_change)
boost::function< void(BgpXmppChannel *)> VisitorFn
bool IsSubscriptionGrStale(RoutingInstance *instance) const
tbb::atomic< uint64_t > table_unsubscribe_complete
TableMembershipRequestMap table_membership_request_map_
bool ProcessInet6Item(std::string vrf_name, const pugi::xml_node &node, bool add_change)
RoutingInstance::RouteTargetList targets
std::string transport_address_string() const
const XmppSession * GetSession() const
void IdentifierUpdateCallback(Ip4Address old_identifier)
int32_t deleting_count() const
void MembershipRequestCallback(BgpTable *table)
BgpXmppChannel(XmppChannel *channel, BgpServer *bgp_server=NULL, BgpXmppChannelManager *manager=NULL)
uint64_t get_tx_route_reach() const
void VisitChannels(BgpXmppChannelManager::VisitorFn)
virtual TcpSession::Endpoint endpoint() const
uint64_t get_inet6_rx_bad_nexthop_count() const
SubscribedRoutingInstanceList routing_instances_
Definition: timer.h:54
void LlgrStaleCurrentSubscriptions()
tbb::atomic< uint64_t > inet6_rx_bad_nexthop_count
void FillTableMembershipInfo(BgpNeighborResp *resp) const
void ClearStaledSubscription(RoutingInstance *rt_instance, SubscriptionState *sub_state)
tbb::atomic< uint64_t > table_subscribe
virtual void ReceiveUpdate(const XmppStanza::XmppMessage *msg)
Timer * eor_send_timer() const
void DequeueRequest(const std::string &table_name, DBRequest *request)
bool Enqueue(QueueEntryT entry)
Definition: queue_task.h:248
void RoutingInstanceCallback(std::string vrf_name, int op)
const XmppChannel * channel() const
std::set< RouteTarget > RouteTargetList
void SweepCurrentSubscriptions()
tbb::atomic< uint64_t > instance_subscribe
const XmppServer * xmpp_server() const
XmppChannelNameMap channel_name_map_
DISALLOW_COPY_AND_ASSIGN(BgpXmppChannelManager)
Timer * eor_receive_timer_
boost::scoped_ptr< PeerStats > peer_stats_
void RegisterTable(int line, BgpTable *table, const TableMembershipRequestState *tmr_state)
std::map< RoutingInstance *, SubscriptionState > SubscribedRoutingInstanceList
virtual ~BgpXmppChannel()