/*
 * 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
