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 187437 : fd_reedsol_encode_fini( fd_reedsol_t * rs ) { 18 : 19 62479 : # if FD_REEDSOL_ARITH_IMPL==3 20 62479 : if( FD_LIKELY( (rs->data_shred_cnt==32UL) & (rs->parity_shred_cnt==32UL ) ) ) { 21 62479 : fd_reedsol_private_encode_32_32( rs->shred_sz, rs->encode.data_shred, rs->encode.parity_shred, rs->scratch ); 22 2061807 : for( ulong i=0UL; i<rs->parity_shred_cnt; i++ ) fd_msan_unpoison( rs->encode.parity_shred[ i ], rs->shred_sz ); 23 62479 : } else 24 0 : # endif 25 124958 : 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 124958 : else if( FD_LIKELY( rs->data_shred_cnt<=32UL ) ) 28 124958 : 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 187437 : rs->data_shred_cnt = 0UL; 35 187437 : rs->parity_shred_cnt = 0UL; 36 187437 : } 37 : 38 : int 39 219 : fd_reedsol_recover_fini( fd_reedsol_t * rs ) { 40 : 41 219 : ulong data_shred_cnt = rs->data_shred_cnt; 42 219 : ulong parity_shred_cnt = rs->parity_shred_cnt; 43 : 44 219 : rs->data_shred_cnt = 0UL; 45 219 : 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 219 : ulong unerased = 0UL; 51 219 : ulong i = 0UL; 52 12207 : for( ; i<data_shred_cnt + parity_shred_cnt; i++ ) { 53 12207 : unerased += !rs->recover.erased[ i ]; 54 12207 : if( unerased==data_shred_cnt ) break; 55 12207 : } 56 219 : 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 219 : 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 219 : if( FD_LIKELY( i<32UL ) ) 74 39 : return fd_reedsol_private_recover_var_32( rs->shred_sz, rs->recover.shred, data_shred_cnt, parity_shred_cnt, rs->recover.erased ); 75 180 : if( FD_LIKELY( i<64UL ) ) 76 180 : 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 : }