1*b3df74d0SJoseph Chen /* SPDX-License-Identifier: GPL-2.0+ */ 2*b3df74d0SJoseph Chen /* 3*b3df74d0SJoseph Chen * Copyright 2019 Google LLC 4*b3df74d0SJoseph Chen */ 5*b3df74d0SJoseph Chen 6*b3df74d0SJoseph Chen #ifndef __LZ4_H 7*b3df74d0SJoseph Chen #define __LZ4_H 8*b3df74d0SJoseph Chen 9*b3df74d0SJoseph Chen #define LZ4F_MAGIC 0x184D2204 10*b3df74d0SJoseph Chen 11*b3df74d0SJoseph Chen struct lz4_frame_header { 12*b3df74d0SJoseph Chen u32 magic; 13*b3df74d0SJoseph Chen union { 14*b3df74d0SJoseph Chen u8 flags; 15*b3df74d0SJoseph Chen struct { 16*b3df74d0SJoseph Chen u8 reserved0:2; 17*b3df74d0SJoseph Chen u8 has_content_checksum:1; 18*b3df74d0SJoseph Chen u8 has_content_size:1; 19*b3df74d0SJoseph Chen u8 has_block_checksum:1; 20*b3df74d0SJoseph Chen u8 independent_blocks:1; 21*b3df74d0SJoseph Chen u8 version:2; 22*b3df74d0SJoseph Chen }; 23*b3df74d0SJoseph Chen }; 24*b3df74d0SJoseph Chen union { 25*b3df74d0SJoseph Chen u8 block_descriptor; 26*b3df74d0SJoseph Chen struct { 27*b3df74d0SJoseph Chen u8 reserved1:4; 28*b3df74d0SJoseph Chen u8 max_block_size:3; 29*b3df74d0SJoseph Chen u8 reserved2:1; 30*b3df74d0SJoseph Chen }; 31*b3df74d0SJoseph Chen }; 32*b3df74d0SJoseph Chen /* + u64 content_size iff has_content_size is set */ 33*b3df74d0SJoseph Chen /* + u8 header_checksum */ 34*b3df74d0SJoseph Chen } __packed; 35*b3df74d0SJoseph Chen 36*b3df74d0SJoseph Chen struct lz4_block_header { 37*b3df74d0SJoseph Chen union { 38*b3df74d0SJoseph Chen u32 raw; 39*b3df74d0SJoseph Chen struct { 40*b3df74d0SJoseph Chen u32 size:31; 41*b3df74d0SJoseph Chen u32 not_compressed:1; 42*b3df74d0SJoseph Chen }; 43*b3df74d0SJoseph Chen }; 44*b3df74d0SJoseph Chen /* + size bytes of data */ 45*b3df74d0SJoseph Chen /* + u32 block_checksum iff has_block_checksum is set */ 46*b3df74d0SJoseph Chen } __packed; 47*b3df74d0SJoseph Chen 48*b3df74d0SJoseph Chen bool lz4_is_valid_header(const unsigned char *h); 49*b3df74d0SJoseph Chen 50*b3df74d0SJoseph Chen /** 51*b3df74d0SJoseph Chen * ulz4fn() - Decompress LZ4 data 52*b3df74d0SJoseph Chen * 53*b3df74d0SJoseph Chen * @src: Source data to decompress 54*b3df74d0SJoseph Chen * @srcn: Length of source data 55*b3df74d0SJoseph Chen * @dst: Destination for uncompressed data 56*b3df74d0SJoseph Chen * @dstn: Returns length of uncompressed data 57*b3df74d0SJoseph Chen * @return 0 if OK, -EPROTONOSUPPORT if the magic number or version number are 58*b3df74d0SJoseph Chen * not recognised or independent blocks are used, -EINVAL if the reserved 59*b3df74d0SJoseph Chen * fields are non-zero, or input is overrun, -EENOBUFS if the destination 60*b3df74d0SJoseph Chen * buffer is overrun, -EEPROTO if the compressed data causes an error in 61*b3df74d0SJoseph Chen * the decompression algorithm 62*b3df74d0SJoseph Chen */ 63*b3df74d0SJoseph Chen int ulz4fn(const void *src, size_t srcn, void *dst, size_t *dstn); 64*b3df74d0SJoseph Chen 65*b3df74d0SJoseph Chen #endif 66