Codebase list liberasurecode / 512353f
Compile in pedantic mode and fail compilation on warnings. Also cleanup all existing warnings. Eric Lambert 9 years ago
20 changed file(s) with 226 addition(s) and 152 deletion(s). Raw diff Collapse all Expand all
4141 if test x$debug = xtrue ; then
4242 DEBUG=1
4343 CXXFLAGS=""
44 CFLAGS="-O0 -ggdb -g3 -Werror -D_GNU_SOURCE=1"
44 CFLAGS="-O0 -ggdb -g3 -Werror -D_GNU_SOURCE=1 -Wall -pedantic -std=c99"
4545 else
4646 DEBUG=0
4747 CXXFLAGS=""
48 CFLAGS="-O2 -g -Werror -D_GNU_SOURCE=1"
48 CFLAGS="-O2 -g -Werror -D_GNU_SOURCE=1 -Wall -pedantic -std=c99"
4949 fi
5050
5151 AC_ARG_ENABLE([gcov],
2424 #ifndef _ALG_SIG_H
2525 #define _ALG_SIG_H
2626
27 typedef int (*galois_single_multiply_func)(int, int, int);
28
2729 struct jerasure_mult_routines {
28 int (*galois_single_multiply)(int, int, int);
30 galois_single_multiply_func galois_single_multiply;
2931 };
3032
3133 #define JERASURE_SONAME "libJerasure.dylib"
4646 EC_BACKENDS_MAX,
4747 } ec_backend_id_t;
4848
49 #ifndef EC_BACKENDS_SUPPORTED
50 #define EC_BACKENDS_SUPPORTED
51 /* Supported EC backends */
52 static const char *ec_backend_names[EC_BACKENDS_MAX] = {
53 "null",
54 "jerasure_rs_vand",
55 "jerasure_rs_cauchy",
56 "flat_xor_hd",
57 };
58 #endif // EC_BACKENDS_SUPPORTED
59
6049 /* ~=*=~==~=*=~= EC Fragment metadata - supported checksum types ~=*=~==~=*=~ */
6150
6251 /* Checksum types supported for fragment metadata stored in each fragment */
6655 CHKSUM_MD5 = 2,
6756 CHKSUM_TYPES_MAX,
6857 } ec_checksum_type_t;
69
70 #ifndef EC_CHKSUM_TYPES_SUPPORTED
71 #define EC_CHKSUM_TYPES_SUPPORTED
72 /* Supported EC backends */
73 static const char *ec_chksum_types[CHKSUM_TYPES_MAX] = {
74 "none",
75 "crc32",
76 "md5",
77 };
78 #endif // EC_CHKSUM_TYPES_SUPPORTED
7958
8059 /* =~=*=~==~=*=~== EC Arguments - Common and backend-specific =~=*=~==~=*=~== */
8160
134134 int set_orig_data_size(char *buf, int orig_data_size);
135135 int get_orig_data_size(char *buf);
136136 int validate_fragment(char *buf);
137 int set_checksum(char *buf, int chksum);
137 int set_checksum(char *buf, int blocksize);
138138 int get_checksum(char *buf);
139139
140140 /* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
2929 #define _ERASURECODE_POSTPROCESSING_H_
3030
3131 int finalize_fragments_after_encode(ec_backend_t instance,
32 int k, int m, int blocksize,
32 int k, int m, int blocksize, uint64_t orig_data_size,
3333 char **encoded_data, char **encoded_parity);
3434
35 void add_fragment_metadata(char *fragment,
36 int idx, uint64_t orig_data_size, int blocksize,
37 int add_chksum);
38
3539 #endif
5353 int k;
5454 int m;
5555 int hd;
56 int *parity_bms;
57 int *data_bms;
56 unsigned int *parity_bms;
57 unsigned int *data_bms;
5858 int (*decode)(struct xor_code_s *code_desc, char **data, char **parity, int *missing_idxs, int blocksize, int decode_parity);
5959 void (*encode)(struct xor_code_s *code_desc, char **data, char **parity, int blocksize);
6060 int (*fragments_needed)(struct xor_code_s *code_desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed);
3636 struct ec_backend_op_stubs jerasure_rs_cauchy_ops;
3737 struct ec_backend jerasure_rs_cauchy;
3838
39 typedef int* (*cauchy_original_coding_matrix_func)(int, int, int);
40 typedef int* (*jerasure_matrix_to_bitmatrix_func)(int, int, int, int *);
41 typedef int** (*jerasure_smart_bitmatrix_to_schedule_func)(int, int, int, int *);
42 typedef void (*jerasure_bitmatrix_encode_func)(int, int, int, int *, char **, char **, int, int);
43 typedef int (*jerasure_bitmatrix_decode_func)(int, int, int, int *, int, int *,char **, char **, int, int);
44 typedef int * (*jerasure_erasures_to_erased_func)(int, int, int *);
45 typedef int (*jerasure_make_decoding_bitmatrix_func)(int, int, int, int *, int *, int *, int *);
46 typedef void (*jerasure_bitmatrix_dotprod_func)(int, int, int *, int *, int,char **, char **, int, int);
47
48
49
3950 /*
4051 * ToDo (KMG): Should we make this a parameter, or is that
4152 * exposing too much b.s. to the client?
4455
4556 struct jerasure_rs_cauchy_descriptor {
4657 /* calls required for init */
47 int * (*cauchy_original_coding_matrix)(int, int, int);
48 int * (*jerasure_matrix_to_bitmatrix)(int, int, int, int*);
49 int ** (*jerasure_smart_bitmatrix_to_schedule)(int, int, int, int*);
50
58 cauchy_original_coding_matrix_func cauchy_original_coding_matrix;
59 jerasure_matrix_to_bitmatrix_func jerasure_matrix_to_bitmatrix;
60 jerasure_smart_bitmatrix_to_schedule_func jerasure_smart_bitmatrix_to_schedule;
61
5162 /* calls required for encode */
52 void (*jerasure_bitmatrix_encode)(int, int, int, int *, char **, char **, int, int);
63 jerasure_bitmatrix_encode_func jerasure_bitmatrix_encode;
5364
5465
5566 /* calls required for decode */
56 int (*jerasure_bitmatrix_decode)(int, int, int, int *, int, int *,char **, char **, int, int);
67 jerasure_bitmatrix_decode_func jerasure_bitmatrix_decode;
5768
5869
5970 /* calls required for reconstruct */
60 int * (*jerasure_erasures_to_erased)(int, int, int *);
61 int (*jerasure_make_decoding_bitmatrix)(int, int, int, int *, int *, int *, int *);
62 void (*jerasure_bitmatrix_dotprod)(int, int, int *, int *, int,char **, char **, int, int);
71 jerasure_erasures_to_erased_func jerasure_erasures_to_erased;
72 jerasure_make_decoding_bitmatrix_func jerasure_make_decoding_bitmatrix;
73 jerasure_bitmatrix_dotprod_func jerasure_bitmatrix_dotprod;
6374
6475 /* fields needed to hold state */
6576 int *matrix;
92103 (struct jerasure_rs_cauchy_descriptor*)desc;
93104
94105 /* FIXME - make jerasure_matrix_decode return a value */
95 jerasure_desc->jerasure_bitmatrix_decode(jerasure_desc->k,
106 return jerasure_desc->jerasure_bitmatrix_decode(jerasure_desc->k,
96107 jerasure_desc->m,
97108 jerasure_desc->w,
98109 jerasure_desc->bitmatrix,
180191 }
181192 }
182193
183 out:
184194 return ret;
185195 }
186196
220230 goto error;
221231 }
222232 }
233
234 /*
235 * ISO C forbids casting a void* to a function pointer.
236 * Since dlsym return returns a void*, we use this union to
237 * "transform" the void* to a function pointer.
238 */
239 union {
240 cauchy_original_coding_matrix_func initp;
241 jerasure_matrix_to_bitmatrix_func matrixtobitmatrixp;
242 jerasure_smart_bitmatrix_to_schedule_func matrixschedulep;
243 jerasure_bitmatrix_encode_func encodep;
244 jerasure_bitmatrix_decode_func decodep;
245 jerasure_erasures_to_erased_func erasedp;
246 jerasure_make_decoding_bitmatrix_func decodematrixp;
247 jerasure_bitmatrix_dotprod_func dotprodp;
248 void *vptr;
249 } func_handle = {.vptr = NULL};
223250
224251 /* fill in function addresses */
225 desc->jerasure_bitmatrix_encode = dlsym(
226 backend_sohandle, "jerasure_bitmatrix_encode");
252 func_handle.vptr = NULL;
253 func_handle.vptr = dlsym(backend_sohandle, "jerasure_bitmatrix_encode");
254 desc->jerasure_bitmatrix_encode = func_handle.encodep;
227255 if (NULL == desc->jerasure_bitmatrix_encode) {
228256 goto error;
229257 }
230258
231 desc->jerasure_bitmatrix_decode = dlsym(
232 backend_sohandle, "jerasure_bitmatrix_decode");
259 func_handle.vptr = NULL;
260 func_handle.vptr = dlsym(backend_sohandle, "jerasure_bitmatrix_decode");
261 desc->jerasure_bitmatrix_decode = func_handle.decodep;
233262 if (NULL == desc->jerasure_bitmatrix_decode) {
234263 goto error;
235264 }
236265
237 desc->cauchy_original_coding_matrix = dlsym(
238 backend_sohandle, "cauchy_original_coding_matrix");
266 func_handle.vptr = NULL;
267 func_handle.vptr = dlsym(backend_sohandle, "cauchy_original_coding_matrix");
268 desc->cauchy_original_coding_matrix = func_handle.initp;
239269 if (NULL == desc->cauchy_original_coding_matrix) {
240270 goto error;
241271 }
242272
243 desc->jerasure_matrix_to_bitmatrix = dlsym(
244 backend_sohandle, "jerasure_matrix_to_bitmatrix");
273 func_handle.vptr = NULL;
274 func_handle.vptr = dlsym(backend_sohandle, "jerasure_matrix_to_bitmatrix");
275 desc->jerasure_matrix_to_bitmatrix = func_handle.matrixtobitmatrixp;
245276 if (NULL == desc->jerasure_matrix_to_bitmatrix) {
246277 goto error;
247278 }
248279
249 desc->jerasure_smart_bitmatrix_to_schedule = dlsym(
250 backend_sohandle, "jerasure_smart_bitmatrix_to_schedule");
280 func_handle.vptr = NULL;
281 func_handle.vptr = dlsym(backend_sohandle, "jerasure_smart_bitmatrix_to_schedule");
282 desc->jerasure_smart_bitmatrix_to_schedule = func_handle.matrixschedulep;
251283 if (NULL == desc->jerasure_smart_bitmatrix_to_schedule) {
252284 goto error;
253285 }
254286
255 desc->jerasure_make_decoding_bitmatrix = dlsym(
256 backend_sohandle, "jerasure_make_decoding_bitmatrix");
287 func_handle.vptr = NULL;
288 func_handle.vptr = dlsym(backend_sohandle, "jerasure_make_decoding_bitmatrix");
289 desc->jerasure_make_decoding_bitmatrix = func_handle.decodematrixp;
257290 if (NULL == desc->jerasure_make_decoding_bitmatrix) {
258291 goto error;
259292 }
260293
261 desc->jerasure_bitmatrix_dotprod = dlsym(
262 backend_sohandle, "jerasure_bitmatrix_dotprod");
294 func_handle.vptr = NULL;
295 func_handle.vptr = dlsym(backend_sohandle, "jerasure_bitmatrix_dotprod");
296 desc->jerasure_bitmatrix_dotprod = func_handle.dotprodp;
263297 if (NULL == desc->jerasure_bitmatrix_dotprod) {
264298 goto error;
265299 }
266300
267 desc->jerasure_erasures_to_erased = dlsym(
268 backend_sohandle, "jerasure_erasures_to_erased");
301 func_handle.vptr = NULL;
302 func_handle.vptr = dlsym(backend_sohandle, "jerasure_erasures_to_erased");
303 desc->jerasure_erasures_to_erased = func_handle.erasedp;
269304 if (NULL == desc->jerasure_erasures_to_erased) {
270305 goto error;
271306 }
323358 free(jerasure_desc->schedule);
324359 }
325360 free(desc);
361 return 0;
326362 }
327363
328364 struct ec_backend_op_stubs jerasure_rs_cauchy_op_stubs = {
3636 struct ec_backend_op_stubs jerasure_rs_vand_ops;
3737 struct ec_backend jerasure_rs_vand;
3838
39 typedef int* (*reed_sol_vandermonde_coding_matrix_func)(int, int, int);
40 typedef void (*jerasure_matrix_encode_func)(int, int, int, int*, char **, char **, int);
41 typedef int (*jerasure_matrix_decode_func)(int, int, int, int *, int, int*, char **, char **, int);
42 typedef int (*jerasure_make_decoding_matrix_func)(int, int, int, int *, int *, int *, int *);
43 typedef int * (*jerasure_erasures_to_erased_func)(int, int, int *);
44 typedef void (*jerasure_matrix_dotprod_func)(int, int, int *,int *, int,char **, char **, int);
45
3946 struct jerasure_rs_vand_descriptor {
4047 /* calls required for init */
41 int * (*reed_sol_vandermonde_coding_matrix)(int, int, int);
48 reed_sol_vandermonde_coding_matrix_func reed_sol_vandermonde_coding_matrix;
4249
4350 /* calls required for encode */
44 void (*jerasure_matrix_encode)(int, int, int, int*, char **, char **, int);
51 jerasure_matrix_encode_func jerasure_matrix_encode;
4552
4653 /* calls required for decode */
47 int (*jerasure_matrix_decode)(int, int, int, int *, int, int*, char **, char **, int);
54 jerasure_matrix_decode_func jerasure_matrix_decode;
4855
4956 /* calls required for reconstruct */
50 int (*jerasure_make_decoding_matrix)(int, int, int, int *, int *, int *, int *);
51 int * (*jerasure_erasures_to_erased)(int, int, int *);
52 void (*jerasure_matrix_dotprod)(int, int, int *,int *, int,char **, char **, int);
57 jerasure_make_decoding_matrix_func jerasure_make_decoding_matrix;
58 jerasure_erasures_to_erased_func jerasure_erasures_to_erased;
59 jerasure_matrix_dotprod_func jerasure_matrix_dotprod;
5360
5461 /* fields needed to hold state */
5562 int *matrix;
160167 }
161168 }
162169
163 out:
164170 return ret;
165171 }
166172
197203 }
198204 }
199205
206 /*
207 * ISO C forbids casting a void* to a function pointer.
208 * Since dlsym return returns a void*, we use this union to
209 * "transform" the void* to a function pointer.
210 */
211 union {
212 reed_sol_vandermonde_coding_matrix_func initp;
213 jerasure_matrix_encode_func encodep;
214 jerasure_matrix_decode_func decodep;
215 jerasure_make_decoding_matrix_func decodematrixp;
216 jerasure_erasures_to_erased_func erasep;
217 jerasure_matrix_dotprod_func dotprodp;
218 void *vptr;
219 } func_handle = {.vptr = NULL};
220
221
200222 /* fill in function addresses */
201 desc->jerasure_matrix_encode = dlsym(
202 backend_sohandle, "jerasure_matrix_encode");
223 func_handle.vptr = NULL;
224 func_handle.vptr = dlsym(backend_sohandle, "jerasure_matrix_encode");
225 desc->jerasure_matrix_encode = func_handle.encodep;
203226 if (NULL == desc->jerasure_matrix_encode) {
204227 goto error;
205228 }
206229
207 desc->jerasure_matrix_decode = dlsym(
208 backend_sohandle, "jerasure_matrix_decode");
230 func_handle.vptr = NULL;
231 func_handle.vptr = dlsym(backend_sohandle, "jerasure_matrix_decode");
232 desc->jerasure_matrix_decode = func_handle.decodep;
209233 if (NULL == desc->jerasure_matrix_decode) {
210234 goto error;
211235 }
212236
213 desc->jerasure_make_decoding_matrix = dlsym(
214 backend_sohandle, "jerasure_make_decoding_matrix");
237 func_handle.vptr = NULL;
238 func_handle.vptr = dlsym(backend_sohandle, "jerasure_make_decoding_matrix");
239 desc->jerasure_make_decoding_matrix = func_handle.decodematrixp;
215240 if (NULL == desc->jerasure_make_decoding_matrix) {
216241 goto error;
217242 }
218243
219 desc->jerasure_matrix_dotprod = dlsym(
220 backend_sohandle, "jerasure_matrix_dotprod");
244 func_handle.vptr = NULL;
245 func_handle.vptr = dlsym(backend_sohandle, "jerasure_matrix_dotprod");
246 desc->jerasure_matrix_dotprod = func_handle.dotprodp;
221247 if (NULL == desc->jerasure_matrix_dotprod) {
222248 goto error;
223249 }
224250
225 desc->jerasure_erasures_to_erased = dlsym(
226 backend_sohandle, "jerasure_erasures_to_erased");
251 func_handle.vptr = NULL;
252 func_handle.vptr = dlsym(backend_sohandle, "jerasure_erasures_to_erased");
253 desc->jerasure_erasures_to_erased = func_handle.erasep;
227254 if (NULL == desc->jerasure_erasures_to_erased) {
228255 goto error;
229256 }
230257
231 desc->reed_sol_vandermonde_coding_matrix = dlsym(
232 backend_sohandle, "reed_sol_vandermonde_coding_matrix");
258 func_handle.vptr = NULL;
259 func_handle.vptr = dlsym(backend_sohandle, "reed_sol_vandermonde_coding_matrix");
260 desc->reed_sol_vandermonde_coding_matrix = func_handle.initp;
233261 if (NULL == desc->reed_sol_vandermonde_coding_matrix) {
234262 goto error;
235263 }
272300 jerasure_desc = (struct jerasure_rs_vand_descriptor*) desc;
273301
274302 free(jerasure_desc);
303
304 return 0;
275305 }
276306
277307 struct ec_backend_op_stubs jerasure_rs_vand_op_stubs = {
3535 struct ec_backend null;
3636 struct ec_backend_op_stubs null_ops;
3737
38 typedef void* (*init_null_code_func)(int, int, int);
39 typedef int (*null_code_encode_func)(void *, char **, char **, int);
40 typedef int (*null_code_decode_func)(void *, char **, char **, int *, int, int);
41 typedef int (*null_reconstruct_func)(char **, int, uint64_t, int, char *);
42 typedef int (*null_code_fragments_needed_func)(void *, int *, int *, int *);
43
3844 struct null_descriptor {
3945 /* calls required for init */
40 void* (*init_null_code)(int k, int m, int hd);
46 init_null_code_func init_null_code;
4147
4248 /* calls required for encode */
43 int (*null_code_encode)(void *code_desc, char **data, char **parity,
44 int blocksize);
49 null_code_encode_func null_code_encode;
4550
4651 /* calls required for decode */
47 int (*null_code_decode)(void *code_desc, char **data, char **parity,
48 int *missing_idxs, int blocksize, int decode_parity);
52 null_code_decode_func null_code_decode;
4953
5054 /* calls required for reconstruct */
51 int (*null_reconstruct)(char **available_fragments, int num_fragments,
52 uint64_t fragment_len, int destination_idx, char* out_fragment);
55 null_reconstruct_func null_reconstruct;
5356
5457 /* set of fragments needed to reconstruct at a minimum */
55 int (*null_code_fragments_needed)(void *code_desc, int *missing_idxs,
56 int *fragments_to_exclude, int *fragments_needed);
58 null_code_fragments_needed_func null_code_fragments_needed;
5759
5860 /* fields needed to hold state */
5961 int *matrix;
6769
6870 static int null_encode(void *desc, char **data, char **parity, int blocksize)
6971 {
70 struct null_descriptor *xdesc = (struct null_descriptor *) desc;
71
7272 return 0;
7373 }
7474
7575 static int null_decode(void *desc, char **data, char **parity,
7676 int *missing_idxs, int blocksize)
7777 {
78 struct null_descriptor *xdesc = (struct null_descriptor *) desc;
79
8078 return 0;
8179 }
8280
8381 static int null_reconstruct(void *desc, char **data, char **parity,
8482 int *missing_idxs, int destination_idx, int blocksize)
8583 {
86 struct null_descriptor *xdesc = (struct null_descriptor *) desc;
87
8884 return 0;
8985 }
9086
9187 static int null_min_fragments(void *desc, int *missing_idxs,
9288 int *fragments_to_exclude, int *fragments_needed)
9389 {
94 struct null_descriptor *xdesc = (struct null_descriptor *) desc;
95
9690 return 0;
9791 }
9892
142136 }
143137 }
144138
139 /*
140 * ISO C forbids casting a void* to a function pointer.
141 * Since dlsym return returns a void*, we use this union to
142 * "transform" the void* to a function pointer.
143 */
144 union {
145 init_null_code_func initp;
146 null_code_encode_func encodep;
147 null_code_decode_func decodep;
148 null_reconstruct_func reconp;
149 null_code_fragments_needed_func fragsneededp;
150 void *vptr;
151 } func_handle = {.vptr = NULL};
152
145153 /* fill in function addresses */
146 xdesc->init_null_code = dlsym(
147 backend_sohandle, "null_code_init");
154 func_handle.vptr = NULL;
155 func_handle.vptr = dlsym(backend_sohandle, "null_code_init");
156 xdesc->init_null_code = func_handle.initp;
148157 if (NULL == xdesc->init_null_code) {
149158 goto error;
150159 }
151160
152 xdesc->null_code_encode = dlsym(
153 backend_sohandle, "null_code_encode");
161 func_handle.vptr = NULL;
162 func_handle.vptr = dlsym(backend_sohandle, "null_code_encode");
163 xdesc->null_code_encode = func_handle.encodep;
154164 if (NULL == xdesc->null_code_encode) {
155165 goto error;
156166 }
157167
158 xdesc->null_code_decode = dlsym(
159 backend_sohandle, "null_code_decode");
168 func_handle.vptr = NULL;
169 func_handle.vptr = dlsym(backend_sohandle, "null_code_decode");
170 xdesc->null_code_decode = func_handle.decodep;
160171 if (NULL == xdesc->null_code_decode) {
161172 goto error;
162173 }
163174
164 xdesc->null_reconstruct = dlsym(
165 backend_sohandle, "null_reconstruct");
175 func_handle.vptr = NULL;
176 func_handle.vptr = dlsym(backend_sohandle, "null_reconstruct");
177 xdesc->null_reconstruct = func_handle.reconp;
166178 if (NULL == xdesc->null_reconstruct) {
167179 goto error;
168180 }
169181
170 xdesc->null_code_fragments_needed = dlsym(
171 backend_sohandle, "null_code_fragments_needed");
182 func_handle.vptr = NULL;
183 func_handle.vptr = dlsym(backend_sohandle, "null_code_fragments_needed");
184 xdesc->null_code_fragments_needed = func_handle.fragsneededp;
172185 if (NULL == xdesc->null_code_fragments_needed) {
173186 goto error;
174187 }
186199 struct null_descriptor *xdesc = (struct null_descriptor *) desc;
187200
188201 free (xdesc);
202 return 0;
189203 }
190204
191205 struct ec_backend_op_stubs null_op_stubs = {
3636 struct ec_backend_op_stubs flat_xor_hd_ops;
3737 struct ec_backend flat_xor_hd;
3838
39 typedef xor_code_t* (*init_xor_hd_code_func)(int, int, int);
40 typedef void (*xor_code_encode_func)(xor_code_t *, char **, char **, int);
41 typedef int (*xor_code_decode_func)(xor_code_t *, char **, char **, int *, int, int);
42 typedef int (*xor_hd_fragments_needed_func)(xor_code_t *, int *, int *, int *);
43
3944 struct flat_xor_hd_descriptor {
4045 xor_code_t *xor_desc;
41
42 xor_code_t* (*init_xor_hd_code)(int k, int m, int hd);
43 void (*xor_code_encode)(xor_code_t *code_desc, char **data, char **parity,
44 int blocksize);
45 int (*xor_hd_decode)(xor_code_t *code_desc, char **data, char **parity,
46 int *missing_idxs, int blocksize, int decode_parity);
47 int (*xor_hd_fragments_needed)(xor_code_t *code_desc, int *missing_idxs,
48 int *fragments_to_exclude, int *fragments_needed);
46 init_xor_hd_code_func init_xor_hd_code;
47 xor_code_encode_func xor_code_encode;
48 xor_code_decode_func xor_code_decode;
49 xor_hd_fragments_needed_func xor_hd_fragments_needed;
4950 };
5051
5152 #define DEFAULT_W 32
5859
5960 xor_code_t *xor_desc = (xor_code_t *) xdesc->xor_desc;
6061 xor_desc->encode(xor_desc, data, parity, blocksize);
62 return 0;
6163 }
6264
6365 static int flat_xor_hd_decode(void *desc,
6870 (struct flat_xor_hd_descriptor *) desc;
6971
7072 xor_code_t *xor_desc = (xor_code_t *) xdesc->xor_desc;
71 xor_desc->decode(xor_desc, data, parity, missing_idxs, blocksize, 1);
73 return xor_desc->decode(xor_desc, data, parity, missing_idxs, blocksize, 1);
7274 }
7375
7476 static int flat_xor_hd_reconstruct(void *desc,
144146
145147 free (bdesc->xor_desc);
146148 free (bdesc);
149 return 0;
147150 }
148151
149152 struct ec_backend_op_stubs flat_xor_hd_op_stubs = {
2525 * vi: set noai tw=79 ts=4 sw=4:
2626 */
2727
28 #include <stdlib.h>
2829 #include <stdint.h>
2930
3031 /* calls required for init */
3132 void* null_code_init(int k, int m, int hd)
3233 {
3334 /* add your code here */
35 return NULL;
3436 }
3537
3638 /* calls required for encode */
5757 // Verify that missing_data[2] == -1?
5858 int data_index = missing_data[0];
5959 int parity_index = index_of_connected_parity(code_desc, data_index, missing_parity, missing_data);
60 int i;
6160 int ret;
6261
6362 if (parity_index < 0) {
3030 #include "erasurecode_backend.h"
3131 #include "erasurecode_helpers.h"
3232 #include "erasurecode_preprocessing.h"
33 #include "erasurecode_postprocessing.h"
3334 #include "erasurecode_stdinc.h"
35 #include "erasurecode/alg_sig.h"
3436
3537 /* =~=*=~==~=*=~==~=*=~= Supported EC backends =~=*=~==~=*=~==~=*=~==~=*=~== */
3638
3941 extern struct ec_backend_common backend_flat_xor_hd;
4042 extern struct ec_backend_common backend_jerasure_rs_vand;
4143 extern struct ec_backend_common backend_jerasure_rs_cauchy;
44
45 static const char *ec_chksum_types[CHKSUM_TYPES_MAX] = {
46 "none",
47 "crc32",
48 "md5",
49 };
4250
4351 ec_backend_t ec_backends_supported[] = {
4452 (ec_backend_t) &backend_null,
170178 } else {
171179 goto exit;
172180 }
173
174 register_out:
175181 rwlock_unlock(&active_instances_rwlock);
182
176183 exit:
177184 return rc;
178185 }
191198 /* Generic dlopen/dlclose routines */
192199 int liberasurecode_backend_open(ec_backend_t instance)
193200 {
194 void *handle = NULL;
195201 if (instance && NULL != instance->desc.backend_sohandle)
196202 return 0;
197203
439445 char ***encoded_data, char ***encoded_parity, /* output */
440446 uint64_t *fragment_len) /* output */
441447 {
442 int i;
443448 int k, m;
444449 int ret = 0; /* return code */
445450
446451 int blocksize = 0; /* length of each of k data elements */
447 int data_len; /* data len to write to fragment headers */
448 int aligned_data_len; /* EC algorithm compatible data length */
449452
450453 if (orig_data == NULL) {
451454 log_error("Pointer to data buffer is null!");
540543 */
541544 int liberasurecode_decode_cleanup(int desc, char *data)
542545 {
543 int i;
544546 ec_backend_t instance = liberasurecode_backend_instance_get_by_desc(desc);
545547 if (NULL == instance) {
546548 return -EBACKENDNOTAVAIL;
571573 int i, j;
572574 int ret = 0;
573575
574 int k, m;
576 int k = -1, m = -1;
575577 int orig_data_size = 0;
576578
577579 int blocksize = 0;
761763 char **parity = NULL;
762764 int *missing_idxs = NULL;
763765 char *fragment_ptr = NULL;
764 int k;
765 int m;
766 int k = -1;
767 int m = -1;
766768 int i;
767 int j;
768769 uint64_t realloc_bm = 0;
769770 char **data_segments = NULL;
770771 char **parity_segments = NULL;
772 int set_chksum = 1;
771773
772774 ec_backend_t instance = liberasurecode_backend_instance_get_by_desc(desc);
773775 if (NULL == instance) {
862864 }
863865 init_fragment_header(fragment_ptr);
864866 add_fragment_metadata(fragment_ptr, destination_idx, orig_data_size,
865 blocksize);
867 blocksize, !set_chksum);
866868
867869 /*
868870 * Copy the reconstructed fragment to the output buffer
3030 #include "erasurecode_backend.h"
3131 #include "erasurecode_helpers.h"
3232 #include "erasurecode_stdinc.h"
33 #include "erasurecode/alg_sig.h"
3334
3435 /* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
3536
168169 int get_aligned_data_size(ec_backend_t instance, int data_len)
169170 {
170171 int k = instance->args.uargs.k;
171 int m = instance->args.uargs.m;
172172 int w = instance->args.uargs.w;
173173 int word_size = w / 8;
174174 int alignment_multiple;
340340
341341 /* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
342342
343 inline int set_chksum(char *buf, int blocksize)
343 inline int set_checksum(char *buf, int blocksize)
344344 {
345345 fragment_header_t* header = (fragment_header_t*) buf;
346346 char *data = get_data_ptr_from_fragment(buf);
3737 set_orig_data_size(fragment, orig_data_size);
3838 set_fragment_payload_size(fragment, blocksize);
3939 if (add_chksum) {
40 set_chksum(fragment, blocksize);
40 set_checksum(fragment, blocksize);
4141 }
4242 }
4343
2626 #include <stdio.h>
2727 #include <stdlib.h>
2828 #include <string.h>
29 #define GALOIS_SINGLE_MULTIPLY "galois_single_multiply"
2930
3031 int valid_gf_w[] = { 8, 16, -1 };
3132 int valid_pairs[][2] = { { 8, 32}, {16, 32}, {16, 64}, {-1, -1} };
3233
34 galois_single_multiply_func get_galois_multi_func(void *handle) {
35 /*
36 * ISO C forbids casting a void* to a function pointer.
37 * Since dlsym return returns a void*, we use this union to
38 * "transform" the void* to a function pointer.
39 */
40 union {
41 galois_single_multiply_func fptr;
42 void *vptr;
43 } func_handle = {.vptr = NULL};
44 func_handle.vptr = dlsym(handle, GALOIS_SINGLE_MULTIPLY);
45 return func_handle.fptr;
46 }
47
3348 void *get_jerasure_sohandle()
3449 {
3550 return dlopen(JERASURE_SONAME, RTLD_LAZY | RTLD_LOCAL);
3752
3853 int load_gf_functions(void *sohandle, struct jerasure_mult_routines *routines)
3954 {
40 routines->galois_single_multiply = dlsym(sohandle, "galois_single_multiply");
55 routines->galois_single_multiply = get_galois_multi_func(sohandle);
4156 if (NULL == routines->galois_single_multiply) {
4257 return -1;
4358 }
5368 int w = 8;
5469 int alpha = 2, beta = 4, gamma = 8;
5570 int num_components = sig_len / w;
56 struct jerasure_mult_routines g_jerasure_mult_routines;
5771
5872 alg_sig_handle = (alg_sig_t *)malloc(sizeof(alg_sig_t));
5973 if (NULL == alg_sig_handle) {
225239 static
226240 int compute_w8_alg_sig_32(alg_sig_t *alg_sig_handle, char *buf, int len, char *sig)
227241 {
228 int bit_mask;
229242 int i;
230 int alpha = 2, beta = 4, gamma = 8;
231 int w = 8;
232243
233244 if (len == 0) {
234245 bzero(sig, 4);
2828 #include <xor_code.h>
2929 #include "test_xor_hd_code.h"
3030
31 void fill_buffer(unsigned char *buf, int size, int seed)
31 void fill_buffer(char *buf, int size, int seed)
3232 {
3333 int i;
3434
7878 parity = (char**)malloc(code_desc->m * sizeof(char*));
7979 fragments_needed = (int*)malloc(code_desc->k*code_desc->m*sizeof(int));
8080 if (!fragments_needed) {
81 fprintf(stderr, "Could not allocate memory for fragments %d\n", i);
81 fprintf(stderr, "Could not allocate memory for fragments\n");
8282 exit(2);
8383 }
8484
177177
178178 code_desc->decode(code_desc, data, parity, missing_idxs, blocksize, 1);
179179
180 if (missing_idxs[0] > -1 && missing_idxs[0] < code_desc->k && check_buffer(data[missing_idx_0], blocksize, missing_idx_0) < 0) {
180 if (missing_idxs[0] > -1 && missing_idxs[0] < code_desc->k && check_buffer((unsigned char *)data[missing_idx_0], blocksize, missing_idx_0) < 0) {
181181 fprintf(stderr, "Decode did not work: %d (%d %d %d)!\n", missing_idxs[0], missing_idxs[0], missing_idxs[1], missing_idxs[2]);
182182 exit(2);
183183 }
184 if (missing_idxs[1] > -1 && missing_idxs[1] < code_desc->k && check_buffer(data[missing_idx_1], blocksize, missing_idx_1) < 0) {
184 if (missing_idxs[1] > -1 && missing_idxs[1] < code_desc->k && check_buffer((unsigned char *)data[missing_idx_1], blocksize, missing_idx_1) < 0) {
185185 fprintf(stderr, "Decode did not work: %d (%d %d %d)!\n", missing_idxs[1], missing_idxs[0], missing_idxs[1], missing_idxs[2]);
186186 exit(2);
187187 }
188 if (missing_idxs[2] > -1 && missing_idxs[2] < code_desc->k && check_buffer(data[missing_idx_2], blocksize, missing_idx_2) < 0) {
188 if (missing_idxs[2] > -1 && missing_idxs[2] < code_desc->k && check_buffer((unsigned char *)data[missing_idx_2], blocksize, missing_idx_2) < 0) {
189189 fprintf(stderr, "Decode did not work: %d (%d %d %d)!\n", missing_idxs[2], missing_idxs[0], missing_idxs[1], missing_idxs[2]);
190190 exit(2);
191191 }
6666 fprintf(stderr,"\n");
6767 }
6868
69 void missing_mask_to_array(unsigned long mask, unsigned int *missing)
69 void missing_mask_to_array(long mask, int *missing)
7070 {
7171 unsigned int i = 0;
7272 unsigned long pos = 1;
9999 unsigned int num_frags = 0;
100100 unsigned long i = 0;
101101 fragment_header_t *header = NULL;
102 char **ptr = NULL;
103102 size_t size = (num_data_frags + num_parity_frags) * sizeof(char *);
104103 char **array = malloc(size);
105104
141140 return rc;
142141 }
143142
144 static void fill_buffer(unsigned char *buf, size_t size, int seed)
145 {
146 size_t i;
143 static void fill_buffer(char *buf, size_t size, int seed)
144 {
145 int i;
147146 buf[0] = seed;
148147
149148 for (i=1; i < size; i++) {
168167 char **encoded_parity = NULL;
169168 uint64_t encoded_fragment_len = 0;
170169 int rc = 0;
171 int num_fragments = args->k + args->m;
172 char **available_frags = NULL;
173170 char *out_data = NULL;
174171 uint64_t out_data_len = 0;
175172 unsigned long mask = 0;
176173 int desc = -1;
177 unsigned int num_available_frags = 0;
178174 struct frag_array_set frags; //MOVE ME
179175
180176 srand(time(NULL));
185181
186182 fragments_needed = (int*)malloc(args->k*args->m*sizeof(int));
187183 if (!fragments_needed) {
188 fprintf(stderr, "Could not allocate memory for fragments %d\n", i);
184 fprintf(stderr, "Could not allocate memory for fragments\n");
189185 exit(2);
190186 }
191187 memset(fragments_needed, 0, args->k*args->m*sizeof(int));
192188
193189 err = posix_memalign((void **) &data, 16, blocksize * args->k);
194190 if (err != 0 || !data) {
195 fprintf(stderr, "Could not allocate memory for data %d\n", i);
191 fprintf(stderr, "Could not allocate memory for data\n");
196192 exit(1);
197193 }
198 fill_buffer(data, blocksize * args->k, i);
194 fill_buffer(data, blocksize * args->k, 0);
199195
200196 parity = (char**)malloc(args->m * sizeof(char*));
201197 for (i=0; i < args->m; i++) {
405405 char *orig_data = NULL;
406406 char **encoded_data = NULL, **encoded_parity = NULL;
407407 uint64_t encoded_fragment_len = 0;
408 int num_fragments = args-> k + args->m;
409408 uint64_t decoded_data_len = 0;
410409 char *decoded_data = NULL;
411410 size_t frag_header_size = sizeof(fragment_header_t);
437436 assert(metadata.idx == i);
438437 assert(metadata.size == encoded_fragment_len - frag_header_size);
439438 assert(metadata.orig_data_size == orig_data_size);
440 unsigned char *data_ptr = frag + frag_header_size;
439 char *data_ptr = frag + frag_header_size;
441440 int cmp_size = remaining >= metadata.size ? metadata.size : remaining;
442441 assert(memcmp(data_ptr, orig_data_ptr, cmp_size) == 0);
443442 remaining -= cmp_size;
479478 char **encoded_data = NULL, **encoded_parity = NULL;
480479 uint64_t encoded_fragment_len = 0;
481480 int num_fragments = args-> k + args->m;
482 uint64_t decoded_data_len = 0;
483 char *decoded_data = NULL;
484481 char **avail_frags = NULL;
485482 int num_avail_frags = 0;
486483 int i = 0;
7474 ret = 1;
7575 }
7676
77 out:
7877 free(parity_sig);
7978
8079 return ret;