Line data Source code
1 : #include "fd_reedsol_private.h" 2 : #include "../../util/sanitize/fd_msan.h" 3 : 4 : /* Include the constants in one central spot */ 5 : 6 : #if FD_REEDSOL_ARITH_IMPL==0 7 : FD_IMPORT_BINARY( fd_reedsol_arith_consts_generic_mul, "src/ballet/reedsol/constants/generic_constants.bin" ); 8 : #elif FD_REEDSOL_ARITH_IMPL==1 9 : FD_IMPORT_BINARY( fd_reedsol_arith_consts_avx_mul, "src/ballet/reedsol/constants/avx2_constants.bin" ); 10 : #elif FD_REEDSOL_ARITH_IMPL==4 11 : FD_IMPORT_BINARY( fd_reedsol_arith_consts_neon_mul, "src/ballet/reedsol/constants/neon_constants.bin" ); 12 : #else 13 : FD_IMPORT_BINARY( fd_reedsol_arith_consts_gfni_mul, "src/ballet/reedsol/constants/gfni_constants.bin" ); 14 : #endif 15 : 16 : void 17 0 : fd_reedsol_encode_fini( fd_reedsol_t * rs ) { 18 : 19 0 : # if FD_REEDSOL_ARITH_IMPL==3 20 0 : if( FD_LIKELY( (rs->data_shred_cnt==32UL) & (rs->parity_shred_cnt==32UL ) ) ) { 21 0 : fd_reedsol_private_encode_32_32( rs->shred_sz, rs->encode.data_shred, rs->encode.parity_shred, rs->scratch ); 22 0 : for( ulong i=0UL; i<rs->parity_shred_cnt; i++ ) fd_msan_unpoison( rs->encode.parity_shred[ i ], rs->shred_sz ); 23 0 : } else 24 0 : # endif 25 0 : if( FD_UNLIKELY( rs->data_shred_cnt<=16UL ) ) 26 0 : fd_reedsol_private_encode_16 ( rs->shred_sz, rs->encode.data_shred, rs->data_shred_cnt, rs->encode.parity_shred, rs->parity_shred_cnt ); 27 0 : else if( FD_LIKELY( rs->data_shred_cnt<=32UL ) ) 28 0 : fd_reedsol_private_encode_32 ( rs->shred_sz, rs->encode.data_shred, rs->data_shred_cnt, rs->encode.parity_shred, rs->parity_shred_cnt ); 29 0 : else if( FD_LIKELY( rs->data_shred_cnt<=64UL ) ) 30 0 : fd_reedsol_private_encode_64 ( rs->shred_sz, rs->encode.data_shred, rs->data_shred_cnt, rs->encode.parity_shred, rs->parity_shred_cnt ); 31 0 : else 32 0 : fd_reedsol_private_encode_128( rs->shred_sz, rs->encode.data_shred, rs->data_shred_cnt, rs->encode.parity_shred, rs->parity_shred_cnt ); 33 : 34 0 : rs->data_shred_cnt = 0UL; 35 0 : rs->parity_shred_cnt = 0UL; 36 0 : } 37 : 38 : int 39 4572 : fd_reedsol_recover_fini( fd_reedsol_t * rs ) { 40 : 41 4572 : ulong data_shred_cnt = rs->data_shred_cnt; 42 4572 : ulong parity_shred_cnt = rs->parity_shred_cnt; 43 : 44 4572 : rs->data_shred_cnt = 0UL; 45 4572 : rs->parity_shred_cnt = 0UL; 46 : 47 : /* How many shreds do we need to consider in order to find 48 : rs->data_shred_cnt un-erased? */ 49 : 50 4572 : ulong unerased = 0UL; 51 4572 : ulong i = 0UL; 52 146304 : for( ; i<data_shred_cnt + parity_shred_cnt; i++ ) { 53 146304 : unerased += !rs->recover.erased[ i ]; 54 146304 : if( unerased==data_shred_cnt ) break; 55 146304 : } 56 4572 : if( FD_UNLIKELY( unerased!=data_shred_cnt ) ) return FD_REEDSOL_ERR_PARTIAL; 57 : 58 : # if 0 /* TODO: Add first variant for slightly more performance */ 59 : if( FD_LIKELY( i==data_shred_cnt ) ) { 60 : // Common case: we have all of the data shreds 61 : if( FD_UNLIKELY( i<=16UL ) ) 62 : return fd_reedsol_private_recover_first_16( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt ); 63 : if( FD_LIKELY( i<=32UL ) ) 64 : return fd_reedsol_private_recover_first_32( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt ); 65 : if( FD_LIKELY( i<=64UL ) ) 66 : return fd_reedsol_private_recover_first_64( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt ); 67 : return fd_reedsol_private_recover_first_128( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt ); 68 : } 69 : # endif 70 : 71 4572 : if( FD_UNLIKELY( i<16UL ) ) 72 0 : return fd_reedsol_private_recover_var_16( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased ); 73 4572 : if( FD_LIKELY( i<32UL ) ) 74 4572 : return fd_reedsol_private_recover_var_32( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased ); 75 0 : if( FD_LIKELY( i<64UL ) ) 76 0 : return fd_reedsol_private_recover_var_64( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased ); 77 0 : if( FD_LIKELY( i<128UL ) ) 78 0 : return fd_reedsol_private_recover_var_128( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased ); 79 : 80 0 : return fd_reedsol_private_recover_var_256( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased ); 81 0 : } 82 : 83 : char const * 84 0 : fd_reedsol_strerror( int err ) { 85 0 : switch( err ) { 86 0 : case FD_REEDSOL_SUCCESS: return "success"; 87 0 : case FD_REEDSOL_ERR_CORRUPT: return "corrupt"; 88 0 : case FD_REEDSOL_ERR_PARTIAL: return "partial"; 89 0 : default: break; 90 0 : } 91 0 : return "unknown"; 92 0 : }