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 */