35 #include "erasurecode.h"
36 #include "erasurecode_helpers.h"
37 #include "erasurecode_helpers_ext.h"
38 #include "erasurecode_backend.h"
46 typedef int (*
shss_decode_func)(
char **, size_t,
int *, int, int, int, int, int,
long long *);
47 typedef int (*
shss_reconstruct_func)(
char **, size_t,
int *, int,
int *, int, int, int, int, int,
long long *);
63 #define SHSS_LIB_VER_STR "1.0"
64 #define SHSS_LIB_NAME "shss"
65 #if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
66 #define SHSS_SO_NAME "libshss.dylib"
68 #define SHSS_SO_NAME "libshss.so.1"
73 static int shss_encode(
void *desc,
char **data,
char **parity,
78 int priv_bitnum = 128;
89 encoded = alloca(
sizeof(
char*)*xdesc->
n);
91 for (i = 0; i<xdesc->
k; i++) encoded[i] = (
char*)data[i];
92 for (i = 0; i<xdesc->
m; i++) encoded[i+xdesc->
k] = (
char*)parity[i];
94 ret = xdesc->
ssencode((
char**)encoded, (
size_t)blocksize,
95 xdesc->
k, xdesc->
m, priv_bitnum, chksum, &einfo);
105 int *missing_idxs,
int blocksize)
108 int missing_size = 0;
110 int priv_bitnum = 128;
121 decoded = alloca(
sizeof(
char*)*xdesc->
n);
123 for (i = 0; i<xdesc->
k; i++) decoded[i] = (
char*)data[i];
124 for (i = 0; i<xdesc->
m; i++) decoded[i+xdesc->
k] = (
char*)parity[i];
125 for (i = 0; i<xdesc->
n; i++) {
126 if (i == missing_idxs[missing_size]) {
131 ret = xdesc->
ssdecode((
char**)decoded, (
size_t)blocksize, missing_idxs, missing_size,
132 xdesc->
k, xdesc->
m, priv_bitnum, chksum, &einfo);
142 int *missing_idxs,
int destination_idx,
int blocksize)
145 int missing_size = 0;
147 int priv_bitnum = 128;
150 char **reconstructed;
159 reconstructed = alloca(
sizeof(
char*)*xdesc->
n);
161 for (i = 0; i<xdesc->
k; i++) reconstructed[i] = (
char*)data[i];
162 for (i = 0; i<xdesc->
m; i++) reconstructed[i+xdesc->
k] = (
char*)parity[i];
163 for (i = 0; i<xdesc->
n; i++) {
164 if (i == missing_idxs[missing_size]) {
169 ret = xdesc->
ssreconst((
char**)reconstructed, (
size_t)blocksize,
170 &destination_idx, dst_size, missing_idxs, missing_size, xdesc->
k,
171 xdesc->
m, priv_bitnum, chksum, &einfo);
181 int *fragments_to_exclude,
int *fragments_needed)
185 uint64_t exclude_bm = convert_list_to_bitmap(fragments_to_exclude);
186 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs) | exclude_bm;
191 for (i = 0; i < xdesc->
n; i++) {
192 if (!(missing_bm & (1 << i))) {
193 fragments_needed[j] = i;
198 fragments_needed[j] = -1;
215 static void *
shss_init(
struct ec_backend_args *args,
void *backend_sohandle)
225 desc->
k = args->uargs.k;
226 desc->
m = args->uargs.m;
227 desc->
n = args->uargs.k + args->uargs.m;
234 int *priv = (
int *)args->uargs.priv_args2;
248 func_handle.vptr = NULL;
249 func_handle.vptr = dlsym(backend_sohandle,
"ssencode");
250 desc->
ssencode = func_handle.encodep;
255 func_handle.vptr = NULL;
256 func_handle.vptr = dlsym(backend_sohandle,
"ssdecode");
257 desc->
ssdecode = func_handle.decodep;
262 func_handle.vptr = NULL;
263 func_handle.vptr = dlsym(backend_sohandle,
"ssreconst");
303 .GETENCODEOFFSET = get_encode_offset_zero,
307 .id = EC_BACKEND_SHSS,