Line data Source code
1 : #include "fd_failover_wire.h" 2 : 3 : #include <string.h> 4 : 5 : static ulong const payload_max[ FD_FAILOVER_MSG_CNT ] = { 6 : sizeof(fd_failover_hello_t), 7 : sizeof(fd_failover_handoff_request_t), 8 : FD_FAILOVER_DEMOTED_PAYLOAD_MAX, 9 : sizeof(fd_failover_promote_ack_t), 10 : sizeof(fd_failover_promote_rejected_t), 11 : sizeof(fd_failover_handoff_result_t), 12 : 0UL /* KEEPALIVE */ 13 : }; 14 : 15 : ulong 16 : fd_failover_wire_encode( uchar * out, 17 : ushort type, 18 : uchar const * payload, 19 36 : ulong payload_sz ) { 20 36 : if( FD_UNLIKELY( type>=FD_FAILOVER_MSG_CNT || 21 36 : payload_sz>payload_max[type] ) ) return 0UL; 22 : 23 36 : ulong frame_sz = FD_FAILOVER_FRAME_HDR_SZ+payload_sz; 24 : 25 36 : fd_failover_frame_hdr_t hdr = { 26 36 : .version = (ushort)FD_FAILOVER_VERSION, 27 36 : .len = (uint)frame_sz, 28 36 : .type = type, 29 36 : }; 30 36 : fd_memcpy( out, &hdr, FD_FAILOVER_FRAME_HDR_SZ ); 31 36 : if( FD_LIKELY( payload_sz ) ) fd_memcpy( out+FD_FAILOVER_FRAME_HDR_SZ, payload, payload_sz ); 32 : 33 36 : return frame_sz; 34 36 : } 35 : 36 : int 37 : fd_failover_wire_decode( uchar const * buf, 38 : ulong buf_sz, 39 : ushort * out_type, 40 : uchar const ** out_payload, 41 : ulong * out_payload_sz, 42 144 : ulong * out_frame_sz ) { 43 144 : if( FD_UNLIKELY( buf_sz<FD_FAILOVER_FRAME_HDR_SZ ) ) return FD_FAILOVER_WIRE_ERR_AGAIN; 44 : 45 15 : fd_failover_frame_hdr_t hdr; 46 15 : fd_memcpy( &hdr, buf, FD_FAILOVER_FRAME_HDR_SZ ); 47 : 48 15 : ulong frame_sz = (ulong)hdr.len; 49 15 : if( FD_UNLIKELY( frame_sz<FD_FAILOVER_FRAME_HDR_SZ ) ) return FD_FAILOVER_WIRE_ERR_SZ; 50 15 : if( FD_UNLIKELY( frame_sz>FD_FAILOVER_FRAME_MAX ) ) return FD_FAILOVER_WIRE_ERR_SZ; 51 : 52 15 : ulong payload_sz = frame_sz-FD_FAILOVER_FRAME_HDR_SZ; 53 : 54 15 : if( FD_UNLIKELY( hdr.version!=(ushort)FD_FAILOVER_VERSION ) ) return FD_FAILOVER_WIRE_ERR_VERSION; 55 15 : if( FD_UNLIKELY( hdr.type>=FD_FAILOVER_MSG_CNT ) ) return FD_FAILOVER_WIRE_ERR_TYPE; 56 : 57 15 : if( FD_UNLIKELY( payload_sz>payload_max[hdr.type] ) ) return FD_FAILOVER_WIRE_ERR_SZ; 58 15 : if( FD_UNLIKELY( buf_sz<frame_sz ) ) return FD_FAILOVER_WIRE_ERR_AGAIN; 59 : 60 15 : *out_type = hdr.type; 61 15 : *out_payload = buf+FD_FAILOVER_FRAME_HDR_SZ; 62 15 : *out_payload_sz = payload_sz; 63 15 : *out_frame_sz = frame_sz; 64 15 : return FD_FAILOVER_WIRE_SUCCESS; 65 15 : }