LCOV - code coverage report
Current view: top level - discof/repair - fd_repair.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 0 117 0.0 %
Date: 2026-03-19 18:19:27 Functions: 0 10 0.0 %

          Line data    Source code
       1             : #include "fd_repair.h"
       2             : #include "../../ballet/sha256/fd_sha256.h"
       3             : 
       4             : void *
       5           0 : fd_repair_new( void * shmem, fd_pubkey_t * identity_key ) {
       6             : 
       7           0 :   if( FD_UNLIKELY( !shmem ) ) {
       8           0 :     FD_LOG_WARNING(( "NULL mem" ));
       9           0 :     return NULL;
      10           0 :   }
      11             : 
      12           0 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmem, fd_repair_align() ) ) ) {
      13           0 :     FD_LOG_WARNING(( "misaligned mem" ));
      14           0 :     return NULL;
      15           0 :   }
      16             : 
      17           0 :   ulong footprint = fd_repair_footprint();
      18           0 :   fd_memset( shmem, 0, footprint );
      19             : 
      20           0 :   fd_repair_t * repair = (fd_repair_t *)shmem;
      21           0 :   repair->identity_key = *identity_key;
      22             : 
      23           0 :   return shmem;
      24           0 : }
      25             : 
      26             : fd_repair_t *
      27           0 : fd_repair_join( void * shrepair ) {
      28           0 :   fd_repair_t * repair = (fd_repair_t *)shrepair;
      29             : 
      30           0 :   if( FD_UNLIKELY( !repair ) ) {
      31           0 :     FD_LOG_WARNING(( "NULL repair" ));
      32           0 :     return NULL;
      33           0 :   }
      34             : 
      35           0 :   if( FD_UNLIKELY( !fd_ulong_is_aligned((ulong)repair, fd_repair_align() ) ) ) {
      36           0 :     FD_LOG_WARNING(( "misaligned repair" ));
      37           0 :     return NULL;
      38           0 :   }
      39             : 
      40           0 :   fd_wksp_t * wksp = fd_wksp_containing( repair );
      41           0 :   if( FD_UNLIKELY( !wksp ) ) {
      42           0 :     FD_LOG_WARNING(( "repair must be part of a workspace" ));
      43           0 :     return NULL;
      44           0 :   }
      45             : 
      46           0 :   return repair;
      47           0 : }
      48             : 
      49             : void *
      50           0 : fd_repair_leave( fd_repair_t const * repair ) {
      51             : 
      52           0 :   if( FD_UNLIKELY( !repair ) ) {
      53           0 :     FD_LOG_WARNING(( "NULL repair" ));
      54           0 :     return NULL;
      55           0 :   }
      56             : 
      57           0 :   return (void *)repair;
      58           0 : }
      59             : 
      60             : void *
      61           0 : fd_repair_delete( void * repair ) {
      62             : 
      63           0 :   if( FD_UNLIKELY( !repair ) ) {
      64           0 :     FD_LOG_WARNING(( "NULL repair" ));
      65           0 :     return NULL;
      66           0 :   }
      67             : 
      68           0 :   if( FD_UNLIKELY( !fd_ulong_is_aligned((ulong)repair, fd_repair_align() ) ) ) {
      69           0 :     FD_LOG_WARNING(( "misaligned repair" ));
      70           0 :     return NULL;
      71           0 :   }
      72             : 
      73           0 :   return repair;
      74           0 : }
      75             : 
      76             : fd_repair_msg_t *
      77           0 : fd_repair_pong( fd_repair_t * repair, fd_hash_t * ping_token ) {
      78           0 :   uchar pre_image[FD_REPAIR_PONG_PREIMAGE_SZ];
      79           0 :   memcpy( pre_image, "SOLANA_PING_PONG", 16UL );
      80           0 :   memcpy( pre_image+16UL, ping_token->uc, 32UL);
      81             : 
      82             :   /* Generate response hash token */
      83           0 :   fd_sha256_hash( pre_image, FD_REPAIR_PONG_PREIMAGE_SZ, &repair->msg.pong.hash );
      84             : 
      85           0 :   repair->msg.kind      = FD_REPAIR_KIND_PONG;
      86           0 :   repair->msg.pong.from = repair->identity_key;
      87           0 :   return &repair->msg;
      88           0 : }
      89             : 
      90             : fd_repair_msg_t *
      91             : fd_repair_shred( fd_repair_t *     repair,
      92             :                  fd_pubkey_t const * to,
      93             :                  ulong             ts,
      94             :                  uint              nonce,
      95             :                  ulong             slot,
      96           0 :                  ulong             shred_idx ) {
      97           0 :   memset(&repair->msg, 0, sizeof(fd_repair_msg_t));
      98           0 :   repair->msg.kind            = FD_REPAIR_KIND_SHRED;
      99           0 :   repair->msg.shred.from      = repair->identity_key;
     100           0 :   repair->msg.shred.to        = *to;
     101           0 :   repair->msg.shred.ts        = ts;
     102           0 :   repair->msg.shred.nonce     = nonce;
     103           0 :   repair->msg.shred.slot      = slot;
     104           0 :   repair->msg.shred.shred_idx = shred_idx;
     105           0 :   return &repair->msg;
     106           0 : }
     107             : 
     108             : fd_repair_msg_t *
     109             : fd_repair_highest_shred( fd_repair_t *     repair,
     110             :                          fd_pubkey_t const * to,
     111             :                          ulong             ts,
     112             :                          uint              nonce,
     113             :                          ulong             slot,
     114           0 :                          ulong             shred_idx ) {
     115           0 :   memset(&repair->msg, 0, sizeof(fd_repair_msg_t));
     116           0 :   repair->msg.kind                    = FD_REPAIR_KIND_HIGHEST_SHRED;
     117           0 :   repair->msg.highest_shred.from      = repair->identity_key;
     118           0 :   repair->msg.highest_shred.to        = *to;
     119           0 :   repair->msg.highest_shred.ts        = ts;
     120           0 :   repair->msg.highest_shred.nonce     = nonce;
     121           0 :   repair->msg.highest_shred.slot      = slot;
     122           0 :   repair->msg.highest_shred.shred_idx = shred_idx;
     123           0 :   return &repair->msg;
     124           0 : }
     125             : 
     126             : fd_repair_msg_t *
     127             : fd_repair_orphan( fd_repair_t *     repair,
     128             :                   fd_pubkey_t const * to,
     129             :                   ulong             ts,
     130             :                   uint              nonce,
     131           0 :                   ulong             slot ) {
     132           0 :   memset(&repair->msg, 0, sizeof(fd_repair_msg_t));
     133           0 :   repair->msg.kind         = FD_REPAIR_KIND_ORPHAN;
     134           0 :   repair->msg.orphan.from  = repair->identity_key;
     135           0 :   repair->msg.orphan.to    = *to;
     136           0 :   repair->msg.orphan.ts    = ts;
     137           0 :   repair->msg.orphan.nonce = nonce;
     138           0 :   repair->msg.orphan.slot  = slot;
     139           0 :   return &repair->msg;
     140           0 : }
     141             : 
     142             : int
     143             : fd_repair_ping_de( fd_repair_ping_t * ping,
     144             :                    uchar      const * buf,
     145           0 :                    ulong              buf_sz ) {
     146           0 :   if( FD_UNLIKELY( buf_sz!=sizeof(fd_repair_ping_t) )) return -1;
     147             : 
     148           0 :   ping->kind = fd_uint_load_4_fast( buf );
     149           0 :   buf    += sizeof(uint);
     150             : 
     151           0 :   if( FD_UNLIKELY( ping->kind != FD_REPAIR_KIND_PING )) return -1;
     152             : 
     153             :   /* pong section */
     154             : 
     155           0 :   memcpy( &ping->ping.from, buf, sizeof(fd_pubkey_t) );
     156           0 :   buf += sizeof(fd_pubkey_t);
     157             : 
     158           0 :   memcpy( &ping->ping.hash, buf, sizeof(fd_hash_t) );
     159           0 :   buf += sizeof(fd_hash_t);
     160             : 
     161           0 :   memcpy( ping->ping.sig, buf, sizeof(fd_ed25519_sig_t) );
     162           0 :   buf += sizeof(fd_ed25519_sig_t);
     163           0 :   return 0;
     164           0 : }
     165             : 
     166             : int
     167             : fd_repair_ping_ser( fd_repair_ping_t const * ping,
     168             :                     uchar                    buf[static sizeof(fd_repair_ping_t)],
     169           0 :                     ulong                    buf_sz ) {
     170           0 :   ulong off = 0;
     171           0 :   if( FD_UNLIKELY( buf_sz!=sizeof(fd_repair_ping_t) )) return -1;
     172             : 
     173           0 :   FD_STORE( uint, buf+off, ping->kind );
     174           0 :   off += sizeof(uint);
     175             : 
     176           0 :   FD_STORE( fd_pubkey_t, buf+off, ping->ping.from );
     177           0 :   off += sizeof(fd_pubkey_t);
     178             : 
     179           0 :   FD_STORE( fd_hash_t, buf+off, ping->ping.hash );
     180           0 :   off += sizeof(fd_hash_t);
     181             : 
     182           0 :   memcpy( buf+off, ping->ping.sig, sizeof(fd_ed25519_sig_t) );
     183           0 :   off += sizeof(fd_ed25519_sig_t);
     184             : 
     185           0 :   return 0;
     186           0 : }

Generated by: LCOV version 1.14