#include "cpa.h"
#include "cpa_dc.h"
#include "icp_adf_init.h"
#include "dc_header_footer.h"
#include "dc_session.h"
#include "dc_datapath.h"
CpaStatus
cpaDcGenerateHeader(CpaDcSessionHandle pSessionHandle,
CpaFlatBuffer *pDestBuff,
Cpa32U *count)
{
dc_session_desc_t *pSessionDesc = NULL;
LAC_CHECK_NULL_PARAM(pSessionHandle);
LAC_CHECK_NULL_PARAM(pDestBuff);
LAC_CHECK_NULL_PARAM(pDestBuff->pData);
LAC_CHECK_NULL_PARAM(count);
pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
if (NULL == pSessionDesc) {
QAT_UTILS_LOG("Session handle not as expected\n");
return CPA_STATUS_INVALID_PARAM;
}
if (CPA_DC_DIR_DECOMPRESS == pSessionDesc->sessDirection) {
QAT_UTILS_LOG("Invalid session direction\n");
return CPA_STATUS_INVALID_PARAM;
}
if (CPA_DC_DEFLATE == pSessionDesc->compType) {
if (CPA_DC_CRC32 == pSessionDesc->checksumType) {
Cpa8U *pDest = pDestBuff->pData;
if (pDestBuff->dataLenInBytes < DC_GZIP_HEADER_SIZE) {
QAT_UTILS_LOG(
"The dataLenInBytes of the dest buffer is too small.\n");
return CPA_STATUS_INVALID_PARAM;
}
pDest[0] = DC_GZIP_ID1;
pDest[1] = DC_GZIP_ID2;
pDest[2] =
0x08;
pDest[3] = 0x00;
pDest[4] = 0x00;
pDest[5] = 0x00;
pDest[6] = 0x00;
pDest[7] = 0x00;
pDest[8] = 0;
if (CPA_DC_L1 == pSessionDesc->compLevel)
pDest[8] = DC_GZIP_FAST_COMP;
else if (CPA_DC_L4 >= pSessionDesc->compLevel)
pDest[8] = DC_GZIP_MAX_COMP;
pDest[9] =
DC_GZIP_FILESYSTYPE;
*count = DC_GZIP_HEADER_SIZE;
}
else if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
Cpa8U *pDest = pDestBuff->pData;
Cpa16U header = 0, level = 0;
if (pDestBuff->dataLenInBytes < DC_ZLIB_HEADER_SIZE) {
QAT_UTILS_LOG(
"The dataLenInBytes of the dest buffer is too small.\n");
return CPA_STATUS_INVALID_PARAM;
}
header =
(DC_ZLIB_CM_DEFLATE +
(DC_32K_WINDOW_SIZE << DC_ZLIB_WINDOWSIZE_OFFSET))
<< LAC_NUM_BITS_IN_BYTE;
switch (pSessionDesc->compLevel) {
case CPA_DC_L1:
level = DC_ZLIB_LEVEL_0;
break;
case CPA_DC_L2:
level = DC_ZLIB_LEVEL_1;
break;
case CPA_DC_L3:
level = DC_ZLIB_LEVEL_2;
break;
default:
level = DC_ZLIB_LEVEL_3;
}
header |= level << DC_ZLIB_FLEVEL_OFFSET;
header += DC_ZLIB_HEADER_OFFSET -
(header % DC_ZLIB_HEADER_OFFSET);
pDest[0] = (Cpa8U)(header >> LAC_NUM_BITS_IN_BYTE);
pDest[1] = (Cpa8U)header;
*count = DC_ZLIB_HEADER_SIZE;
}
else {
*count = 0;
}
} else {
*count = 0;
}
return CPA_STATUS_SUCCESS;
}
CpaStatus
cpaDcGenerateFooter(CpaDcSessionHandle pSessionHandle,
CpaFlatBuffer *pDestBuff,
CpaDcRqResults *pRes)
{
dc_session_desc_t *pSessionDesc = NULL;
LAC_CHECK_NULL_PARAM(pSessionHandle);
LAC_CHECK_NULL_PARAM(pDestBuff);
LAC_CHECK_NULL_PARAM(pDestBuff->pData);
LAC_CHECK_NULL_PARAM(pRes);
pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
if (NULL == pSessionDesc) {
QAT_UTILS_LOG("Session handle not as expected\n");
return CPA_STATUS_INVALID_PARAM;
}
if (CPA_DC_DIR_DECOMPRESS == pSessionDesc->sessDirection) {
QAT_UTILS_LOG("Invalid session direction\n");
return CPA_STATUS_INVALID_PARAM;
}
if (CPA_DC_DEFLATE == pSessionDesc->compType) {
if (CPA_DC_CRC32 == pSessionDesc->checksumType) {
Cpa8U *pDest = pDestBuff->pData;
Cpa32U crc32 = pRes->checksum;
Cpa64U totalLenBeforeCompress =
pSessionDesc->cumulativeConsumedBytes;
if (pDestBuff->dataLenInBytes < DC_GZIP_FOOTER_SIZE) {
QAT_UTILS_LOG(
"The dataLenInBytes of the dest buffer is too small.\n");
return CPA_STATUS_INVALID_PARAM;
}
pDest[0] = (Cpa8U)crc32;
pDest[1] = (Cpa8U)(crc32 >> LAC_NUM_BITS_IN_BYTE);
pDest[2] = (Cpa8U)(crc32 >> 2 * LAC_NUM_BITS_IN_BYTE);
pDest[3] = (Cpa8U)(crc32 >> 3 * LAC_NUM_BITS_IN_BYTE);
pDest[4] = (Cpa8U)totalLenBeforeCompress;
pDest[5] = (Cpa8U)(totalLenBeforeCompress >>
LAC_NUM_BITS_IN_BYTE);
pDest[6] = (Cpa8U)(totalLenBeforeCompress >>
2 * LAC_NUM_BITS_IN_BYTE);
pDest[7] = (Cpa8U)(totalLenBeforeCompress >>
3 * LAC_NUM_BITS_IN_BYTE);
pRes->produced += DC_GZIP_FOOTER_SIZE;
} else if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
Cpa8U *pDest = pDestBuff->pData;
Cpa32U adler32 = pRes->checksum;
if (pDestBuff->dataLenInBytes < DC_ZLIB_FOOTER_SIZE) {
QAT_UTILS_LOG(
"The dataLenInBytes of the dest buffer is too small.\n");
return CPA_STATUS_INVALID_PARAM;
}
pDest[0] = (Cpa8U)(adler32 >> 3 * LAC_NUM_BITS_IN_BYTE);
pDest[1] = (Cpa8U)(adler32 >> 2 * LAC_NUM_BITS_IN_BYTE);
pDest[2] = (Cpa8U)(adler32 >> LAC_NUM_BITS_IN_BYTE);
pDest[3] = (Cpa8U)adler32;
pRes->produced += DC_ZLIB_FOOTER_SIZE;
}
}
return CPA_STATUS_SUCCESS;
}