101 lines
4.0 KiB
C
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
|