ex: Allow erasure list in any order in ec example

Previous gf_gen_decode_matrix_simple() assumed that all source errors
were listed first before any erasures in parity.  Generalized to work
in any order.

Change-Id: I31b9c0c0db5d0155473424ccd0ecdcdd787ef71f
Signed-off-by: Greg Tucker <greg.b.tucker@intel.com>
This commit is contained in:
Greg Tucker 2018-05-18 18:06:41 -07:00
parent 19f2c46d1b
commit 9edac4799d

View File

@ -99,10 +99,9 @@ int main(int argc, char *argv[])
break; break;
case 'r': case 'r':
srand(atoi(optarg)); srand(atoi(optarg));
k = rand() % MMAX; k = (rand() % (MMAX - 1)) + 1; // Pick k {1 to MMAX - 1}
k++; // Pick k (1 to MMAX) p = (rand() % (MMAX - k)) + 1; // Pick p {1 to MMAX - k}
p = rand() % (MMAX - k);
p++; // Pick p (1 to MMAX - k)
for (i = 0; i < k + p && nerrs < p; i++) for (i = 0; i < k + p && nerrs < p; i++)
if (rand() & 1) if (rand() & 1)
frag_err_list[nerrs++] = i; frag_err_list[nerrs++] = i;
@ -255,22 +254,24 @@ static int gf_gen_decode_matrix_simple(u8 * encode_matrix,
return -1; return -1;
// Get decode matrix with only wanted recovery rows // Get decode matrix with only wanted recovery rows
for (i = 0; i < nsrcerrs; i++) { for (i = 0; i < nerrs; i++) {
for (j = 0; j < k; j++) { if (frag_err_list[i] < k) // A src err
decode_matrix[k * i + j] = invert_matrix[k * frag_err_list[i] + j]; for (j = 0; j < k; j++)
} decode_matrix[k * i + j] =
invert_matrix[k * frag_err_list[i] + j];
} }
// For non-src (parity) erasures need to multiply encode matrix * invert // For non-src (parity) erasures need to multiply encode matrix * invert
for (p = nsrcerrs; p < nerrs; p++) { for (p = 0; p < nerrs; p++) {
if (frag_err_list[p] >= k) { // A parity err
for (i = 0; i < k; i++) { for (i = 0; i < k; i++) {
s = 0; s = 0;
for (j = 0; j < k; j++) for (j = 0; j < k; j++)
s ^= gf_mul(invert_matrix[j * k + i], s ^= gf_mul(invert_matrix[j * k + i],
encode_matrix[k * frag_err_list[p] + j]); encode_matrix[k * frag_err_list[p] + j]);
decode_matrix[k * p + i] = s; decode_matrix[k * p + i] = s;
} }
} }
}
return 0; return 0;
} }