30#define GALOIS_SINGLE_MULTIPLY "galois_single_multiply"
31#define GALOIS_UNINIT "galois_uninit_field"
34int 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);
188 if (num_components >= 4) {
189 alg_sig_handle->tbl2_l = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
190 alg_sig_handle->tbl2_r = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
191 alg_sig_handle->tbl3_l = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
192 alg_sig_handle->tbl3_r = (
int*)malloc(
sizeof(
int) * num_gf_lr_table_syms);
200 for (i = 0; i < 256; i++) {
201 alg_sig_handle->tbl1_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) (i << 8), alpha, w);
202 alg_sig_handle->tbl1_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) i, alpha, w);
204 if (num_components >= 4) {
205 alg_sig_handle->tbl2_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) (i << 8), beta, w);
206 alg_sig_handle->tbl2_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) i, beta, w);
208 alg_sig_handle->tbl3_l[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) (i << 8), gamma, w);
209 alg_sig_handle->tbl3_r[i] = alg_sig_handle->mult_routines.galois_single_multiply((
unsigned short) i, gamma, w);
213 return alg_sig_handle;
221 if (NULL == jerasure_sohandle) {
222 fprintf (stderr,
"Could not open Jerasure backend. Install Jerasure or fix LD_LIBRARY_PATH. Passing.\n");
240 }
else if (gf_w == 16) {
248 if (alg_sig_handle == NULL) {
251 if (alg_sig_handle->gf_w == 0) {
252 free(alg_sig_handle);
256 alg_sig_handle->mult_routines.galois_uninit_field(alg_sig_handle->gf_w);
257 dlclose(alg_sig_handle->jerasure_sohandle);
259 int num_components = alg_sig_handle->sig_len / alg_sig_handle->gf_w;
261 free(alg_sig_handle->tbl1_l);
262 free(alg_sig_handle->tbl1_r);
263 if (num_components >= 4) {
264 free(alg_sig_handle->tbl2_l);
265 free(alg_sig_handle->tbl2_r);
266 free(alg_sig_handle->tbl3_l);
267 free(alg_sig_handle->tbl3_r);
270 free(alg_sig_handle);
293 for (i = len - 2; i >= 0; i--) {
295 sig[1] = (buf[i] ^ (alg_sig_handle->tbl1_l[(sig[1] >> 4) & 0x0f] ^ alg_sig_handle->tbl1_r[sig[1] & 0x0f]));
296 sig[2] = (buf[i] ^ (alg_sig_handle->tbl2_l[(sig[2] >> 4) & 0x0f] ^ alg_sig_handle->tbl2_r[sig[2] & 0x0f]));
297 sig[3] = (buf[i] ^ (alg_sig_handle->tbl3_l[(sig[3] >> 4) & 0x0f] ^ alg_sig_handle->tbl3_r[sig[3] & 0x0f]));
307 int adj_len = len / 2;
309 unsigned short *_buf = (
unsigned short *)buf;
310 unsigned short sig_buf[4];
331 sig_buf[0] = (_buf[adj_len - 1] & bit_mask);
332 sig_buf[1] = (_buf[adj_len - 1] & bit_mask);
333 sig_buf[2] = (_buf[adj_len - 1] & bit_mask);
334 sig_buf[3] = (_buf[adj_len - 1] & bit_mask);
340 for (i = adj_len - 2; i >= 0; i--) {
341 sig_buf[0] ^= _buf[i];
342 sig_buf[1] = (_buf[i] ^ (alg_sig_handle->tbl1_l[(sig_buf[1] >> 8) & 0x00ff] ^ alg_sig_handle->tbl1_r[sig_buf[1] & 0x00ff]));
343 sig_buf[2] = (_buf[i] ^ (alg_sig_handle->tbl2_l[(sig_buf[2] >> 8) & 0x00ff] ^ alg_sig_handle->tbl2_r[sig_buf[2] & 0x00ff]));
344 sig_buf[3] = (_buf[i] ^ (alg_sig_handle->tbl3_l[(sig_buf[3] >> 8) & 0x00ff] ^ alg_sig_handle->tbl3_r[sig_buf[3] & 0x00ff]));
347 sig[0] = (char) (sig_buf[0] & 0x000ff);
348 sig[1] = (char) ((sig_buf[0] >> 8) & 0x000ff);
349 sig[2] = (char) (sig_buf[1] & 0x00ff);
350 sig[3] = (char) ((sig_buf[1] >> 8) & 0x00ff);
351 sig[4] = (char) (sig_buf[2] & 0x00ff);
352 sig[5] = (char) ((sig_buf[2] >> 8) & 0x00ff);
353 sig[6] = (char) (sig_buf[3] & 0x00ff);
354 sig[7] = (char) ((sig_buf[3] >> 8) & 0x00ff);
362 int adj_len = len / 2;
364 unsigned short *_buf = (
unsigned short *)buf;
365 unsigned short sig_buf[2];
386 sig_buf[0] = (_buf[adj_len - 1] & bit_mask);
387 sig_buf[1] = (_buf[adj_len - 1] & bit_mask);
393 for (i = adj_len - 2; i >= 0; i--) {
394 sig_buf[0] ^= _buf[i];
395 sig_buf[1] = (_buf[i] ^ (alg_sig_handle->tbl1_l[(sig_buf[1] >> 8) & 0x00ff] ^ alg_sig_handle->tbl1_r[sig_buf[1] & 0x00ff]));
398 sig[0] = (char) (sig_buf[0] & 0x000ff);
399 sig[1] = (char) ((sig_buf[0] >> 8) & 0x000ff);
400 sig[2] = (char) (sig_buf[1] & 0x00ff);
401 sig[3] = (char) ((sig_buf[1] >> 8) & 0x00ff);
408 if (alg_sig_handle->gf_w == 8) {
410 }
else if (alg_sig_handle->gf_w == 16) {
419 if (alg_sig_handle->gf_w == 16) {
427 if (alg_sig_handle->sig_len == 32) {
429 }
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)
int load_gf_functions(void *sohandle, struct jerasure_mult_routines *routines)
static alg_sig_t * init_alg_sig_w16(void *jerasure_sohandle, int sig_len)
alg_sig_t * init_alg_sig(int sig_len, int gf_w)
void destroy_alg_sig(alg_sig_t *alg_sig_handle)
int compute_alg_sig(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
static int compute_w8_alg_sig_32(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
#define GALOIS_SINGLE_MULTIPLY
galois_uninit_field_func get_galois_uninit_func(void *handle)
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)
void stub_galois_uninit_field(int w)
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)
void * get_jerasure_sohandle()
static int compute_alg_sig_32(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
void(* galois_uninit_field_func)(int)