LCOV - code coverage report
Current view: top level - flamenco/gossip - fd_gossip.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 0 7 0.0 %
Date: 2025-03-20 12:08:36 Functions: 0 0 -

          Line data    Source code
       1             : #ifndef HEADER_fd_src_flamenco_gossip_fd_gossip_h
       2             : #define HEADER_fd_src_flamenco_gossip_fd_gossip_h
       3             : 
       4             : #include "../types/fd_types.h"
       5             : #include "../../util/valloc/fd_valloc.h"
       6             : #include "../../disco/metrics/generated/fd_metrics_gossip.h"
       7             : #include "../../util/net/fd_net_headers.h" /* fd_ip4_port_t */
       8             : 
       9             : /* Max number of validators that can be known */
      10           0 : #define FD_PEER_KEY_MAX (1<<14)
      11             : /* Number of recognized CRDS enum members */
      12             : #define FD_KNOWN_CRDS_ENUM_MAX (14UL)
      13             : 
      14             : /* Contact info v2 socket tag constants */
      15           0 : #define FD_GOSSIP_SOCKET_TAG_GOSSIP             (0)
      16             : #define FD_GOSSIP_SOCKET_TAG_RPC                (2)
      17             : #define FD_GOSSIP_SOCKET_TAG_RPC_PUBSUB         (3)
      18           0 : #define FD_GOSSIP_SOCKET_TAG_SERVE_REPAIR       (4)
      19             : #define FD_GOSSIP_SOCKET_TAG_SERVE_REPAIR_QUIC  (1)
      20           0 : #define FD_GOSSIP_SOCKET_TAG_TPU                (5)
      21             : #define FD_GOSSIP_SOCKET_TAG_TPU_FORWARDS       (6)
      22             : #define FD_GOSSIP_SOCKET_TAG_TPU_FORWARDS_QUIC  (7)
      23           0 : #define FD_GOSSIP_SOCKET_TAG_TPU_QUIC           (8)
      24           0 : #define FD_GOSSIP_SOCKET_TAG_TPU_VOTE           (9)
      25           0 : #define FD_GOSSIP_SOCKET_TAG_TVU                (10)
      26             : #define FD_GOSSIP_SOCKET_TAG_TVU_QUIC           (11)
      27             : 
      28             : #define FD_GOSSIP_SOCKET_TAG_MAX                (12)
      29             : 
      30             : 
      31             : enum fd_gossip_crds_route {
      32             :     FD_GOSSIP_CRDS_ROUTE_PULL_RESP,
      33             :     FD_GOSSIP_CRDS_ROUTE_PUSH,
      34             :     FD_GOSSIP_CRDS_ROUTE_INTERNAL,
      35             : 
      36             :     /* Add entries above this one */
      37             :     FD_GOSSIP_CRDS_ROUTE_ENUM_CNT
      38             :   };
      39             : 
      40             : typedef enum fd_gossip_crds_route fd_gossip_crds_route_t;
      41             : 
      42             : /* Global state of gossip protocol */
      43             : typedef struct fd_gossip fd_gossip_t;
      44             : ulong         fd_gossip_align    ( void );
      45             : ulong         fd_gossip_footprint( void );
      46             : void *        fd_gossip_new      ( void * shmem, ulong seed );
      47             : fd_gossip_t * fd_gossip_join     ( void * shmap );
      48             : void *        fd_gossip_leave    ( fd_gossip_t * join );
      49             : void *        fd_gossip_delete   ( void * shmap );
      50             : 
      51             : typedef union fd_ip4_port fd_gossip_peer_addr_t;
      52             : 
      53             : int
      54             : fd_gossip_from_soladdr(fd_gossip_peer_addr_t * dst, fd_gossip_socket_addr_t const * src );
      55             : 
      56             : int
      57             : fd_gossip_to_soladdr( fd_gossip_socket_addr_t * dst, fd_gossip_peer_addr_t const * src );
      58             : 
      59             : 
      60             : void
      61             : fd_gossip_contact_info_v2_to_v1( fd_gossip_contact_info_v2_t const * v2,
      62             :                                  fd_gossip_contact_info_v1_t *       v1 );
      63             : 
      64             : int
      65             : fd_gossip_contact_info_v2_find_proto_ident( fd_gossip_contact_info_v2_t const * contact_info,
      66             :                                             uchar                               proto_ident,
      67             :                                             fd_gossip_socket_addr_t *           out_addr );
      68             : 
      69             : /* Callback when a new message is received */
      70             : typedef void (*fd_gossip_data_deliver_fun)(fd_crds_data_t* data, void* arg);
      71             : 
      72             : /* Callback for sending a packet. addr is the address of the destination. */
      73             : typedef void (*fd_gossip_send_packet_fun)( uchar const * msg, size_t msglen, fd_gossip_peer_addr_t const * addr, void * arg );
      74             : 
      75             : /* Callback for signing */
      76             : typedef void (*fd_gossip_sign_fun)( void * ctx, uchar * sig, uchar const * buffer, ulong len, int sign_type );
      77             : 
      78             : struct fd_gossip_config {
      79             :     fd_pubkey_t * public_key;
      80             :     long node_outset; /* timestamp (in ms) when node's pubkey was set */
      81             :     fd_gossip_peer_addr_t my_addr;
      82             :     fd_gossip_version_v3_t my_version;
      83             :     ushort shred_version;
      84             :     fd_gossip_data_deliver_fun deliver_fun;
      85             :     void * deliver_arg;
      86             :     fd_gossip_send_packet_fun send_fun;
      87             :     void * send_arg;
      88             :     fd_gossip_sign_fun sign_fun;
      89             :     void * sign_arg;
      90             : };
      91             : typedef struct fd_gossip_config fd_gossip_config_t;
      92             : 
      93             : /* Initialize the gossip data structure */
      94             : int fd_gossip_set_config( fd_gossip_t * glob, const fd_gossip_config_t * config );
      95             : 
      96             : /* Update the binding addr */
      97             : int fd_gossip_update_addr( fd_gossip_t * glob, const fd_gossip_peer_addr_t * addr );
      98             : 
      99             : /* Update the repair service addr */
     100             : int fd_gossip_update_repair_addr( fd_gossip_t * glob, const fd_gossip_peer_addr_t * serve );
     101             : 
     102             : /* Update the tvu rx addr */
     103             : int
     104             : fd_gossip_update_tvu_addr( fd_gossip_t * glob,
     105             :                            fd_gossip_peer_addr_t const * tvu );
     106             : 
     107             : /* Update the tpu addr */
     108             : int
     109             : fd_gossip_update_tpu_addr( fd_gossip_t * glob,
     110             :                            fd_gossip_peer_addr_t const * tpu,
     111             :                            fd_gossip_peer_addr_t const * tpu_quic );
     112             : 
     113             : /* Update the tpu vote addr */
     114             : int fd_gossip_update_tpu_vote_addr( fd_gossip_t * glob, const fd_gossip_peer_addr_t * tpu_vote );
     115             : 
     116             : /* Set the shred version (after receiving a contact info msg) */
     117             : void fd_gossip_set_shred_version( fd_gossip_t * glob, ushort shred_version );
     118             : 
     119             : /* Add a peer to talk to */
     120             : int fd_gossip_add_active_peer( fd_gossip_t * glob, fd_gossip_peer_addr_t const * addr );
     121             : 
     122             : /* Publish an outgoing value. The source id and wallclock are set by this function. The gossip key for the value is optionally returned. */
     123             : int fd_gossip_push_value( fd_gossip_t * glob, fd_crds_data_t* data, fd_hash_t * key_opt );
     124             : 
     125             : /* Set the current protocol time in nanosecs. Call this as often as feasible. */
     126             : void fd_gossip_settime( fd_gossip_t * glob, long ts );
     127             : 
     128             : /* Get the current protocol time in nanosecs */
     129             : long fd_gossip_gettime( fd_gossip_t * glob );
     130             : 
     131             : /* Start timed events and other protocol behavior. settime MUST be called before this. */
     132             : int fd_gossip_start( fd_gossip_t * glob );
     133             : 
     134             : /* Dispatch timed events and other protocol behavior. This should be
     135             :  * called inside the main spin loop. calling settime first is recommended. */
     136             : int fd_gossip_continue( fd_gossip_t * glob );
     137             : 
     138             : /* Pass a raw gossip packet into the protocol. addr is the address of the sender */
     139             : int fd_gossip_recv_packet( fd_gossip_t * glob, uchar const * msg, ulong msglen, fd_gossip_peer_addr_t const * addr );
     140             : 
     141             : const char * fd_gossip_addr_str( char * dst, ulong dstlen, fd_gossip_peer_addr_t const * src );
     142             : 
     143             : ushort fd_gossip_get_shred_version( fd_gossip_t const * glob );
     144             : 
     145             : void fd_gossip_set_stake_weights( fd_gossip_t * gossip, fd_stake_weight_t const * stake_weights, ulong stake_weights_cnt );
     146             : 
     147             : /* fd_gossip_set_entrypoints sets ip and ports for initial known
     148             :    validators to gossip to.  These values are set by the operator
     149             :    at startup.  This function should only be called at startup. */
     150             : void
     151             : fd_gossip_set_entrypoints( fd_gossip_t *         gossip,
     152             :                            fd_ip4_port_t const * entrypoints,
     153             :                            ulong                 entrypoint_cnt );
     154             : 
     155             : uint fd_gossip_is_allowed_entrypoint( fd_gossip_t * gossip, fd_gossip_peer_addr_t * addr );
     156             : 
     157             : /* Gossip Metrics */
     158             : struct fd_gossip_metrics {
     159             :   /* Receive Packets */
     160             :   ulong recv_pkt_cnt;
     161             :   ulong recv_pkt_corrupted_msg;
     162             : 
     163             :   /* Receive Gossip Messages */
     164             :   ulong recv_message[FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_CNT];
     165             :   ulong recv_unknown_message;
     166             : 
     167             :   /* Receive CRDS */
     168             :   ulong recv_crds[FD_GOSSIP_CRDS_ROUTE_ENUM_CNT][FD_METRICS_ENUM_CRDS_VALUE_CNT];
     169             :   ulong recv_crds_duplicate_message[FD_GOSSIP_CRDS_ROUTE_ENUM_CNT][FD_METRICS_ENUM_CRDS_VALUE_CNT];
     170             :   ulong recv_crds_drop_reason[FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_CNT];
     171             : 
     172             : 
     173             :   /* Push CRDS value */
     174             :   ulong push_crds[FD_KNOWN_CRDS_ENUM_MAX];
     175             :   ulong push_crds_duplicate[FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_CNT];
     176             :   ulong push_crds_drop_reason[FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_CNT];
     177             :   ulong push_crds_queue_cnt;
     178             : 
     179             :   /* Active Push Destinations */
     180             :   ulong active_push_destinations;
     181             :   ulong refresh_push_states_failcnt;
     182             : 
     183             :   /* Pull Requests/Responses */
     184             :   ulong handle_pull_req_fails[FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_CNT];
     185             :   ulong handle_pull_req_bloom_filter_result[FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_CNT]; /* TODO: per host? */
     186             :   ulong handle_pull_req_npackets; /* TODO: per host? */
     187             : 
     188             :   /* Receive Prune Messages */
     189             :   ulong handle_prune_fails[FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_CNT];
     190             : 
     191             :   /* Send Prune Messages */
     192             :   ulong make_prune_stale_entry; /* TODO: per host? */
     193             :   ulong make_prune_high_duplicates; /* TODO: per host? */
     194             :   ulong make_prune_requested_origins; /* TODO: per host? */
     195             :   ulong make_prune_sign_data_encode_failed;
     196             : 
     197             :   /* Send Gossip Messages */
     198             :   ulong send_message[FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_CNT];
     199             : 
     200             :   /* Send Packets */
     201             :   ulong send_packet_cnt;
     202             : 
     203             :   /* Ping/Pong */
     204             :   ulong send_ping_events[FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_CNT];
     205             :   ulong recv_ping_invalid_signature;
     206             : 
     207             :   ulong recv_pong_events[FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_CNT];
     208             : 
     209             :   /* Peers (all known validators) */
     210             :   ulong gossip_peer_cnt[FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_CNT];
     211             :   /* TODO: Lock metrics */
     212             : };
     213             : typedef struct fd_gossip_metrics fd_gossip_metrics_t;
     214             : #define FD_GOSSIP_METRICS_FOOTPRINT ( sizeof( fd_gossip_metrics_t ) )
     215             : 
     216             : fd_gossip_metrics_t *
     217             : fd_gossip_get_metrics( fd_gossip_t * gossip );
     218             : 
     219             : #endif /* HEADER_fd_src_flamenco_gossip_fd_gossip_h */

Generated by: LCOV version 1.14