中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

EC接口

接口描述

EC编解码接口。

接口格式

  • int KsalEcEncode(uint8_t **data, uint8_t **parity, struct HecParam *param);
  • int KsalEcDecode(uint8_t **data, uint8_t **parity, struct HecParam *param);
  • int KsalLrcEncode(uint8_t **data, uint8_t **parity, struct LrcParam *param);
  • int KsalLrcDecode(uint8_t **data, uint8_t **parity, struct LrcParam *param);
  • int KsalLrcMininumToDecode(uint8_t *minimumToReadBitMap, uint8_t *availChunksBitMap, struct LrcParam *param, uint8_t minimumToReadBitMapLen, uint8_t availChunksBitMapLen);

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

参数释义

参数名

类型

描述

输入/输出

data

指针数组

数据块指针数组。

输入/输出

parity

指针数组

校验块指针数组。

输入/输出

param

编解码参数指针

编解码参数。

输入

minimumToReadBitMap

指针数组

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

输入/输出

availChunksBitMap

指针数组

存活块bitmap信息。

输入

minimumToReadBitMapLen

整型数

minimumToReadBitMap数组长度。

输入

availChunksBitMapLen

整型数

availChunksBitMap数组长度。

输入

ret

整型数

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

输出

数据结构

表1 struct HecParam(注:28+3以外配比)

成员名

类型

描述

dataNum

整型数

数据块个数。

parityNum

整型数

校验块个数。

sectorSize

整型数

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

blockSize

整型数

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

targetColNum

整型数

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

targetColArray[6]

整型数

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

version

整型数

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

  • 版本号为0:支持扇区大小为64Byte的整数倍。
  • 版本号为1:支持扇区大小为4096Byte的整数倍。
表2 struct LrcParam(注:仅支持28+3配比)

成员名

类型

描述

dataNum

整型数

数据块个数。

localParityNum

整型数

局部校验块个数。

globalParityNum

整型数

全局校验块个数。

sectorSize

整型数

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

blockSize

整型数

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

targetColNum

整型数

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

targetColArray[6]

整型数

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

version

整型数

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

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

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

使用依赖

ksal/ksal_erasure_code.h

使用实例

  • EC编解码接口(28+3之外配比)
  1. 编写EC测试代码。
    1. 新建“test.c”文件。
      vi test.c
    2. “i”键进入编辑模式,添加如下测试代码。
      #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可执行文件。
    gcc test.c -lksal -o test
  3. 运行test可执行文件。
    ./test
    执行输出如下。
    decode succ!!
  • EC编解码接口(28+3配比)
  1. 编写EC测试代码。
    1. 新建“test.c”文件。
      vi test.c
    2. “i”键进入编辑模式,添加如下测试代码。
      #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可执行文件。
    gcc test.c -lksal -o test
  3. 运行test可执行文件。
    ./test
    执行输出如下。
    decode succ!!
  • 根据擦除块的位置选择解码位置接口(28+3配比)
  1. 编写EC测试代码。
    1. 新建“test.c”文件。
      vi test.c
    2. “i”键进入编辑模式,添加如下测试代码。
      #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可执行文件。
    gcc test.c -lksal -o test
  3. 运行test可执行文件。
    ./test
    执行输出如下。
    get minimumToReadBitMap succ!!
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词