LCOV - code coverage report
Current view: top level - discof/failover - fd_failover_wire.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 31 31 100.0 %
Date: 2026-11-12 04:25:03 Functions: 2 2 100.0 %

          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 : }

Generated by: LCOV version 1.14