Line data Source code
1 : #include "fd_gossip_txbuild.h" 2 : #include "fd_gossip_message.h" 3 : 4 : #include "../../util/log/fd_log.h" 5 : 6 : struct __attribute__((packed)) crds_val_hdr { 7 : uchar sig[ 64UL ]; 8 : uint tag; /* CRDS value tag */ 9 : }; 10 : 11 : typedef struct crds_val_hdr crds_val_hdr_t; 12 : 13 : struct __attribute__((packed)) crds_msg { 14 : uint msg_type; 15 : uchar identity_pubkey[ 32UL ]; 16 : ulong crds_len; 17 : uchar crds[ ]; 18 : }; 19 : 20 : typedef struct crds_msg crds_msg_t; 21 : 22 : void 23 : fd_gossip_txbuild_init( fd_gossip_txbuild_t * txbuild, 24 : uchar const * identity_pubkey, 25 0 : uchar msg_type ) { 26 0 : txbuild->tag = msg_type; 27 0 : txbuild->bytes_len = 44UL; /* offsetof( crds_msg_t, crds ) */ 28 0 : txbuild->crds_len = 0UL; 29 : 30 0 : crds_msg_t * msg = (crds_msg_t *)txbuild->bytes; 31 0 : msg->msg_type = msg_type; 32 0 : fd_memcpy( msg->identity_pubkey, identity_pubkey, 32UL ); 33 0 : msg->crds_len = 0UL; 34 0 : } 35 : 36 : int 37 : fd_gossip_txbuild_can_fit( fd_gossip_txbuild_t const * txbuild, 38 0 : ulong crds_len ) { 39 0 : return crds_len<=(sizeof(txbuild->bytes)-txbuild->bytes_len); 40 0 : } 41 : 42 : void 43 : fd_gossip_txbuild_append( fd_gossip_txbuild_t * txbuild, 44 : ulong crds_len, 45 0 : uchar const * crds ) { 46 0 : FD_TEST( crds_len<=FD_GOSSIP_VALUE_MAX_SZ ); 47 0 : FD_TEST( fd_gossip_txbuild_can_fit( txbuild, crds_len ) ); 48 0 : FD_TEST( txbuild->crds_len<sizeof(txbuild->crds)/sizeof(txbuild->crds[0]) ); 49 : 50 0 : fd_memcpy( &txbuild->bytes[ txbuild->bytes_len ], crds, crds_len ); 51 : 52 0 : crds_msg_t * msg = (crds_msg_t *)txbuild->bytes; 53 0 : msg->crds_len++; 54 : 55 0 : crds_val_hdr_t * hdr = (crds_val_hdr_t *)crds; 56 : 57 0 : txbuild->crds[ txbuild->crds_len ].tag = hdr->tag; 58 0 : txbuild->crds[ txbuild->crds_len ].off = (ushort)txbuild->bytes_len; 59 0 : txbuild->crds[ txbuild->crds_len ].sz = (ushort)crds_len; 60 0 : txbuild->crds_len++; 61 : 62 0 : txbuild->bytes_len += crds_len; 63 0 : }