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