32#include "erasurecode_backend.h"
33#include "erasurecode_helpers.h"
34#include "erasurecode_helpers_ext.h"
35#include "erasurecode_stdinc.h"
36#include "erasurecode_version.h"
39#include "erasurecode_log.h"
45 fragment_header_t *header = (fragment_header_t *) buf;
47 assert(NULL != header);
48 if (header->magic == LIBERASURECODE_FRAG_HEADER_MAGIC) {
62void *get_aligned_buffer16(
int size)
70 if (posix_memalign(&buf, 16, size) != 0) {
86void * alloc_zeroed_buffer(
int size)
103 buf = malloc((
size_t) size);
105 buf = memset(buf, value, (
size_t) size);
119void * check_and_free_buffer(
void * buf)
127char *alloc_fragment_buffer(
int size)
130 fragment_header_t *header = NULL;
132 size +=
sizeof(fragment_header_t);
133 buf = get_aligned_buffer16(size);
136 header = (fragment_header_t *) buf;
137 header->magic = LIBERASURECODE_FRAG_HEADER_MAGIC;
144int free_fragment_buffer(
char *buf)
146 fragment_header_t *header;
152 buf -=
sizeof(fragment_header_t);
154 header = (fragment_header_t *) buf;
155 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
156 log_error(
"Invalid fragment header (free fragment)!");
174uint64_t get_fragment_size(
char *buf)
180 return get_fragment_buffer_size(buf) +
sizeof(fragment_header_t);
192int get_aligned_data_size(ec_backend_t instance,
int data_len)
194 int k = instance->args.uargs.k;
195 int w = instance->args.uargs.w;
196 int word_size = w / 8;
197 int alignment_multiple;
198 int aligned_size = 0;
204 if (EC_BACKEND_JERASURE_RS_CAUCHY == instance->common.id) {
205 alignment_multiple = k * w * (
sizeof(long) * 128);
207 alignment_multiple = k * word_size;
210 aligned_size = ((data_len + alignment_multiple - 1) / alignment_multiple)
211 * alignment_multiple;
220 buf +=
sizeof(fragment_header_t);
226int get_data_ptr_array_from_fragments(
char **data_array,
char **fragments,
230 for (i = 0; i < num_fragments; i++) {
231 char *frag = fragments[i];
233 data_array[i] = NULL;
243int get_fragment_ptr_array_from_data(
char **frag_array,
char **data,
247 for (i = 0; i < num_data; i++) {
248 char *data_ptr = frag_array[i];
249 if (data_ptr == NULL) {
253 data[i] = get_fragment_ptr_from_data(data_ptr);
260char *get_fragment_ptr_from_data_novalidate(
char *buf)
262 buf -=
sizeof(fragment_header_t);
268char *get_fragment_ptr_from_data(
char *buf)
270 fragment_header_t *header;
272 buf -=
sizeof(fragment_header_t);
274 header = (fragment_header_t *) buf;
276 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
277 log_error(
"Invalid fragment header (get header ptr)!\n");
287int set_fragment_idx(
char *buf,
int idx)
289 fragment_header_t *header = (fragment_header_t *) buf;
291 assert(NULL != header);
292 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
293 log_error(
"Invalid fragment header (idx check)!\n");
297 header->meta.idx = idx;
303int get_fragment_idx(
char *buf)
305 fragment_header_t *header = (fragment_header_t *) buf;
307 assert(NULL != header);
308 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
309 log_error(
"Invalid fragment header (get idx)!");
313 return header->meta.idx;
317int set_fragment_payload_size(
char *buf,
int size)
319 fragment_header_t *header = (fragment_header_t *) buf;
321 assert(NULL != header);
322 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
323 log_error(
"Invalid fragment header (size check)!");
327 header->meta.size = size;
333int get_fragment_payload_size(
char *buf)
335 fragment_header_t *header = (fragment_header_t *) buf;
337 assert(NULL != header);
338 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
339 log_error(
"Invalid fragment header (get size)!");
343 return header->meta.size;
347int set_fragment_backend_metadata_size(
char *buf,
int size)
349 fragment_header_t *header = (fragment_header_t *) buf;
351 assert(NULL != header);
352 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
353 log_error(
"Invalid fragment header (set fragment backend metadata size)!");
357 header->meta.frag_backend_metadata_size = size;
363int get_fragment_backend_metadata_size(
char *buf)
365 fragment_header_t *header = (fragment_header_t *) buf;
367 assert(NULL != header);
368 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
369 log_error(
"Invalid fragment header (get fragment backend metadata size)!");
373 return header->meta.frag_backend_metadata_size;
377int get_fragment_buffer_size(
char *buf)
379 fragment_header_t *header = (fragment_header_t *) buf;
381 assert(NULL != header);
382 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
383 log_error(
"Invalid fragment header (get size)!");
387 return header->meta.size + header->meta.frag_backend_metadata_size;
391int set_orig_data_size(
char *buf,
int orig_data_size)
393 fragment_header_t *header = (fragment_header_t *) buf;
395 assert(NULL != header);
396 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
397 log_error(
"Invalid fragment header (set orig data check)!");
401 header->meta.orig_data_size = orig_data_size;
407int get_orig_data_size(
char *buf)
409 fragment_header_t *header = (fragment_header_t *) buf;
411 assert(NULL != header);
412 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
413 log_error(
"Invalid fragment header (get orig data check)!");
417 return header->meta.orig_data_size;
421int set_libec_version(
char *buf)
426 fragment_header_t *header = (fragment_header_t *) buf;
427 header->libec_version = (uint32_t)LIBERASURECODE_VERSION;
436 fragment_header_t *header = (fragment_header_t *) buf;
437 *ver = header->libec_version;
442int set_backend_id(
char *buf, ec_backend_id_t
id)
447 fragment_header_t *header = (fragment_header_t *) buf;
448 header->meta.backend_id = (uint8_t)
id;
457 fragment_header_t *header = (fragment_header_t *) buf;
458 *
id = header->meta.backend_id;
463int set_backend_version(
char *buf, uint32_t version)
468 fragment_header_t *header = (fragment_header_t *) buf;
469 header->meta.backend_version = version;
478 fragment_header_t *header = (fragment_header_t *) buf;
479 *version = header->meta.backend_version;
486inline
int set_checksum(ec_checksum_type_t ct,
char *buf,
int blocksize)
488 fragment_header_t* header = (fragment_header_t*) buf;
492 assert(NULL != header);
493 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
494 log_error(
"Invalid fragment header (set chksum)!\n");
498 header->meta.chksum_type = ct;
499 header->meta.chksum_mismatch = 0;
501 switch(header->meta.chksum_type) {
503 flag = getenv(
"LIBERASURECODE_WRITE_LEGACY_CRC");
504 if (flag && !(flag[0] ==
'\0' || (flag[0] ==
'0' && flag[1] ==
'\0'))) {
507 header->meta.chksum[0] = crc32(0, (
unsigned char *) data, blocksize);
int liberasurecode_crc32_alt(int crc, const void *buf, size_t size)
int get_backend_version(char *buf, uint32_t *version)
void * alloc_and_set_buffer(int size, int value)
Allocate a buffer of a specific size and set its' contents to the specified value.
int get_backend_id(char *buf, ec_backend_id_t *id)
char * get_data_ptr_from_fragment(char *buf)
__attribute__((visibility("internal")))
Memory Management Methods.
int get_libec_version(char *buf, uint32_t *ver)
static bool is_fragment(char *buf)