/* * Copyright (C) 2024 Intel Corporation. All rights reserved. * Authors: * Gustavo A Espinoza * * * For conditions of distribution and use, see copyright notice in zlib.h */ #include #include #include "memory.hpp" #include "session.hpp" namespace qat { constexpr CpaDcHuffType kHuffType = CPA_DC_HT_FULL_DYNAMIC; DeflateSession::DeflateSession( std::shared_ptr &qat_instance, CpaDcCompLvl comp_level, CpaDcChecksum checksum, uint32_t numa_node): qat_instance_(qat_instance) { uint32_t session_size = 0; uint32_t ctx_size = 0; CpaDcSessionSetupData sd{}; sd.compLevel = comp_level; sd.compType = CPA_DC_DEFLATE; sd.huffType = kHuffType; sd.autoSelectBestHuffmanTree = CPA_DC_ASB_UNCOMP_STATIC_DYNAMIC_WITH_STORED_HDRS; sd.sessDirection = CPA_DC_DIR_COMBINED; sd.sessState = CPA_DC_STATELESS; sd.checksum = checksum; cpaDcGetSessionSize(qat_instance_->GetHandle(), &sd, &session_size, &ctx_size); session_ = AllocBlockArray(session_size, numa_node); cpaDcInitSession( qat_instance_->GetHandle(), session_, &sd, nullptr, // No context for stateless operations &dc_callback ); } DeflateSession::~DeflateSession() { if (session_) { cpaDcRemoveSession(qat_instance_->GetHandle(), session_); Free(session_); } session_ = nullptr; } std::unique_ptr DeflateSession::Deflate( std::unique_ptr &&buffers, bool flush_final) { CpaDcOpData op_data{}; op_data.flushFlag = (flush_final) ? CPA_DC_FLUSH_FINAL : CPA_DC_FLUSH_FULL; op_data.compressAndVerify = CPA_TRUE; op_data.inputSkipData.skipMode = CPA_DC_SKIP_DISABLED; op_data.outputSkipData.skipMode = CPA_DC_SKIP_DISABLED; auto task = std::make_unique( qat_instance_, std::move(buffers), std::make_unique() ); cpaDcCompressData2( qat_instance_->GetHandle(), session_, &task->GetBuffers()->GetSrc()->list, &task->GetBuffers()->GetDst()->list, &op_data, task->GetResults(), static_cast(task.get()) ); return std::move(task); } std::unique_ptr DeflateSession::Inflate(std::unique_ptr &&buffers) { CpaDcOpData op_data = {}; op_data.flushFlag = CPA_DC_FLUSH_FINAL; op_data.compressAndVerify = CPA_TRUE; op_data.inputSkipData.skipMode = CPA_DC_SKIP_DISABLED; op_data.outputSkipData.skipMode = CPA_DC_SKIP_DISABLED; auto task = std::make_unique( qat_instance_, std::move(buffers), std::make_unique() ); cpaDcDecompressData2( qat_instance_->GetHandle(), session_, &task->GetBuffers()->GetSrc()->list, &task->GetBuffers()->GetDst()->list, &op_data, task->GetResults(), static_cast(task.get()) ); return std::move(task); } uint32_t DeflateSession::GetDeflateBound(uint32_t input_size) { uint32_t output_size = 0; cpaDcDeflateCompressBound( qat_instance_->GetHandle(), kHuffType, input_size, &output_size ); return output_size; } }