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-05-15 13:12:55 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             :  */
       4             : 
       5             : #ifndef SRC_BGP_IPEER_H_
       6             : #define SRC_BGP_IPEER_H_
       7             : 
       8             : #include <atomic>
       9             : #include "bgp/bgp_proto.h"
      10             : #include "base/address.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    12625126 :     virtual ~IPeerUpdate() { }
      23        8975 :     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       10472 :     virtual bool SendUpdate(const uint8_t *msg, size_t msgsize,
      32             :                             const std::string *msg_str) {
      33       10472 :         return SendUpdate(msg, msgsize);
      34             :     }
      35             : 
      36             :     // Flush any accumulated updates.
      37             :     // Returns true if the peer can send additional messages.
      38       10115 :     virtual bool FlushUpdate() { return true; }
      39             : };
      40             : 
      41             : class IPeerDebugStats {
      42             : public:
      43             :     struct ProtoStats {
      44       32086 :         ProtoStats() {
      45       32086 :             total = 0;
      46       32086 :             open = 0;
      47       32086 :             keepalive = 0;
      48       32086 :             notification = 0;
      49       32086 :             update = 0;
      50       32086 :             close = 0;
      51       32086 :         }
      52             :         uint64_t total;
      53             :         uint64_t open;
      54             :         uint64_t keepalive;
      55             :         uint64_t notification;
      56             :         uint64_t update;
      57             :         uint64_t close;
      58             :     };
      59             : 
      60             :     struct ErrorStats {
      61       15599 :         ErrorStats() {
      62       15599 :             connect_error = 0;
      63       15599 :             connect_timer = 0;
      64       15599 :             hold_timer = 0;
      65       15599 :             open_error = 0;
      66       15599 :             update_error = 0;
      67       15599 :         }
      68             :         uint64_t connect_error;
      69             :         uint64_t connect_timer;
      70             :         uint64_t hold_timer;
      71             :         uint64_t open_error;
      72             :         uint64_t update_error;
      73             :     };
      74             : 
      75             :     struct RxErrorStats {
      76         175 :         RxErrorStats() {
      77         175 :             inet6_bad_xml_token_count = 0;
      78         175 :             inet6_bad_prefix_count = 0;
      79         175 :             inet6_bad_nexthop_count = 0;
      80         175 :             inet6_bad_afi_safi_count = 0;
      81         175 :         }
      82             :         uint64_t inet6_bad_xml_token_count;
      83             :         uint64_t inet6_bad_prefix_count;
      84             :         uint64_t inet6_bad_nexthop_count;
      85             :         uint64_t inet6_bad_afi_safi_count;
      86             :     };
      87             : 
      88             :     struct RxRouteStats {
      89         175 :         RxRouteStats() {
      90         175 :             total_path_count = 0;
      91         175 :             primary_path_count = 0;
      92         175 :         }
      93             :         uint64_t total_path_count;
      94             :         uint64_t primary_path_count;
      95             :     };
      96             : 
      97             :     struct UpdateStats {
      98       32436 :         UpdateStats() {
      99       32436 :             end_of_rib = 0;
     100       32436 :             total = 0;
     101       32436 :             reach = 0;
     102       32436 :             unreach = 0;
     103       32436 :         }
     104             :         uint64_t end_of_rib;
     105             :         uint64_t total;
     106             :         uint64_t reach;
     107             :         uint64_t unreach;
     108             :     };
     109             : 
     110             :     struct SocketStats {
     111         543 :         SocketStats() {
     112         543 :             calls = 0;
     113         543 :             bytes = 0;
     114         543 :             blocked_count = 0;
     115         543 :             blocked_duration_usecs = 0;
     116         543 :         }
     117             :         uint64_t calls;
     118             :         uint64_t bytes;
     119             :         uint64_t blocked_count;
     120             :         uint64_t blocked_duration_usecs;
     121             :     };
     122             : 
     123       20403 :     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      225089 :     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       36792 :     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       37226 :     virtual bool CheckSplitHorizon(uint32_t cluster_id = 0,
     230             :             uint32_t ribout_cid = 0) const {
     231       37226 :         return PeerType() == BgpProto::IBGP;
     232             :     }
     233             : };
     234             : 
     235             : #endif  // SRC_BGP_IPEER_H_

Generated by: LCOV version 1.14