30#define GALOIS_SINGLE_MULTIPLY "galois_single_multiply"
31#define GALOIS_UNINIT "galois_uninit_field"
34static int valid_pairs[][2] = { { 8, 32}, {16, 32}, {16, 64}, {-1, -1} };
43 galois_single_multiply_func fptr;
45 } func_handle = {.vptr = NULL};
47 return func_handle.fptr;
61 } func_handle = {.vptr = NULL};
63 return func_handle.fptr;
69 return dlopen(JERASURE_SONAME, RTLD_LAZY | RTLD_LOCAL);
76 if (NULL == routines->galois_single_multiply) {
88 if (NULL == routines->galois_uninit_field) {
98 alg_sig_t *alg_sig_handle;
99 int num_gf_lr_table_syms;
102 int alpha = 2, beta = 4, gamma = 8;
103 int num_components = sig_len / w;
105 alg_sig_handle = (alg_sig_t *)malloc(
sizeof(alg_sig_t));
106 if (NULL == alg_sig_handle) {
110 alg_sig_handle->jerasure_sohandle = jerasure_sohandle;
112 if (
load_gf_functions(alg_sig_handle->jerasure_sohandle, &(alg_sig_handle->mult_routines)) < 0) {
113 free(alg_sig_handle);
117 alg_sig_handle->sig_len = sig_len;
118 alg_sig_handle->gf_w = w;
120 num_gf_lr_table_syms = 1 << (w >> 1);
122 if (num_components >= 4) {
123 alg_sig_handle->tbl1_l = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
124 alg_sig_handle->tbl1_r = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
125 alg_sig_handle->tbl2_l = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
126 alg_sig_handle->tbl2_r = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
127 alg_sig_handle->tbl3_l = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
128 alg_sig_handle->tbl3_r = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
136 for (i = 0; i < 16; i++) {
137 if (num_components >= 4) {
138 alg_sig_handle->tbl1_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned char)(i << 4) & 0xf0, alpha, w);
139 alg_sig_handle->tbl1_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned char) i, alpha, w);
141 alg_sig_handle->tbl2_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned char) (i << 4) & 0xf0, beta, w);
142 alg_sig_handle->tbl2_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned char) i, beta, w);
144 alg_sig_handle->tbl3_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned char) (i << 4) & 0xf0, gamma, w);
145 alg_sig_handle->tbl3_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned char) i, gamma, w);
149 return alg_sig_handle;
155 alg_sig_t *alg_sig_handle;
156 int num_gf_lr_table_syms;
159 int alpha = 2, beta = 4, gamma = 8;
160 int num_components = sig_len / w;
162 if (NULL == jerasure_sohandle) {
166 alg_sig_handle = (alg_sig_t *)malloc(
sizeof(alg_sig_t));
167 if (NULL == alg_sig_handle) {
171 alg_sig_handle->jerasure_sohandle = jerasure_sohandle;
173 if (
load_gf_functions(alg_sig_handle->jerasure_sohandle, &(alg_sig_handle->mult_routines)) < 0) {
174 free(alg_sig_handle);
178 alg_sig_handle->sig_len = sig_len;
179 alg_sig_handle->gf_w = w;
181 num_gf_lr_table_syms = 1 << (w >> 1);
183 if (num_components >= 2) {
184 alg_sig_handle->tbl1_l = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
185 alg_sig_handle->tbl1_r = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
186 if (NULL == alg_sig_handle->tbl1_l || NULL == alg_sig_handle->tbl1_r) {
187 free(alg_sig_handle->tbl1_l);
188 free(alg_sig_handle->tbl1_r);
189 free(alg_sig_handle);
194 if (num_components >= 4) {
195 alg_sig_handle->tbl2_l = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
196 alg_sig_handle->tbl2_r = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
197 alg_sig_handle->tbl3_l = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
198 alg_sig_handle->tbl3_r = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
199 if (NULL == alg_sig_handle->tbl2_l || NULL == alg_sig_handle->tbl2_r ||
200 NULL == alg_sig_handle->tbl3_l || NULL == alg_sig_handle->tbl3_r) {
201 free(alg_sig_handle->tbl2_l);
202 free(alg_sig_handle->tbl2_r);
203 free(alg_sig_handle->tbl3_l);
204 free(alg_sig_handle->tbl3_r);
205 free(alg_sig_handle);
215 for (i = 0; i < 256; i++) {
216 if (num_components >= 2) {
217 alg_sig_handle->tbl1_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) (i << 8), alpha, w);
218 alg_sig_handle->tbl1_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) i, alpha, w);
221 if (num_components >= 4) {
222 alg_sig_handle->tbl2_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) (i << 8), beta, w);
223 alg_sig_handle->tbl2_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) i, beta, w);
225 alg_sig_handle->tbl3_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) (i << 8), gamma, w);
226 alg_sig_handle->tbl3_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) i, gamma, w);
230 return alg_sig_handle;
234alg_sig_t *init_alg_sig(
int sig_len,
int gf_w)
239 if (NULL == jerasure_sohandle) {
240 fprintf (stderr,
"Could not open Jerasure backend. Install Jerasure or fix LD_LIBRARY_PATH. Passing.\n");
258 }
else if (gf_w == 16) {
265void destroy_alg_sig(alg_sig_t* alg_sig_handle)
267 if (alg_sig_handle == NULL) {
270 if (alg_sig_handle->gf_w == 0) {
271 free(alg_sig_handle);
275 alg_sig_handle->mult_routines.galois_uninit_field(alg_sig_handle->gf_w);
276 dlclose(alg_sig_handle->jerasure_sohandle);
278 int num_components = alg_sig_handle->sig_len / alg_sig_handle->gf_w;
280 if (num_components >= 2) {
281 free(alg_sig_handle->tbl1_l);
282 free(alg_sig_handle->tbl1_r);
284 if (num_components >= 4) {
285 free(alg_sig_handle->tbl2_l);
286 free(alg_sig_handle->tbl2_r);
287 free(alg_sig_handle->tbl3_l);
288 free(alg_sig_handle->tbl3_r);
291 free(alg_sig_handle);
314 for (i = len - 2; i >= 0; i--) {
316 sig[1] = (buf[i] ^ (alg_sig_handle->tbl1_l[(sig[1] >> 4) & 0x0f] ^ alg_sig_handle->tbl1_r[sig[1] & 0x0f]));
317 sig[2] = (buf[i] ^ (alg_sig_handle->tbl2_l[(sig[2] >> 4) & 0x0f] ^ alg_sig_handle->tbl2_r[sig[2] & 0x0f]));
318 sig[3] = (buf[i] ^ (alg_sig_handle->tbl3_l[(sig[3] >> 4) & 0x0f] ^ alg_sig_handle->tbl3_r[sig[3] & 0x0f]));
328 int adj_len = len / 2;
330 unsigned short *_buf = (
unsigned short *)buf;
331 unsigned short sig_buf[4];
352 sig_buf[0] = (_buf[adj_len - 1] & bit_mask);
353 sig_buf[1] = (_buf[adj_len - 1] & bit_mask);
354 sig_buf[2] = (_buf[adj_len - 1] & bit_mask);
355 sig_buf[3] = (_buf[adj_len - 1] & bit_mask);
361 for (i = adj_len - 2; i >= 0; i--) {
362 sig_buf[0] ^= _buf[i];
363 sig_buf[1] = (_buf[i] ^ (alg_sig_handle->tbl1_l[(sig_buf[1] >> 8) & 0x00ff] ^ alg_sig_handle->tbl1_r[sig_buf[1] & 0x00ff]));
364 sig_buf[2] = (_buf[i] ^ (alg_sig_handle->tbl2_l[(sig_buf[2] >> 8) & 0x00ff] ^ alg_sig_handle->tbl2_r[sig_buf[2] & 0x00ff]));
365 sig_buf[3] = (_buf[i] ^ (alg_sig_handle->tbl3_l[(sig_buf[3] >> 8) & 0x00ff] ^ alg_sig_handle->tbl3_r[sig_buf[3] & 0x00ff]));
368 sig[0] = (char) (sig_buf[0] & 0x000ff);
369 sig[1] = (char) ((sig_buf[0] >> 8) & 0x000ff);
370 sig[2] = (char) (sig_buf[1] & 0x00ff);
371 sig[3] = (char) ((sig_buf[1] >> 8) & 0x00ff);
372 sig[4] = (char) (sig_buf[2] & 0x00ff);
373 sig[5] = (char) ((sig_buf[2] >> 8) & 0x00ff);
374 sig[6] = (char) (sig_buf[3] & 0x00ff);
375 sig[7] = (char) ((sig_buf[3] >> 8) & 0x00ff);
383 int adj_len = len / 2;
385 unsigned short *_buf = (
unsigned short *)buf;
386 unsigned short sig_buf[2];
407 sig_buf[0] = (_buf[adj_len - 1] & bit_mask);
408 sig_buf[1] = (_buf[adj_len - 1] & bit_mask);
414 for (i = adj_len - 2; i >= 0; i--) {
415 sig_buf[0] ^= _buf[i];
416 sig_buf[1] = (_buf[i] ^ (alg_sig_handle->tbl1_l[(sig_buf[1] >> 8) & 0x00ff] ^ alg_sig_handle->tbl1_r[sig_buf[1] & 0x00ff]));
419 sig[0] = (char) (sig_buf[0] & 0x000ff);
420 sig[1] = (char) ((sig_buf[0] >> 8) & 0x000ff);
421 sig[2] = (char) (sig_buf[1] & 0x00ff);
422 sig[3] = (char) ((sig_buf[1] >> 8) & 0x00ff);
429 if (alg_sig_handle->gf_w == 8) {
431 }
else if (alg_sig_handle->gf_w == 16) {
440 if (alg_sig_handle->gf_w == 16) {
447int compute_alg_sig(alg_sig_t *alg_sig_handle,
char *buf,
int len,
char *sig)
449 if (alg_sig_handle->sig_len == 32) {
451 }
else if (alg_sig_handle->sig_len == 64) {
static int compute_w16_alg_sig_32(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
static void stub_galois_uninit_field(int w)
static void * get_jerasure_sohandle(void)
static alg_sig_t * init_alg_sig_w16(void *jerasure_sohandle, int sig_len)
static int compute_w8_alg_sig_32(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
#define GALOIS_SINGLE_MULTIPLY
static galois_single_multiply_func get_galois_multi_func(void *handle)
static int compute_w16_alg_sig_64(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
static int valid_pairs[][2]
__attribute__((visibility("internal")))
static int load_gf_functions(void *sohandle, struct jerasure_mult_routines *routines)
static int compute_alg_sig_64(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
static alg_sig_t * init_alg_sig_w8(void *jerasure_sohandle, int sig_len)
static int compute_alg_sig_32(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
static galois_uninit_field_func get_galois_uninit_func(void *handle)
void(* galois_uninit_field_func)(int)