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