OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ipeer.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_IPEER_H_
6 #define SRC_BGP_IPEER_H_
7 
8 #include "bgp/bgp_proto.h"
9 #include "base/address.h"
10 #include "tbb/atomic.h"
11 
12 class DBTablePartBase;
13 class BgpPath;
14 class BgpRoute;
15 class BgpServer;
16 class BgpTable;
17 class IPeer;
18 class PeerCloseManager;
19 
20 class IPeerUpdate {
21 public:
22  virtual ~IPeerUpdate() { }
23  virtual bool send_ready() const { return true; }
24 
25  // Printable name
26  virtual const std::string &ToString() const = 0;
27 
28  // Send an update.
29  // Returns true if the peer can send additional messages.
30  virtual bool SendUpdate(const uint8_t *msg, size_t msgsize) = 0;
31  virtual bool SendUpdate(const uint8_t *msg, size_t msgsize,
32  const std::string *msg_str) {
33  return SendUpdate(msg, msgsize);
34  }
35 
36  // Flush any accumulated updates.
37  // Returns true if the peer can send additional messages.
38  virtual bool FlushUpdate() { return true; }
39 };
40 
42 public:
43  struct ProtoStats {
45  total = 0;
46  open = 0;
47  keepalive = 0;
48  notification = 0;
49  update = 0;
50  close = 0;
51  }
52  tbb::atomic<uint64_t> total;
53  tbb::atomic<uint64_t> open;
54  tbb::atomic<uint64_t> keepalive;
55  tbb::atomic<uint64_t> notification;
56  tbb::atomic<uint64_t> update;
57  tbb::atomic<uint64_t> close;
58  };
59 
60  struct ErrorStats {
62  connect_error = 0;
63  connect_timer = 0;
64  hold_timer = 0;
65  open_error = 0;
66  update_error = 0;
67  }
68  tbb::atomic<uint64_t> connect_error;
69  tbb::atomic<uint64_t> connect_timer;
70  tbb::atomic<uint64_t> hold_timer;
71  tbb::atomic<uint64_t> open_error;
72  tbb::atomic<uint64_t> update_error;
73  };
74 
75  struct RxErrorStats {
81  }
82  tbb::atomic<uint64_t> inet6_bad_xml_token_count;
83  tbb::atomic<uint64_t> inet6_bad_prefix_count;
84  tbb::atomic<uint64_t> inet6_bad_nexthop_count;
85  tbb::atomic<uint64_t> inet6_bad_afi_safi_count;
86  };
87 
88  struct RxRouteStats {
90  total_path_count = 0;
92  }
93  tbb::atomic<uint64_t> total_path_count;
94  tbb::atomic<uint64_t> primary_path_count;
95  };
96 
97  struct UpdateStats {
99  end_of_rib = 0;
100  total = 0;
101  reach = 0;
102  unreach = 0;
103  }
104  tbb::atomic<uint64_t> end_of_rib;
105  tbb::atomic<uint64_t> total;
106  tbb::atomic<uint64_t> reach;
107  tbb::atomic<uint64_t> unreach;
108  };
109 
110  struct SocketStats {
112  calls = 0;
113  bytes = 0;
114  blocked_count = 0;
116  }
117  tbb::atomic<uint64_t> calls;
118  tbb::atomic<uint64_t> bytes;
119  tbb::atomic<uint64_t> blocked_count;
120  tbb::atomic<uint64_t> blocked_duration_usecs;
121  };
122 
123  virtual ~IPeerDebugStats() { }
124 
125  // Reset all counters
126  virtual void Clear() = 0;
127  // Printable name
128  virtual std::string ToString() const = 0;
129  // Previous State of the peer
130  virtual std::string last_state() const = 0;
131  // Last state change At
132  virtual std::string last_state_change_at() const = 0;
133  // Last error on this peer
134  virtual std::string last_error() const = 0;
135  // Last Event on this peer
136  virtual std::string last_event() const = 0;
137  // When was the Last
138  virtual std::string last_flap() const = 0;
139  // Total number of flaps
140  virtual uint64_t num_flaps() const = 0;
141 
142  virtual void GetRxProtoStats(ProtoStats *stats) const = 0;
143  virtual void GetRxRouteUpdateStats(UpdateStats *stats) const = 0;
144  virtual void GetRxSocketStats(SocketStats *stats) const = 0;
145  virtual void GetRxErrorStats(RxErrorStats *stats) const = 0;
146  virtual void GetRxRouteStats(RxRouteStats *stats) const = 0;
147 
148  virtual void GetTxProtoStats(ProtoStats *stats) const = 0;
149  virtual void GetTxRouteUpdateStats(UpdateStats *stats) const = 0;
150  virtual void GetTxSocketStats(SocketStats *stats) const = 0;
151 
152  virtual void UpdateTxReachRoute(uint64_t count) = 0;
153  virtual void UpdateTxUnreachRoute(uint64_t count) = 0;
154 };
155 
156 // Interface for PeerCloseManager clients
157 class IPeerClose {
158 public:
159  typedef std::set<Address::Family> Families;
160 
161  virtual ~IPeerClose() { }
162  virtual void Close(bool graceful) = 0;
163  virtual bool IsCloseGraceful() const = 0;
164  virtual bool IsCloseLongLivedGraceful() const = 0;
165  virtual void CustomClose() = 0;
166  virtual void CloseComplete() = 0;
167  virtual void Delete() = 0;
168  virtual void GracefulRestartStale() = 0;
169  virtual void LongLivedGracefulRestartStale() = 0;
170  virtual void GracefulRestartSweep() = 0;
171  virtual void GetGracefulRestartFamilies(Families *) const = 0;
172  virtual int GetGracefulRestartTime() const = 0;
173  virtual int GetLongLivedGracefulRestartTime() const = 0;
174  virtual void GetLongLivedGracefulRestartFamilies(Families *) const = 0;
175  virtual bool IsReady() const = 0;
176  virtual IPeer *peer() const = 0;
177  virtual void ReceiveEndOfRIB(Address::Family family) = 0;
178  virtual void MembershipRequestCallbackComplete() = 0;
179  virtual const char *GetTaskName() const = 0;
180  virtual int GetTaskInstance() const = 0;
181  virtual PeerCloseManager *GetManager() const = 0;
182  virtual void UpdateRouteStats(Address::Family family,
183  const BgpPath *old_path, uint32_t path_flags) const = 0;
184 };
185 
186 class IPeer : public IPeerUpdate {
187 public:
188  virtual ~IPeer() { }
189  // Printable name
190  virtual const std::string &ToString() const = 0;
191  virtual const std::string &ToUVEKey() const = 0;
192  virtual BgpServer *server() = 0;
193  virtual BgpServer *server() const = 0;
194  virtual IPeerClose *peer_close() const = 0;
195  virtual IPeerClose *peer_close() = 0;
196  virtual IPeerDebugStats *peer_stats() = 0;
197  virtual const IPeerDebugStats *peer_stats() const = 0;
198  virtual bool IsReady() const = 0;
199  virtual bool IsXmppPeer() const = 0;
200  virtual bool IsRouterTypeBGPaaS() const = 0;
201  //
202  // Whether the peer must register to a table
203  // before it could push the route to VRF.
204  // Control is mostly required in MockPeer in unit tests.
205  //
206  virtual bool IsRegistrationRequired() const = 0;
207  virtual void Close(bool graceful) = 0;
208  virtual BgpProto::BgpPeerType PeerType() const = 0;
209  virtual uint32_t bgp_identifier() const = 0;
210  virtual const std::string GetStateName() const = 0;
211  virtual void UpdateTotalPathCount(int count) const = 0;
212  virtual int GetTotalPathCount() const = 0;
213  virtual bool IsAs4Supported() const = 0;
214  virtual void ProcessPathTunnelEncapsulation(const BgpPath *path,
215  BgpAttr *attr, ExtCommunityDB *extcomm_db,
216  const BgpTable *table) const = 0;
217  virtual const std::vector<std::string> GetDefaultTunnelEncap(
218  const Address::Family family) const = 0;
219  virtual void UpdatePrimaryPathCount(int count,
220  Address::Family family = Address::UNSPEC) const = 0;
221  virtual int GetPrimaryPathCount() const = 0;
222  virtual void MembershipRequestCallback(BgpTable *table) = 0;
223  virtual bool MembershipPathCallback(DBTablePartBase *tpart,
224  BgpRoute *route, BgpPath *path) = 0;
225  virtual bool CanUseMembershipManager() const = 0;
226  virtual bool IsInGRTimerWaitState() const = 0;
227  virtual void UpdateCloseRouteStats(Address::Family family,
228  const BgpPath *old_path, uint32_t path_flags) const = 0;
229  virtual bool CheckSplitHorizon(uint32_t cluster_id = 0,
230  uint32_t ribout_cid = 0) const {
231  return PeerType() == BgpProto::IBGP;
232  }
233 };
234 
235 #endif // SRC_BGP_IPEER_H_
tbb::atomic< uint64_t > unreach
Definition: ipeer.h:107
virtual void GetRxSocketStats(SocketStats *stats) const =0
virtual std::string last_event() const =0
static void UpdateStats(FlowEvent *event, FlowStats *stats)
Definition: flow_proto.cc:785
virtual bool IsCloseLongLivedGraceful() const =0
virtual void UpdatePrimaryPathCount(int count, Address::Family family=Address::UNSPEC) const =0
virtual int GetLongLivedGracefulRestartTime() const =0
virtual void Close(bool graceful)=0
virtual void GetRxErrorStats(RxErrorStats *stats) const =0
virtual void UpdateTxReachRoute(uint64_t count)=0
virtual IPeerClose * peer_close() const =0
virtual bool IsXmppPeer() const =0
virtual uint32_t bgp_identifier() const =0
std::set< Address::Family > Families
Definition: ipeer.h:159
virtual bool IsCloseGraceful() const =0
virtual BgpProto::BgpPeerType PeerType() const =0
tbb::atomic< uint64_t > total
Definition: ipeer.h:52
virtual void ReceiveEndOfRIB(Address::Family family)=0
virtual void GetTxRouteUpdateStats(UpdateStats *stats) const =0
virtual void Clear()=0
Family
Definition: address.h:24
virtual int GetPrimaryPathCount() const =0
virtual void UpdateCloseRouteStats(Address::Family family, const BgpPath *old_path, uint32_t path_flags) const =0
virtual const std::vector< std::string > GetDefaultTunnelEncap(const Address::Family family) const =0
virtual IPeerDebugStats * peer_stats()=0
virtual void UpdateTxUnreachRoute(uint64_t count)=0
virtual ~IPeerDebugStats()
Definition: ipeer.h:123
virtual bool IsRouterTypeBGPaaS() const =0
tbb::atomic< uint64_t > total
Definition: ipeer.h:105
tbb::atomic< uint64_t > blocked_count
Definition: ipeer.h:119
virtual const std::string & ToString() const =0
virtual bool IsReady() const =0
virtual PeerCloseManager * GetManager() const =0
Definition: ipeer.h:186
tbb::atomic< uint64_t > open_error
Definition: ipeer.h:71
tbb::atomic< uint64_t > close
Definition: ipeer.h:57
virtual std::string last_error() const =0
virtual int GetTotalPathCount() const =0
virtual void GetRxRouteStats(RxRouteStats *stats) const =0
virtual bool IsInGRTimerWaitState() const =0
tbb::atomic< uint64_t > primary_path_count
Definition: ipeer.h:94
virtual uint64_t num_flaps() const =0
virtual const std::string GetStateName() const =0
virtual int GetTaskInstance() const =0
virtual bool CheckSplitHorizon(uint32_t cluster_id=0, uint32_t ribout_cid=0) const
Definition: ipeer.h:229
virtual ~IPeerUpdate()
Definition: ipeer.h:22
tbb::atomic< uint64_t > inet6_bad_nexthop_count
Definition: ipeer.h:84
tbb::atomic< uint64_t > notification
Definition: ipeer.h:55
virtual std::string ToString() const =0
virtual void GetTxSocketStats(SocketStats *stats) const =0
virtual bool send_ready() const
Definition: ipeer.h:23
tbb::atomic< uint64_t > connect_timer
Definition: ipeer.h:69
virtual const std::string & ToString() const =0
virtual void CloseComplete()=0
tbb::atomic< uint64_t > reach
Definition: ipeer.h:106
tbb::atomic< uint64_t > hold_timer
Definition: ipeer.h:70
virtual void GracefulRestartStale()=0
virtual void Close(bool graceful)=0
virtual void CustomClose()=0
virtual int GetGracefulRestartTime() const =0
virtual void LongLivedGracefulRestartStale()=0
tbb::atomic< uint64_t > total_path_count
Definition: ipeer.h:93
tbb::atomic< uint64_t > update_error
Definition: ipeer.h:72
tbb::atomic< uint64_t > end_of_rib
Definition: ipeer.h:104
virtual BgpServer * server()=0
tbb::atomic< uint64_t > connect_error
Definition: ipeer.h:68
virtual void UpdateTotalPathCount(int count) const =0
virtual bool FlushUpdate()
Definition: ipeer.h:38
tbb::atomic< uint64_t > inet6_bad_prefix_count
Definition: ipeer.h:83
virtual void MembershipRequestCallbackComplete()=0
virtual void UpdateRouteStats(Address::Family family, const BgpPath *old_path, uint32_t path_flags) const =0
virtual ~IPeer()
Definition: ipeer.h:188
virtual void GracefulRestartSweep()=0
virtual void MembershipRequestCallback(BgpTable *table)=0
virtual std::string last_flap() const =0
virtual bool SendUpdate(const uint8_t *msg, size_t msgsize)=0
virtual const std::string & ToUVEKey() const =0
virtual void GetLongLivedGracefulRestartFamilies(Families *) const =0
virtual bool IsReady() const =0
virtual void GetRxProtoStats(ProtoStats *stats) const =0
tbb::atomic< uint64_t > open
Definition: ipeer.h:53
tbb::atomic< uint64_t > keepalive
Definition: ipeer.h:54
tbb::atomic< uint64_t > update
Definition: ipeer.h:56
virtual IPeer * peer() const =0
virtual std::string last_state() const =0
virtual void Delete()=0
virtual bool IsRegistrationRequired() const =0
virtual void GetTxProtoStats(ProtoStats *stats) const =0
virtual ~IPeerClose()
Definition: ipeer.h:161
virtual void GetGracefulRestartFamilies(Families *) const =0
tbb::atomic< uint64_t > inet6_bad_afi_safi_count
Definition: ipeer.h:85
virtual bool MembershipPathCallback(DBTablePartBase *tpart, BgpRoute *route, BgpPath *path)=0
tbb::atomic< uint64_t > inet6_bad_xml_token_count
Definition: ipeer.h:82
tbb::atomic< uint64_t > calls
Definition: ipeer.h:117
virtual std::string last_state_change_at() const =0
virtual const char * GetTaskName() const =0
virtual void ProcessPathTunnelEncapsulation(const BgpPath *path, BgpAttr *attr, ExtCommunityDB *extcomm_db, const BgpTable *table) const =0
virtual bool SendUpdate(const uint8_t *msg, size_t msgsize, const std::string *msg_str)
Definition: ipeer.h:31
tbb::atomic< uint64_t > blocked_duration_usecs
Definition: ipeer.h:120
virtual bool IsAs4Supported() const =0
tbb::atomic< uint64_t > bytes
Definition: ipeer.h:118
virtual bool CanUseMembershipManager() const =0
virtual void GetRxRouteUpdateStats(UpdateStats *stats) const =0