blob: 8fc86a98f6bf493fac24bc556966342522317545 [file] [log] [blame]
/*
* Copyright (c) 2020 The Fuchsia Authors
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef LZ4_WRAPPER_H_
#define LZ4_WRAPPER_H_
#include <linux/types.h>
#include <compiler.h>
#include <linux/kernel.h>
typedef uint8_t BYTE;
typedef uint16_t U16;
typedef uint32_t U32;
typedef int32_t S32;
typedef uint64_t U64;
#define FORCE_INLINE static inline __attribute__((always_inline))
struct lz4_frame_header {
u32 magic;
union {
u8 flags;
struct {
u8 reserved0 : 2;
u8 has_content_checksum : 1;
u8 has_content_size : 1;
u8 has_block_checksum : 1;
u8 independent_blocks : 1;
u8 version : 2;
};
};
union {
u8 block_descriptor;
struct {
u8 reserved1 : 4;
u8 max_block_size : 3;
u8 reserved2 : 1;
};
};
/* + u64 content_size iff has_content_size is set */
/* + u8 header_checksum */
} __packed;
/**
* Check whether the given buffer in |src| is lz4 compressed.
*/
bool is_data_lz4_compressed(const void *src, size_t srcn);
/**
* Return the maximum uncompressed block size in a lz4 frame in bytes.
* @param h The pointer to the frame header.
* @param out Output pointer of the size in bytes.
*
* Return 0 on success, other values on failure.
*/
int get_lz4_max_block_size(const struct lz4_frame_header *h, size_t *out);
/**
* Validate and extract the header in lz4 compressed data given by |src|.
*
* @param src The lz4 compressed data.
* @param srcn Size of |src|.
* @param out Output pointer for storing the extracted header.
* @param data_offset Offset of the actual compressed data in |src|.
*
* Returns 0 on success, other values on failure.
*/
int check_and_extract_lz4_frame_header(const void *src, size_t srcn,
struct lz4_frame_header *out,
size_t *data_offset);
/**
* Decompress one block of data from lz4 data.
*
* @param src The lz4 compressed data.
* @param srcn Size of |src|.
* @param dst Output pointer for storing the decompress block.
* @param dstn Size of |dst|.
* @param block_size Output pointer for size of current compressed block.
* @param decompressed_size Output pointer for the amount of data decompressed.
*
* Returns 0 on success, other values on failure.
*/
int decompress_block(const void *src, size_t srcn, void *dst, int dstn,
size_t *block_size, size_t *decompressed_size);
/**
* Decompress as much data as possible that can fit into the output buffer.
*
* @param h Pointer to the lz4 frame header.
* @param src Pointer to the lz4 compressed block data.
* @param srcn Pointer to a size_t. It shall be the ize of |src| when calling
* the function. Upon successful return, the value will be set to the number
* of bytes processed from |src|.
* @param dst Output buffer
* @param dstn Pointer to a size_t. It shall be the size of |dst| when
* calling the function. Upon successful return, the value will be set to
* the number of bytes decompressed.
* @param has_more_data An output boolean pointer for indicating whether
* there is more data available to decompress.
*
* Returns 0 on success, other values on failure.
*/
int lz4_decompress(const struct lz4_frame_header *h, const uint8_t *src,
size_t *srcn, uint8_t *dst, size_t *dstn,
bool *has_more_data);
#endif