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