EC接口

接口描述

EC编解码接口。

接口格式

KsalLrcEncode、KsalLrcDecode、KsalLrcMininumToDecode仅支持28+3配比。

参数释义

参数名

类型

描述

输入/输出

data

指针数组

数据块指针数组。

输入/输出

parity

指针数组

校验块指针数组。

输入/输出

param

编解码参数指针

编解码参数。

输入

minimumToReadBitMap

指针数组

最少需要读的块的bitmap信息。

输入/输出

availChunksBitMap

指针数组

存活块bitmap信息。

输入

minimumToReadBitMapLen

整型数

minimumToReadBitMap数组长度。

输入

availChunksBitMapLen

整型数

availChunksBitMap数组长度。

输入

ret

整型数

返回0表示成功,其他则表示失败。

输出

数据结构

表1 struct HecParam

成员名

类型

描述

dataNum

整型数

数据块个数。

parityNum

整型数

校验块个数。

sectorSize

整型数

扇区大小,最小编解码粒度,当前支持64Byte和4096Byte粒度。

blockSize

整型数

数据块或者校验块的大小,须为sectorSize的整数倍。

targetColNum

整型数

损失块的个数,解码接口使用。

targetColArray[6]

整型数

损失块列表,各个元素取值范围为[0, dataNum + parityNum)。

version

整型数

算法版本号,默认值为1。

  • 版本号为0:支持扇区大小为64Byte的整数倍(2≤数据块个数≤25,1≤校验块个数≤4)。
  • 版本号为1:支持扇区大小为4096Byte的整数倍(2≤数据块个数≤25,1≤校验块个数≤4)。
  • 版本号为2:支持扇区大小为64Byte的整数倍(仅支持6+3配比)。
表2 struct LrcParam

成员名

类型

描述

dataNum

整型数

数据块个数。

localParityNum

整型数

局部校验块个数。

globalParityNum

整型数

全局校验块个数。

sectorSize

整型数

扇区大小,最小编解码粒度,当前支持64Byte和4096Byte粒度。

blockSize

整型数

数据块或者校验块的大小,须为sectorSize的整数倍。

targetColNum

整型数

损失块的个数,解码接口使用。

targetColArray[6]

整型数

损失块列表,各个元素取值范围为[0, dataNum + parityNum)。

version

整型数

算法版本号,默认值为1。

版本号为0:支持扇区大小为64Byte的整数倍。

版本号为1:支持扇区大小为4096Byte的整数倍。

struct HecParam支持28+3以外配比,struct LrcParam仅支持28+3配比。

使用依赖

ksal/ksal_erasure_code.h

使用实例

  1. 编写EC测试代码。

    1. 新建“test.c”文件。
      1
      vi test.c
      
    2. “i”键进入编辑模式,添加如下测试代码。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <ksal/ksal_erasure_code.h>
      
      int main(int argc, char **argv)
      {
          struct HecParam param = {4, 2, 4096, 8192, 2, {3, 4}};
          uint8_t tmp[20][8192];
          uint8_t *ptrs[20];
          uint8_t *bptrs[20];
          for (size_t i = 0; i < param.dataNum + param.parityNum; ++i) {
              for (size_t j = 0; j < param.blockSize; j++) {
                      tmp[i][j] = (uint8_t)rand() & 0xff;
              }
              ptrs[i] = tmp[i];
              bptrs[i] = tmp[i];
          }
          KsalEcEncode(ptrs, ptrs + param.dataNum, &param);
          bptrs[3] = tmp[18];
          bptrs[4] = tmp[19];
          KsalEcDecode(bptrs, bptrs + param.dataNum, &param);
          if (memcmp(bptrs[3], ptrs[3], param.blockSize) == 0 &&
              memcmp(bptrs[4], ptrs[4], param.blockSize) == 0) {
              printf("decode succ!!\r\n");
          } else {
              printf("decode fail!!\r\n");
          }
          return 0;
      }
      
    3. “Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。

  2. 编译“test.c”文件,生成test可执行文件。

    1
    gcc test.c -lksal -o test
    

  3. 运行test可执行文件。

    1
    ./test
    
    执行输出如下。
    1
    decode succ!!
    

  1. 编写EC测试代码。

    1. 新建“test.c”文件。
      1
      vi test.c
      
    2. “i”键进入编辑模式,添加如下测试代码。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <ksal/ksal_erasure_code.h>
      
      int main(int argc, char **argv)
      {
          struct LrcParam param = {28, 2, 1, 4096, 8192, 2, {3, 4}, 1};
          uint8_t tmp[40][8192];
          uint8_t *ptrs[40];
          uint8_t *bptrs[40];
          for (size_t i = 0; i < param.dataNum + param.localParityNum + param.globalParityNum; ++i) {
              for (size_t j = 0; j < param.blockSize; j++) {
                      tmp[i][j] = (uint8_t)rand() & 0xff;
              }
              ptrs[i] = tmp[i];
              bptrs[i] = tmp[i];
          }
          KsalLrcEncode(ptrs, ptrs + param.dataNum, &param);
          bptrs[3] = tmp[32];
          bptrs[4] = tmp[33];
          KsalLrcDecode(bptrs, bptrs + param.dataNum, &param);
          if (memcmp(bptrs[3], ptrs[3], param.blockSize) == 0 &&
              memcmp(bptrs[4], ptrs[4], param.blockSize) == 0) {
              printf("decode succ!!\r\n");
          } else {
              printf("decode fail!!\r\n");
          }
          return 0;
      }
      
    3. “Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。

  2. 编译“test.c”文件,生成test可执行文件。

    1
    gcc test.c -lksal -o test
    

  3. 运行test可执行文件。

    1
    ./test
    
    执行输出如下。
    1
    decode succ!!
    

  1. 编写EC测试代码。

    1. 新建“test.c”文件。
      1
      vi test.c
      
    2. “i”键进入编辑模式,添加如下测试代码。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <ksal/ksal_erasure_code.h>
      
      int main(int argc, char **argv)
      {
          struct LrcParam param = {28, 2, 1, 4096, 8192, 2, {3, 4}, 1};
          uint8_t minimumToReadBitMapLen = 31;
          uint8_t availChunksBitMapLen = 31;
          uint8_t minimumToReadBitMap[31] = {0};
          uint8_t availChunksBitMap[31] = {0};
          for (size_t i = 0; i < param.dataNum + param.localParityNum + param.globalParityNum; ++i) {
              if (i != 3 && i != 4) {
                  availChunksBitMap[i] = 1;
              }
          }
          int ret = KsalLrcMininumToDecode(minimumToReadBitMap, availChunksBitMap, &param, minimumToReadBitMapLen, availChunksBitMapLen);
          uint8_t targetMinimumToReadBitMap[31] = {1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
          if (memcmp(targetMinimumToReadBitMap, minimumToReadBitMap, minimumToReadBitMapLen) == 0 && ret == 0) {
              printf("get minimumToReadBitMap succ!!\r\n");
          } else {
              printf("get minimumToReadBitMap fail!!\r\n");
          }
          return 0;
      }
      
    3. “Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。

  2. 编译“test.c”文件,生成test可执行文件。

    1
    gcc test.c -lksal -o test
    

  3. 运行test可执行文件。

    1
    ./test
    
    执行输出如下。
    1
    get minimumToReadBitMap succ!!