32 #include "erasurecode.h"
33 #include "erasurecode_backend.h"
34 #include "erasurecode_helpers.h"
36 #define LIBPHAZR_LIB_MAJOR 1
37 #define LIBPHAZR_LIB_MINOR 0
38 #define LIBPHAZR_LIB_REV 0
39 #define LIBPHAZR_LIB_VER_STR "1.0.0"
40 #define LIBPHAZR_LIB_NAME "libphazr"
41 #if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
42 #define LIBPHAZR_SO_NAME "libphazr.dylib"
44 #define LIBPHAZR_SO_NAME "libphazr.so.1"
55 typedef char* (*pio_create_precoding_matrix_func)(int);
56 typedef char* (*pio_create_inverse_precoding_matrix_func)(int);
57 typedef char* (*pio_create_kmux_matrix_func)(int, int, int);
90 int word_size = w / 8;
91 return ((blocksize + ((word_size - hd) - 1)) / (word_size - hd)) * word_size;
99 char **encoded = malloc(
sizeof(
char*) * (xdesc->
k + xdesc->
m));
101 if (NULL == encoded) {
106 for (i = 0; i < xdesc->
k; i++) {
107 encoded[i] = data[i];
110 for (i = 0; i < xdesc->
m; i++) {
111 encoded[i + xdesc->
k] = parity[i];
115 xdesc->
k, xdesc->
m, xdesc->
w, xdesc->
hd, blocksize, padding_size);
124 int *missing_idxs,
int blocksize)
129 char **decoded = malloc(
sizeof(
char*) * (xdesc->
k + xdesc->
m));
131 if (NULL == decoded) {
136 for (i = 0; i < xdesc->
k; i++) {
137 decoded[i] = data[i];
140 for (i = 0; i < xdesc->
m; i++) {
141 decoded[i + xdesc->
k] = parity[i];
145 missing_idxs, xdesc->
k, xdesc->
m, xdesc->
w, xdesc->
hd, blocksize, padding_size);
154 int *missing_idxs,
int destination_idx,
int blocksize)
159 char **encoded = malloc(
sizeof(
char*) * (xdesc->
k + xdesc->
m));
161 if (NULL == encoded) {
166 for (i = 0; i < xdesc->
k; i++) {
167 encoded[i] = data[i];
170 for (i = 0; i < xdesc->
m; i++) {
171 encoded[i + xdesc->
k] = parity[i];
175 destination_idx, xdesc->
k, xdesc->
m, xdesc->
w, blocksize, padding_size);
184 int *fragments_to_exclude,
int *fragments_needed)
187 uint64_t exclude_bm = convert_list_to_bitmap(fragments_to_exclude);
188 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs) | exclude_bm;
193 for (i = 0; i < (xdesc->
k + xdesc->
m); i++) {
194 if (!(missing_bm & (1 << i))) {
195 fragments_needed[j] = i;
200 fragments_needed[j] = -1;
219 static void *
pio_init(
struct ec_backend_args *args,
void *backend_sohandle)
230 desc->
k = args->uargs.k;
231 desc->
m = args->uargs.m;
232 desc->
w = args->uargs.w;
233 desc->
hd = args->uargs.hd;
237 args->uargs.w = desc->
w;
241 args->uargs.hd = desc->
hd;
256 } func_handle = {.vptr = NULL};
259 func_handle.vptr = NULL;
260 func_handle.vptr = dlsym(backend_sohandle,
"create_precoding_matrix");
266 func_handle.vptr = NULL;
267 func_handle.vptr = dlsym(backend_sohandle,
"create_inverse_precoding_matrix");
273 func_handle.vptr = NULL;
274 func_handle.vptr = dlsym(backend_sohandle,
"create_kmux_matrix");
280 func_handle.vptr = NULL;
281 func_handle.vptr = dlsym(backend_sohandle,
"matrix_encode");
287 func_handle.vptr = NULL;
288 func_handle.vptr = dlsym(backend_sohandle,
"matrix_decode");
294 func_handle.vptr = NULL;
295 func_handle.vptr = dlsym(backend_sohandle,
"matrix_reconstruct");
315 if (NULL == desc->
matrix) {
322 return (
void *) desc;
360 return padded_blocksize - blocksize;
365 return metadata_size;
383 .id = EC_BACKEND_LIBPHAZR,