Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/discof/gossip/fd_gossip_tile.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,12 @@ handle_packet( fd_gossip_tile_ctx_t * ctx,
case 1: {
fd_gossip_pingreq_t * pingreq = (fd_gossip_pingreq_t *)payload;
fd_gossip_ping_tracker_track( ctx->gossip, pingreq->pubkey.uc, peer, now );
break;
}
case 2: {
fd_gossip_no_origin_reject_t * reject = (fd_gossip_no_origin_reject_t *)payload;
fd_gossip_insert_no_origin_reject( ctx->gossip, &reject->pubkey, reject->sha256_hash, now );
break;
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions src/discof/gossip/fd_gossip_tile.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@ struct fd_gossip_ping_update {

typedef struct fd_gossip_ping_update fd_gossip_ping_update_t;

struct fd_gossip_no_origin_reject {
fd_pubkey_t pubkey;
uchar sha256_hash[ 32UL ];
};

typedef struct fd_gossip_no_origin_reject fd_gossip_no_origin_reject_t;

extern fd_topo_run_tile_t fd_tile_gossip;

#endif /* HEADER_fd_src_discof_gossip_fd_gossip_tile_h */
31 changes: 26 additions & 5 deletions src/discof/gossip/fd_gossvf_tile.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ struct fd_gossvf_tile_ctx {
ulong round_robin_idx;
ulong round_robin_cnt;

fd_sha256_t sha256[1];
fd_sha512_t sha[ 1 ];

struct {
Expand Down Expand Up @@ -439,11 +440,26 @@ is_entrypoint( fd_gossvf_tile_ctx_t * ctx,
return 0;
}

static void
publish_no_origin_reject( fd_gossvf_tile_ctx_t * ctx,
fd_gossip_view_crds_value_t const * value,
uchar const * payload,
fd_stem_context_t * stem ) {
uchar * _dst = fd_chunk_to_laddr( ctx->out->mem, ctx->out->chunk );
fd_gossip_no_origin_reject_t * reject = (fd_gossip_no_origin_reject_t *)_dst;
fd_memcpy( reject->pubkey.uc, payload+value->pubkey_off, 32UL );
fd_gossip_generate_crds_value_hash( ctx->sha256, payload+value->value_off, value->length, reject->sha256_hash );

fd_stem_publish( stem, 0UL, fd_gossvf_sig( 0U, 0U, 2U ), ctx->out->chunk, sizeof(fd_gossip_no_origin_reject_t), 0UL, 0UL, 0UL );
ctx->out->chunk = fd_dcache_compact_next( ctx->out->chunk, sizeof(fd_gossip_no_origin_reject_t), ctx->out->chunk0, ctx->out->wmark );
}

static void
filter_shred_version_crds( fd_gossvf_tile_ctx_t * ctx,
int tag,
fd_gossip_view_crds_container_t * container,
uchar const * payload ) {
uchar const * payload,
fd_stem_context_t * stem ) {
peer_t const * relayer = peer_map_ele_query_const( ctx->peer_map, (fd_pubkey_t*)(payload+container->from_off), NULL, ctx->peers );
int keep_non_ci = (relayer && relayer->shred_version==ctx->shred_version) || (!relayer && is_entrypoint( ctx, ctx->peer ) );

Expand All @@ -463,6 +479,7 @@ filter_shred_version_crds( fd_gossvf_tile_ctx_t * ctx,
if( FD_LIKELY( no_origin ) ) {
ctx->metrics.crds_rx[ FD_METRICS_ENUM_GOSSVF_CRDS_OUTCOME_V_DROPPED_PULL_RESPONSE_ORIGIN_NO_CONTACT_INFO_IDX ]++;
ctx->metrics.crds_rx_bytes[ FD_METRICS_ENUM_GOSSVF_CRDS_OUTCOME_V_DROPPED_PULL_RESPONSE_ORIGIN_NO_CONTACT_INFO_IDX ] += container->crds_values[ i ].length;
publish_no_origin_reject( ctx, &container->crds_values[ i ], payload, stem );
} else {
ctx->metrics.crds_rx[ FD_METRICS_ENUM_GOSSVF_CRDS_OUTCOME_V_DROPPED_PULL_RESPONSE_ORIGIN_SHRED_VERSION_IDX ]++;
ctx->metrics.crds_rx_bytes[ FD_METRICS_ENUM_GOSSVF_CRDS_OUTCOME_V_DROPPED_PULL_RESPONSE_ORIGIN_SHRED_VERSION_IDX ] += container->crds_values[ i ].length;
Expand All @@ -481,6 +498,8 @@ filter_shred_version_crds( fd_gossvf_tile_ctx_t * ctx,
if( FD_LIKELY( no_origin ) ) {
ctx->metrics.crds_rx[ FD_METRICS_ENUM_GOSSVF_CRDS_OUTCOME_V_DROPPED_PUSH_ORIGIN_NO_CONTACT_INFO_IDX ]++;
ctx->metrics.crds_rx_bytes[ FD_METRICS_ENUM_GOSSVF_CRDS_OUTCOME_V_DROPPED_PUSH_ORIGIN_NO_CONTACT_INFO_IDX ] += container->crds_values[ i ].length;
/* Should we ignore for push messages? */
publish_no_origin_reject( ctx, &container->crds_values[ i ], payload, stem );
} else {
ctx->metrics.crds_rx[ FD_METRICS_ENUM_GOSSVF_CRDS_OUTCOME_V_DROPPED_PUSH_ORIGIN_SHRED_VERSION_IDX ]++;
ctx->metrics.crds_rx_bytes[ FD_METRICS_ENUM_GOSSVF_CRDS_OUTCOME_V_DROPPED_PUSH_ORIGIN_SHRED_VERSION_IDX ] += container->crds_values[ i ].length;
Expand All @@ -507,22 +526,23 @@ filter_shred_version_crds( fd_gossvf_tile_ctx_t * ctx,
static int
filter_shred_version( fd_gossvf_tile_ctx_t * ctx,
fd_gossip_view_t * view,
uchar const * payload ) {
uchar const * payload,
fd_stem_context_t * stem ) {
switch( view->tag ) {
case FD_GOSSIP_MESSAGE_PING:
case FD_GOSSIP_MESSAGE_PONG:
case FD_GOSSIP_MESSAGE_PRUNE:
return 0;
case FD_GOSSIP_MESSAGE_PUSH: {
filter_shred_version_crds( ctx, view->tag, view->push, payload );
filter_shred_version_crds( ctx, view->tag, view->push, payload, stem );
if( FD_UNLIKELY( !view->push->crds_values_len ) ) {
return FD_METRICS_ENUM_GOSSVF_MESSAGE_OUTCOME_V_DROPPED_PUSH_NO_VALID_CRDS_IDX;
} else {
return 0;
}
}
case FD_GOSSIP_MESSAGE_PULL_RESPONSE: {
filter_shred_version_crds( ctx, view->tag, view->pull_response, payload );
filter_shred_version_crds( ctx, view->tag, view->pull_response, payload, stem );
if( FD_UNLIKELY( !view->pull_response->crds_values_len ) ) {
return FD_METRICS_ENUM_GOSSVF_MESSAGE_OUTCOME_V_DROPPED_PULL_RESPONSE_NO_VALID_CRDS_IDX;
} else {
Expand Down Expand Up @@ -814,7 +834,7 @@ handle_net( fd_gossvf_tile_ctx_t * ctx,
if( FD_UNLIKELY( !view->push->crds_values_len ) ) return FD_METRICS_ENUM_GOSSVF_MESSAGE_OUTCOME_V_DROPPED_PUSH_NO_VALID_CRDS_IDX;
}

int result = filter_shred_version( ctx, view, payload );
int result = filter_shred_version( ctx, view, payload, stem );
if( FD_UNLIKELY( result ) ) return result;

result = verify_addresses( ctx, view, stem );
Expand Down Expand Up @@ -976,6 +996,7 @@ unprivileged_init( fd_topo_t * topo,
ctx->last_wallclock = fd_log_wallclock();
ctx->last_tickcount = fd_tickcount();

FD_TEST( fd_sha256_join( fd_sha256_new( ctx->sha ) ) );
FD_TEST( fd_sha512_join( fd_sha512_new( ctx->sha ) ) );

fd_tcache_t * tcache = fd_tcache_join( fd_tcache_new( _tcache, tile->gossvf.tcache_depth, 0UL ) );
Expand Down
2 changes: 1 addition & 1 deletion src/flamenco/gossip/Local.mk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
$(call add-hdrs,fd_gossip.h fd_gossip_out.h fd_gossip_txbuild.h)
$(call add-objs,fd_gossip fd_gossip_msg_parse fd_gossip_msg_ser fd_gossip_out fd_gossip_txbuild,fd_flamenco)
$(call add-objs,fd_gossip fd_gossip_msg_parse fd_gossip_msg_ser fd_gossip_out fd_gossip_txbuild fd_gossip_private,fd_flamenco)

$(call add-hdrs,fd_bloom.h)
$(call add-hdrs,fd_gossip_types.h)
Expand Down
Loading
Loading