LCOV - code coverage report
Current view: top level - bgp - ipeer.h (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 47 47 100.0 %
Date: 2026-11-09 02:10:49 Functions: 14 18 77.8 %
Legend: Lines: hit not hit

          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_

Generated by: LCOV version 1.14