35#include "erasurecode.h"
36#include "erasurecode_helpers.h"
37#include "erasurecode_helpers_ext.h"
38#include "erasurecode_backend.h"
46typedef int (*
shss_decode_func)(
char **, size_t,
int *, int, int, int, int, int,
long long *);
47typedef 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" LIBERASURECODE_SO_SUFFIX ".dylib"
68#define SHSS_SO_NAME "libshss" LIBERASURECODE_SO_SUFFIX ".so.1"
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;
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");
303 .GETENCODEOFFSET = get_encode_offset_zero,
307 .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)
static int shss_reconstruct(void *desc, char **data, char **parity, int *missing_idxs, int destination_idx, int blocksize)
struct ec_backend_op_stubs shss_ops
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.
struct ec_backend_op_stubs shss_op_stubs
shss_decode_func ssdecode
shss_reconstruct_func ssreconst
shss_encode_func ssencode