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