--> ops->cot_decompress = crypto_decompress;
/*
* 在创建上下文的最后调用下,算法里的初始化函数,如果是和一个硬件
* 的驱动适配,那么这里就可以执行相应硬件初始化的内容。
*/
--> if (!tfm->exit && alg->cra_init && (err = alg->cra_init(tfm)))
第二,就是执行压缩的操作:
crypto_comp_compress(tfm, input, ilen, result, &dlen)
crypto_comp_compress(crypto_comp, src, slen, dst, dlen)
/* so hardware can do compress here! */
--> compress_tfm->cot_compress;
第三,就是释放这个压缩的上下文
crypto_free_comp(comp)
内核虽然现在提供了压缩的异步接口,但是貌似还没有驱动会用到。异步接口的使用要比同步接口复杂一点。下面具体看看。
In alg_test_comp, async branch:
/* 和同步一样,这里也创建一个异步的上下文 */
acomp = crypto_alloc_acomp(driver, type, mask);
/*
* 不过和同步接口不一样的是,这里又创建一个acomp_req的上下文, 后续的操作都围绕着这个req结构展开。可以看到req里面包含了异步接口需要的回调函数。
*/
req = acomp_request_alloc(tfm);
acomp_request_set_params(req, &src, &dst, ilen, dlen);
acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
crypto_req_done, &wait);
crypto_acomp_compress(req)
这里需要说明的是,testmsg.c里的这个acomp的测试程序里加了wait/complete的相关内容。这里应该是为了测试方便而加的,一般的异步接口里, 当硬件完成操作的时候,在中断函数里直接调用异步接口的回调函数就可以了。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx