liberasurecode/include/xor_codes/xor_code.h

101 lines
4.0 KiB
C

/* * Copyright (c) 2013, Kevin Greenan (kmgreen2@gmail.com)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY
* THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _XOR_CODE_H
#define _XOR_CODE_H
#define MAX_DATA 32
#define MAX_PARITY MAX_DATA
#define MEM_ALIGN_SIZE 16
#define DECODED_MISSING_IDX MAX_DATA
typedef enum { FAIL_PATTERN_GE_HD, // Num failures greater than or equal to HD
FAIL_PATTERN_0D_0P,
FAIL_PATTERN_1D_0P,
FAIL_PATTERN_2D_0P,
FAIL_PATTERN_3D_0P,
FAIL_PATTERN_1D_1P,
FAIL_PATTERN_1D_2P,
FAIL_PATTERN_2D_1P,
FAIL_PATTERN_0D_1P,
FAIL_PATTERN_0D_2P,
FAIL_PATTERN_0D_3P } failure_pattern_t;
#define is_aligned(x) (((unsigned long)x & (MEM_ALIGN_SIZE-1)) == 0)
#define num_unaligned_end(size) (size % MEM_ALIGN_SIZE)
struct xor_code_s;
typedef struct xor_code_s
{
int k;
int m;
int hd;
unsigned int *parity_bms;
unsigned int *data_bms;
int (*decode)(struct xor_code_s *code_desc, char **data, char **parity, int *missing_idxs, int blocksize, int decode_parity);
void (*encode)(struct xor_code_s *code_desc, char **data, char **parity, int blocksize);
int (*fragments_needed)(struct xor_code_s *code_desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed);
} xor_code_t;
int is_data_in_parity(int data_idx, unsigned int parity_bm);
int does_parity_have_data(int parity_idx, unsigned int data_bm);
int parity_bit_lookup(xor_code_t *code_desc, int index);
int data_bit_lookup(xor_code_t *code_desc, int index);
int missing_elements_bm(xor_code_t *code_desc, int *missing_elements, int (*bit_lookup_func)(xor_code_t *code_desc, int index));
failure_pattern_t get_failure_pattern(xor_code_t *code_desc, int *missing_idxs);
void fast_memcpy(char *dst, char *src, int size);
void xor_bufs_and_store(char *buf1, char *buf2, int blocksize);
void xor_code_encode(xor_code_t *code_desc, char **data, char **parity, int blocksize);
void selective_encode(xor_code_t *code_desc, char **data, char **parity, int *missing_parity, int blocksize);
int * get_missing_parity(xor_code_t *code_desc, int *missing_idxs);
int * get_missing_data(xor_code_t *code_desc, int *missing_idxs);
int num_missing_data_in_parity(xor_code_t *code_desc, int parity_idx, int *missing_data);
int index_of_connected_parity(xor_code_t *code_desc, int data_index, int *missing_parity, int *missing_data);
void remove_from_missing_list(int element, int *missing_list);
int* get_symbols_needed(xor_code_t *code_desc, int *missing_list, int *fragments_to_exclude);
void xor_reconstruct_one(xor_code_t *code_desc, char **data, char **parity, int *missing_idxs, int index_to_reconstruct, int blocksize);
xor_code_t* init_xor_hd_code(int k, int m, int hd);
#endif