35#include "erasurecode.h"
36#include "erasurecode_helpers.h"
37#include "erasurecode_helpers_ext.h"
38#include "erasurecode_backend.h"
44typedef int (*
shss_decode_func)(
char **, size_t,
int *, int, int, int, int, int,
long long *);
45typedef int (*
shss_reconstruct_func)(
char **, size_t,
int *, int,
int *, int, int, int, int, int,
long long *);
61#define SHSS_LIB_VER_STR "1.0"
62#define SHSS_LIB_NAME "shss"
63#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
64#define SHSS_SO_NAME "libshss" LIBERASURECODE_SO_SUFFIX ".dylib"
66#define SHSS_SO_NAME "libshss" LIBERASURECODE_SO_SUFFIX ".so.1"
76 int priv_bitnum = 128;
87 encoded = alloca(
sizeof(
char*)*xdesc->
n);
89 for (i = 0; i<xdesc->
k; i++) encoded[i] = (
char*)data[i];
90 for (i = 0; i<xdesc->
m; i++) encoded[i+xdesc->
k] = (
char*)parity[i];
92 ret = xdesc->
ssencode((
char**)encoded, (
size_t)blocksize,
93 xdesc->
k, xdesc->
m, priv_bitnum, chksum, &einfo);
103 int *missing_idxs,
int blocksize)
106 int missing_size = 0;
108 int priv_bitnum = 128;
119 decoded = alloca(
sizeof(
char*)*xdesc->
n);
121 for (i = 0; i<xdesc->
k; i++) decoded[i] = (
char*)data[i];
122 for (i = 0; i<xdesc->
m; i++) decoded[i+xdesc->
k] = (
char*)parity[i];
123 for (i = 0; i<xdesc->
n; i++) {
124 if (i == missing_idxs[missing_size]) {
129 ret = xdesc->
ssdecode((
char**)decoded, (
size_t)blocksize, missing_idxs, missing_size,
130 xdesc->
k, xdesc->
m, priv_bitnum, chksum, &einfo);
140 int *missing_idxs,
int destination_idx,
int blocksize)
143 int missing_size = 0;
145 int priv_bitnum = 128;
148 char **reconstructed;
157 reconstructed = alloca(
sizeof(
char*)*xdesc->
n);
159 for (i = 0; i<xdesc->
k; i++) reconstructed[i] = (
char*)data[i];
160 for (i = 0; i<xdesc->
m; i++) reconstructed[i+xdesc->
k] = (
char*)parity[i];
161 for (i = 0; i<xdesc->
n; i++) {
162 if (i == missing_idxs[missing_size]) {
167 ret = xdesc->
ssreconst((
char**)reconstructed, (
size_t)blocksize,
168 &destination_idx, dst_size, missing_idxs, missing_size, xdesc->
k,
169 xdesc->
m, priv_bitnum, chksum, &einfo);
179 int *fragments_to_exclude,
int *fragments_needed)
183 struct ec_bm exclude_bm = NEW_BM, missing_bm = NEW_BM;
184 convert_list_to_bitmap(fragments_to_exclude, &exclude_bm);
185 convert_list_to_bitmap(missing_idxs, &missing_bm);
186 bm_combine_or(&exclude_bm, &missing_bm);
191 for (i = 0; i < xdesc->
n; i++) {
192 if (!bm_get_value(&missing_bm, i)) {
193 fragments_needed[j] = i;
198 fragments_needed[j] = -1;
215static 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");
304 .GETENCODEOFFSET = get_encode_offset_zero,
309 .id = EC_BACKEND_SHSS,
struct ec_backend_common backend_shss
static int shss_decode(void *desc, char **data, char **parity, int *missing_idxs, int blocksize)
int(* shss_decode_func)(char **, size_t, int *, int, int, int, int, int, long long *)
static int shss_fragments_needed(void *desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed)
static int shss_encode(void *desc, char **data, char **parity, int blocksize)
int(* shss_reconstruct_func)(char **, size_t, int *, int, int *, int, int, int, int, int, long long *)
int(* shss_encode_func)(char **, size_t, int, int, int, int, long long *)
static int shss_exit(void *desc)
static void * shss_init(struct ec_backend_args *args, void *backend_sohandle)
static bool shss_is_compatible_with(uint32_t version)
__attribute__((visibility("internal")))
static int shss_reconstruct(void *desc, char **data, char **parity, int *missing_idxs, int destination_idx, int blocksize)
static size_t shss_get_backend_metadata_size(void *desc, int blocksize)
static int shss_element_size(void *desc)
Return the element-size, which is the number of bits stored on a given device, per codeword.
static struct ec_backend_op_stubs shss_op_stubs
shss_decode_func ssdecode
shss_reconstruct_func ssreconst
shss_encode_func ssencode