14f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#ifndef FIO_VERIFY_H
24f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#define FIO_VERIFY_H
34f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe
403e20d687566753b90383571e5e152c5142bdffdBruce Cran#include <stdint.h>
503e20d687566753b90383571e5e152c5142bdffdBruce Cran
6d3a173a927084660c365d6aa162016ebb0746946Jens Axboe#define FIO_HDR_MAGIC	0xacca
74f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe
84f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboeenum {
94f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_NONE = 0,		/* no verification */
104f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_MD5,			/* md5 sum data blocks */
114f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_CRC64,			/* crc64 sum data blocks */
124f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_CRC32,			/* crc32 sum data blocks */
134f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_CRC32C,			/* crc32c sum data blocks */
144f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_CRC32C_INTEL,		/* crc32c sum data blocks with hw */
154f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_CRC16,			/* crc16 sum data blocks */
164f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_CRC7,			/* crc7 sum data blocks */
174f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_SHA256,			/* sha256 sum data blocks */
184f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_SHA512,			/* sha512 sum data blocks */
19844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	VERIFY_XXHASH,			/* xxhash sum data blocks */
204f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_META,			/* block_num, timestamp etc. */
217c353ceb3257b132f4c98326046b42201e070731Jens Axboe	VERIFY_SHA1,			/* sha1 sum data blocks */
2292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	VERIFY_PATTERN,			/* verify specific patterns */
234f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	VERIFY_NULL,			/* pretend to verify */
244f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
254f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe
264f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe/*
274f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe * A header structure associated with each checksummed data block. It is
284f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe * followed by a checksum specific header that contains the verification
294f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe * data.
304f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe */
314f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct verify_header {
32d3a173a927084660c365d6aa162016ebb0746946Jens Axboe	uint16_t magic;
33d3a173a927084660c365d6aa162016ebb0746946Jens Axboe	uint16_t verify_type;
34f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	uint32_t len;
35f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	uint64_t rand_seed;
36f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	uint32_t crc32;
374f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
384f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe
394f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct vhdr_md5 {
4034644af59bd9232cc2948baf4f94b6534cb0a120Jens Axboe	uint32_t md5_digest[4];
414f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
424f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct vhdr_sha512 {
434f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	uint8_t sha512[128];
444f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
454f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct vhdr_sha256 {
46bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
474f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
487c353ceb3257b132f4c98326046b42201e070731Jens Axboestruct vhdr_sha1 {
497c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
507c353ceb3257b132f4c98326046b42201e070731Jens Axboe};
514f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct vhdr_crc64 {
524f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	uint64_t crc64;
534f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
544f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct vhdr_crc32 {
554f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	uint32_t crc32;
564f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
574f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct vhdr_crc16 {
584f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	uint16_t crc16;
594f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
604f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct vhdr_crc7 {
614f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	uint8_t crc7;
624f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
634f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboestruct vhdr_meta {
644f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	uint64_t offset;
654f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	unsigned char thread;
664f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	unsigned short numberio;
674f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	unsigned long time_sec;
684f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe	unsigned long time_usec;
694f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe};
70844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboestruct vhdr_xxhash {
71844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	uint32_t hash;
72844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe};
734f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe
744f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe/*
754f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe * Verify helpers
764f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe */
774f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboeextern void populate_verify_io_u(struct thread_data *, struct io_u *);
784f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboeextern int __must_check get_next_verify(struct thread_data *td, struct io_u *);
794f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboeextern int __must_check verify_io_u(struct thread_data *, struct io_u *);
80e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeextern int verify_io_u_async(struct thread_data *, struct io_u *);
81ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboeextern void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed);
82ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboeextern void fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len);
83dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboeextern void fio_verify_init(struct thread_data *td);
84e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
85e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
86e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Async verify offload
87e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
88e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeextern int verify_async_init(struct thread_data *);
89e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeextern void verify_async_exit(struct thread_data *);
904f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe
914f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#endif
92