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