---
title: 默认场景
description: "1. 队列申请时，需首先声明一个struct wd_queue的结构体变量（结构体当前定义如下表）并初始化为全0。在成员变量capa的alg中指定算法字符串，该字符串需与UACCE设备支持的算法匹配，其他成员暂时无需赋值。在用户环境中的shell中，通过执行cat /sys/class/uacce/*/attrs/algorithms，可以列举出当前注册到UACCE的设备都支持哪些算法。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/252RC1/accel/kunpengaccel_17_0013.html
sourcePath: /source/zh/kunpengboostkithistory/252RC1/accel/kunpengaccel_17_0013.html
indexId: 20474f7d43701d73aeb564c5ca9bbe78a6c9127480800ac32bd9f4df91084c2272
---
# 默认场景

1. 队列申请时，需首先声明一个struct wd_queue的结构体变量（结构体当前定义如下表）并初始化为全0。在成员变量capa的alg中指定算法字符串，该字符串需与UACCE设备支持的算法匹配，其他成员暂时无需赋值。在用户环境中的shell中，通过执行cat /sys/class/uacce/*/attrs/algorithms，可以列举出当前注册到UACCE的设备都支持哪些算法。
  如果需要从注册到UACCE的指定设备中搜索支持这种算法的队列，需要指定dev_path或node_mask的值，dev_path必须是已经注册到UACCE中设备的路径，node_mask必须是numa node的掩码或组合。
| 对外可见 | 对外可见 | 对外不可见，只是为了逻辑完整而列出 |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 1 2 3 4 5 6 struct wd\_queue { struct wd\_capa capa; char dev\_path[PATH\_STR\_SIZE]; unsigned int node\_mask; void \*qinfo; 指向内部私有信息，用户不需要处理 }; | 1 2 3 4 5 6 | struct wd\_queue { struct wd\_capa capa; char dev\_path[PATH\_STR\_SIZE]; unsigned int node\_mask; void \*qinfo; 指向内部私有信息，用户不需要处理 }; | 1 2 3 4 5 6 7 struct wd\_capa { char \*alg; int throughput; int latency; \_\_u32 flags; struct wcrypto\_paras priv; }; | 1 2 3 4 5 6 7 | struct wd\_capa { char \*alg; int throughput; int latency; \_\_u32 flags; struct wcrypto\_paras priv; }; | 1 2 3 4 5 6 7 8 9 10 struct q\_info { const char \*hw\_type; int hw\_type\_id; int ref; void \*priv; 指向硬件数据 const void \*dev\_info; int fd; int ctx\_num; ... } | 1 2 3 4 5 6 7 8 9 10 | struct q\_info { const char \*hw\_type; int hw\_type\_id; int ref; void \*priv; 指向硬件数据 const void \*dev\_info; int fd; int ctx\_num; ... } |
| 1 2 3 4 5 6 | struct wd\_queue { struct wd\_capa capa; char dev\_path[PATH\_STR\_SIZE]; unsigned int node\_mask; void \*qinfo; 指向内部私有信息，用户不需要处理 }; |  |  |  |  |  |  |  |
| 1 2 3 4 5 6 7 | struct wd\_capa { char \*alg; int throughput; int latency; \_\_u32 flags; struct wcrypto\_paras priv; }; |  |  |  |  |  |  |  |
| 1 2 3 4 5 6 7 8 9 10 | struct q\_info { const char \*hw\_type; int hw\_type\_id; int ref; void \*priv; 指向硬件数据 const void \*dev\_info; int fd; int ctx\_num; ... } |  |  |  |  |  |  |  |


2. 队列申请时，取第1步struct wd_queue结构体变量的地址作为参数，调用int wd_request_queue(struct wd_queue *q)申请指定算法的队列，如果返回值是负值说明失败；否则成功，并把申请到的queue的私有信息保存到struct wd_queue结构体变量的成员变量qinfo中，后续queue相关的操作都会访问qinfo中保存的信息，qinfo指向的内存在调用wd_release_queue时释放。
3. 消息发送前，首先要声明一个某种算法消息结构体的变量（具体请参考  算法层接口
），比如RSA算法消息，填充好算法要求的数据，in，out和key等指向的内存需要用户先申请好，处理完之后相关内存由用户负责释放。用户也可以声明自定义的消息结构体变量，但是前提是该消息结构体能被硬件加速器用户态驱动识别处理。
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 struct wcrypto_rsa_msg { __u8 alg_type:3;/* Denoted by enum wcrypto_type */ __u8 op_type:2;/* Denoted by enum wcrypto_rsa_op_type */ __u8 key_type:2;/* Denoted by enum wcrypto_rsa_key_type */ __u8 data_fmt:1; /* Data format, denoted by enum wd_buff_type */ __u8 result;/* Data format, denoted by WD error code */ __u16 in_bytes;/* Input data bytes */ __u16 out_bytes;/* Output data bytes */ __u16 key_bytes;/* Input key bytes */ __u8 *in;/* Input data VA, buf should be DMA buffer. */ __u8 *out;/* Output data VA pointer, should be DMA buffer */ __u8 *key;/* Input key VA pointer, should be DMA buffer */ __u64 usr_data;/* Input user tag, used for indentify data stream/user: struct wcrypto_cb_tag */ };

4. 消息发送时，取第1步struct wd_queue结构体变量的地址和第3步的算法消息结构体变量的地址作为参数，调用int wd_send(struct wd_queue *q, void *req)将请求发给硬件处理，成功返回0，同时请不要释放第3步申请的变量及内存；失败返回负值。内部逻辑中将根据wd_queue的成员变量qinfo中的hw_type找到合适的硬件加速器用户态驱动，并调用该驱动的方法将请求发给该硬件。
5. 消息接收前，首先声明一个和第3步一样的算法消息结构体的指针变量。
6. 消息接收时，取第1步struct wd_queue结构体变量的地址和第5步的算法消息结构体指针变量的地址作为参数，调用int wd_recv(struct wd_queue *q, void **resp)从硬件接收回应消息，成功返回0，处理完的数据会更新到第3步中的req中，并把resp指向req；失败返回负值。内部逻辑中将根据wd_queue的成员变量qinfo中的hw_type找到合适的硬件加速器用户态驱动，并调用该驱动的方法从硬件接收回应消息。
7. 队列释放前，处理完数据之后，释放第3步中申请的变量及内存。
8. 队列释放时，取第1步struct wd_queue结构体变量的地址作为参数，调用void wd_release_queue(struct wd_queue *q)释放队列和涉及到的硬件资源。
