xref: /spdk/test/unit/lib/util/dif.c/dif_ut.c (revision 92fb22519345bcb309a617ae4ad1cb7eebce6f14)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2019 Intel Corporation.
38b6c22b1SShuhei Matsumoto  *   All rights reserved.
48b6c22b1SShuhei Matsumoto  */
58b6c22b1SShuhei Matsumoto 
68b6c22b1SShuhei Matsumoto #include "spdk/stdinc.h"
78b6c22b1SShuhei Matsumoto 
8ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
98b6c22b1SShuhei Matsumoto 
108b6c22b1SShuhei Matsumoto #include "util/dif.c"
118b6c22b1SShuhei Matsumoto 
122fefd9f5SShuhei Matsumoto #define DATA_PATTERN(offset)	((uint8_t)(0xAB + (offset)))
138696cd42SShuhei Matsumoto #define GUARD_SEED		0xCD
148b6c22b1SShuhei Matsumoto 
158b6c22b1SShuhei Matsumoto static int
168b6c22b1SShuhei Matsumoto ut_data_pattern_generate(struct iovec *iovs, int iovcnt,
178b6c22b1SShuhei Matsumoto 			 uint32_t block_size, uint32_t md_size, uint32_t num_blocks)
188b6c22b1SShuhei Matsumoto {
19ce325885SShuhei Matsumoto 	struct _dif_sgl sgl;
202fefd9f5SShuhei Matsumoto 	uint32_t offset_blocks, offset_in_block, buf_len, data_offset, i;
212fefd9f5SShuhei Matsumoto 	uint8_t *buf;
228b6c22b1SShuhei Matsumoto 
23404ad843SShuhei Matsumoto 	_dif_sgl_init(&sgl, iovs, iovcnt);
24404ad843SShuhei Matsumoto 
25bbd13b48SShuhei Matsumoto 	if (!_dif_sgl_is_valid(&sgl, block_size * num_blocks)) {
268b6c22b1SShuhei Matsumoto 		return -1;
278b6c22b1SShuhei Matsumoto 	}
288b6c22b1SShuhei Matsumoto 
298b6c22b1SShuhei Matsumoto 	offset_blocks = 0;
302fefd9f5SShuhei Matsumoto 	data_offset = 0;
318b6c22b1SShuhei Matsumoto 
3240864641Swuzhouhui 	while (offset_blocks < num_blocks) {
338b6c22b1SShuhei Matsumoto 		offset_in_block = 0;
3440864641Swuzhouhui 		while (offset_in_block < block_size) {
35ce325885SShuhei Matsumoto 			_dif_sgl_get_buf(&sgl, (void *)&buf, &buf_len);
368b6c22b1SShuhei Matsumoto 			if (offset_in_block < block_size - md_size) {
378b6c22b1SShuhei Matsumoto 				buf_len = spdk_min(buf_len,
388b6c22b1SShuhei Matsumoto 						   block_size - md_size - offset_in_block);
392fefd9f5SShuhei Matsumoto 				for (i = 0; i < buf_len; i++) {
402fefd9f5SShuhei Matsumoto 					buf[i] = DATA_PATTERN(data_offset + i);
412fefd9f5SShuhei Matsumoto 				}
422fefd9f5SShuhei Matsumoto 				data_offset += buf_len;
438b6c22b1SShuhei Matsumoto 			} else {
448b6c22b1SShuhei Matsumoto 				buf_len = spdk_min(buf_len, block_size - offset_in_block);
458b6c22b1SShuhei Matsumoto 				memset(buf, 0, buf_len);
468b6c22b1SShuhei Matsumoto 			}
47ce325885SShuhei Matsumoto 			_dif_sgl_advance(&sgl, buf_len);
488b6c22b1SShuhei Matsumoto 			offset_in_block += buf_len;
498b6c22b1SShuhei Matsumoto 		}
508b6c22b1SShuhei Matsumoto 		offset_blocks++;
518b6c22b1SShuhei Matsumoto 	}
528b6c22b1SShuhei Matsumoto 
538b6c22b1SShuhei Matsumoto 	return 0;
548b6c22b1SShuhei Matsumoto }
558b6c22b1SShuhei Matsumoto 
568b6c22b1SShuhei Matsumoto static int
578b6c22b1SShuhei Matsumoto ut_data_pattern_verify(struct iovec *iovs, int iovcnt,
588b6c22b1SShuhei Matsumoto 		       uint32_t block_size, uint32_t md_size, uint32_t num_blocks)
598b6c22b1SShuhei Matsumoto {
60ce325885SShuhei Matsumoto 	struct _dif_sgl sgl;
612fefd9f5SShuhei Matsumoto 	uint32_t offset_blocks, offset_in_block, buf_len, data_offset, i;
628b6c22b1SShuhei Matsumoto 	uint8_t *buf;
638b6c22b1SShuhei Matsumoto 
64404ad843SShuhei Matsumoto 	_dif_sgl_init(&sgl, iovs, iovcnt);
65404ad843SShuhei Matsumoto 
66bbd13b48SShuhei Matsumoto 	if (!_dif_sgl_is_valid(&sgl, block_size * num_blocks)) {
678b6c22b1SShuhei Matsumoto 		return -1;
688b6c22b1SShuhei Matsumoto 	}
698b6c22b1SShuhei Matsumoto 
708b6c22b1SShuhei Matsumoto 	offset_blocks = 0;
712fefd9f5SShuhei Matsumoto 	data_offset = 0;
728b6c22b1SShuhei Matsumoto 
7340864641Swuzhouhui 	while (offset_blocks < num_blocks) {
748b6c22b1SShuhei Matsumoto 		offset_in_block = 0;
7540864641Swuzhouhui 		while (offset_in_block < block_size) {
76ce325885SShuhei Matsumoto 			_dif_sgl_get_buf(&sgl, (void *)&buf, &buf_len);
778b6c22b1SShuhei Matsumoto 
788b6c22b1SShuhei Matsumoto 			if (offset_in_block < block_size - md_size) {
798b6c22b1SShuhei Matsumoto 				buf_len = spdk_min(buf_len,
808b6c22b1SShuhei Matsumoto 						   block_size - md_size - offset_in_block);
818b6c22b1SShuhei Matsumoto 				for (i = 0; i < buf_len; i++) {
822fefd9f5SShuhei Matsumoto 					if (buf[i] != DATA_PATTERN(data_offset + i)) {
838b6c22b1SShuhei Matsumoto 						return -1;
848b6c22b1SShuhei Matsumoto 					}
858b6c22b1SShuhei Matsumoto 				}
862fefd9f5SShuhei Matsumoto 				data_offset += buf_len;
878b6c22b1SShuhei Matsumoto 			} else {
888b6c22b1SShuhei Matsumoto 				buf_len = spdk_min(buf_len, block_size - offset_in_block);
898b6c22b1SShuhei Matsumoto 			}
90ce325885SShuhei Matsumoto 			_dif_sgl_advance(&sgl, buf_len);
918b6c22b1SShuhei Matsumoto 			offset_in_block += buf_len;
928b6c22b1SShuhei Matsumoto 		}
938b6c22b1SShuhei Matsumoto 		offset_blocks++;
948b6c22b1SShuhei Matsumoto 	}
958b6c22b1SShuhei Matsumoto 
968b6c22b1SShuhei Matsumoto 	return 0;
978b6c22b1SShuhei Matsumoto }
988b6c22b1SShuhei Matsumoto 
998b6c22b1SShuhei Matsumoto static void
1008b6c22b1SShuhei Matsumoto _iov_alloc_buf(struct iovec *iov, uint32_t len)
1018b6c22b1SShuhei Matsumoto {
1028b6c22b1SShuhei Matsumoto 	iov->iov_base = calloc(1, len);
1038b6c22b1SShuhei Matsumoto 	iov->iov_len = len;
1048b6c22b1SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(iov->iov_base != NULL);
1058b6c22b1SShuhei Matsumoto }
1068b6c22b1SShuhei Matsumoto 
1078b6c22b1SShuhei Matsumoto static void
1088b6c22b1SShuhei Matsumoto _iov_free_buf(struct iovec *iov)
1098b6c22b1SShuhei Matsumoto {
1108b6c22b1SShuhei Matsumoto 	free(iov->iov_base);
1118b6c22b1SShuhei Matsumoto }
1128b6c22b1SShuhei Matsumoto 
1138b6c22b1SShuhei Matsumoto static void
1146716729cSShuhei Matsumoto _iov_set_buf(struct iovec *iov, uint8_t *buf, uint32_t buf_len)
1156716729cSShuhei Matsumoto {
1166716729cSShuhei Matsumoto 	iov->iov_base = buf;
1176716729cSShuhei Matsumoto 	iov->iov_len = buf_len;
1186716729cSShuhei Matsumoto }
1196716729cSShuhei Matsumoto 
1206716729cSShuhei Matsumoto static bool
1216716729cSShuhei Matsumoto _iov_check(struct iovec *iov, void *iov_base, uint32_t iov_len)
1226716729cSShuhei Matsumoto {
1236716729cSShuhei Matsumoto 	return (iov->iov_base == iov_base && iov->iov_len == iov_len);
1246716729cSShuhei Matsumoto }
1256716729cSShuhei Matsumoto 
1265256f0efSSlawomir Ptak static uint64_t
1275256f0efSSlawomir Ptak _generate_guard(uint64_t guard_seed, void *buf, size_t buf_len,
128cc4498acSSlawomir Ptak 		enum spdk_dif_pi_format dif_pi_format)
129cc4498acSSlawomir Ptak {
1305256f0efSSlawomir Ptak 	uint64_t guard;
131cc4498acSSlawomir Ptak 
132cc4498acSSlawomir Ptak 	if (dif_pi_format == SPDK_DIF_PI_FORMAT_16) {
1335256f0efSSlawomir Ptak 		guard = (uint64_t)spdk_crc16_t10dif((uint16_t)guard_seed, buf, buf_len);
1345256f0efSSlawomir Ptak 	} else if (dif_pi_format == SPDK_DIF_PI_FORMAT_32) {
1355256f0efSSlawomir Ptak 		guard = (uint64_t)spdk_crc32c_nvme(buf, buf_len, guard_seed);
136cc4498acSSlawomir Ptak 	} else {
1375256f0efSSlawomir Ptak 		guard = spdk_crc64_nvme(buf, buf_len, guard_seed);
138cc4498acSSlawomir Ptak 	}
139cc4498acSSlawomir Ptak 
140cc4498acSSlawomir Ptak 	return guard;
141cc4498acSSlawomir Ptak }
142cc4498acSSlawomir Ptak 
1436716729cSShuhei Matsumoto static void
1448b6c22b1SShuhei Matsumoto _dif_generate_and_verify(struct iovec *iov,
14518461cbaSShuhei Matsumoto 			 uint32_t block_size, uint32_t md_size, bool dif_loc,
1468b6c22b1SShuhei Matsumoto 			 enum spdk_dif_type dif_type, uint32_t dif_flags,
147cc4498acSSlawomir Ptak 			 enum spdk_dif_pi_format dif_pi_format,
14807d28d02SSlawomir Ptak 			 uint64_t ref_tag, uint64_t e_ref_tag,
1498b6c22b1SShuhei Matsumoto 			 uint16_t app_tag, uint16_t apptag_mask, uint16_t e_app_tag,
1508b6c22b1SShuhei Matsumoto 			 bool expect_pass)
1518b6c22b1SShuhei Matsumoto {
15218461cbaSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
15318461cbaSShuhei Matsumoto 	uint32_t guard_interval;
1545256f0efSSlawomir Ptak 	uint64_t guard = 0;
15518461cbaSShuhei Matsumoto 	int rc;
1568b6c22b1SShuhei Matsumoto 
1578b6c22b1SShuhei Matsumoto 	rc = ut_data_pattern_generate(iov, 1, block_size, md_size, 1);
1588b6c22b1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1598b6c22b1SShuhei Matsumoto 
160cc4498acSSlawomir Ptak 	ctx.dif_pi_format = dif_pi_format;
161cc4498acSSlawomir Ptak 
16207d28d02SSlawomir Ptak 	guard_interval = _get_guard_interval(block_size, md_size, dif_loc, true,
16307d28d02SSlawomir Ptak 					     _dif_size(ctx.dif_pi_format));
16418461cbaSShuhei Matsumoto 
16518461cbaSShuhei Matsumoto 	ctx.dif_type = dif_type;
16618461cbaSShuhei Matsumoto 	ctx.dif_flags = dif_flags;
16718461cbaSShuhei Matsumoto 	ctx.init_ref_tag = ref_tag;
16818461cbaSShuhei Matsumoto 	ctx.app_tag = app_tag;
16918461cbaSShuhei Matsumoto 
17096f29261SShuhei Matsumoto 	if (dif_flags & SPDK_DIF_FLAGS_GUARD_CHECK) {
171cc4498acSSlawomir Ptak 		guard = _generate_guard(0, iov->iov_base, guard_interval, ctx.dif_pi_format);
1728b6c22b1SShuhei Matsumoto 	}
17318461cbaSShuhei Matsumoto 	_dif_generate(iov->iov_base + guard_interval, guard, 0, &ctx);
1748b6c22b1SShuhei Matsumoto 
17518461cbaSShuhei Matsumoto 	ctx.init_ref_tag = e_ref_tag;
17618461cbaSShuhei Matsumoto 	ctx.apptag_mask = apptag_mask;
17718461cbaSShuhei Matsumoto 	ctx.app_tag = e_app_tag;
17818461cbaSShuhei Matsumoto 
17965e491a8SShuhei Matsumoto 	rc = _dif_verify(iov->iov_base + guard_interval, guard, 0, &ctx, NULL);
1808b6c22b1SShuhei Matsumoto 	CU_ASSERT((expect_pass && rc == 0) || (!expect_pass && rc != 0));
1818b6c22b1SShuhei Matsumoto 
1828b6c22b1SShuhei Matsumoto 	rc = ut_data_pattern_verify(iov, 1, block_size, md_size, 1);
1838b6c22b1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1848b6c22b1SShuhei Matsumoto }
1858b6c22b1SShuhei Matsumoto 
1868b6c22b1SShuhei Matsumoto static void
1878b6c22b1SShuhei Matsumoto dif_generate_and_verify_test(void)
1888b6c22b1SShuhei Matsumoto {
1898b6c22b1SShuhei Matsumoto 	struct iovec iov;
1908b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
1918b6c22b1SShuhei Matsumoto 
19296f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
19396f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1948b6c22b1SShuhei Matsumoto 
1958b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iov, 4096 + 128);
1968b6c22b1SShuhei Matsumoto 
1978b6c22b1SShuhei Matsumoto 	/* Positive cases */
1988b6c22b1SShuhei Matsumoto 
199cc4498acSSlawomir Ptak 	/* The case that DIF is contained in the first 8/16 bytes of metadata. */
2008b6c22b1SShuhei Matsumoto 	_dif_generate_and_verify(&iov,
2013f836b03SShuhei Matsumoto 				 4096 + 128, 128, true,
2028b6c22b1SShuhei Matsumoto 				 SPDK_DIF_TYPE1, dif_flags,
203cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_16,
2048b6c22b1SShuhei Matsumoto 				 22, 22,
2058b6c22b1SShuhei Matsumoto 				 0x22, 0xFFFF, 0x22,
2068b6c22b1SShuhei Matsumoto 				 true);
2078b6c22b1SShuhei Matsumoto 
208cc4498acSSlawomir Ptak 	_dif_generate_and_verify(&iov,
209cc4498acSSlawomir Ptak 				 4096 + 128, 128, true,
210cc4498acSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
211cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_32,
212cc4498acSSlawomir Ptak 				 22, 22,
213cc4498acSSlawomir Ptak 				 0x22, 0xFFFF, 0x22,
214cc4498acSSlawomir Ptak 				 true);
215cc4498acSSlawomir Ptak 
2165256f0efSSlawomir Ptak 	_dif_generate_and_verify(&iov,
2175256f0efSSlawomir Ptak 				 4096 + 128, 128, true,
2185256f0efSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
2195256f0efSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_64,
2205256f0efSSlawomir Ptak 				 22, 22,
2215256f0efSSlawomir Ptak 				 0x22, 0xFFFF, 0x22,
2225256f0efSSlawomir Ptak 				 true);
2235256f0efSSlawomir Ptak 
224cc4498acSSlawomir Ptak 	/* The case that DIF is contained in the last 8/16 bytes of metadata. */
2258b6c22b1SShuhei Matsumoto 	_dif_generate_and_verify(&iov,
2263f836b03SShuhei Matsumoto 				 4096 + 128, 128, false,
2278b6c22b1SShuhei Matsumoto 				 SPDK_DIF_TYPE1, dif_flags,
228cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_16,
229cc4498acSSlawomir Ptak 				 22, 22,
230cc4498acSSlawomir Ptak 				 0x22, 0xFFFF, 0x22,
231cc4498acSSlawomir Ptak 				 true);
232cc4498acSSlawomir Ptak 
233cc4498acSSlawomir Ptak 	_dif_generate_and_verify(&iov,
234cc4498acSSlawomir Ptak 				 4096 + 128, 128, false,
235cc4498acSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
236cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_32,
2378b6c22b1SShuhei Matsumoto 				 22, 22,
2388b6c22b1SShuhei Matsumoto 				 0x22, 0xFFFF, 0x22,
2398b6c22b1SShuhei Matsumoto 				 true);
2408b6c22b1SShuhei Matsumoto 
2415256f0efSSlawomir Ptak 	_dif_generate_and_verify(&iov,
2425256f0efSSlawomir Ptak 				 4096 + 128, 128, false,
2435256f0efSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
2445256f0efSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_64,
2455256f0efSSlawomir Ptak 				 22, 22,
2465256f0efSSlawomir Ptak 				 0x22, 0xFFFF, 0x22,
2475256f0efSSlawomir Ptak 				 true);
2485256f0efSSlawomir Ptak 
2498b6c22b1SShuhei Matsumoto 	/* Negative cases */
2508b6c22b1SShuhei Matsumoto 
2518b6c22b1SShuhei Matsumoto 	/* Reference tag doesn't match. */
2528b6c22b1SShuhei Matsumoto 	_dif_generate_and_verify(&iov,
25318461cbaSShuhei Matsumoto 				 4096 + 128, 128, false,
2548b6c22b1SShuhei Matsumoto 				 SPDK_DIF_TYPE1, dif_flags,
255cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_16,
256cc4498acSSlawomir Ptak 				 22, 23,
257cc4498acSSlawomir Ptak 				 0x22, 0xFFFF, 0x22,
258cc4498acSSlawomir Ptak 				 false);
259cc4498acSSlawomir Ptak 
260cc4498acSSlawomir Ptak 	_dif_generate_and_verify(&iov,
261cc4498acSSlawomir Ptak 				 4096 + 128, 128, false,
262cc4498acSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
263cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_32,
2648b6c22b1SShuhei Matsumoto 				 22, 23,
2658b6c22b1SShuhei Matsumoto 				 0x22, 0xFFFF, 0x22,
2668b6c22b1SShuhei Matsumoto 				 false);
2678b6c22b1SShuhei Matsumoto 
2685256f0efSSlawomir Ptak 	_dif_generate_and_verify(&iov,
2695256f0efSSlawomir Ptak 				 4096 + 128, 128, false,
2705256f0efSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
2715256f0efSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_64,
2725256f0efSSlawomir Ptak 				 22, 23,
2735256f0efSSlawomir Ptak 				 0x22, 0xFFFF, 0x22,
2745256f0efSSlawomir Ptak 				 false);
2755256f0efSSlawomir Ptak 
2768b6c22b1SShuhei Matsumoto 	/* Application tag doesn't match. */
2778b6c22b1SShuhei Matsumoto 	_dif_generate_and_verify(&iov,
27818461cbaSShuhei Matsumoto 				 4096 + 128, 128, false,
2798b6c22b1SShuhei Matsumoto 				 SPDK_DIF_TYPE1, dif_flags,
280cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_16,
281cc4498acSSlawomir Ptak 				 22, 22,
282cc4498acSSlawomir Ptak 				 0x22, 0xFFFF, 0x23,
283cc4498acSSlawomir Ptak 				 false);
284cc4498acSSlawomir Ptak 
285cc4498acSSlawomir Ptak 	_dif_generate_and_verify(&iov,
286cc4498acSSlawomir Ptak 				 4096 + 128, 128, false,
287cc4498acSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
288cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_32,
2898b6c22b1SShuhei Matsumoto 				 22, 22,
2908b6c22b1SShuhei Matsumoto 				 0x22, 0xFFFF, 0x23,
2918b6c22b1SShuhei Matsumoto 				 false);
2928b6c22b1SShuhei Matsumoto 
2935256f0efSSlawomir Ptak 	_dif_generate_and_verify(&iov,
2945256f0efSSlawomir Ptak 				 4096 + 128, 128, false,
2955256f0efSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
2965256f0efSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_64,
2975256f0efSSlawomir Ptak 				 22, 22,
2985256f0efSSlawomir Ptak 				 0x22, 0xFFFF, 0x23,
2995256f0efSSlawomir Ptak 				 false);
3005256f0efSSlawomir Ptak 
3018b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iov);
3028b6c22b1SShuhei Matsumoto }
3038b6c22b1SShuhei Matsumoto 
3048b6c22b1SShuhei Matsumoto static void
3058b6c22b1SShuhei Matsumoto dif_disable_check_test(void)
3068b6c22b1SShuhei Matsumoto {
3078b6c22b1SShuhei Matsumoto 	struct iovec iov;
3088b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
3098b6c22b1SShuhei Matsumoto 
31096f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
31196f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
3128b6c22b1SShuhei Matsumoto 
3138b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iov, 4096 + 128);
3148b6c22b1SShuhei Matsumoto 
3158b6c22b1SShuhei Matsumoto 	/* The case that DIF check is disabled when the Application Tag is 0xFFFF for
3168b6c22b1SShuhei Matsumoto 	 * Type 1. DIF check is disabled and pass is expected.
3178b6c22b1SShuhei Matsumoto 	 */
3188b6c22b1SShuhei Matsumoto 	_dif_generate_and_verify(&iov,
31918461cbaSShuhei Matsumoto 				 4096 + 128, 128, false,
3208b6c22b1SShuhei Matsumoto 				 SPDK_DIF_TYPE1, dif_flags,
321cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_16,
322cc4498acSSlawomir Ptak 				 22, 22,
323cc4498acSSlawomir Ptak 				 0xFFFF, 0xFFFF, 0x22,
324cc4498acSSlawomir Ptak 				 true);
325cc4498acSSlawomir Ptak 
326cc4498acSSlawomir Ptak 	_dif_generate_and_verify(&iov,
327cc4498acSSlawomir Ptak 				 4096 + 128, 128, false,
328cc4498acSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
329cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_32,
3308b6c22b1SShuhei Matsumoto 				 22, 22,
3318b6c22b1SShuhei Matsumoto 				 0xFFFF, 0xFFFF, 0x22,
3328b6c22b1SShuhei Matsumoto 				 true);
3338b6c22b1SShuhei Matsumoto 
3345256f0efSSlawomir Ptak 	_dif_generate_and_verify(&iov,
3355256f0efSSlawomir Ptak 				 4096 + 128, 128, false,
3365256f0efSSlawomir Ptak 				 SPDK_DIF_TYPE1, dif_flags,
3375256f0efSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_64,
3385256f0efSSlawomir Ptak 				 22, 22,
3395256f0efSSlawomir Ptak 				 0xFFFF, 0xFFFF, 0x22,
3405256f0efSSlawomir Ptak 				 true);
3415256f0efSSlawomir Ptak 
3428b6c22b1SShuhei Matsumoto 	/* The case that DIF check is not disabled when the Application Tag is 0xFFFF but
3438b6c22b1SShuhei Matsumoto 	 * the Reference Tag is not 0xFFFFFFFF for Type 3. DIF check is not disabled and
3448b6c22b1SShuhei Matsumoto 	 * fail is expected.
3458b6c22b1SShuhei Matsumoto 	 */
3468b6c22b1SShuhei Matsumoto 	_dif_generate_and_verify(&iov,
34718461cbaSShuhei Matsumoto 				 4096 + 128, 128, false,
3488b6c22b1SShuhei Matsumoto 				 SPDK_DIF_TYPE3, dif_flags,
349cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_16,
350cc4498acSSlawomir Ptak 				 22, 22,
351cc4498acSSlawomir Ptak 				 0xFFFF, 0xFFFF, 0x22,
352cc4498acSSlawomir Ptak 				 false);
353cc4498acSSlawomir Ptak 
354cc4498acSSlawomir Ptak 	_dif_generate_and_verify(&iov,
355cc4498acSSlawomir Ptak 				 4096 + 128, 128, false,
356cc4498acSSlawomir Ptak 				 SPDK_DIF_TYPE3, dif_flags,
357cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_32,
3588b6c22b1SShuhei Matsumoto 				 22, 22,
3598b6c22b1SShuhei Matsumoto 				 0xFFFF, 0xFFFF, 0x22,
3608b6c22b1SShuhei Matsumoto 				 false);
3618b6c22b1SShuhei Matsumoto 
3625256f0efSSlawomir Ptak 	_dif_generate_and_verify(&iov,
3635256f0efSSlawomir Ptak 				 4096 + 128, 128, false,
3645256f0efSSlawomir Ptak 				 SPDK_DIF_TYPE3, dif_flags,
3655256f0efSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_64,
3665256f0efSSlawomir Ptak 				 22, 22,
3675256f0efSSlawomir Ptak 				 0xFFFF, 0xFFFF, 0x22,
3685256f0efSSlawomir Ptak 				 false);
3695256f0efSSlawomir Ptak 
3708b6c22b1SShuhei Matsumoto 	/* The case that DIF check is disabled when the Application Tag is 0xFFFF and
3718b6c22b1SShuhei Matsumoto 	 * the Reference Tag is 0xFFFFFFFF for Type 3. DIF check is disabled and
3728b6c22b1SShuhei Matsumoto 	 * pass is expected.
3738b6c22b1SShuhei Matsumoto 	 */
3748b6c22b1SShuhei Matsumoto 	_dif_generate_and_verify(&iov,
37518461cbaSShuhei Matsumoto 				 4096 + 128, 128, false,
3768b6c22b1SShuhei Matsumoto 				 SPDK_DIF_TYPE3, dif_flags,
377cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_16,
3788b6c22b1SShuhei Matsumoto 				 0xFFFFFFFF, 22,
3798b6c22b1SShuhei Matsumoto 				 0xFFFF, 0xFFFF, 0x22,
3808b6c22b1SShuhei Matsumoto 				 true);
3818b6c22b1SShuhei Matsumoto 
382cc4498acSSlawomir Ptak 	_dif_generate_and_verify(&iov,
383cc4498acSSlawomir Ptak 				 4096 + 128, 128, false,
384cc4498acSSlawomir Ptak 				 SPDK_DIF_TYPE3, dif_flags,
385cc4498acSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_32,
386cc4498acSSlawomir Ptak 				 0xFFFFFFFFFFFFFFFF, 22,
387cc4498acSSlawomir Ptak 				 0xFFFF, 0xFFFF, 0x22,
388cc4498acSSlawomir Ptak 				 true);
389cc4498acSSlawomir Ptak 
3905256f0efSSlawomir Ptak 	_dif_generate_and_verify(&iov,
3915256f0efSSlawomir Ptak 				 4096 + 128, 128, false,
3925256f0efSSlawomir Ptak 				 SPDK_DIF_TYPE3, dif_flags,
3935256f0efSSlawomir Ptak 				 SPDK_DIF_PI_FORMAT_64,
3945256f0efSSlawomir Ptak 				 0xFFFFFFFFFFFFFFFF, 22,
3955256f0efSSlawomir Ptak 				 0xFFFF, 0xFFFF, 0x22,
3965256f0efSSlawomir Ptak 				 true);
3975256f0efSSlawomir Ptak 
3988b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iov);
3998b6c22b1SShuhei Matsumoto }
4008b6c22b1SShuhei Matsumoto 
4018b6c22b1SShuhei Matsumoto static void
402cc4498acSSlawomir Ptak _dif_generate_and_verify_different_pi_format(uint32_t dif_flags,
403cc4498acSSlawomir Ptak 		enum spdk_dif_pi_format dif_pi_format_1, enum spdk_dif_pi_format dif_pi_format_2)
404cc4498acSSlawomir Ptak {
405cc4498acSSlawomir Ptak 	struct spdk_dif_ctx ctx_1 = {}, ctx_2 = {};
406cc4498acSSlawomir Ptak 	int rc;
407cc4498acSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
408cc4498acSSlawomir Ptak 	struct iovec iov;
409cc4498acSSlawomir Ptak 	struct spdk_dif_error err_blk = {};
410cc4498acSSlawomir Ptak 	uint8_t expected_err_type = 0;
411cc4498acSSlawomir Ptak 
412cc4498acSSlawomir Ptak 	if (dif_flags & SPDK_DIF_FLAGS_GUARD_CHECK) {
413cc4498acSSlawomir Ptak 		expected_err_type = SPDK_DIF_GUARD_ERROR;
414cc4498acSSlawomir Ptak 	} else if (dif_flags & SPDK_DIF_FLAGS_APPTAG_CHECK) {
415cc4498acSSlawomir Ptak 		expected_err_type = SPDK_DIF_APPTAG_ERROR;
416cc4498acSSlawomir Ptak 	} else if (dif_flags & SPDK_DIF_FLAGS_REFTAG_CHECK) {
417cc4498acSSlawomir Ptak 		expected_err_type = SPDK_DIF_REFTAG_ERROR;
418cc4498acSSlawomir Ptak 	} else {
419cc4498acSSlawomir Ptak 		CU_ASSERT(false);
420cc4498acSSlawomir Ptak 	}
421cc4498acSSlawomir Ptak 
422cc4498acSSlawomir Ptak 	CU_ASSERT(dif_pi_format_1 != dif_pi_format_2);
423cc4498acSSlawomir Ptak 
424cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iov, 4096 + 128);
425cc4498acSSlawomir Ptak 
426cc4498acSSlawomir Ptak 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 1);
427cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
428cc4498acSSlawomir Ptak 
4295681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
430cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format_1;
431cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx_1, 4096 + 128, 128, true, true, SPDK_DIF_TYPE1, dif_flags,
432cc4498acSSlawomir Ptak 			       12, 0xFFFF, 23, 0, 0, &dif_opts);
433cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
434cc4498acSSlawomir Ptak 
435cc4498acSSlawomir Ptak 	rc = spdk_dif_generate(&iov, 1, 1, &ctx_1);
436cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
437cc4498acSSlawomir Ptak 
438cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format_2;
439cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx_2, 4096 + 128, 128, true, true, SPDK_DIF_TYPE1, dif_flags,
440cc4498acSSlawomir Ptak 			       12, 0xFFFF, 23, 0, 0, &dif_opts);
441cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
442cc4498acSSlawomir Ptak 
443cc4498acSSlawomir Ptak 	rc = spdk_dif_verify(&iov, 1, 1, &ctx_2, &err_blk);
444cc4498acSSlawomir Ptak 	CU_ASSERT(rc != 0);
445cc4498acSSlawomir Ptak 	CU_ASSERT(err_blk.err_type == expected_err_type);
446cc4498acSSlawomir Ptak 
447cc4498acSSlawomir Ptak 	rc = ut_data_pattern_verify(&iov, 1, 4096 + 128, 128, 1);
448cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
449cc4498acSSlawomir Ptak 
450cc4498acSSlawomir Ptak 	_iov_free_buf(&iov);
451cc4498acSSlawomir Ptak }
452cc4498acSSlawomir Ptak 
453cc4498acSSlawomir Ptak static void
454cc4498acSSlawomir Ptak dif_generate_and_verify_different_pi_formats_test(void)
455cc4498acSSlawomir Ptak {
456cc4498acSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_GUARD_CHECK,
457cc4498acSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_16, SPDK_DIF_PI_FORMAT_32);
458cc4498acSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_GUARD_CHECK,
459cc4498acSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_32, SPDK_DIF_PI_FORMAT_16);
4605256f0efSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_GUARD_CHECK,
4615256f0efSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_16, SPDK_DIF_PI_FORMAT_64);
4625256f0efSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_GUARD_CHECK,
4635256f0efSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_32, SPDK_DIF_PI_FORMAT_64);
4645256f0efSSlawomir Ptak 
465cc4498acSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_APPTAG_CHECK,
466cc4498acSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_16, SPDK_DIF_PI_FORMAT_32);
467cc4498acSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_APPTAG_CHECK,
468cc4498acSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_32, SPDK_DIF_PI_FORMAT_16);
4695256f0efSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_APPTAG_CHECK,
4705256f0efSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_16, SPDK_DIF_PI_FORMAT_64);
4715256f0efSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_APPTAG_CHECK,
4725256f0efSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_32, SPDK_DIF_PI_FORMAT_64);
4735256f0efSSlawomir Ptak 
474cc4498acSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_REFTAG_CHECK,
475cc4498acSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_16, SPDK_DIF_PI_FORMAT_32);
476cc4498acSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_REFTAG_CHECK,
477cc4498acSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_32, SPDK_DIF_PI_FORMAT_16);
4785256f0efSSlawomir Ptak 	_dif_generate_and_verify_different_pi_format(SPDK_DIF_FLAGS_REFTAG_CHECK,
4795256f0efSSlawomir Ptak 			SPDK_DIF_PI_FORMAT_16, SPDK_DIF_PI_FORMAT_64);
4805256f0efSSlawomir Ptak 	/* The ref tag in 32 and 64 PI formats will partially overlap, so skip the last test */
481cc4498acSSlawomir Ptak }
482cc4498acSSlawomir Ptak 
483cc4498acSSlawomir Ptak static void
484b648aca5SSlawomir Ptak _dif_apptag_mask_test(enum spdk_dif_pi_format dif_pi_format)
485b648aca5SSlawomir Ptak {
486b648aca5SSlawomir Ptak 	struct spdk_dif_ctx ctx = {};
487b648aca5SSlawomir Ptak 	int rc;
488b648aca5SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
489b648aca5SSlawomir Ptak 	struct iovec iov;
490b648aca5SSlawomir Ptak 	struct spdk_dif_error err_blk = {};
491b648aca5SSlawomir Ptak 	uint32_t dif_flags;
492b648aca5SSlawomir Ptak 
493b648aca5SSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_APPTAG_CHECK;
494b648aca5SSlawomir Ptak 
495b648aca5SSlawomir Ptak 	_iov_alloc_buf(&iov, 4096 + 128);
496b648aca5SSlawomir Ptak 
497b648aca5SSlawomir Ptak 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 1);
498b648aca5SSlawomir Ptak 	CU_ASSERT(rc == 0);
499b648aca5SSlawomir Ptak 
500b648aca5SSlawomir Ptak 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
501b648aca5SSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
502b648aca5SSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, true, SPDK_DIF_TYPE1, dif_flags,
503b648aca5SSlawomir Ptak 			       0, 0xFFFF, 0x1234, 0, 0, &dif_opts);
504b648aca5SSlawomir Ptak 	CU_ASSERT(rc == 0);
505b648aca5SSlawomir Ptak 
506b648aca5SSlawomir Ptak 	rc = spdk_dif_generate(&iov, 1, 1, &ctx);
507b648aca5SSlawomir Ptak 	CU_ASSERT(rc == 0);
508b648aca5SSlawomir Ptak 
509b648aca5SSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, true, SPDK_DIF_TYPE1, dif_flags,
510b648aca5SSlawomir Ptak 			       12, 0xFFFF, 0x1256, 0, 0, &dif_opts);
511b648aca5SSlawomir Ptak 	CU_ASSERT(rc == 0);
512b648aca5SSlawomir Ptak 
513b648aca5SSlawomir Ptak 	rc = spdk_dif_verify(&iov, 1, 1, &ctx, &err_blk);
514b648aca5SSlawomir Ptak 	CU_ASSERT(rc != 0);
515b648aca5SSlawomir Ptak 	CU_ASSERT(err_blk.err_type == SPDK_DIF_APPTAG_ERROR);
516b648aca5SSlawomir Ptak 
517b648aca5SSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, true, SPDK_DIF_TYPE1, dif_flags,
518b648aca5SSlawomir Ptak 			       12, 0xFF00, 0x1256, 0, 0, &dif_opts);
519b648aca5SSlawomir Ptak 	CU_ASSERT(rc == 0);
520b648aca5SSlawomir Ptak 
521b648aca5SSlawomir Ptak 	rc = spdk_dif_verify(&iov, 1, 1, &ctx, &err_blk);
522b648aca5SSlawomir Ptak 	CU_ASSERT(rc == 0);
523b648aca5SSlawomir Ptak 
524b648aca5SSlawomir Ptak 	rc = ut_data_pattern_verify(&iov, 1, 4096 + 128, 128, 1);
525b648aca5SSlawomir Ptak 	CU_ASSERT(rc == 0);
526b648aca5SSlawomir Ptak 
527b648aca5SSlawomir Ptak 	_iov_free_buf(&iov);
528b648aca5SSlawomir Ptak }
529b648aca5SSlawomir Ptak 
530b648aca5SSlawomir Ptak static void
531b648aca5SSlawomir Ptak dif_apptag_mask_test(void)
532b648aca5SSlawomir Ptak {
533b648aca5SSlawomir Ptak 	_dif_apptag_mask_test(SPDK_DIF_PI_FORMAT_16);
534b648aca5SSlawomir Ptak 	_dif_apptag_mask_test(SPDK_DIF_PI_FORMAT_32);
535b648aca5SSlawomir Ptak }
536b648aca5SSlawomir Ptak 
537b648aca5SSlawomir Ptak static void
538f7d49034SShuhei Matsumoto dif_sec_8_md_8_error_test(void)
539f7d49034SShuhei Matsumoto {
540f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
541f7d49034SShuhei Matsumoto 	int rc;
542f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx_init_ext_opts dif_opts;
543f7d49034SShuhei Matsumoto 
544f7d49034SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
545f7d49034SShuhei Matsumoto 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
546f7d49034SShuhei Matsumoto 	/* Metadata size is 8 and block size is 8. */
547f7d49034SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 8, 8, true, false, SPDK_DIF_TYPE1, 0,
548f7d49034SShuhei Matsumoto 			       0, 0, 0, 0, 0, &dif_opts);
549f7d49034SShuhei Matsumoto 	CU_ASSERT(rc != 0);
550f7d49034SShuhei Matsumoto }
551f7d49034SShuhei Matsumoto 
552f7d49034SShuhei Matsumoto static void
5538b6c22b1SShuhei Matsumoto dif_sec_512_md_0_error_test(void)
5548b6c22b1SShuhei Matsumoto {
55518461cbaSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
5568b6c22b1SShuhei Matsumoto 	int rc;
557a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
5588b6c22b1SShuhei Matsumoto 
5595681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
560a711d629SSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
5618b6c22b1SShuhei Matsumoto 	/* Metadata size is 0. */
562cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 512, 0, true, false, SPDK_DIF_TYPE1, 0,
563cc4498acSSlawomir Ptak 			       0, 0, 0, 0, 0, &dif_opts);
5648b6c22b1SShuhei Matsumoto 	CU_ASSERT(rc != 0);
5658b6c22b1SShuhei Matsumoto }
5668b6c22b1SShuhei Matsumoto 
5678b6c22b1SShuhei Matsumoto static void
568f7d49034SShuhei Matsumoto _dif_sec_512_md_16_error_test(enum spdk_dif_pi_format dif_pi_format)
569f7d49034SShuhei Matsumoto {
570f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
571f7d49034SShuhei Matsumoto 	int rc;
572f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx_init_ext_opts dif_opts;
573f7d49034SShuhei Matsumoto 
574f7d49034SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
575f7d49034SShuhei Matsumoto 	dif_opts.dif_pi_format = dif_pi_format;
576f7d49034SShuhei Matsumoto 	/* Metadata size is 16 but block size is 512. */
577f7d49034SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 512, 16, true, false, SPDK_DIF_TYPE1, 0,
578f7d49034SShuhei Matsumoto 			       0, 0, 0, 0, 0, &dif_opts);
579f7d49034SShuhei Matsumoto 	CU_ASSERT(rc != 0);
580f7d49034SShuhei Matsumoto }
581f7d49034SShuhei Matsumoto 
582f7d49034SShuhei Matsumoto static void
583f7d49034SShuhei Matsumoto dif_sec_512_md_16_error_test(void)
584f7d49034SShuhei Matsumoto {
585f7d49034SShuhei Matsumoto 	_dif_sec_512_md_16_error_test(SPDK_DIF_PI_FORMAT_32);
586f7d49034SShuhei Matsumoto 	_dif_sec_512_md_16_error_test(SPDK_DIF_PI_FORMAT_64);
587f7d49034SShuhei Matsumoto }
588f7d49034SShuhei Matsumoto 
589f7d49034SShuhei Matsumoto static void
590f7d49034SShuhei Matsumoto _dif_sec_4096_md_0_8_error_test(enum spdk_dif_pi_format dif_pi_format)
591cc4498acSSlawomir Ptak {
592cc4498acSSlawomir Ptak 	struct spdk_dif_ctx ctx = {};
593cc4498acSSlawomir Ptak 	int rc;
594cc4498acSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
595cc4498acSSlawomir Ptak 
5965681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
5975256f0efSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
598cc4498acSSlawomir Ptak 	/* Metadata size is 0. */
599cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 4096, 0, true, false, SPDK_DIF_TYPE1, 0,
600cc4498acSSlawomir Ptak 			       0, 0, 0, 0, 0, &dif_opts);
601cc4498acSSlawomir Ptak 	CU_ASSERT(rc != 0);
602f7d49034SShuhei Matsumoto 
603f7d49034SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
604f7d49034SShuhei Matsumoto 	dif_opts.dif_pi_format = dif_pi_format;
605f7d49034SShuhei Matsumoto 	/* Metadata size is 8. */
606f7d49034SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096, 8, true, false, SPDK_DIF_TYPE1, 0,
607f7d49034SShuhei Matsumoto 			       0, 0, 0, 0, 0, &dif_opts);
608f7d49034SShuhei Matsumoto 	CU_ASSERT(rc != 0);
609cc4498acSSlawomir Ptak }
610cc4498acSSlawomir Ptak 
611cc4498acSSlawomir Ptak static void
612f7d49034SShuhei Matsumoto dif_sec_4096_md_0_8_error_test(void)
6135256f0efSSlawomir Ptak {
614f7d49034SShuhei Matsumoto 	_dif_sec_4096_md_0_8_error_test(SPDK_DIF_PI_FORMAT_32);
615f7d49034SShuhei Matsumoto 	_dif_sec_4096_md_0_8_error_test(SPDK_DIF_PI_FORMAT_64);
6165256f0efSSlawomir Ptak }
6175256f0efSSlawomir Ptak 
6185256f0efSSlawomir Ptak static void
6195256f0efSSlawomir Ptak _dif_sec_4100_md_128_error_test(enum spdk_dif_pi_format dif_pi_format)
620cc4498acSSlawomir Ptak {
621cc4498acSSlawomir Ptak 	struct spdk_dif_ctx ctx = {};
622cc4498acSSlawomir Ptak 	int rc;
623cc4498acSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
624cc4498acSSlawomir Ptak 
6255681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
626cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_32;
627cc4498acSSlawomir Ptak 	/* Block size is not multiple of 4kB, MD interleave = false */
628cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 4100, 128, false, false, SPDK_DIF_TYPE1, 0,
629cc4498acSSlawomir Ptak 			       0, 0, 0, 0, 0, &dif_opts);
630cc4498acSSlawomir Ptak 	CU_ASSERT(rc != 0);
631cc4498acSSlawomir Ptak }
632cc4498acSSlawomir Ptak 
633cc4498acSSlawomir Ptak static void
6345256f0efSSlawomir Ptak dif_sec_4100_md_128_error_test(void)
6355256f0efSSlawomir Ptak {
6365256f0efSSlawomir Ptak 	_dif_sec_4100_md_128_error_test(SPDK_DIF_PI_FORMAT_32);
6375256f0efSSlawomir Ptak 	_dif_sec_4100_md_128_error_test(SPDK_DIF_PI_FORMAT_64);
6385256f0efSSlawomir Ptak }
6395256f0efSSlawomir Ptak 
6405256f0efSSlawomir Ptak static void
641cc4498acSSlawomir Ptak _dif_guard_seed_test(uint32_t block_size, uint32_t md_size,
642cc4498acSSlawomir Ptak 		     enum spdk_dif_pi_format dif_pi_format)
6438696cd42SShuhei Matsumoto {
6448696cd42SShuhei Matsumoto 	struct iovec iov;
6458696cd42SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
6468696cd42SShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
6478696cd42SShuhei Matsumoto 	struct spdk_dif *dif;
6485256f0efSSlawomir Ptak 	uint64_t guard;
6498696cd42SShuhei Matsumoto 	int rc;
650a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
6518696cd42SShuhei Matsumoto 
652cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iov, block_size);
6538696cd42SShuhei Matsumoto 
654cc4498acSSlawomir Ptak 	memset(iov.iov_base, 0, block_size);
6558696cd42SShuhei Matsumoto 
656cc4498acSSlawomir Ptak 	dif = (struct spdk_dif *)(iov.iov_base + (block_size - md_size));
6578696cd42SShuhei Matsumoto 
6585681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
659cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
660cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, true, SPDK_DIF_TYPE1,
661cc4498acSSlawomir Ptak 			       SPDK_DIF_FLAGS_GUARD_CHECK,
662cc4498acSSlawomir Ptak 			       0, 0, 0, 0, 0, &dif_opts);
6638696cd42SShuhei Matsumoto 	CU_ASSERT(rc == 0);
6648696cd42SShuhei Matsumoto 
6658696cd42SShuhei Matsumoto 	rc = spdk_dif_generate(&iov, 1, 1, &ctx);
6668696cd42SShuhei Matsumoto 	CU_ASSERT(rc == 0);
6678696cd42SShuhei Matsumoto 
6688696cd42SShuhei Matsumoto 	/* Guard should be zero if the block is all zero and seed is not added. */
669cc4498acSSlawomir Ptak 	guard = _dif_get_guard(dif, ctx.dif_pi_format);
6708696cd42SShuhei Matsumoto 	CU_ASSERT(guard == 0);
6718696cd42SShuhei Matsumoto 
6728696cd42SShuhei Matsumoto 	rc = spdk_dif_verify(&iov, 1, 1, &ctx, &err_blk);
6738696cd42SShuhei Matsumoto 	CU_ASSERT(rc == 0);
6748696cd42SShuhei Matsumoto 
675cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, true, SPDK_DIF_TYPE1,
676cc4498acSSlawomir Ptak 			       SPDK_DIF_FLAGS_GUARD_CHECK,
677cc4498acSSlawomir Ptak 			       0, 0, 0, 0, GUARD_SEED, &dif_opts);
6788696cd42SShuhei Matsumoto 	CU_ASSERT(rc == 0);
6798696cd42SShuhei Matsumoto 
6808696cd42SShuhei Matsumoto 	rc = spdk_dif_generate(&iov, 1, 1, &ctx);
6818696cd42SShuhei Matsumoto 	CU_ASSERT(rc == 0);
6828696cd42SShuhei Matsumoto 
6838696cd42SShuhei Matsumoto 	/* Guard should not be zero if the block is all zero but seed is added. */
684cc4498acSSlawomir Ptak 	guard = _dif_get_guard(dif, ctx.dif_pi_format);
6858696cd42SShuhei Matsumoto 	CU_ASSERT(guard != 0);
6868696cd42SShuhei Matsumoto 
6878696cd42SShuhei Matsumoto 	rc = spdk_dif_verify(&iov, 1, 1, &ctx, &err_blk);
6888696cd42SShuhei Matsumoto 	CU_ASSERT(rc == 0);
6898696cd42SShuhei Matsumoto 
6908696cd42SShuhei Matsumoto 	_iov_free_buf(&iov);
6918696cd42SShuhei Matsumoto }
6928696cd42SShuhei Matsumoto 
6938696cd42SShuhei Matsumoto static void
694cc4498acSSlawomir Ptak dif_guard_seed_test(void)
695cc4498acSSlawomir Ptak {
696cc4498acSSlawomir Ptak 	_dif_guard_seed_test(512 + 8, 8, SPDK_DIF_PI_FORMAT_16);
697cc4498acSSlawomir Ptak }
698cc4498acSSlawomir Ptak 
699cc4498acSSlawomir Ptak static void
700cc4498acSSlawomir Ptak _dif_guard_value_test(uint32_t block_size, uint32_t md_size,
701cc4498acSSlawomir Ptak 		      enum spdk_dif_pi_format dif_pi_format, struct iovec *iov_input_data,
702cc4498acSSlawomir Ptak 		      uint64_t expected_guard)
703cc4498acSSlawomir Ptak {
704cc4498acSSlawomir Ptak 	struct spdk_dif_ctx ctx = {};
705cc4498acSSlawomir Ptak 	struct spdk_dif_error err_blk = {};
706cc4498acSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
707cc4498acSSlawomir Ptak 	struct spdk_dif *dif;
708cc4498acSSlawomir Ptak 	int rc;
7095256f0efSSlawomir Ptak 	uint64_t guard;
710cc4498acSSlawomir Ptak 
7115681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
712cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
713cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, true, SPDK_DIF_TYPE1,
714cc4498acSSlawomir Ptak 			       SPDK_DIF_FLAGS_GUARD_CHECK,
715cc4498acSSlawomir Ptak 			       0, 0, 0, 0, 0, &dif_opts);
716cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
717cc4498acSSlawomir Ptak 
718cc4498acSSlawomir Ptak 	dif = (struct spdk_dif *)(iov_input_data->iov_base + (block_size - md_size));
719cc4498acSSlawomir Ptak 
720cc4498acSSlawomir Ptak 	rc = spdk_dif_generate(iov_input_data, 1, 1, &ctx);
721cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
722cc4498acSSlawomir Ptak 
723cc4498acSSlawomir Ptak 	guard = _dif_get_guard(dif, ctx.dif_pi_format);
724cc4498acSSlawomir Ptak 	CU_ASSERT(guard == expected_guard);
725cc4498acSSlawomir Ptak 
726cc4498acSSlawomir Ptak 	rc = spdk_dif_verify(iov_input_data, 1, 1, &ctx, &err_blk);
727cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
728cc4498acSSlawomir Ptak }
729cc4498acSSlawomir Ptak 
730cc4498acSSlawomir Ptak static void
731cc4498acSSlawomir Ptak dif_guard_value_test(void)
732cc4498acSSlawomir Ptak {
733cc4498acSSlawomir Ptak 	struct iovec iov;
734cc4498acSSlawomir Ptak 	unsigned int i, j;
735cc4498acSSlawomir Ptak 	uint32_t block_size = 4096 + 128;
736cc4498acSSlawomir Ptak 	uint32_t md_size = 128;
737cc4498acSSlawomir Ptak 
738cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iov, block_size);
739cc4498acSSlawomir Ptak 
740cc4498acSSlawomir Ptak 	/* All the expected CRC guard values are compliant with
741cc4498acSSlawomir Ptak 	* the NVM Command Set Specification 1.0c */
742cc4498acSSlawomir Ptak 
7435256f0efSSlawomir Ptak 	/* Input buffer = 0s */
744cc4498acSSlawomir Ptak 	memset(iov.iov_base, 0, block_size);
745cc4498acSSlawomir Ptak 	_dif_guard_value_test(block_size, md_size, SPDK_DIF_PI_FORMAT_32, &iov, 0x98F94189);
7465256f0efSSlawomir Ptak 	_dif_guard_value_test(block_size, md_size, SPDK_DIF_PI_FORMAT_64, &iov, 0x6482D367EB22B64E);
747cc4498acSSlawomir Ptak 
7485256f0efSSlawomir Ptak 	/* Input buffer = 1s */
749cc4498acSSlawomir Ptak 	memset(iov.iov_base, 0xFF, block_size);
750cc4498acSSlawomir Ptak 	_dif_guard_value_test(block_size, md_size, SPDK_DIF_PI_FORMAT_32, &iov, 0x25C1FE13);
7515256f0efSSlawomir Ptak 	_dif_guard_value_test(block_size, md_size, SPDK_DIF_PI_FORMAT_64, &iov, 0xC0DDBA7302ECA3AC);
752cc4498acSSlawomir Ptak 
7535256f0efSSlawomir Ptak 	/* Input buffer = 0x00, 0x01, 0x02, ... */
754cc4498acSSlawomir Ptak 	memset(iov.iov_base, 0, block_size);
755cc4498acSSlawomir Ptak 	j = 0;
756cc4498acSSlawomir Ptak 	for (i = 0; i < block_size - md_size; i++) {
757cc4498acSSlawomir Ptak 		*((uint8_t *)(iov.iov_base) + i) = j;
758cc4498acSSlawomir Ptak 		if (j == 0xFF) {
759cc4498acSSlawomir Ptak 			j = 0;
760cc4498acSSlawomir Ptak 		} else {
761cc4498acSSlawomir Ptak 			j++;
762cc4498acSSlawomir Ptak 		}
763cc4498acSSlawomir Ptak 	}
764cc4498acSSlawomir Ptak 	_dif_guard_value_test(block_size, md_size, SPDK_DIF_PI_FORMAT_32, &iov, 0x9C71FE32);
7655256f0efSSlawomir Ptak 	_dif_guard_value_test(block_size, md_size, SPDK_DIF_PI_FORMAT_64, &iov, 0x3E729F5F6750449C);
766cc4498acSSlawomir Ptak 
7675256f0efSSlawomir Ptak 	/* Input buffer = 0xFF, 0xFE, 0xFD, ... */
768cc4498acSSlawomir Ptak 	memset(iov.iov_base, 0, block_size);
769cc4498acSSlawomir Ptak 	j = 0xFF;
770cc4498acSSlawomir Ptak 	for (i = 0; i < block_size - md_size ; i++) {
771cc4498acSSlawomir Ptak 		*((uint8_t *)(iov.iov_base) + i) = j;
772cc4498acSSlawomir Ptak 		if (j == 0) {
773cc4498acSSlawomir Ptak 			j = 0xFF;
774cc4498acSSlawomir Ptak 		} else {
775cc4498acSSlawomir Ptak 			j--;
776cc4498acSSlawomir Ptak 		}
777cc4498acSSlawomir Ptak 	}
778cc4498acSSlawomir Ptak 	_dif_guard_value_test(block_size, md_size, SPDK_DIF_PI_FORMAT_32, &iov, 0x214941A8);
7795256f0efSSlawomir Ptak 	_dif_guard_value_test(block_size, md_size, SPDK_DIF_PI_FORMAT_64, &iov, 0x9A2DF64B8E9E517E);
780cc4498acSSlawomir Ptak 
781cc4498acSSlawomir Ptak 
782cc4498acSSlawomir Ptak 	_iov_free_buf(&iov);
783cc4498acSSlawomir Ptak }
784cc4498acSSlawomir Ptak 
785cc4498acSSlawomir Ptak static void
7868b6c22b1SShuhei Matsumoto dif_generate_and_verify(struct iovec *iovs, int iovcnt,
7878b6c22b1SShuhei Matsumoto 			uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
7888b6c22b1SShuhei Matsumoto 			bool dif_loc, enum spdk_dif_type dif_type, uint32_t dif_flags,
789cc4498acSSlawomir Ptak 			enum spdk_dif_pi_format dif_pi_format,
7908b6c22b1SShuhei Matsumoto 			uint32_t init_ref_tag, uint16_t apptag_mask, uint16_t app_tag)
7918b6c22b1SShuhei Matsumoto {
79218461cbaSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
7938b6c22b1SShuhei Matsumoto 	int rc;
794a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
7958b6c22b1SShuhei Matsumoto 
7968b6c22b1SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, iovcnt, block_size, md_size, num_blocks);
7978b6c22b1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
7988b6c22b1SShuhei Matsumoto 
7995681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
800cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
80165624bd5SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, dif_loc, dif_type, dif_flags,
802a711d629SSlawomir Ptak 			       init_ref_tag, apptag_mask, app_tag, 0, GUARD_SEED, &dif_opts);
8038b6c22b1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
8048b6c22b1SShuhei Matsumoto 
80518461cbaSShuhei Matsumoto 	rc = spdk_dif_generate(iovs, iovcnt, num_blocks, &ctx);
80618461cbaSShuhei Matsumoto 	CU_ASSERT(rc == 0);
80718461cbaSShuhei Matsumoto 
80865e491a8SShuhei Matsumoto 	rc = spdk_dif_verify(iovs, iovcnt, num_blocks, &ctx, NULL);
8098b6c22b1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
8108b6c22b1SShuhei Matsumoto 
8118b6c22b1SShuhei Matsumoto 	rc = ut_data_pattern_verify(iovs, iovcnt, block_size, md_size, num_blocks);
8128b6c22b1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
8138b6c22b1SShuhei Matsumoto }
8148b6c22b1SShuhei Matsumoto 
8158b6c22b1SShuhei Matsumoto static void
816a5e3d61dSShuhei Matsumoto dif_disable_sec_512_md_8_single_iov_test(void)
817a5e3d61dSShuhei Matsumoto {
818a5e3d61dSShuhei Matsumoto 	struct iovec iov;
819a5e3d61dSShuhei Matsumoto 
82009a7599eSwuzhouhui 	_iov_alloc_buf(&iov, 512 + 8);
821a5e3d61dSShuhei Matsumoto 
822cc4498acSSlawomir Ptak 	dif_generate_and_verify(&iov, 1, 512 + 8, 8, 1, false, SPDK_DIF_DISABLE, 0,
823cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16, 0, 0, 0);
824a5e3d61dSShuhei Matsumoto 
825a5e3d61dSShuhei Matsumoto 	_iov_free_buf(&iov);
826a5e3d61dSShuhei Matsumoto }
827a5e3d61dSShuhei Matsumoto 
828a5e3d61dSShuhei Matsumoto static void
8298b6c22b1SShuhei Matsumoto dif_sec_512_md_8_prchk_0_single_iov_test(void)
8308b6c22b1SShuhei Matsumoto {
8318b6c22b1SShuhei Matsumoto 	struct iovec iov;
8328b6c22b1SShuhei Matsumoto 
83309a7599eSwuzhouhui 	_iov_alloc_buf(&iov, 512 + 8);
8348b6c22b1SShuhei Matsumoto 
835cc4498acSSlawomir Ptak 	dif_generate_and_verify(&iov, 1, 512 + 8, 8, 1, false, SPDK_DIF_TYPE1, 0,
836cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16, 0, 0, 0);
837cc4498acSSlawomir Ptak 
838cc4498acSSlawomir Ptak 	_iov_free_buf(&iov);
839cc4498acSSlawomir Ptak }
840cc4498acSSlawomir Ptak 
841cc4498acSSlawomir Ptak static void
8425256f0efSSlawomir Ptak dif_sec_4096_md_128_prchk_0_single_iov_test(void)
843cc4498acSSlawomir Ptak {
844cc4498acSSlawomir Ptak 	struct iovec iov;
845cc4498acSSlawomir Ptak 
846cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iov, 4096 + 128);
847cc4498acSSlawomir Ptak 
848cc4498acSSlawomir Ptak 	dif_generate_and_verify(&iov, 1, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1, 0,
849cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_32, 0, 0, 0);
8505256f0efSSlawomir Ptak 	dif_generate_and_verify(&iov, 1, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1, 0,
8515256f0efSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_64, 0, 0, 0);
8528b6c22b1SShuhei Matsumoto 
8538b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iov);
8548b6c22b1SShuhei Matsumoto }
8558b6c22b1SShuhei Matsumoto 
8568b6c22b1SShuhei Matsumoto static void
8578b6c22b1SShuhei Matsumoto dif_sec_512_md_8_prchk_0_1_2_4_multi_iovs_test(void)
8588b6c22b1SShuhei Matsumoto {
8598b6c22b1SShuhei Matsumoto 	struct iovec iovs[4];
8608b6c22b1SShuhei Matsumoto 	int i, num_blocks;
8618b6c22b1SShuhei Matsumoto 
8628b6c22b1SShuhei Matsumoto 	num_blocks = 0;
8638b6c22b1SShuhei Matsumoto 
8648b6c22b1SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
8658b6c22b1SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], (512 + 8) * (i + 1));
8668b6c22b1SShuhei Matsumoto 		num_blocks += i + 1;
8678b6c22b1SShuhei Matsumoto 	}
8688b6c22b1SShuhei Matsumoto 
8698b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 4, 512 + 8, 8, num_blocks, false, SPDK_DIF_TYPE1,
870cc4498acSSlawomir Ptak 				0, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
8718b6c22b1SShuhei Matsumoto 
8728b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 4, 512 + 8, 8, num_blocks, false, SPDK_DIF_TYPE1,
873cc4498acSSlawomir Ptak 				SPDK_DIF_FLAGS_GUARD_CHECK, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
8748b6c22b1SShuhei Matsumoto 
8758b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 4, 512 + 8, 8, num_blocks, false, SPDK_DIF_TYPE1,
876cc4498acSSlawomir Ptak 				SPDK_DIF_FLAGS_APPTAG_CHECK, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
8778b6c22b1SShuhei Matsumoto 
8788b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 4, 512 + 8, 8, num_blocks, false, SPDK_DIF_TYPE1,
879cc4498acSSlawomir Ptak 				SPDK_DIF_FLAGS_REFTAG_CHECK, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
880cc4498acSSlawomir Ptak 
881cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
882cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
883cc4498acSSlawomir Ptak 	}
884cc4498acSSlawomir Ptak }
885cc4498acSSlawomir Ptak 
886cc4498acSSlawomir Ptak static void
8875256f0efSSlawomir Ptak _dif_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(enum spdk_dif_pi_format dif_pi_format)
888cc4498acSSlawomir Ptak {
889cc4498acSSlawomir Ptak 	struct iovec iovs[4];
890cc4498acSSlawomir Ptak 	int i, num_blocks;
891cc4498acSSlawomir Ptak 
892cc4498acSSlawomir Ptak 	num_blocks = 0;
893cc4498acSSlawomir Ptak 
894cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
895cc4498acSSlawomir Ptak 		_iov_alloc_buf(&iovs[i], (4096 + 128) * (i + 1));
896cc4498acSSlawomir Ptak 		num_blocks += i + 1;
897cc4498acSSlawomir Ptak 	}
898cc4498acSSlawomir Ptak 
899cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, false, SPDK_DIF_TYPE1,
9005256f0efSSlawomir Ptak 				0, dif_pi_format, 22, 0xFFFF, 0x22);
901cc4498acSSlawomir Ptak 
902cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, false, SPDK_DIF_TYPE1,
9035256f0efSSlawomir Ptak 				SPDK_DIF_FLAGS_GUARD_CHECK, dif_pi_format, 22, 0xFFFF, 0x22);
904cc4498acSSlawomir Ptak 
905cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, false, SPDK_DIF_TYPE1,
9065256f0efSSlawomir Ptak 				SPDK_DIF_FLAGS_APPTAG_CHECK, dif_pi_format, 22, 0xFFFF, 0x22);
907cc4498acSSlawomir Ptak 
908cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, false, SPDK_DIF_TYPE1,
9095256f0efSSlawomir Ptak 				SPDK_DIF_FLAGS_REFTAG_CHECK, dif_pi_format, 22, 0xFFFF, 0x22);
9105256f0efSSlawomir Ptak 
9115256f0efSSlawomir Ptak 	for (i = 0; i < 4; i++) {
9125256f0efSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
9135256f0efSSlawomir Ptak 	}
9145256f0efSSlawomir Ptak }
9155256f0efSSlawomir Ptak 
9165256f0efSSlawomir Ptak static void
9175256f0efSSlawomir Ptak dif_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(void)
9185256f0efSSlawomir Ptak {
9195256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(SPDK_DIF_PI_FORMAT_32);
9205256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(SPDK_DIF_PI_FORMAT_64);
9215256f0efSSlawomir Ptak }
9225256f0efSSlawomir Ptak 
9235256f0efSSlawomir Ptak static void
9245256f0efSSlawomir Ptak _dif_sec_4096_md_128_prchk_7_multi_iovs_test(enum spdk_dif_pi_format dif_pi_format)
9255256f0efSSlawomir Ptak {
9265256f0efSSlawomir Ptak 	struct iovec iovs[4];
9275256f0efSSlawomir Ptak 	int i, num_blocks;
9285256f0efSSlawomir Ptak 	uint32_t dif_flags;
9295256f0efSSlawomir Ptak 
9305256f0efSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
9315256f0efSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
9325256f0efSSlawomir Ptak 
9335256f0efSSlawomir Ptak 	num_blocks = 0;
9345256f0efSSlawomir Ptak 
9355256f0efSSlawomir Ptak 	for (i = 0; i < 4; i++) {
9365256f0efSSlawomir Ptak 		_iov_alloc_buf(&iovs[i], (4096 + 128) * (i + 1));
9375256f0efSSlawomir Ptak 		num_blocks += i + 1;
9385256f0efSSlawomir Ptak 	}
9395256f0efSSlawomir Ptak 
9405256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, false, SPDK_DIF_TYPE1,
9415256f0efSSlawomir Ptak 				dif_flags, dif_pi_format, 22, 0xFFFF, 0x22);
9425256f0efSSlawomir Ptak 
9435256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, true, SPDK_DIF_TYPE1,
9445256f0efSSlawomir Ptak 				dif_flags, dif_pi_format, 22, 0xFFFF, 0x22);
9458b6c22b1SShuhei Matsumoto 
9468b6c22b1SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
9478b6c22b1SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
9488b6c22b1SShuhei Matsumoto 	}
9498b6c22b1SShuhei Matsumoto }
9508b6c22b1SShuhei Matsumoto 
9518b6c22b1SShuhei Matsumoto static void
9528b6c22b1SShuhei Matsumoto dif_sec_4096_md_128_prchk_7_multi_iovs_test(void)
9538b6c22b1SShuhei Matsumoto {
9545256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_prchk_7_multi_iovs_test(SPDK_DIF_PI_FORMAT_16);
9555256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_prchk_7_multi_iovs_test(SPDK_DIF_PI_FORMAT_32);
9565256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_prchk_7_multi_iovs_test(SPDK_DIF_PI_FORMAT_64);
9578b6c22b1SShuhei Matsumoto }
9588b6c22b1SShuhei Matsumoto 
9598b6c22b1SShuhei Matsumoto static void
9608b6c22b1SShuhei Matsumoto dif_sec_512_md_8_prchk_7_multi_iovs_split_data_and_md_test(void)
9618b6c22b1SShuhei Matsumoto {
9628b6c22b1SShuhei Matsumoto 	struct iovec iovs[2];
9638b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
9648b6c22b1SShuhei Matsumoto 
96596f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
96696f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
9678b6c22b1SShuhei Matsumoto 
9688b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 512);
9698b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 8);
9708b6c22b1SShuhei Matsumoto 
9718b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 2, 512 + 8, 8, 1, false, SPDK_DIF_TYPE1,
972cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
973cc4498acSSlawomir Ptak 
974cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
975cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
976cc4498acSSlawomir Ptak }
977cc4498acSSlawomir Ptak 
978cc4498acSSlawomir Ptak static void
9795256f0efSSlawomir Ptak dif_sec_4096_md_128_prchk_7_multi_iovs_split_data_and_md_test(void)
980cc4498acSSlawomir Ptak {
981cc4498acSSlawomir Ptak 	struct iovec iovs[2];
982cc4498acSSlawomir Ptak 	uint32_t dif_flags;
983cc4498acSSlawomir Ptak 
984cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
985cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
986cc4498acSSlawomir Ptak 
987cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 4096);
988cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 128);
989cc4498acSSlawomir Ptak 
990cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
991cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_32, 22, 0xFFFF, 0x22);
9925256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
9935256f0efSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_64, 22, 0xFFFF, 0x22);
9948b6c22b1SShuhei Matsumoto 
9958b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
9968b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
9978b6c22b1SShuhei Matsumoto }
9988b6c22b1SShuhei Matsumoto 
9998b6c22b1SShuhei Matsumoto static void
10008b6c22b1SShuhei Matsumoto dif_sec_512_md_8_prchk_7_multi_iovs_split_data_test(void)
10018b6c22b1SShuhei Matsumoto {
10028b6c22b1SShuhei Matsumoto 	struct iovec iovs[2];
10038b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
10048b6c22b1SShuhei Matsumoto 
100596f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
100696f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
10078b6c22b1SShuhei Matsumoto 
10088b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
10098b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 264);
10108b6c22b1SShuhei Matsumoto 
10118b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 2, 512 + 8, 8, 1, false, SPDK_DIF_TYPE1,
1012cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
1013cc4498acSSlawomir Ptak 
1014cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
1015cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
1016cc4498acSSlawomir Ptak }
1017cc4498acSSlawomir Ptak 
1018cc4498acSSlawomir Ptak static void
10195256f0efSSlawomir Ptak dif_sec_4096_md_128_prchk_7_multi_iovs_split_data_test(void)
1020cc4498acSSlawomir Ptak {
1021cc4498acSSlawomir Ptak 	struct iovec iovs[2];
1022cc4498acSSlawomir Ptak 	uint32_t dif_flags;
1023cc4498acSSlawomir Ptak 
1024cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
1025cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1026cc4498acSSlawomir Ptak 
1027cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 2048);
1028cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 2176);
1029cc4498acSSlawomir Ptak 
1030cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
1031cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_32, 22, 0xFFFF, 0x22);
10325256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
10335256f0efSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_64, 22, 0xFFFF, 0x22);
10348b6c22b1SShuhei Matsumoto 
10358b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
10368b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
10378b6c22b1SShuhei Matsumoto }
10388b6c22b1SShuhei Matsumoto 
10398b6c22b1SShuhei Matsumoto static void
10408b6c22b1SShuhei Matsumoto dif_sec_512_md_8_prchk_7_multi_iovs_split_guard_test(void)
10418b6c22b1SShuhei Matsumoto {
10428b6c22b1SShuhei Matsumoto 	struct iovec iovs[2];
10438b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
10448b6c22b1SShuhei Matsumoto 
104596f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
104696f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
10478b6c22b1SShuhei Matsumoto 
10488b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 513);
10498b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 7);
10508b6c22b1SShuhei Matsumoto 
10518b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 2, 512 + 8, 8, 1, false, SPDK_DIF_TYPE1,
1052cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
1053cc4498acSSlawomir Ptak 
1054cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
1055cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
1056cc4498acSSlawomir Ptak }
1057cc4498acSSlawomir Ptak 
1058cc4498acSSlawomir Ptak static void
10595256f0efSSlawomir Ptak dif_sec_4096_md_128_prchk_7_multi_iovs_split_guard_test(void)
1060cc4498acSSlawomir Ptak {
1061cc4498acSSlawomir Ptak 	struct iovec iovs[2];
1062cc4498acSSlawomir Ptak 	uint32_t dif_flags;
1063cc4498acSSlawomir Ptak 
1064cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
1065cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1066cc4498acSSlawomir Ptak 
1067cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 4097);
1068cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 127);
1069cc4498acSSlawomir Ptak 
1070cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
1071cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_32, 22, 0xFFFF, 0x22);
10725256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
10735256f0efSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_64, 22, 0xFFFF, 0x22);
10748b6c22b1SShuhei Matsumoto 
10758b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
10768b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
10778b6c22b1SShuhei Matsumoto }
10788b6c22b1SShuhei Matsumoto 
10798b6c22b1SShuhei Matsumoto static void
10808b6c22b1SShuhei Matsumoto dif_sec_512_md_8_prchk_7_multi_iovs_split_apptag_test(void)
10818b6c22b1SShuhei Matsumoto {
10828b6c22b1SShuhei Matsumoto 	struct iovec iovs[2];
10838b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
10848b6c22b1SShuhei Matsumoto 
108596f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
108696f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
10878b6c22b1SShuhei Matsumoto 
10888b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 515);
10898b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 5);
10908b6c22b1SShuhei Matsumoto 
10918b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 2, 512 + 8, 8, 1, false, SPDK_DIF_TYPE1,
1092cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
1093cc4498acSSlawomir Ptak 
1094cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
1095cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
1096cc4498acSSlawomir Ptak }
1097cc4498acSSlawomir Ptak 
1098cc4498acSSlawomir Ptak static void
10995256f0efSSlawomir Ptak dif_sec_4096_md_128_prchk_7_multi_iovs_split_apptag_test(void)
1100cc4498acSSlawomir Ptak {
1101cc4498acSSlawomir Ptak 	struct iovec iovs[2];
1102cc4498acSSlawomir Ptak 	uint32_t dif_flags;
1103cc4498acSSlawomir Ptak 
1104cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
1105cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1106cc4498acSSlawomir Ptak 
1107cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 4101);
1108cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 123);
1109cc4498acSSlawomir Ptak 
1110cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
1111cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_32, 22, 0xFFFF, 0x22);
11125256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
11135256f0efSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_64, 22, 0xFFFF, 0x22);
11148b6c22b1SShuhei Matsumoto 
11158b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
11168b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
11178b6c22b1SShuhei Matsumoto }
11188b6c22b1SShuhei Matsumoto 
11198b6c22b1SShuhei Matsumoto static void
11208b6c22b1SShuhei Matsumoto dif_sec_512_md_8_prchk_7_multi_iovs_split_reftag_test(void)
11218b6c22b1SShuhei Matsumoto {
11228b6c22b1SShuhei Matsumoto 	struct iovec iovs[2];
11238b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
11248b6c22b1SShuhei Matsumoto 
112596f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
112696f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
11278b6c22b1SShuhei Matsumoto 
11288b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 518);
11298b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 2);
11308b6c22b1SShuhei Matsumoto 
11318b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 2, 512 + 8, 8, 1, false, SPDK_DIF_TYPE1,
1132cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
1133cc4498acSSlawomir Ptak 
1134cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
1135cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
1136cc4498acSSlawomir Ptak }
1137cc4498acSSlawomir Ptak 
1138cc4498acSSlawomir Ptak static void
11395256f0efSSlawomir Ptak dif_sec_4096_md_128_prchk_7_multi_iovs_split_reftag_test(void)
1140cc4498acSSlawomir Ptak {
1141cc4498acSSlawomir Ptak 	struct iovec iovs[2];
1142cc4498acSSlawomir Ptak 	uint32_t dif_flags;
1143cc4498acSSlawomir Ptak 
1144cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
1145cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1146cc4498acSSlawomir Ptak 
1147cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 4108);
1148cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 116);
1149cc4498acSSlawomir Ptak 
1150cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
1151cc4498acSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_32, 22, 0xFFFF, 0x22);
11525256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 2, 4096 + 128, 128, 1, false, SPDK_DIF_TYPE1,
11535256f0efSSlawomir Ptak 				dif_flags, SPDK_DIF_PI_FORMAT_64, 22, 0xFFFF, 0x22);
11548b6c22b1SShuhei Matsumoto 
11558b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
11568b6c22b1SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
11578b6c22b1SShuhei Matsumoto }
11588b6c22b1SShuhei Matsumoto 
11598b6c22b1SShuhei Matsumoto static void
11608b6c22b1SShuhei Matsumoto dif_sec_512_md_8_prchk_7_multi_iovs_complex_splits_test(void)
11618b6c22b1SShuhei Matsumoto {
11628b6c22b1SShuhei Matsumoto 	struct iovec iovs[9];
11638b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
11648b6c22b1SShuhei Matsumoto 	int i;
11658b6c22b1SShuhei Matsumoto 
116696f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
116796f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
11688b6c22b1SShuhei Matsumoto 
11698b6c22b1SShuhei Matsumoto 	/* data[0][255:0] */
11708b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
11718b6c22b1SShuhei Matsumoto 
11728b6c22b1SShuhei Matsumoto 	/* data[0][511:256], guard[0][0] */
11738b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256 + 1);
11748b6c22b1SShuhei Matsumoto 
11758b6c22b1SShuhei Matsumoto 	/* guard[0][1], apptag[0][0] */
11768b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 1 + 1);
11778b6c22b1SShuhei Matsumoto 
11788b6c22b1SShuhei Matsumoto 	/* apptag[0][1], reftag[0][0] */
11798b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 1 + 1);
11808b6c22b1SShuhei Matsumoto 
11818b6c22b1SShuhei Matsumoto 	/* reftag[0][3:1], data[1][255:0] */
11828b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 3 + 256);
11838b6c22b1SShuhei Matsumoto 
11848b6c22b1SShuhei Matsumoto 	/* data[1][511:256], guard[1][0] */
11858b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 256 + 1);
11868b6c22b1SShuhei Matsumoto 
11878b6c22b1SShuhei Matsumoto 	/* guard[1][1], apptag[1][0] */
11888b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[6], 1 + 1);
11898b6c22b1SShuhei Matsumoto 
11908b6c22b1SShuhei Matsumoto 	/* apptag[1][1], reftag[1][0] */
11918b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[7], 1 + 1);
11928b6c22b1SShuhei Matsumoto 
11938b6c22b1SShuhei Matsumoto 	/* reftag[1][3:1] */
11948b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[8], 3);
11958b6c22b1SShuhei Matsumoto 
11968b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 9, 512 + 8, 8, 2, false, SPDK_DIF_TYPE1, dif_flags,
1197cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
11988b6c22b1SShuhei Matsumoto 
11998b6c22b1SShuhei Matsumoto 	for (i = 0; i < 9; i++) {
12008b6c22b1SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
12018b6c22b1SShuhei Matsumoto 	}
12028b6c22b1SShuhei Matsumoto }
12038b6c22b1SShuhei Matsumoto 
12048b6c22b1SShuhei Matsumoto static void
12058b6c22b1SShuhei Matsumoto dif_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_test(void)
12068b6c22b1SShuhei Matsumoto {
12078b6c22b1SShuhei Matsumoto 	struct iovec iovs[11];
12088b6c22b1SShuhei Matsumoto 	uint32_t dif_flags;
12098b6c22b1SShuhei Matsumoto 	int i;
12108b6c22b1SShuhei Matsumoto 
121196f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
121296f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
12138b6c22b1SShuhei Matsumoto 
12148b6c22b1SShuhei Matsumoto 	/* data[0][1000:0] */
12158b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 1000);
12168b6c22b1SShuhei Matsumoto 
12178b6c22b1SShuhei Matsumoto 	/* data[0][3095:1000], guard[0][0] */
12188b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 3096 + 1);
12198b6c22b1SShuhei Matsumoto 
12208b6c22b1SShuhei Matsumoto 	/* guard[0][1], apptag[0][0] */
12218b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 1 + 1);
12228b6c22b1SShuhei Matsumoto 
12238b6c22b1SShuhei Matsumoto 	/* apptag[0][1], reftag[0][0] */
12248b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 1 + 1);
12258b6c22b1SShuhei Matsumoto 
12268b6c22b1SShuhei Matsumoto 	/* reftag[0][3:1], ignore[0][59:0] */
12278b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 3 + 60);
12288b6c22b1SShuhei Matsumoto 
12298b6c22b1SShuhei Matsumoto 	/* ignore[119:60], data[1][3050:0] */
12308b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 60 + 3051);
12318b6c22b1SShuhei Matsumoto 
12328b6c22b1SShuhei Matsumoto 	/* data[1][4095:3050], guard[1][0] */
12338b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[6], 1045 + 1);
12348b6c22b1SShuhei Matsumoto 
12358b6c22b1SShuhei Matsumoto 	/* guard[1][1], apptag[1][0] */
12368b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[7], 1 + 1);
12378b6c22b1SShuhei Matsumoto 
12388b6c22b1SShuhei Matsumoto 	/* apptag[1][1], reftag[1][0] */
12398b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[8], 1 + 1);
12408b6c22b1SShuhei Matsumoto 
12418b6c22b1SShuhei Matsumoto 	/* reftag[1][3:1], ignore[1][9:0] */
12428b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[9], 3 + 10);
12438b6c22b1SShuhei Matsumoto 
12448b6c22b1SShuhei Matsumoto 	/* ignore[1][127:9] */
12458b6c22b1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[10], 118);
12468b6c22b1SShuhei Matsumoto 
12478b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 11, 4096 + 128, 128, 2, false, SPDK_DIF_TYPE1, dif_flags,
1248cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
12498b6c22b1SShuhei Matsumoto 	dif_generate_and_verify(iovs, 11, 4096 + 128, 128, 2, true, SPDK_DIF_TYPE1, dif_flags,
1250cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16, 22, 0xFFFF, 0x22);
1251cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 11, 4096 + 128, 128, 2, false, SPDK_DIF_TYPE1, dif_flags,
1252cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_32, 22, 0xFFFF, 0x22);
1253cc4498acSSlawomir Ptak 	dif_generate_and_verify(iovs, 11, 4096 + 128, 128, 2, true, SPDK_DIF_TYPE1, dif_flags,
1254cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_32, 22, 0xFFFF, 0x22);
12555256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 11, 4096 + 128, 128, 2, false, SPDK_DIF_TYPE1, dif_flags,
12565256f0efSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_64, 22, 0xFFFF, 0x22);
12575256f0efSSlawomir Ptak 	dif_generate_and_verify(iovs, 11, 4096 + 128, 128, 2, true, SPDK_DIF_TYPE1, dif_flags,
12585256f0efSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_64, 22, 0xFFFF, 0x22);
12598b6c22b1SShuhei Matsumoto 
12608b6c22b1SShuhei Matsumoto 	for (i = 0; i < 11; i++) {
12618b6c22b1SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
12628b6c22b1SShuhei Matsumoto 	}
12638b6c22b1SShuhei Matsumoto }
12648b6c22b1SShuhei Matsumoto 
1265f0e00ef2SShuhei Matsumoto static void
1266f0e00ef2SShuhei Matsumoto _dif_inject_error_and_verify(struct iovec *iovs, int iovcnt,
1267f0e00ef2SShuhei Matsumoto 			     uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
1268cc4498acSSlawomir Ptak 			     uint32_t inject_flags, bool dif_loc, enum spdk_dif_pi_format dif_pi_format)
1269f0e00ef2SShuhei Matsumoto {
127018461cbaSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
127165e491a8SShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
127265e491a8SShuhei Matsumoto 	uint32_t inject_offset = 0, dif_flags;
1273f0e00ef2SShuhei Matsumoto 	int rc;
1274a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1275f0e00ef2SShuhei Matsumoto 
127696f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
127796f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1278f0e00ef2SShuhei Matsumoto 
1279f0e00ef2SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, iovcnt, block_size, md_size, num_blocks);
1280f0e00ef2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1281f0e00ef2SShuhei Matsumoto 
12825681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1283cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
128465624bd5SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, dif_loc,
1285cc4498acSSlawomir Ptak 			       SPDK_DIF_TYPE1, dif_flags,
1286cc4498acSSlawomir Ptak 			       88, 0xFFFF, 0x88, 0, GUARD_SEED, &dif_opts);
1287f0e00ef2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1288f0e00ef2SShuhei Matsumoto 
128918461cbaSShuhei Matsumoto 	rc = spdk_dif_generate(iovs, iovcnt, num_blocks, &ctx);
1290f0e00ef2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1291f0e00ef2SShuhei Matsumoto 
129265e491a8SShuhei Matsumoto 	rc = spdk_dif_inject_error(iovs, iovcnt, num_blocks, &ctx, inject_flags, &inject_offset);
129318461cbaSShuhei Matsumoto 	CU_ASSERT(rc == 0);
129418461cbaSShuhei Matsumoto 
129565e491a8SShuhei Matsumoto 	rc = spdk_dif_verify(iovs, iovcnt, num_blocks, &ctx, &err_blk);
1296f0e00ef2SShuhei Matsumoto 	CU_ASSERT(rc != 0);
129765e491a8SShuhei Matsumoto 	if (inject_flags == SPDK_DIF_DATA_ERROR) {
129865e491a8SShuhei Matsumoto 		CU_ASSERT(SPDK_DIF_GUARD_ERROR == err_blk.err_type);
129965e491a8SShuhei Matsumoto 	} else {
130065e491a8SShuhei Matsumoto 		CU_ASSERT(inject_flags == err_blk.err_type);
130165e491a8SShuhei Matsumoto 	}
130265e491a8SShuhei Matsumoto 	CU_ASSERT(inject_offset == err_blk.err_offset);
1303f0e00ef2SShuhei Matsumoto 
1304f0e00ef2SShuhei Matsumoto 	rc = ut_data_pattern_verify(iovs, iovcnt, block_size, md_size, num_blocks);
130565e491a8SShuhei Matsumoto 	CU_ASSERT((rc == 0 && (inject_flags != SPDK_DIF_DATA_ERROR)) ||
130665e491a8SShuhei Matsumoto 		  (rc != 0 && (inject_flags == SPDK_DIF_DATA_ERROR)));
1307f0e00ef2SShuhei Matsumoto }
1308f0e00ef2SShuhei Matsumoto 
1309f0e00ef2SShuhei Matsumoto static void
1310f0e00ef2SShuhei Matsumoto dif_inject_error_and_verify(struct iovec *iovs, int iovcnt,
1311f0e00ef2SShuhei Matsumoto 			    uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
1312cc4498acSSlawomir Ptak 			    uint32_t inject_flags, enum spdk_dif_pi_format dif_pi_format)
1313f0e00ef2SShuhei Matsumoto {
1314cc4498acSSlawomir Ptak 	/* The case that DIF is contained in the first 8/16 bytes of metadata. */
1315f0e00ef2SShuhei Matsumoto 	_dif_inject_error_and_verify(iovs, iovcnt, block_size, md_size, num_blocks,
1316cc4498acSSlawomir Ptak 				     inject_flags, true, dif_pi_format);
1317f0e00ef2SShuhei Matsumoto 
1318cc4498acSSlawomir Ptak 	/* The case that DIF is contained in the last 8/16 bytes of metadata. */
1319f0e00ef2SShuhei Matsumoto 	_dif_inject_error_and_verify(iovs, iovcnt, block_size, md_size, num_blocks,
1320cc4498acSSlawomir Ptak 				     inject_flags, false, dif_pi_format);
1321f0e00ef2SShuhei Matsumoto }
1322f0e00ef2SShuhei Matsumoto 
1323f0e00ef2SShuhei Matsumoto static void
1324f0e00ef2SShuhei Matsumoto dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_test(void)
1325f0e00ef2SShuhei Matsumoto {
1326f0e00ef2SShuhei Matsumoto 	struct iovec iovs[4];
1327f0e00ef2SShuhei Matsumoto 	int i, num_blocks;
1328f0e00ef2SShuhei Matsumoto 
1329f0e00ef2SShuhei Matsumoto 	num_blocks = 0;
1330f0e00ef2SShuhei Matsumoto 
1331f0e00ef2SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
1332f0e00ef2SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], (4096 + 128) * (i + 1));
1333f0e00ef2SShuhei Matsumoto 		num_blocks += i + 1;
1334f0e00ef2SShuhei Matsumoto 	}
1335f0e00ef2SShuhei Matsumoto 
1336cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
1337cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
1338cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
1339cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1340cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
1341cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1342cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
1343cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
1344cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
1345cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_32);
1346cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
1347cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
1348cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
1349cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
1350cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
1351cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_32);
13525256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
13535256f0efSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_64);
13545256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
13555256f0efSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
13565256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
13575256f0efSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
13585256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 4, 4096 + 128, 128, num_blocks,
13595256f0efSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_64);
1360f0e00ef2SShuhei Matsumoto 
1361f0e00ef2SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
1362f0e00ef2SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
1363f0e00ef2SShuhei Matsumoto 	}
1364f0e00ef2SShuhei Matsumoto }
1365f0e00ef2SShuhei Matsumoto 
1366f0e00ef2SShuhei Matsumoto static void
1367f0e00ef2SShuhei Matsumoto dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_data_and_md_test(void)
1368f0e00ef2SShuhei Matsumoto {
1369f0e00ef2SShuhei Matsumoto 	struct iovec iovs[2];
1370f0e00ef2SShuhei Matsumoto 
1371f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 4096);
1372f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 128);
1373f0e00ef2SShuhei Matsumoto 
1374cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1375cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
1376cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1377cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1378cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1379cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1380cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1381cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
1382cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1383cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_32);
1384cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1385cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
1386cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1387cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
1388cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1389cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_32);
13905256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
13915256f0efSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_64);
13925256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
13935256f0efSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
13945256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
13955256f0efSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
13965256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
13975256f0efSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_64);
13985256f0efSSlawomir Ptak 
1399f0e00ef2SShuhei Matsumoto 
1400f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
1401f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
1402f0e00ef2SShuhei Matsumoto }
1403f0e00ef2SShuhei Matsumoto 
1404f0e00ef2SShuhei Matsumoto static void
1405f0e00ef2SShuhei Matsumoto dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_data_test(void)
1406f0e00ef2SShuhei Matsumoto {
1407f0e00ef2SShuhei Matsumoto 	struct iovec iovs[2];
1408f0e00ef2SShuhei Matsumoto 
1409f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 2048);
1410f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 2048 + 128);
1411f0e00ef2SShuhei Matsumoto 
1412cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1413cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
1414cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1415cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1416cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1417cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1418cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1419cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
1420cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1421cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_32);
1422cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1423cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
1424cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1425cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
1426cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1427cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_32);
14285256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
14295256f0efSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_64);
14305256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
14315256f0efSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
14325256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
14335256f0efSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
14345256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
14355256f0efSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_64);
1436f0e00ef2SShuhei Matsumoto 
1437f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
1438f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
1439f0e00ef2SShuhei Matsumoto }
1440f0e00ef2SShuhei Matsumoto 
1441f0e00ef2SShuhei Matsumoto static void
1442f0e00ef2SShuhei Matsumoto dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_guard_test(void)
1443f0e00ef2SShuhei Matsumoto {
1444f0e00ef2SShuhei Matsumoto 	struct iovec iovs[2];
1445f0e00ef2SShuhei Matsumoto 
1446f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 4096 + 1);
1447f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 127);
1448f0e00ef2SShuhei Matsumoto 
1449cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1450cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
1451cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1452cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1453cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1454cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1455cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1456cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
1457cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1458cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_32);
1459cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1460cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
1461cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1462cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
1463cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1464cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_32);
14655256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
14665256f0efSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_64);
14675256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
14685256f0efSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
14695256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
14705256f0efSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
14715256f0efSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
14725256f0efSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_64);
1473f0e00ef2SShuhei Matsumoto 
1474f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
1475f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
1476f0e00ef2SShuhei Matsumoto }
1477f0e00ef2SShuhei Matsumoto 
1478f0e00ef2SShuhei Matsumoto static void
14795256f0efSSlawomir Ptak dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_apptag_pi_16_test(void)
1480f0e00ef2SShuhei Matsumoto {
1481f0e00ef2SShuhei Matsumoto 	struct iovec iovs[2];
1482f0e00ef2SShuhei Matsumoto 
1483f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 4096 + 3);
1484f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 125);
1485f0e00ef2SShuhei Matsumoto 
1486cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1487cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
1488cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1489cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1490cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1491cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1492cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1493cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
1494cc4498acSSlawomir Ptak 
1495cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
1496cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
1497cc4498acSSlawomir Ptak }
1498cc4498acSSlawomir Ptak 
1499cc4498acSSlawomir Ptak static void
15005256f0efSSlawomir Ptak _dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_apptag_test(
15015256f0efSSlawomir Ptak 	enum spdk_dif_pi_format dif_pi_format)
1502cc4498acSSlawomir Ptak {
1503cc4498acSSlawomir Ptak 	struct iovec iovs[2];
1504cc4498acSSlawomir Ptak 
1505cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 4096 + 5);
1506cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 123);
1507cc4498acSSlawomir Ptak 
1508cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
15095256f0efSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, dif_pi_format);
1510cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
15115256f0efSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, dif_pi_format);
1512cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
15135256f0efSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, dif_pi_format);
1514cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
15155256f0efSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, dif_pi_format);
1516f0e00ef2SShuhei Matsumoto 
1517f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
1518f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
1519f0e00ef2SShuhei Matsumoto }
1520f0e00ef2SShuhei Matsumoto 
1521f0e00ef2SShuhei Matsumoto static void
15225256f0efSSlawomir Ptak dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_apptag_test(void)
15235256f0efSSlawomir Ptak {
15245256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_apptag_test(SPDK_DIF_PI_FORMAT_32);
15255256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_apptag_test(SPDK_DIF_PI_FORMAT_64);
15265256f0efSSlawomir Ptak }
15275256f0efSSlawomir Ptak 
15285256f0efSSlawomir Ptak static void
15295256f0efSSlawomir Ptak dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_reftag_pi_16_test(void)
1530f0e00ef2SShuhei Matsumoto {
1531f0e00ef2SShuhei Matsumoto 	struct iovec iovs[2];
1532f0e00ef2SShuhei Matsumoto 
1533f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 4096 + 6);
1534f0e00ef2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 122);
1535f0e00ef2SShuhei Matsumoto 
1536cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1537cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
1538cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1539cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1540cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1541cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
1542cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
1543cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
1544cc4498acSSlawomir Ptak 
1545cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
1546cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
1547cc4498acSSlawomir Ptak }
1548cc4498acSSlawomir Ptak 
1549cc4498acSSlawomir Ptak static void
15505256f0efSSlawomir Ptak _dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_reftag_test(
15515256f0efSSlawomir Ptak 	enum spdk_dif_pi_format dif_pi_format)
1552cc4498acSSlawomir Ptak {
1553cc4498acSSlawomir Ptak 	struct iovec iovs[2];
1554cc4498acSSlawomir Ptak 
1555cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 4096 + 9);
1556cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 119);
1557cc4498acSSlawomir Ptak 
1558cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
15595256f0efSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, dif_pi_format);
1560cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
15615256f0efSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, dif_pi_format);
1562cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
15635256f0efSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, dif_pi_format);
1564cc4498acSSlawomir Ptak 	dif_inject_error_and_verify(iovs, 2, 4096 + 128, 128, 1,
15655256f0efSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, dif_pi_format);
1566f0e00ef2SShuhei Matsumoto 
1567f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
1568f0e00ef2SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
1569f0e00ef2SShuhei Matsumoto }
1570f0e00ef2SShuhei Matsumoto 
1571bc5507e4SShuhei Matsumoto static void
15725256f0efSSlawomir Ptak dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_reftag_test(void)
15735256f0efSSlawomir Ptak {
15745256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_reftag_test(SPDK_DIF_PI_FORMAT_32);
15755256f0efSSlawomir Ptak 	_dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_reftag_test(SPDK_DIF_PI_FORMAT_64);
15765256f0efSSlawomir Ptak }
15775256f0efSSlawomir Ptak 
15785256f0efSSlawomir Ptak static void
15792de3092aSShuhei Matsumoto dif_copy_gen_and_verify(struct iovec *iovs, int iovcnt,
15802de3092aSShuhei Matsumoto 			struct iovec *bounce_iovs, int bounce_iovcnt,
1581bc5507e4SShuhei Matsumoto 			uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
1582bc5507e4SShuhei Matsumoto 			bool dif_loc, enum spdk_dif_type dif_type, uint32_t dif_flags,
1583cc4498acSSlawomir Ptak 			uint32_t init_ref_tag, uint16_t apptag_mask, uint16_t app_tag,
1584cc4498acSSlawomir Ptak 			enum spdk_dif_pi_format dif_pi_format)
1585bc5507e4SShuhei Matsumoto {
1586bc5507e4SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
1587bc5507e4SShuhei Matsumoto 	int rc;
1588a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1589bc5507e4SShuhei Matsumoto 
1590*92fb2251SShuhei Matsumoto 	if (dif_flags & SPDK_DIF_FLAGS_NVME_PRACT) {
1591*92fb2251SShuhei Matsumoto 		rc = ut_data_pattern_generate(iovs, iovcnt, block_size, md_size, num_blocks);
1592*92fb2251SShuhei Matsumoto 	} else {
1593bc5507e4SShuhei Matsumoto 		rc = ut_data_pattern_generate(iovs, iovcnt, block_size - md_size, 0, num_blocks);
1594*92fb2251SShuhei Matsumoto 	}
1595bc5507e4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1596bc5507e4SShuhei Matsumoto 
15975681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
15988072cbc2SSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
159965624bd5SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, dif_loc, dif_type, dif_flags,
1600a711d629SSlawomir Ptak 			       init_ref_tag, apptag_mask, app_tag, 0, GUARD_SEED, &dif_opts);
1601bc5507e4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1602bc5507e4SShuhei Matsumoto 
16032de3092aSShuhei Matsumoto 	rc = spdk_dif_generate_copy(iovs, iovcnt, bounce_iovs, bounce_iovcnt, num_blocks, &ctx);
1604bc5507e4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1605bc5507e4SShuhei Matsumoto 
1606*92fb2251SShuhei Matsumoto 	rc = ut_data_pattern_verify(bounce_iovs, bounce_iovcnt, block_size, md_size, num_blocks);
1607*92fb2251SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1608*92fb2251SShuhei Matsumoto 
16092de3092aSShuhei Matsumoto 	rc = spdk_dif_verify_copy(iovs, iovcnt, bounce_iovs, bounce_iovcnt, num_blocks, &ctx, NULL);
1610bc5507e4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1611bc5507e4SShuhei Matsumoto 
1612*92fb2251SShuhei Matsumoto 	if (dif_flags & SPDK_DIF_FLAGS_NVME_PRACT) {
1613*92fb2251SShuhei Matsumoto 		rc = ut_data_pattern_verify(iovs, iovcnt, block_size, md_size, num_blocks);
1614*92fb2251SShuhei Matsumoto 	} else {
1615bc5507e4SShuhei Matsumoto 		rc = ut_data_pattern_verify(iovs, iovcnt, block_size - md_size, 0, num_blocks);
1616*92fb2251SShuhei Matsumoto 	}
1617bc5507e4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
1618bc5507e4SShuhei Matsumoto }
1619bc5507e4SShuhei Matsumoto 
1620bc5507e4SShuhei Matsumoto static void
1621bc5507e4SShuhei Matsumoto dif_copy_sec_512_md_8_prchk_0_single_iov(void)
1622bc5507e4SShuhei Matsumoto {
1623bc5507e4SShuhei Matsumoto 	struct iovec iov, bounce_iov;
1624bc5507e4SShuhei Matsumoto 
1625bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iov, 512 * 4);
1626bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, (512 + 8) * 4);
1627bc5507e4SShuhei Matsumoto 
16282de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(&iov, 1, &bounce_iov, 1, 512 + 8, 8, 4,
1629cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, 0, 0, 0, 0, SPDK_DIF_PI_FORMAT_16);
16302de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(&iov, 1, &bounce_iov, 1, 512 + 8, 8, 4,
1631cc4498acSSlawomir Ptak 				true, SPDK_DIF_TYPE1, 0, 0, 0, 0, SPDK_DIF_PI_FORMAT_16);
1632cc4498acSSlawomir Ptak 
1633cc4498acSSlawomir Ptak 	_iov_free_buf(&iov);
1634cc4498acSSlawomir Ptak 	_iov_free_buf(&bounce_iov);
1635cc4498acSSlawomir Ptak }
1636cc4498acSSlawomir Ptak 
1637cc4498acSSlawomir Ptak static void
16384b88d742SShuhei Matsumoto dif_copy_sec_512_md_8_dif_disable_single_iov(void)
16394b88d742SShuhei Matsumoto {
16404b88d742SShuhei Matsumoto 	struct iovec iov, bounce_iov;
16414b88d742SShuhei Matsumoto 
16424b88d742SShuhei Matsumoto 	_iov_alloc_buf(&iov, 512 * 4);
16434b88d742SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, (512 + 8) * 4);
16444b88d742SShuhei Matsumoto 
16454b88d742SShuhei Matsumoto 	dif_copy_gen_and_verify(&iov, 1, &bounce_iov, 1, 512 + 8, 8, 4,
16464b88d742SShuhei Matsumoto 				false, SPDK_DIF_DISABLE, 0, 0, 0, 0, SPDK_DIF_PI_FORMAT_16);
16474b88d742SShuhei Matsumoto 	dif_copy_gen_and_verify(&iov, 1, &bounce_iov, 1, 512 + 8, 8, 4,
16484b88d742SShuhei Matsumoto 				true, SPDK_DIF_DISABLE, 0, 0, 0, 0, SPDK_DIF_PI_FORMAT_16);
16494b88d742SShuhei Matsumoto 
16504b88d742SShuhei Matsumoto 	_iov_free_buf(&iov);
16514b88d742SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
16524b88d742SShuhei Matsumoto }
16534b88d742SShuhei Matsumoto 
16544b88d742SShuhei Matsumoto static void
16555256f0efSSlawomir Ptak _dif_copy_sec_4096_md_128_prchk_0_single_iov_test(
16565256f0efSSlawomir Ptak 	enum spdk_dif_pi_format dif_pi_format)
1657cc4498acSSlawomir Ptak {
1658cc4498acSSlawomir Ptak 	struct iovec iov, bounce_iov;
1659cc4498acSSlawomir Ptak 
1660cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iov, 4096 * 4);
1661cc4498acSSlawomir Ptak 	_iov_alloc_buf(&bounce_iov, (4096 + 128) * 4);
1662cc4498acSSlawomir Ptak 
16632de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(&iov, 1, &bounce_iov, 1, 4096 + 128, 128, 4,
16645256f0efSSlawomir Ptak 				false, SPDK_DIF_TYPE1, 0, 0, 0, 0, dif_pi_format);
16652de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(&iov, 1, &bounce_iov, 1, 4096 + 128, 128, 4,
16665256f0efSSlawomir Ptak 				true, SPDK_DIF_TYPE1, 0, 0, 0, 0, dif_pi_format);
1667bc5507e4SShuhei Matsumoto 
1668bc5507e4SShuhei Matsumoto 	_iov_free_buf(&iov);
1669bc5507e4SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
1670bc5507e4SShuhei Matsumoto }
1671bc5507e4SShuhei Matsumoto 
1672bc5507e4SShuhei Matsumoto static void
16735256f0efSSlawomir Ptak dif_copy_sec_4096_md_128_prchk_0_single_iov_test(void)
16745256f0efSSlawomir Ptak {
16755256f0efSSlawomir Ptak 	_dif_copy_sec_4096_md_128_prchk_0_single_iov_test(SPDK_DIF_PI_FORMAT_32);
16765256f0efSSlawomir Ptak 	_dif_copy_sec_4096_md_128_prchk_0_single_iov_test(SPDK_DIF_PI_FORMAT_64);
16775256f0efSSlawomir Ptak }
16785256f0efSSlawomir Ptak 
16795256f0efSSlawomir Ptak static void
1680bc5507e4SShuhei Matsumoto dif_copy_sec_512_md_8_prchk_0_1_2_4_multi_iovs(void)
1681bc5507e4SShuhei Matsumoto {
1682bc5507e4SShuhei Matsumoto 	struct iovec iovs[4], bounce_iov;
1683bc5507e4SShuhei Matsumoto 	int i, num_blocks;
1684bc5507e4SShuhei Matsumoto 
1685bc5507e4SShuhei Matsumoto 	num_blocks = 0;
1686bc5507e4SShuhei Matsumoto 
1687bc5507e4SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
1688bc5507e4SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 512 * (i + 1));
1689bc5507e4SShuhei Matsumoto 		num_blocks += i + 1;
1690bc5507e4SShuhei Matsumoto 	}
1691bc5507e4SShuhei Matsumoto 
1692bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, (512 + 8) * num_blocks);
1693bc5507e4SShuhei Matsumoto 
16942de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 512 + 8, 8, num_blocks,
1695cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, 0, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
1696bc5507e4SShuhei Matsumoto 
16972de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 512 + 8, 8, num_blocks,
1698cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_GUARD_CHECK, 22, 0xFFFF, 0x22,
1699cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16);
1700bc5507e4SShuhei Matsumoto 
17012de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 512 + 8, 8, num_blocks,
1702cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_APPTAG_CHECK, 22, 0xFFFF, 0x22,
1703cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16);
1704bc5507e4SShuhei Matsumoto 
17052de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 512 + 8, 8, num_blocks,
1706cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_REFTAG_CHECK, 22, 0xFFFF, 0x22,
1707cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16);
1708cc4498acSSlawomir Ptak 
1709cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
1710cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
1711cc4498acSSlawomir Ptak 	}
1712cc4498acSSlawomir Ptak 	_iov_free_buf(&bounce_iov);
1713cc4498acSSlawomir Ptak }
1714cc4498acSSlawomir Ptak 
1715cc4498acSSlawomir Ptak static void
17165256f0efSSlawomir Ptak _dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(
17175256f0efSSlawomir Ptak 	enum spdk_dif_pi_format dif_pi_format)
1718cc4498acSSlawomir Ptak {
1719cc4498acSSlawomir Ptak 	struct iovec iovs[4], bounce_iov;
1720cc4498acSSlawomir Ptak 	int i, num_blocks;
1721cc4498acSSlawomir Ptak 
1722cc4498acSSlawomir Ptak 	num_blocks = 0;
1723cc4498acSSlawomir Ptak 
1724cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
1725cc4498acSSlawomir Ptak 		_iov_alloc_buf(&iovs[i], 4096 * (i + 1));
1726cc4498acSSlawomir Ptak 		num_blocks += i + 1;
1727cc4498acSSlawomir Ptak 	}
1728cc4498acSSlawomir Ptak 
1729cc4498acSSlawomir Ptak 	_iov_alloc_buf(&bounce_iov, (4096 + 128) * num_blocks);
1730cc4498acSSlawomir Ptak 
17312de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
17325256f0efSSlawomir Ptak 				false, SPDK_DIF_TYPE1, 0, 22, 0xFFFF, 0x22, dif_pi_format);
1733cc4498acSSlawomir Ptak 
17342de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
1735cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_GUARD_CHECK, 22, 0xFFFF, 0x22,
17365256f0efSSlawomir Ptak 				dif_pi_format);
1737cc4498acSSlawomir Ptak 
17382de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
1739cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_APPTAG_CHECK, 22, 0xFFFF, 0x22,
17405256f0efSSlawomir Ptak 				dif_pi_format);
1741cc4498acSSlawomir Ptak 
17422de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
1743cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_REFTAG_CHECK, 22, 0xFFFF, 0x22,
17445256f0efSSlawomir Ptak 				dif_pi_format);
1745bc5507e4SShuhei Matsumoto 
1746bc5507e4SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
1747bc5507e4SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
1748bc5507e4SShuhei Matsumoto 	}
1749bc5507e4SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
1750bc5507e4SShuhei Matsumoto }
1751bc5507e4SShuhei Matsumoto 
1752bc5507e4SShuhei Matsumoto static void
17535256f0efSSlawomir Ptak dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(void)
17545256f0efSSlawomir Ptak {
17555256f0efSSlawomir Ptak 	_dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(SPDK_DIF_PI_FORMAT_32);
17565256f0efSSlawomir Ptak 	_dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(SPDK_DIF_PI_FORMAT_64);
17575256f0efSSlawomir Ptak }
17585256f0efSSlawomir Ptak 
17595256f0efSSlawomir Ptak static void
17602de3092aSShuhei Matsumoto _dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test(
17612de3092aSShuhei Matsumoto 	enum spdk_dif_pi_format dif_pi_format)
17622de3092aSShuhei Matsumoto {
17632de3092aSShuhei Matsumoto 	struct iovec iovs[4], bounce_iovs[2];
17642de3092aSShuhei Matsumoto 	int i, num_blocks;
17652de3092aSShuhei Matsumoto 
17662de3092aSShuhei Matsumoto 	num_blocks = 0;
17672de3092aSShuhei Matsumoto 
17682de3092aSShuhei Matsumoto 	for (i = 0; i < 4; i++) {
17692de3092aSShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 4096 * (i + 1));
17702de3092aSShuhei Matsumoto 		num_blocks += i + 1;
17712de3092aSShuhei Matsumoto 	}
17722de3092aSShuhei Matsumoto 
17732de3092aSShuhei Matsumoto 	num_blocks = 0;
17742de3092aSShuhei Matsumoto 
17752de3092aSShuhei Matsumoto 	for (i = 0; i < 2; i++) {
17762de3092aSShuhei Matsumoto 		_iov_alloc_buf(&bounce_iovs[i], (4096 + 128) * 2 * (i + 1));
17772de3092aSShuhei Matsumoto 		num_blocks += 2 * (i + 1);
17782de3092aSShuhei Matsumoto 	}
17792de3092aSShuhei Matsumoto 
17802de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
17812de3092aSShuhei Matsumoto 				false, SPDK_DIF_TYPE1, 0, 22, 0xFFFF, 0x22, dif_pi_format);
17822de3092aSShuhei Matsumoto 
17832de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
17842de3092aSShuhei Matsumoto 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_GUARD_CHECK, 22, 0xFFFF, 0x22,
17852de3092aSShuhei Matsumoto 				dif_pi_format);
17862de3092aSShuhei Matsumoto 
17872de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
17882de3092aSShuhei Matsumoto 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_APPTAG_CHECK, 22, 0xFFFF, 0x22,
17892de3092aSShuhei Matsumoto 				dif_pi_format);
17902de3092aSShuhei Matsumoto 
17912de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
17922de3092aSShuhei Matsumoto 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_REFTAG_CHECK, 22, 0xFFFF, 0x22,
17932de3092aSShuhei Matsumoto 				dif_pi_format);
17942de3092aSShuhei Matsumoto 
17952de3092aSShuhei Matsumoto 	for (i = 0; i < 4; i++) {
17962de3092aSShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
17972de3092aSShuhei Matsumoto 	}
17982de3092aSShuhei Matsumoto 
17992de3092aSShuhei Matsumoto 	for (i = 0; i < 2; i++) {
18002de3092aSShuhei Matsumoto 		_iov_free_buf(&bounce_iovs[i]);
18012de3092aSShuhei Matsumoto 	}
18022de3092aSShuhei Matsumoto }
18032de3092aSShuhei Matsumoto 
18042de3092aSShuhei Matsumoto static void
18052de3092aSShuhei Matsumoto dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test(void)
18062de3092aSShuhei Matsumoto {
18072de3092aSShuhei Matsumoto 	_dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test(SPDK_DIF_PI_FORMAT_32);
18082de3092aSShuhei Matsumoto 	_dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test(SPDK_DIF_PI_FORMAT_64);
18092de3092aSShuhei Matsumoto }
18102de3092aSShuhei Matsumoto 
18112de3092aSShuhei Matsumoto static void
1812*92fb2251SShuhei Matsumoto _nvme_pract_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test(
1813*92fb2251SShuhei Matsumoto 	enum spdk_dif_pi_format dif_pi_format)
1814*92fb2251SShuhei Matsumoto {
1815*92fb2251SShuhei Matsumoto 	struct iovec iovs[4], bounce_iovs[2];
1816*92fb2251SShuhei Matsumoto 	int i, num_blocks;
1817*92fb2251SShuhei Matsumoto 
1818*92fb2251SShuhei Matsumoto 	num_blocks = 0;
1819*92fb2251SShuhei Matsumoto 
1820*92fb2251SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
1821*92fb2251SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], (4096 + 128) * (i + 1));
1822*92fb2251SShuhei Matsumoto 		num_blocks += i + 1;
1823*92fb2251SShuhei Matsumoto 	}
1824*92fb2251SShuhei Matsumoto 
1825*92fb2251SShuhei Matsumoto 	num_blocks = 0;
1826*92fb2251SShuhei Matsumoto 
1827*92fb2251SShuhei Matsumoto 	for (i = 0; i < 2; i++) {
1828*92fb2251SShuhei Matsumoto 		_iov_alloc_buf(&bounce_iovs[i], (4096 + 128) * 2 * (i + 1));
1829*92fb2251SShuhei Matsumoto 		num_blocks += 2 * (i + 1);
1830*92fb2251SShuhei Matsumoto 	}
1831*92fb2251SShuhei Matsumoto 
1832*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
1833*92fb2251SShuhei Matsumoto 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_NVME_PRACT,
1834*92fb2251SShuhei Matsumoto 				22, 0xFFFF, 0x22, dif_pi_format);
1835*92fb2251SShuhei Matsumoto 
1836*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
1837*92fb2251SShuhei Matsumoto 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_NVME_PRACT,
1838*92fb2251SShuhei Matsumoto 				22, 0xFFFF, 0x22, dif_pi_format);
1839*92fb2251SShuhei Matsumoto 
1840*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
1841*92fb2251SShuhei Matsumoto 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_APPTAG_CHECK | SPDK_DIF_FLAGS_NVME_PRACT,
1842*92fb2251SShuhei Matsumoto 				22, 0xFFFF, 0x22, dif_pi_format);
1843*92fb2251SShuhei Matsumoto 
1844*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
1845*92fb2251SShuhei Matsumoto 				false, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_REFTAG_CHECK | SPDK_DIF_FLAGS_NVME_PRACT,
1846*92fb2251SShuhei Matsumoto 				22, 0xFFFF, 0x22, dif_pi_format);
1847*92fb2251SShuhei Matsumoto 
1848*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
1849*92fb2251SShuhei Matsumoto 				true, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_NVME_PRACT,
1850*92fb2251SShuhei Matsumoto 				22, 0xFFFF, 0x22, dif_pi_format);
1851*92fb2251SShuhei Matsumoto 
1852*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
1853*92fb2251SShuhei Matsumoto 				true, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_NVME_PRACT,
1854*92fb2251SShuhei Matsumoto 				22, 0xFFFF, 0x22, dif_pi_format);
1855*92fb2251SShuhei Matsumoto 
1856*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
1857*92fb2251SShuhei Matsumoto 				true, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_APPTAG_CHECK | SPDK_DIF_FLAGS_NVME_PRACT,
1858*92fb2251SShuhei Matsumoto 				22, 0xFFFF, 0x22, dif_pi_format);
1859*92fb2251SShuhei Matsumoto 
1860*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, bounce_iovs, 2, 4096 + 128, 128, num_blocks,
1861*92fb2251SShuhei Matsumoto 				true, SPDK_DIF_TYPE1, SPDK_DIF_FLAGS_REFTAG_CHECK | SPDK_DIF_FLAGS_NVME_PRACT,
1862*92fb2251SShuhei Matsumoto 				22, 0xFFFF, 0x22, dif_pi_format);
1863*92fb2251SShuhei Matsumoto 
1864*92fb2251SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
1865*92fb2251SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
1866*92fb2251SShuhei Matsumoto 	}
1867*92fb2251SShuhei Matsumoto 
1868*92fb2251SShuhei Matsumoto 	for (i = 0; i < 2; i++) {
1869*92fb2251SShuhei Matsumoto 		_iov_free_buf(&bounce_iovs[i]);
1870*92fb2251SShuhei Matsumoto 	}
1871*92fb2251SShuhei Matsumoto }
1872*92fb2251SShuhei Matsumoto 
1873*92fb2251SShuhei Matsumoto static void
1874*92fb2251SShuhei Matsumoto nvme_pract_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test(void)
1875*92fb2251SShuhei Matsumoto {
1876*92fb2251SShuhei Matsumoto 	_nvme_pract_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test(SPDK_DIF_PI_FORMAT_32);
1877*92fb2251SShuhei Matsumoto 	_nvme_pract_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test(SPDK_DIF_PI_FORMAT_64);
1878*92fb2251SShuhei Matsumoto }
1879*92fb2251SShuhei Matsumoto 
1880*92fb2251SShuhei Matsumoto static void
1881bc5507e4SShuhei Matsumoto dif_copy_sec_4096_md_128_prchk_7_multi_iovs(void)
1882bc5507e4SShuhei Matsumoto {
1883bc5507e4SShuhei Matsumoto 	struct iovec iovs[4], bounce_iov;
1884bc5507e4SShuhei Matsumoto 	uint32_t dif_flags;
1885bc5507e4SShuhei Matsumoto 	int i, num_blocks;
1886bc5507e4SShuhei Matsumoto 
188796f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
188896f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1889bc5507e4SShuhei Matsumoto 
1890bc5507e4SShuhei Matsumoto 	num_blocks = 0;
1891bc5507e4SShuhei Matsumoto 
1892bc5507e4SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
1893bc5507e4SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 4096 * (i + 1));
1894bc5507e4SShuhei Matsumoto 		num_blocks += i + 1;
1895bc5507e4SShuhei Matsumoto 	}
1896bc5507e4SShuhei Matsumoto 
1897bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, (4096 + 128) * num_blocks);
1898bc5507e4SShuhei Matsumoto 
18992de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
1900cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
19012de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
1902cc4498acSSlawomir Ptak 				true, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
19032de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
1904cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
19052de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
1906cc4498acSSlawomir Ptak 				true, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
19072de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
19085256f0efSSlawomir Ptak 				false, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
19092de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, num_blocks,
19105256f0efSSlawomir Ptak 				true, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
1911bc5507e4SShuhei Matsumoto 
1912bc5507e4SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
1913bc5507e4SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
1914bc5507e4SShuhei Matsumoto 	}
1915bc5507e4SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
1916bc5507e4SShuhei Matsumoto }
1917bc5507e4SShuhei Matsumoto 
1918bc5507e4SShuhei Matsumoto static void
1919bc5507e4SShuhei Matsumoto dif_copy_sec_512_md_8_prchk_7_multi_iovs_split_data(void)
1920bc5507e4SShuhei Matsumoto {
1921bc5507e4SShuhei Matsumoto 	struct iovec iovs[2], bounce_iov;
1922bc5507e4SShuhei Matsumoto 	uint32_t dif_flags;
1923bc5507e4SShuhei Matsumoto 
192496f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
192596f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1926bc5507e4SShuhei Matsumoto 
1927bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
1928bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256);
1929bc5507e4SShuhei Matsumoto 
1930bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, 512 + 8);
1931bc5507e4SShuhei Matsumoto 
19322de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 2, &bounce_iov, 1, 512 + 8, 8, 1,
1933cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
1934cc4498acSSlawomir Ptak 
1935cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
1936cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
1937cc4498acSSlawomir Ptak 	_iov_free_buf(&bounce_iov);
1938cc4498acSSlawomir Ptak }
1939cc4498acSSlawomir Ptak 
1940cc4498acSSlawomir Ptak static void
19415256f0efSSlawomir Ptak dif_copy_sec_4096_md_128_prchk_7_multi_iovs_split_data_test(void)
1942cc4498acSSlawomir Ptak {
1943cc4498acSSlawomir Ptak 	struct iovec iovs[2], bounce_iov;
1944cc4498acSSlawomir Ptak 	uint32_t dif_flags;
1945cc4498acSSlawomir Ptak 
1946cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
1947cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1948cc4498acSSlawomir Ptak 
1949cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 2048);
1950cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 2048);
1951cc4498acSSlawomir Ptak 
1952cc4498acSSlawomir Ptak 	_iov_alloc_buf(&bounce_iov, 4096 + 128);
1953cc4498acSSlawomir Ptak 
19542de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 2, &bounce_iov, 1, 4096 + 128, 128, 1,
1955cc4498acSSlawomir Ptak 				false, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
19562de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 2, &bounce_iov, 1, 4096 + 128, 128, 1,
19575256f0efSSlawomir Ptak 				false, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
1958bc5507e4SShuhei Matsumoto 
1959bc5507e4SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
1960bc5507e4SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
1961bc5507e4SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
1962bc5507e4SShuhei Matsumoto }
1963bc5507e4SShuhei Matsumoto 
1964bc5507e4SShuhei Matsumoto static void
1965bc5507e4SShuhei Matsumoto dif_copy_sec_512_md_8_prchk_7_multi_iovs_complex_splits(void)
1966bc5507e4SShuhei Matsumoto {
1967bc5507e4SShuhei Matsumoto 	struct iovec iovs[6], bounce_iov;
1968bc5507e4SShuhei Matsumoto 	uint32_t dif_flags;
1969bc5507e4SShuhei Matsumoto 	int i;
1970bc5507e4SShuhei Matsumoto 
197196f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
197296f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
1973bc5507e4SShuhei Matsumoto 
1974bc5507e4SShuhei Matsumoto 	/* data[0][255:0] */
1975bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
1976bc5507e4SShuhei Matsumoto 
1977bc5507e4SShuhei Matsumoto 	/* data[0][511:256], data[1][255:0] */
1978bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256 + 256);
1979bc5507e4SShuhei Matsumoto 
1980bc5507e4SShuhei Matsumoto 	/* data[1][382:256] */
1981bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 128);
1982bc5507e4SShuhei Matsumoto 
1983bc5507e4SShuhei Matsumoto 	/* data[1][383] */
1984bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 1);
1985bc5507e4SShuhei Matsumoto 
1986bc5507e4SShuhei Matsumoto 	/* data[1][510:384] */
1987bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 126);
1988bc5507e4SShuhei Matsumoto 
1989bc5507e4SShuhei Matsumoto 	/* data[1][511], data[2][511:0], data[3][511:0] */
1990bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 1 + 512 * 2);
1991bc5507e4SShuhei Matsumoto 
1992bc5507e4SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, (512 + 8) * 4);
1993bc5507e4SShuhei Matsumoto 
19942de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 6, &bounce_iov, 1, 512 + 8, 8, 4,
1995cc4498acSSlawomir Ptak 				true, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
1996cc4498acSSlawomir Ptak 
1997cc4498acSSlawomir Ptak 	for (i = 0; i < 6; i++) {
1998cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
1999cc4498acSSlawomir Ptak 	}
2000cc4498acSSlawomir Ptak 	_iov_free_buf(&bounce_iov);
2001cc4498acSSlawomir Ptak }
2002cc4498acSSlawomir Ptak 
2003cc4498acSSlawomir Ptak static void
20042de3092aSShuhei Matsumoto dif_copy_sec_512_md_8_prchk_7_multi_bounce_iovs_complex_splits(void)
20052de3092aSShuhei Matsumoto {
20062de3092aSShuhei Matsumoto 	struct iovec iovs[6], bounce_iovs[7];
20072de3092aSShuhei Matsumoto 	uint32_t dif_flags;
20082de3092aSShuhei Matsumoto 	int i;
20092de3092aSShuhei Matsumoto 
20102de3092aSShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
20112de3092aSShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
20122de3092aSShuhei Matsumoto 
20132de3092aSShuhei Matsumoto 	/* src_data[0][255:0] */
20142de3092aSShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
20152de3092aSShuhei Matsumoto 
20162de3092aSShuhei Matsumoto 	/* src_data[0][511:256], src_data[1][255:0] */
20172de3092aSShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256 + 256);
20182de3092aSShuhei Matsumoto 
20192de3092aSShuhei Matsumoto 	/* src_data[1][382:256] */
20202de3092aSShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 128);
20212de3092aSShuhei Matsumoto 
20222de3092aSShuhei Matsumoto 	/* src_data[1][383] */
20232de3092aSShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 1);
20242de3092aSShuhei Matsumoto 
20252de3092aSShuhei Matsumoto 	/* src_data[1][510:384] */
20262de3092aSShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 126);
20272de3092aSShuhei Matsumoto 
20282de3092aSShuhei Matsumoto 	/* src_data[1][511], src_data[2][511:0], src_data[3][511:0] */
20292de3092aSShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 1 + 512 * 2);
20302de3092aSShuhei Matsumoto 
20312de3092aSShuhei Matsumoto 	/* dst_data[0][516:0] */
20322de3092aSShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[0], 517);
20332de3092aSShuhei Matsumoto 
20342de3092aSShuhei Matsumoto 	/* dst_data[0][519:517], dst_data[1][260:0] */
20352de3092aSShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[1], 3 + 261);
20362de3092aSShuhei Matsumoto 
20372de3092aSShuhei Matsumoto 	/* dst_data[1][399:261] */
20382de3092aSShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[2], 139);
20392de3092aSShuhei Matsumoto 
20402de3092aSShuhei Matsumoto 	/* dst_data[1][511:400] */
20412de3092aSShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[3], 112);
20422de3092aSShuhei Matsumoto 
20432de3092aSShuhei Matsumoto 	/* dst_data[1][515:512] */
20442de3092aSShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[4], 4);
20452de3092aSShuhei Matsumoto 
20462de3092aSShuhei Matsumoto 	/* dst_data[1][519:516], dst_data[2][11:0] */
20472de3092aSShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[5], 21);
20482de3092aSShuhei Matsumoto 
20492de3092aSShuhei Matsumoto 	/* dst_data[1][519:12], dst_data[2][519:0], dst_data[3][519:0] */
20502de3092aSShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[6], 507 + 520 + 520);
20512de3092aSShuhei Matsumoto 
20522de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 6, bounce_iovs, 7, 512 + 8, 8, 4,
20532de3092aSShuhei Matsumoto 				true, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
20542de3092aSShuhei Matsumoto 
20552de3092aSShuhei Matsumoto 	for (i = 0; i < 6; i++) {
20562de3092aSShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
20572de3092aSShuhei Matsumoto 	}
20582de3092aSShuhei Matsumoto 
20592de3092aSShuhei Matsumoto 	for (i = 0; i < 7; i++) {
20602de3092aSShuhei Matsumoto 		_iov_free_buf(&bounce_iovs[i]);
20612de3092aSShuhei Matsumoto 	}
20622de3092aSShuhei Matsumoto }
20632de3092aSShuhei Matsumoto 
20642de3092aSShuhei Matsumoto static void
20654b88d742SShuhei Matsumoto dif_copy_sec_512_md_8_dif_disable_multi_bounce_iovs_complex_splits(void)
20664b88d742SShuhei Matsumoto {
20674b88d742SShuhei Matsumoto 	struct iovec iovs[6], bounce_iovs[7];
20684b88d742SShuhei Matsumoto 	int i;
20694b88d742SShuhei Matsumoto 
20704b88d742SShuhei Matsumoto 	/*
20714b88d742SShuhei Matsumoto 	 * src_data is made of 4 blocks and its block size is 512.
20724b88d742SShuhei Matsumoto 	 * dst_data is made of 4 blocks and its block size is 520.
20734b88d742SShuhei Matsumoto 	 *
20744b88d742SShuhei Matsumoto 	 * The first dimension of src_data[][] and dst_data[][] represents the
20754b88d742SShuhei Matsumoto 	 * number of blocks, and the second dimension represents the bytes range.
20764b88d742SShuhei Matsumoto 	 *
20774b88d742SShuhei Matsumoto 	 * Test the case these data is split with arbitrary boundary.
20784b88d742SShuhei Matsumoto 	 */
20794b88d742SShuhei Matsumoto 
20804b88d742SShuhei Matsumoto 	/* src_data[0][255:0] */
20814b88d742SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
20824b88d742SShuhei Matsumoto 
20834b88d742SShuhei Matsumoto 	/* src_data[0][511:256], src_data[1][255:0] */
20844b88d742SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256 + 256);
20854b88d742SShuhei Matsumoto 
20864b88d742SShuhei Matsumoto 	/* src_data[1][382:256] */
20874b88d742SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 128);
20884b88d742SShuhei Matsumoto 
20894b88d742SShuhei Matsumoto 	/* src_data[1][383] */
20904b88d742SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 1);
20914b88d742SShuhei Matsumoto 
20924b88d742SShuhei Matsumoto 	/* src_data[1][510:384] */
20934b88d742SShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 126);
20944b88d742SShuhei Matsumoto 
20954b88d742SShuhei Matsumoto 	/* src_data[1][511], src_data[2][511:0], src_data[3][511:0] */
20964b88d742SShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 1 + 512 * 2);
20974b88d742SShuhei Matsumoto 
20984b88d742SShuhei Matsumoto 	/* dst_data[0][516:0] */
20994b88d742SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[0], 517);
21004b88d742SShuhei Matsumoto 
21014b88d742SShuhei Matsumoto 	/* dst_data[0][519:517], dst_data[1][260:0] */
21024b88d742SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[1], 3 + 261);
21034b88d742SShuhei Matsumoto 
21044b88d742SShuhei Matsumoto 	/* dst_data[1][399:261] */
21054b88d742SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[2], 139);
21064b88d742SShuhei Matsumoto 
21074b88d742SShuhei Matsumoto 	/* dst_data[1][511:400] */
21084b88d742SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[3], 112);
21094b88d742SShuhei Matsumoto 
21104b88d742SShuhei Matsumoto 	/* dst_data[1][515:512] */
21114b88d742SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[4], 4);
21124b88d742SShuhei Matsumoto 
21134b88d742SShuhei Matsumoto 	/* dst_data[1][519:516], dst_data[2][11:0] */
21144b88d742SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[5], 21);
21154b88d742SShuhei Matsumoto 
21164b88d742SShuhei Matsumoto 	/* dst_data[1][519:12], dst_data[2][519:0], dst_data[3][519:0] */
21174b88d742SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iovs[6], 507 + 520 + 520);
21184b88d742SShuhei Matsumoto 
21194b88d742SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 6, bounce_iovs, 7, 512 + 8, 8, 4,
21204b88d742SShuhei Matsumoto 				true, SPDK_DIF_DISABLE, 0, 0, 0, 0, SPDK_DIF_PI_FORMAT_16);
21214b88d742SShuhei Matsumoto 
21224b88d742SShuhei Matsumoto 	for (i = 0; i < 6; i++) {
21234b88d742SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
21244b88d742SShuhei Matsumoto 	}
21254b88d742SShuhei Matsumoto 
21264b88d742SShuhei Matsumoto 	for (i = 0; i < 7; i++) {
21274b88d742SShuhei Matsumoto 		_iov_free_buf(&bounce_iovs[i]);
21284b88d742SShuhei Matsumoto 	}
21294b88d742SShuhei Matsumoto }
21304b88d742SShuhei Matsumoto 
21314b88d742SShuhei Matsumoto static void
21325256f0efSSlawomir Ptak dif_copy_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_test(void)
2133cc4498acSSlawomir Ptak {
2134cc4498acSSlawomir Ptak 	struct iovec iovs[6], bounce_iov;
2135cc4498acSSlawomir Ptak 	uint32_t dif_flags;
2136cc4498acSSlawomir Ptak 	int i;
2137cc4498acSSlawomir Ptak 
2138cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
2139cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
2140cc4498acSSlawomir Ptak 
2141cc4498acSSlawomir Ptak 	/* data[0][2047:0] */
2142cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 2048);
2143cc4498acSSlawomir Ptak 
2144cc4498acSSlawomir Ptak 	/* data[0][4095:2048], data[1][2047:0] */
2145cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 2048 + 2048);
2146cc4498acSSlawomir Ptak 
2147cc4498acSSlawomir Ptak 	/* data[1][3071:2048] */
2148cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[2], 1024);
2149cc4498acSSlawomir Ptak 
2150cc4498acSSlawomir Ptak 	/* data[1][3072] */
2151cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[3], 1);
2152cc4498acSSlawomir Ptak 
2153cc4498acSSlawomir Ptak 	/* data[1][4094:3073] */
2154cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[4], 1022);
2155cc4498acSSlawomir Ptak 
2156cc4498acSSlawomir Ptak 	/* data[1][4095], data[2][4095:0], data[3][4095:0] */
2157cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[5], 1 + 4096 * 2);
2158cc4498acSSlawomir Ptak 
2159cc4498acSSlawomir Ptak 	_iov_alloc_buf(&bounce_iov, (4096 + 128) * 4);
2160cc4498acSSlawomir Ptak 
21612de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 6, &bounce_iov, 1, 4096 + 128, 128, 4,
2162cc4498acSSlawomir Ptak 				true, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
21632de3092aSShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 6, &bounce_iov, 1, 4096 + 128, 128, 4,
21645256f0efSSlawomir Ptak 				true, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
2165bc5507e4SShuhei Matsumoto 
2166bc5507e4SShuhei Matsumoto 	for (i = 0; i < 6; i++) {
2167bc5507e4SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
2168bc5507e4SShuhei Matsumoto 	}
2169bc5507e4SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
2170bc5507e4SShuhei Matsumoto }
2171bc5507e4SShuhei Matsumoto 
2172045e77c2SShuhei Matsumoto static void
2173*92fb2251SShuhei Matsumoto nvme_pract_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_test(void)
2174*92fb2251SShuhei Matsumoto {
2175*92fb2251SShuhei Matsumoto 	struct iovec iovs[4], bounce_iov;
2176*92fb2251SShuhei Matsumoto 	uint32_t dif_flags;
2177*92fb2251SShuhei Matsumoto 	int i;
2178*92fb2251SShuhei Matsumoto 
2179*92fb2251SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
2180*92fb2251SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK | SPDK_DIF_FLAGS_NVME_PRACT;
2181*92fb2251SShuhei Matsumoto 
2182*92fb2251SShuhei Matsumoto 	/* data[0][2047:0] */
2183*92fb2251SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 2048);
2184*92fb2251SShuhei Matsumoto 
2185*92fb2251SShuhei Matsumoto 	/* data[0][4223:2048], data[1][4220:0] */
2186*92fb2251SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 2176 + 4221);
2187*92fb2251SShuhei Matsumoto 
2188*92fb2251SShuhei Matsumoto 	/* data[1][4223:4221] data[2][4210:0] */
2189*92fb2251SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 3 + 4211);
2190*92fb2251SShuhei Matsumoto 
2191*92fb2251SShuhei Matsumoto 	/* data[2][4223:4211], data[3][4223:0] */
2192*92fb2251SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 13 + 4224);
2193*92fb2251SShuhei Matsumoto 
2194*92fb2251SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, (4096 + 128) * 4);
2195*92fb2251SShuhei Matsumoto 
2196*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, 4,
2197*92fb2251SShuhei Matsumoto 				false, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
2198*92fb2251SShuhei Matsumoto 	dif_copy_gen_and_verify(iovs, 4, &bounce_iov, 1, 4096 + 128, 128, 4,
2199*92fb2251SShuhei Matsumoto 				false, SPDK_DIF_TYPE1, dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
2200*92fb2251SShuhei Matsumoto 
2201*92fb2251SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
2202*92fb2251SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
2203*92fb2251SShuhei Matsumoto 	}
2204*92fb2251SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
2205*92fb2251SShuhei Matsumoto }
2206*92fb2251SShuhei Matsumoto 
2207*92fb2251SShuhei Matsumoto static void
2208045e77c2SShuhei Matsumoto _dif_copy_inject_error_and_verify(struct iovec *iovs, int iovcnt, struct iovec *bounce_iov,
2209045e77c2SShuhei Matsumoto 				  uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
2210cc4498acSSlawomir Ptak 				  uint32_t inject_flags, bool dif_loc, enum spdk_dif_pi_format dif_pi_format)
2211045e77c2SShuhei Matsumoto {
2212045e77c2SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
2213045e77c2SShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
2214045e77c2SShuhei Matsumoto 	uint32_t inject_offset = 0, dif_flags;
2215045e77c2SShuhei Matsumoto 	int rc;
2216a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
2217045e77c2SShuhei Matsumoto 
221896f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
221996f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
2220045e77c2SShuhei Matsumoto 
2221045e77c2SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, iovcnt, block_size - md_size, 0, num_blocks);
2222045e77c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2223045e77c2SShuhei Matsumoto 
22245681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2225cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
222665624bd5SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, dif_loc, SPDK_DIF_TYPE1, dif_flags,
2227a711d629SSlawomir Ptak 			       88, 0xFFFF, 0x88, 0, GUARD_SEED, &dif_opts);
2228045e77c2SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2229045e77c2SShuhei Matsumoto 
223005dd3c0bSChunsong Feng 	rc = spdk_dif_generate_copy(iovs, iovcnt, bounce_iov, 1, num_blocks, &ctx);
2231045e77c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2232045e77c2SShuhei Matsumoto 
2233045e77c2SShuhei Matsumoto 	rc = spdk_dif_inject_error(bounce_iov, 1, num_blocks, &ctx, inject_flags, &inject_offset);
2234045e77c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2235045e77c2SShuhei Matsumoto 
223605dd3c0bSChunsong Feng 	rc = spdk_dif_verify_copy(iovs, iovcnt, bounce_iov, 1, num_blocks, &ctx, &err_blk);
2237045e77c2SShuhei Matsumoto 	CU_ASSERT(rc != 0);
2238045e77c2SShuhei Matsumoto 	if (inject_flags == SPDK_DIF_DATA_ERROR) {
2239045e77c2SShuhei Matsumoto 		CU_ASSERT(SPDK_DIF_GUARD_ERROR == err_blk.err_type);
2240045e77c2SShuhei Matsumoto 	} else {
2241045e77c2SShuhei Matsumoto 		CU_ASSERT(inject_flags == err_blk.err_type);
2242045e77c2SShuhei Matsumoto 	}
2243045e77c2SShuhei Matsumoto 	CU_ASSERT(inject_offset == err_blk.err_offset);
2244045e77c2SShuhei Matsumoto }
2245045e77c2SShuhei Matsumoto 
2246045e77c2SShuhei Matsumoto static void
2247045e77c2SShuhei Matsumoto dif_copy_inject_error_and_verify(struct iovec *iovs, int iovcnt, struct iovec *bounce_iov,
2248045e77c2SShuhei Matsumoto 				 uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
2249cc4498acSSlawomir Ptak 				 uint32_t inject_flags, enum spdk_dif_pi_format dif_pi_format)
2250045e77c2SShuhei Matsumoto {
2251cc4498acSSlawomir Ptak 	/* The case that DIF is contained in the first 8/16 bytes of metadata. */
2252045e77c2SShuhei Matsumoto 	_dif_copy_inject_error_and_verify(iovs, iovcnt, bounce_iov,
2253045e77c2SShuhei Matsumoto 					  block_size, md_size, num_blocks,
2254cc4498acSSlawomir Ptak 					  inject_flags, true, dif_pi_format);
2255045e77c2SShuhei Matsumoto 
2256cc4498acSSlawomir Ptak 	/* The case that DIF is contained in the last 8/16 bytes of metadata. */
2257045e77c2SShuhei Matsumoto 	_dif_copy_inject_error_and_verify(iovs, iovcnt, bounce_iov,
2258045e77c2SShuhei Matsumoto 					  block_size, md_size, num_blocks,
2259cc4498acSSlawomir Ptak 					  inject_flags, false, dif_pi_format);
2260045e77c2SShuhei Matsumoto }
2261045e77c2SShuhei Matsumoto 
2262045e77c2SShuhei Matsumoto static void
2263045e77c2SShuhei Matsumoto dif_copy_sec_4096_md_128_inject_1_2_4_8_multi_iovs_test(void)
2264045e77c2SShuhei Matsumoto {
2265045e77c2SShuhei Matsumoto 	struct iovec iovs[4], bounce_iov;
2266045e77c2SShuhei Matsumoto 	int i, num_blocks;
2267045e77c2SShuhei Matsumoto 
2268045e77c2SShuhei Matsumoto 	num_blocks = 0;
2269045e77c2SShuhei Matsumoto 
2270045e77c2SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
2271045e77c2SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 4096 * (i + 1));
2272045e77c2SShuhei Matsumoto 		num_blocks += i + 1;
2273045e77c2SShuhei Matsumoto 	}
2274045e77c2SShuhei Matsumoto 
2275045e77c2SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, (4096 + 128) * num_blocks);
2276045e77c2SShuhei Matsumoto 
2277045e77c2SShuhei Matsumoto 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2278cc4498acSSlawomir Ptak 					 num_blocks, SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
2279045e77c2SShuhei Matsumoto 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2280cc4498acSSlawomir Ptak 					 num_blocks, SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
2281045e77c2SShuhei Matsumoto 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2282cc4498acSSlawomir Ptak 					 num_blocks, SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
2283045e77c2SShuhei Matsumoto 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2284cc4498acSSlawomir Ptak 					 num_blocks, SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
2285cc4498acSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2286cc4498acSSlawomir Ptak 					 num_blocks, SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_32);
2287cc4498acSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2288cc4498acSSlawomir Ptak 					 num_blocks, SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
2289cc4498acSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2290cc4498acSSlawomir Ptak 					 num_blocks, SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
2291cc4498acSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2292cc4498acSSlawomir Ptak 					 num_blocks, SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_32);
22935256f0efSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
22945256f0efSSlawomir Ptak 					 num_blocks, SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_64);
22955256f0efSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
22965256f0efSSlawomir Ptak 					 num_blocks, SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
22975256f0efSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
22985256f0efSSlawomir Ptak 					 num_blocks, SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
22995256f0efSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
23005256f0efSSlawomir Ptak 					 num_blocks, SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_64);
2301045e77c2SShuhei Matsumoto 
2302045e77c2SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
2303045e77c2SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
2304045e77c2SShuhei Matsumoto 	}
2305045e77c2SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
2306045e77c2SShuhei Matsumoto }
2307045e77c2SShuhei Matsumoto 
2308045e77c2SShuhei Matsumoto static void
2309045e77c2SShuhei Matsumoto dif_copy_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_test(void)
2310045e77c2SShuhei Matsumoto {
2311045e77c2SShuhei Matsumoto 	struct iovec iovs[4], bounce_iov;
2312045e77c2SShuhei Matsumoto 	int i;
2313045e77c2SShuhei Matsumoto 
2314045e77c2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 2048);
2315045e77c2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 2048);
2316045e77c2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 1);
2317045e77c2SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 4095);
2318045e77c2SShuhei Matsumoto 
2319045e77c2SShuhei Matsumoto 	_iov_alloc_buf(&bounce_iov, (4096 + 128) * 2);
2320045e77c2SShuhei Matsumoto 
2321045e77c2SShuhei Matsumoto 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2322cc4498acSSlawomir Ptak 					 2, SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
2323045e77c2SShuhei Matsumoto 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2324cc4498acSSlawomir Ptak 					 2, SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
2325045e77c2SShuhei Matsumoto 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2326cc4498acSSlawomir Ptak 					 2, SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
2327045e77c2SShuhei Matsumoto 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2328cc4498acSSlawomir Ptak 					 2, SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
2329cc4498acSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2330cc4498acSSlawomir Ptak 					 2, SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_32);
2331cc4498acSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2332cc4498acSSlawomir Ptak 					 2, SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
2333cc4498acSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2334cc4498acSSlawomir Ptak 					 2, SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
2335cc4498acSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
2336cc4498acSSlawomir Ptak 					 2, SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_32);
23375256f0efSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
23385256f0efSSlawomir Ptak 					 2, SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_64);
23395256f0efSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
23405256f0efSSlawomir Ptak 					 2, SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
23415256f0efSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
23425256f0efSSlawomir Ptak 					 2, SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
23435256f0efSSlawomir Ptak 	dif_copy_inject_error_and_verify(iovs, 4, &bounce_iov, 4096 + 128, 128,
23445256f0efSSlawomir Ptak 					 2, SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_64);
2345045e77c2SShuhei Matsumoto 
2346045e77c2SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
2347045e77c2SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
2348045e77c2SShuhei Matsumoto 	}
2349045e77c2SShuhei Matsumoto 	_iov_free_buf(&bounce_iov);
2350045e77c2SShuhei Matsumoto }
2351045e77c2SShuhei Matsumoto 
235265624bd5SShuhei Matsumoto static void
2353f7d49034SShuhei Matsumoto dix_sec_0_md_8_error(void)
2354f7d49034SShuhei Matsumoto {
2355f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx ctx;
2356f7d49034SShuhei Matsumoto 	int rc;
2357f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx_init_ext_opts dif_opts;
2358f7d49034SShuhei Matsumoto 
2359f7d49034SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2360f7d49034SShuhei Matsumoto 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
2361f7d49034SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 0, 8, false, false, SPDK_DIF_TYPE1, 0,
2362f7d49034SShuhei Matsumoto 			       0, 0, 0, 0, 0, &dif_opts);
2363f7d49034SShuhei Matsumoto 	CU_ASSERT(rc != 0);
2364f7d49034SShuhei Matsumoto }
2365f7d49034SShuhei Matsumoto 
2366f7d49034SShuhei Matsumoto static void
236765624bd5SShuhei Matsumoto dix_sec_512_md_0_error(void)
236865624bd5SShuhei Matsumoto {
236965624bd5SShuhei Matsumoto 	struct spdk_dif_ctx ctx;
237065624bd5SShuhei Matsumoto 	int rc;
2371a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
237265624bd5SShuhei Matsumoto 
23735681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2374a711d629SSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
2375cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 512, 0, false, false, SPDK_DIF_TYPE1, 0,
2376cc4498acSSlawomir Ptak 			       0, 0, 0, 0, 0, &dif_opts);
237765624bd5SShuhei Matsumoto 	CU_ASSERT(rc != 0);
237865624bd5SShuhei Matsumoto }
237965624bd5SShuhei Matsumoto 
238065624bd5SShuhei Matsumoto static void
2381f7d49034SShuhei Matsumoto _dix_sec_512_md_16_error(enum spdk_dif_pi_format dif_pi_format)
2382f7d49034SShuhei Matsumoto {
2383f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx ctx;
2384f7d49034SShuhei Matsumoto 	int rc;
2385f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx_init_ext_opts dif_opts;
2386f7d49034SShuhei Matsumoto 
2387f7d49034SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2388f7d49034SShuhei Matsumoto 	dif_opts.dif_pi_format = dif_pi_format;
2389f7d49034SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 512, 16, false, false, SPDK_DIF_TYPE1, 0,
2390f7d49034SShuhei Matsumoto 			       0, 0, 0, 0, 0, &dif_opts);
2391f7d49034SShuhei Matsumoto 	CU_ASSERT(rc != 0);
2392f7d49034SShuhei Matsumoto }
2393f7d49034SShuhei Matsumoto 
2394f7d49034SShuhei Matsumoto static void
2395f7d49034SShuhei Matsumoto dix_sec_512_md_16_error(void)
2396f7d49034SShuhei Matsumoto {
2397f7d49034SShuhei Matsumoto 	_dix_sec_512_md_16_error(SPDK_DIF_PI_FORMAT_32);
2398f7d49034SShuhei Matsumoto 	_dix_sec_512_md_16_error(SPDK_DIF_PI_FORMAT_64);
2399f7d49034SShuhei Matsumoto }
2400f7d49034SShuhei Matsumoto 
2401f7d49034SShuhei Matsumoto static void
2402f7d49034SShuhei Matsumoto _dix_sec_4096_md_0_8_error(enum spdk_dif_pi_format dif_pi_format)
2403f7d49034SShuhei Matsumoto {
2404f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
2405f7d49034SShuhei Matsumoto 	int rc;
2406f7d49034SShuhei Matsumoto 	struct spdk_dif_ctx_init_ext_opts dif_opts;
2407f7d49034SShuhei Matsumoto 
2408f7d49034SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2409f7d49034SShuhei Matsumoto 	dif_opts.dif_pi_format = dif_pi_format;
2410f7d49034SShuhei Matsumoto 	/* Metadata size is 0. */
2411f7d49034SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096, 0, true, false, SPDK_DIF_TYPE1, 0,
2412f7d49034SShuhei Matsumoto 			       0, 0, 0, 0, 0, &dif_opts);
2413f7d49034SShuhei Matsumoto 	CU_ASSERT(rc != 0);
2414f7d49034SShuhei Matsumoto 
2415f7d49034SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2416f7d49034SShuhei Matsumoto 	dif_opts.dif_pi_format = dif_pi_format;
2417f7d49034SShuhei Matsumoto 	/* Metadata size is 0. */
2418f7d49034SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096, 8, true, false, SPDK_DIF_TYPE1, 0,
2419f7d49034SShuhei Matsumoto 			       0, 0, 0, 0, 0, &dif_opts);
2420f7d49034SShuhei Matsumoto 	CU_ASSERT(rc != 0);
2421f7d49034SShuhei Matsumoto }
2422f7d49034SShuhei Matsumoto 
2423f7d49034SShuhei Matsumoto static void
2424f7d49034SShuhei Matsumoto dix_sec_4096_md_0_8_error(void)
2425f7d49034SShuhei Matsumoto {
2426f7d49034SShuhei Matsumoto 	_dix_sec_4096_md_0_8_error(SPDK_DIF_PI_FORMAT_32);
2427f7d49034SShuhei Matsumoto 	_dix_sec_4096_md_0_8_error(SPDK_DIF_PI_FORMAT_64);
2428f7d49034SShuhei Matsumoto }
2429f7d49034SShuhei Matsumoto 
2430f7d49034SShuhei Matsumoto static void
243165624bd5SShuhei Matsumoto dix_generate_and_verify(struct iovec *iovs, int iovcnt, struct iovec *md_iov,
243265624bd5SShuhei Matsumoto 			uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
243365624bd5SShuhei Matsumoto 			bool dif_loc, enum spdk_dif_type dif_type, uint32_t dif_flags,
2434cc4498acSSlawomir Ptak 			uint32_t init_ref_tag, uint16_t apptag_mask, uint16_t app_tag,
2435cc4498acSSlawomir Ptak 			enum spdk_dif_pi_format dif_pi_format)
243665624bd5SShuhei Matsumoto {
243765624bd5SShuhei Matsumoto 	struct spdk_dif_ctx ctx;
243865624bd5SShuhei Matsumoto 	int rc;
2439a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
244065624bd5SShuhei Matsumoto 
244165624bd5SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, iovcnt, block_size, 0, num_blocks);
244265624bd5SShuhei Matsumoto 	CU_ASSERT(rc == 0);
244365624bd5SShuhei Matsumoto 
24445681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2445cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
244665624bd5SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, false, dif_loc, dif_type, dif_flags,
2447a711d629SSlawomir Ptak 			       init_ref_tag, apptag_mask, app_tag, 0, GUARD_SEED, &dif_opts);
244865624bd5SShuhei Matsumoto 	CU_ASSERT(rc == 0);
244965624bd5SShuhei Matsumoto 
245065624bd5SShuhei Matsumoto 	rc = spdk_dix_generate(iovs, iovcnt, md_iov, num_blocks, &ctx);
245165624bd5SShuhei Matsumoto 	CU_ASSERT(rc == 0);
245265624bd5SShuhei Matsumoto 
2453ed453525SShuhei Matsumoto 	rc = spdk_dix_verify(iovs, iovcnt, md_iov, num_blocks, &ctx, NULL);
245465624bd5SShuhei Matsumoto 	CU_ASSERT(rc == 0);
245565624bd5SShuhei Matsumoto 
245665624bd5SShuhei Matsumoto 	rc = ut_data_pattern_verify(iovs, iovcnt, block_size, 0, num_blocks);
245765624bd5SShuhei Matsumoto 	CU_ASSERT(rc == 0);
245865624bd5SShuhei Matsumoto }
245965624bd5SShuhei Matsumoto 
246065624bd5SShuhei Matsumoto static void
246165624bd5SShuhei Matsumoto dix_sec_512_md_8_prchk_0_single_iov(void)
246265624bd5SShuhei Matsumoto {
246365624bd5SShuhei Matsumoto 	struct iovec iov, md_iov;
246465624bd5SShuhei Matsumoto 
246565624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iov, 512 * 4);
246665624bd5SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 8 * 4);
246765624bd5SShuhei Matsumoto 
2468cc4498acSSlawomir Ptak 	dix_generate_and_verify(&iov, 1, &md_iov, 512, 8, 4, false, SPDK_DIF_TYPE1, 0, 0, 0, 0,
2469cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16);
2470cc4498acSSlawomir Ptak 	dix_generate_and_verify(&iov, 1, &md_iov, 512, 8, 4, true, SPDK_DIF_TYPE1, 0, 0, 0, 0,
2471cc4498acSSlawomir Ptak 				SPDK_DIF_PI_FORMAT_16);
2472cc4498acSSlawomir Ptak 
2473cc4498acSSlawomir Ptak 	_iov_free_buf(&iov);
2474cc4498acSSlawomir Ptak 	_iov_free_buf(&md_iov);
2475cc4498acSSlawomir Ptak }
2476cc4498acSSlawomir Ptak 
2477cc4498acSSlawomir Ptak static void
24785256f0efSSlawomir Ptak _dix_sec_4096_md_128_prchk_0_single_iov_test(
24795256f0efSSlawomir Ptak 	enum spdk_dif_pi_format dif_pi_format)
2480cc4498acSSlawomir Ptak {
2481cc4498acSSlawomir Ptak 	struct iovec iov, md_iov;
2482cc4498acSSlawomir Ptak 
2483cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iov, 4096 * 4);
2484cc4498acSSlawomir Ptak 	_iov_alloc_buf(&md_iov, 128 * 4);
2485cc4498acSSlawomir Ptak 
2486cc4498acSSlawomir Ptak 	dix_generate_and_verify(&iov, 1, &md_iov, 4096, 128, 4, false, SPDK_DIF_TYPE1, 0, 0, 0, 0,
24875256f0efSSlawomir Ptak 				dif_pi_format);
2488cc4498acSSlawomir Ptak 	dix_generate_and_verify(&iov, 1, &md_iov, 4096, 128, 4, true, SPDK_DIF_TYPE1, 0, 0, 0, 0,
24895256f0efSSlawomir Ptak 				dif_pi_format);
249065624bd5SShuhei Matsumoto 
249165624bd5SShuhei Matsumoto 	_iov_free_buf(&iov);
249265624bd5SShuhei Matsumoto 	_iov_free_buf(&md_iov);
249365624bd5SShuhei Matsumoto }
249465624bd5SShuhei Matsumoto 
249565624bd5SShuhei Matsumoto static void
24965256f0efSSlawomir Ptak dix_sec_4096_md_128_prchk_0_single_iov_test(void)
24975256f0efSSlawomir Ptak {
24985256f0efSSlawomir Ptak 	_dix_sec_4096_md_128_prchk_0_single_iov_test(SPDK_DIF_PI_FORMAT_32);
24995256f0efSSlawomir Ptak 	_dix_sec_4096_md_128_prchk_0_single_iov_test(SPDK_DIF_PI_FORMAT_64);
25005256f0efSSlawomir Ptak }
25015256f0efSSlawomir Ptak 
25025256f0efSSlawomir Ptak static void
250365624bd5SShuhei Matsumoto dix_sec_512_md_8_prchk_0_1_2_4_multi_iovs(void)
250465624bd5SShuhei Matsumoto {
250565624bd5SShuhei Matsumoto 	struct iovec iovs[4], md_iov;
250665624bd5SShuhei Matsumoto 	int i, num_blocks;
250765624bd5SShuhei Matsumoto 
250865624bd5SShuhei Matsumoto 	num_blocks = 0;
250965624bd5SShuhei Matsumoto 
251065624bd5SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
251165624bd5SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 512 * (i + 1));
251265624bd5SShuhei Matsumoto 		num_blocks += i + 1;
251365624bd5SShuhei Matsumoto 	}
251465624bd5SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 8 * num_blocks);
251565624bd5SShuhei Matsumoto 
251665624bd5SShuhei Matsumoto 	dix_generate_and_verify(iovs, 4, &md_iov, 512, 8, num_blocks, false, SPDK_DIF_TYPE1,
2517cc4498acSSlawomir Ptak 				0, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
251865624bd5SShuhei Matsumoto 	dix_generate_and_verify(iovs, 4, &md_iov, 512, 8, num_blocks, false, SPDK_DIF_TYPE1,
2519cc4498acSSlawomir Ptak 				SPDK_DIF_FLAGS_GUARD_CHECK, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
252065624bd5SShuhei Matsumoto 	dix_generate_and_verify(iovs, 4, &md_iov, 512, 8, num_blocks, false, SPDK_DIF_TYPE1,
2521cc4498acSSlawomir Ptak 				SPDK_DIF_FLAGS_APPTAG_CHECK, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
252265624bd5SShuhei Matsumoto 	dix_generate_and_verify(iovs, 4, &md_iov, 512, 8, num_blocks, false, SPDK_DIF_TYPE1,
2523cc4498acSSlawomir Ptak 				SPDK_DIF_FLAGS_REFTAG_CHECK, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
2524cc4498acSSlawomir Ptak 
2525cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
2526cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
2527cc4498acSSlawomir Ptak 	}
2528cc4498acSSlawomir Ptak 	_iov_free_buf(&md_iov);
2529cc4498acSSlawomir Ptak }
2530cc4498acSSlawomir Ptak 
2531cc4498acSSlawomir Ptak static void
25325256f0efSSlawomir Ptak _dix_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(
25335256f0efSSlawomir Ptak 	enum spdk_dif_pi_format dif_pi_format)
2534cc4498acSSlawomir Ptak {
2535cc4498acSSlawomir Ptak 	struct iovec iovs[4], md_iov;
2536cc4498acSSlawomir Ptak 	int i, num_blocks;
2537cc4498acSSlawomir Ptak 
2538cc4498acSSlawomir Ptak 	num_blocks = 0;
2539cc4498acSSlawomir Ptak 
2540cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
2541cc4498acSSlawomir Ptak 		_iov_alloc_buf(&iovs[i], 4096 * (i + 1));
2542cc4498acSSlawomir Ptak 		num_blocks += i + 1;
2543cc4498acSSlawomir Ptak 	}
2544cc4498acSSlawomir Ptak 	_iov_alloc_buf(&md_iov, 128 * num_blocks);
2545cc4498acSSlawomir Ptak 
2546cc4498acSSlawomir Ptak 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
25475256f0efSSlawomir Ptak 				0, 22, 0xFFFF, 0x22, dif_pi_format);
2548cc4498acSSlawomir Ptak 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
25495256f0efSSlawomir Ptak 				SPDK_DIF_FLAGS_GUARD_CHECK, 22, 0xFFFF, 0x22, dif_pi_format);
2550cc4498acSSlawomir Ptak 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
25515256f0efSSlawomir Ptak 				SPDK_DIF_FLAGS_APPTAG_CHECK, 22, 0xFFFF, 0x22, dif_pi_format);
2552cc4498acSSlawomir Ptak 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
25535256f0efSSlawomir Ptak 				SPDK_DIF_FLAGS_REFTAG_CHECK, 22, 0xFFFF, 0x22, dif_pi_format);
255465624bd5SShuhei Matsumoto 
255565624bd5SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
255665624bd5SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
255765624bd5SShuhei Matsumoto 	}
255865624bd5SShuhei Matsumoto 	_iov_free_buf(&md_iov);
255965624bd5SShuhei Matsumoto }
256065624bd5SShuhei Matsumoto 
256165624bd5SShuhei Matsumoto static void
25625256f0efSSlawomir Ptak dix_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(void)
25635256f0efSSlawomir Ptak {
25645256f0efSSlawomir Ptak 	_dix_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(SPDK_DIF_PI_FORMAT_32);
25655256f0efSSlawomir Ptak 	_dix_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test(SPDK_DIF_PI_FORMAT_64);
25665256f0efSSlawomir Ptak }
25675256f0efSSlawomir Ptak 
25685256f0efSSlawomir Ptak /* TODO start here */
25695256f0efSSlawomir Ptak 
25705256f0efSSlawomir Ptak static void
257165624bd5SShuhei Matsumoto dix_sec_4096_md_128_prchk_7_multi_iovs(void)
257265624bd5SShuhei Matsumoto {
257365624bd5SShuhei Matsumoto 	struct iovec iovs[4], md_iov;
257465624bd5SShuhei Matsumoto 	uint32_t dif_flags;
257565624bd5SShuhei Matsumoto 	int i, num_blocks;
257665624bd5SShuhei Matsumoto 
257796f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
257896f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
257965624bd5SShuhei Matsumoto 
258065624bd5SShuhei Matsumoto 	num_blocks = 0;
258165624bd5SShuhei Matsumoto 
258265624bd5SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
258365624bd5SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 4096 * (i + 1));
258465624bd5SShuhei Matsumoto 		num_blocks += i + 1;
258565624bd5SShuhei Matsumoto 	}
258665624bd5SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 128 * num_blocks);
258765624bd5SShuhei Matsumoto 
258865624bd5SShuhei Matsumoto 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
2589cc4498acSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
259065624bd5SShuhei Matsumoto 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, true, SPDK_DIF_TYPE1,
2591cc4498acSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
2592cc4498acSSlawomir Ptak 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
2593cc4498acSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
2594cc4498acSSlawomir Ptak 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, true, SPDK_DIF_TYPE1,
2595cc4498acSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
25965256f0efSSlawomir Ptak 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
25975256f0efSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
25985256f0efSSlawomir Ptak 	dix_generate_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, true, SPDK_DIF_TYPE1,
25995256f0efSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
260065624bd5SShuhei Matsumoto 
260165624bd5SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
260265624bd5SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
260365624bd5SShuhei Matsumoto 	}
260465624bd5SShuhei Matsumoto 	_iov_free_buf(&md_iov);
260565624bd5SShuhei Matsumoto }
260665624bd5SShuhei Matsumoto 
260765624bd5SShuhei Matsumoto static void
260865624bd5SShuhei Matsumoto dix_sec_512_md_8_prchk_7_multi_iovs_split_data(void)
260965624bd5SShuhei Matsumoto {
261065624bd5SShuhei Matsumoto 	struct iovec iovs[2], md_iov;
261165624bd5SShuhei Matsumoto 	uint32_t dif_flags;
261265624bd5SShuhei Matsumoto 
261396f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
261496f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
261565624bd5SShuhei Matsumoto 
261665624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
261765624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256);
261865624bd5SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 8);
261965624bd5SShuhei Matsumoto 
262065624bd5SShuhei Matsumoto 	dix_generate_and_verify(iovs, 2, &md_iov, 512, 8, 1, false, SPDK_DIF_TYPE1,
2621cc4498acSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
2622cc4498acSSlawomir Ptak 
2623cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[0]);
2624cc4498acSSlawomir Ptak 	_iov_free_buf(&iovs[1]);
2625cc4498acSSlawomir Ptak 	_iov_free_buf(&md_iov);
2626cc4498acSSlawomir Ptak }
2627cc4498acSSlawomir Ptak 
2628cc4498acSSlawomir Ptak static void
26295256f0efSSlawomir Ptak dix_sec_4096_md_128_prchk_7_multi_iovs_split_data_test(void)
2630cc4498acSSlawomir Ptak {
2631cc4498acSSlawomir Ptak 	struct iovec iovs[2], md_iov;
2632cc4498acSSlawomir Ptak 	uint32_t dif_flags;
2633cc4498acSSlawomir Ptak 
2634cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
2635cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
2636cc4498acSSlawomir Ptak 
2637cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 2048);
2638cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 2048);
2639cc4498acSSlawomir Ptak 	_iov_alloc_buf(&md_iov, 128);
2640cc4498acSSlawomir Ptak 
2641cc4498acSSlawomir Ptak 	dix_generate_and_verify(iovs, 2, &md_iov, 4096, 128, 1, false, SPDK_DIF_TYPE1,
2642cc4498acSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
26435256f0efSSlawomir Ptak 	dix_generate_and_verify(iovs, 2, &md_iov, 4096, 128, 1, false, SPDK_DIF_TYPE1,
26445256f0efSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
264565624bd5SShuhei Matsumoto 
264665624bd5SShuhei Matsumoto 	_iov_free_buf(&iovs[0]);
264765624bd5SShuhei Matsumoto 	_iov_free_buf(&iovs[1]);
264865624bd5SShuhei Matsumoto 	_iov_free_buf(&md_iov);
264965624bd5SShuhei Matsumoto }
265065624bd5SShuhei Matsumoto 
265165624bd5SShuhei Matsumoto static void
265265624bd5SShuhei Matsumoto dix_sec_512_md_8_prchk_7_multi_iovs_complex_splits(void)
265365624bd5SShuhei Matsumoto {
265465624bd5SShuhei Matsumoto 	struct iovec iovs[6], md_iov;
265565624bd5SShuhei Matsumoto 	uint32_t dif_flags;
265665624bd5SShuhei Matsumoto 	int i;
265765624bd5SShuhei Matsumoto 
265896f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
265996f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
266065624bd5SShuhei Matsumoto 
266165624bd5SShuhei Matsumoto 	/* data[0][255:0] */
266265624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
266365624bd5SShuhei Matsumoto 
266465624bd5SShuhei Matsumoto 	/* data[0][511:256], data[1][255:0] */
266565624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256 + 256);
266665624bd5SShuhei Matsumoto 
266765624bd5SShuhei Matsumoto 	/* data[1][382:256] */
266865624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 128);
266965624bd5SShuhei Matsumoto 
267065624bd5SShuhei Matsumoto 	/* data[1][383] */
267165624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 1);
267265624bd5SShuhei Matsumoto 
267365624bd5SShuhei Matsumoto 	/* data[1][510:384] */
267465624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 126);
267565624bd5SShuhei Matsumoto 
267665624bd5SShuhei Matsumoto 	/* data[1][511], data[2][511:0], data[3][511:0] */
267765624bd5SShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 1 + 512 * 2);
267865624bd5SShuhei Matsumoto 
267965624bd5SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 8 * 4);
268065624bd5SShuhei Matsumoto 
268165624bd5SShuhei Matsumoto 	dix_generate_and_verify(iovs, 6, &md_iov, 512, 8, 4, false, SPDK_DIF_TYPE1,
2682cc4498acSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
2683cc4498acSSlawomir Ptak 
2684cc4498acSSlawomir Ptak 	for (i = 0; i < 6; i++) {
2685cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
2686cc4498acSSlawomir Ptak 	}
2687cc4498acSSlawomir Ptak 	_iov_free_buf(&md_iov);
2688cc4498acSSlawomir Ptak }
2689cc4498acSSlawomir Ptak 
2690cc4498acSSlawomir Ptak static void
26915256f0efSSlawomir Ptak dix_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_test(void)
2692cc4498acSSlawomir Ptak {
2693cc4498acSSlawomir Ptak 	struct iovec iovs[6], md_iov;
2694cc4498acSSlawomir Ptak 	uint32_t dif_flags;
2695cc4498acSSlawomir Ptak 	int i;
2696cc4498acSSlawomir Ptak 
2697cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
2698cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
2699cc4498acSSlawomir Ptak 
2700cc4498acSSlawomir Ptak 	/* data[0][2047:0] */
2701cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 2048);
2702cc4498acSSlawomir Ptak 
2703cc4498acSSlawomir Ptak 	/* data[0][4095:2048], data[1][2047:0] */
2704cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 2048 + 2048);
2705cc4498acSSlawomir Ptak 
2706cc4498acSSlawomir Ptak 	/* data[1][3071:2048] */
2707cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[2], 1024);
2708cc4498acSSlawomir Ptak 
2709cc4498acSSlawomir Ptak 	/* data[1][3072] */
2710cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[3], 1);
2711cc4498acSSlawomir Ptak 
2712cc4498acSSlawomir Ptak 	/* data[1][4094:3073] */
2713cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[4], 1022);
2714cc4498acSSlawomir Ptak 
2715cc4498acSSlawomir Ptak 	/* data[1][4095], data[2][4095:0], data[3][4095:0] */
2716cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[5], 1 + 4096 * 2);
2717cc4498acSSlawomir Ptak 
2718cc4498acSSlawomir Ptak 	_iov_alloc_buf(&md_iov, 128 * 4);
2719cc4498acSSlawomir Ptak 
2720cc4498acSSlawomir Ptak 	dix_generate_and_verify(iovs, 6, &md_iov, 4096, 128, 4, false, SPDK_DIF_TYPE1,
2721cc4498acSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
27225256f0efSSlawomir Ptak 	dix_generate_and_verify(iovs, 6, &md_iov, 4096, 128, 4, false, SPDK_DIF_TYPE1,
27235256f0efSSlawomir Ptak 				dif_flags, 22, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
272465624bd5SShuhei Matsumoto 
272565624bd5SShuhei Matsumoto 	for (i = 0; i < 6; i++) {
272665624bd5SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
272765624bd5SShuhei Matsumoto 	}
272865624bd5SShuhei Matsumoto 	_iov_free_buf(&md_iov);
272965624bd5SShuhei Matsumoto }
273065624bd5SShuhei Matsumoto 
2731ed453525SShuhei Matsumoto static void
2732ed453525SShuhei Matsumoto _dix_inject_error_and_verify(struct iovec *iovs, int iovcnt, struct iovec *md_iov,
2733ed453525SShuhei Matsumoto 			     uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
2734cc4498acSSlawomir Ptak 			     uint32_t inject_flags, bool dif_loc, enum spdk_dif_pi_format dif_pi_format)
2735ed453525SShuhei Matsumoto {
2736ed453525SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
2737ed453525SShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
2738ed453525SShuhei Matsumoto 	uint32_t inject_offset = 0, dif_flags;
2739ed453525SShuhei Matsumoto 	int rc;
2740a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
2741ed453525SShuhei Matsumoto 
274296f29261SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
274396f29261SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
2744ed453525SShuhei Matsumoto 
2745ed453525SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, iovcnt, block_size, 0, num_blocks);
2746ed453525SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2747ed453525SShuhei Matsumoto 
27485681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2749cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
2750ed453525SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, false, dif_loc, SPDK_DIF_TYPE1, dif_flags,
2751a711d629SSlawomir Ptak 			       88, 0xFFFF, 0x88, 0, GUARD_SEED, &dif_opts);
2752ed453525SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2753ed453525SShuhei Matsumoto 
2754ed453525SShuhei Matsumoto 	rc = spdk_dix_generate(iovs, iovcnt, md_iov, num_blocks, &ctx);
2755ed453525SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2756ed453525SShuhei Matsumoto 
2757ed453525SShuhei Matsumoto 	rc = spdk_dix_inject_error(iovs, iovcnt, md_iov, num_blocks, &ctx, inject_flags, &inject_offset);
2758ed453525SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2759ed453525SShuhei Matsumoto 
2760ed453525SShuhei Matsumoto 	rc = spdk_dix_verify(iovs, iovcnt, md_iov, num_blocks, &ctx, &err_blk);
2761ed453525SShuhei Matsumoto 	CU_ASSERT(rc != 0);
2762ed453525SShuhei Matsumoto 
2763ed453525SShuhei Matsumoto 	if (inject_flags == SPDK_DIF_DATA_ERROR) {
2764ed453525SShuhei Matsumoto 		CU_ASSERT(SPDK_DIF_GUARD_ERROR == err_blk.err_type);
2765ed453525SShuhei Matsumoto 	} else {
2766ed453525SShuhei Matsumoto 		CU_ASSERT(inject_flags == err_blk.err_type);
2767ed453525SShuhei Matsumoto 	}
2768ed453525SShuhei Matsumoto 	CU_ASSERT(inject_offset == err_blk.err_offset);
2769ed453525SShuhei Matsumoto }
2770ed453525SShuhei Matsumoto 
2771ed453525SShuhei Matsumoto static void
2772ed453525SShuhei Matsumoto dix_inject_error_and_verify(struct iovec *iovs, int iovcnt, struct iovec *md_iov,
2773ed453525SShuhei Matsumoto 			    uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
2774cc4498acSSlawomir Ptak 			    uint32_t inject_flags, enum spdk_dif_pi_format dif_pi_format)
2775ed453525SShuhei Matsumoto {
2776cc4498acSSlawomir Ptak 	/* The case that DIF is contained in the first 8/16 bytes of metadata. */
2777ed453525SShuhei Matsumoto 	_dix_inject_error_and_verify(iovs, iovcnt, md_iov, block_size, md_size, num_blocks,
2778cc4498acSSlawomir Ptak 				     inject_flags, true, dif_pi_format);
2779ed453525SShuhei Matsumoto 
2780cc4498acSSlawomir Ptak 	/* The case that DIF is contained in the last 8/16 bytes of metadata. */
2781ed453525SShuhei Matsumoto 	_dix_inject_error_and_verify(iovs, iovcnt, md_iov, block_size, md_size, num_blocks,
2782cc4498acSSlawomir Ptak 				     inject_flags, false, dif_pi_format);
2783ed453525SShuhei Matsumoto }
2784ed453525SShuhei Matsumoto 
2785ed453525SShuhei Matsumoto static void
2786ed453525SShuhei Matsumoto dix_sec_4096_md_128_inject_1_2_4_8_multi_iovs_test(void)
2787ed453525SShuhei Matsumoto {
2788ed453525SShuhei Matsumoto 	struct iovec iovs[4], md_iov;
2789ed453525SShuhei Matsumoto 	int i, num_blocks;
2790ed453525SShuhei Matsumoto 
2791ed453525SShuhei Matsumoto 	num_blocks = 0;
2792ed453525SShuhei Matsumoto 
2793ed453525SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
2794ed453525SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 4096 * (i + 1));
2795ed453525SShuhei Matsumoto 		num_blocks += i + 1;
2796ed453525SShuhei Matsumoto 	}
2797ed453525SShuhei Matsumoto 
2798ed453525SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 128 * num_blocks);
2799ed453525SShuhei Matsumoto 
2800cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
2801cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
2802cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
2803cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
2804cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
2805cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
2806cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
2807cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
2808cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
2809cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_32);
2810cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
2811cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
2812cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
2813cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
2814cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
2815cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_32);
28165256f0efSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
28175256f0efSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_64);
28185256f0efSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
28195256f0efSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
28205256f0efSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
28215256f0efSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
28225256f0efSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks,
28235256f0efSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_64);
2824ed453525SShuhei Matsumoto 
2825ed453525SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
2826ed453525SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
2827ed453525SShuhei Matsumoto 	}
2828ed453525SShuhei Matsumoto 	_iov_free_buf(&md_iov);
2829ed453525SShuhei Matsumoto }
2830ed453525SShuhei Matsumoto 
2831ed453525SShuhei Matsumoto static void
2832ed453525SShuhei Matsumoto dix_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_test(void)
2833ed453525SShuhei Matsumoto {
2834ed453525SShuhei Matsumoto 	struct iovec iovs[4], md_iov;
2835ed453525SShuhei Matsumoto 	int i;
2836ed453525SShuhei Matsumoto 
2837ed453525SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 2048);
2838ed453525SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 2048);
2839ed453525SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 1);
2840ed453525SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 4095);
2841ed453525SShuhei Matsumoto 
2842ed453525SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 128 * 2);
2843ed453525SShuhei Matsumoto 
2844cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
2845cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_16);
2846cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
2847cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
2848cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
2849cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_16);
2850cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
2851cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_16);
2852cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
2853cc4498acSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_32);
2854cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
2855cc4498acSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
2856cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
2857cc4498acSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_32);
2858cc4498acSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
2859cc4498acSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_32);
28605256f0efSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
28615256f0efSSlawomir Ptak 				    SPDK_DIF_GUARD_ERROR, SPDK_DIF_PI_FORMAT_64);
28625256f0efSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
28635256f0efSSlawomir Ptak 				    SPDK_DIF_APPTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
28645256f0efSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
28655256f0efSSlawomir Ptak 				    SPDK_DIF_REFTAG_ERROR, SPDK_DIF_PI_FORMAT_64);
28665256f0efSSlawomir Ptak 	dix_inject_error_and_verify(iovs, 4, &md_iov, 4096, 128, 2,
28675256f0efSSlawomir Ptak 				    SPDK_DIF_DATA_ERROR, SPDK_DIF_PI_FORMAT_64);
2868ed453525SShuhei Matsumoto 
2869ed453525SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
2870ed453525SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
2871ed453525SShuhei Matsumoto 	}
2872ed453525SShuhei Matsumoto 	_iov_free_buf(&md_iov);
2873ed453525SShuhei Matsumoto }
2874ed453525SShuhei Matsumoto 
28756716729cSShuhei Matsumoto static int
28766716729cSShuhei Matsumoto ut_readv(uint32_t read_base, uint32_t read_len, struct iovec *iovs, int iovcnt)
28776716729cSShuhei Matsumoto {
28786716729cSShuhei Matsumoto 	int i;
28796716729cSShuhei Matsumoto 	uint32_t j, offset;
28806716729cSShuhei Matsumoto 	uint8_t *buf;
28816716729cSShuhei Matsumoto 
28826716729cSShuhei Matsumoto 	offset = 0;
28836716729cSShuhei Matsumoto 	for (i = 0; i < iovcnt; i++) {
28846716729cSShuhei Matsumoto 		buf = iovs[i].iov_base;
28856716729cSShuhei Matsumoto 		for (j = 0; j < iovs[i].iov_len; j++, offset++) {
28866716729cSShuhei Matsumoto 			if (offset >= read_len) {
28876716729cSShuhei Matsumoto 				return offset;
28886716729cSShuhei Matsumoto 			}
28896716729cSShuhei Matsumoto 			buf[j] = DATA_PATTERN(read_base + offset);
28906716729cSShuhei Matsumoto 		}
28916716729cSShuhei Matsumoto 	}
28926716729cSShuhei Matsumoto 
28936716729cSShuhei Matsumoto 	return offset;
28946716729cSShuhei Matsumoto }
28956716729cSShuhei Matsumoto 
28966716729cSShuhei Matsumoto static void
2897cc4498acSSlawomir Ptak _set_md_interleave_iovs_test(enum spdk_dif_pi_format dif_pi_format)
28986716729cSShuhei Matsumoto {
28996716729cSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
29006716729cSShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
290194c06a68SHailiang Wang 	struct iovec iov1, iov2, dif_iovs[4] = {};
2902d9ec66dfSShuhei Matsumoto 	uint32_t dif_check_flags, data_len, read_len, data_offset, mapped_len = 0;
29036716729cSShuhei Matsumoto 	uint8_t *buf1, *buf2;
29046716729cSShuhei Matsumoto 	int rc;
2905a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
29066716729cSShuhei Matsumoto 
29076716729cSShuhei Matsumoto 	dif_check_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
29086716729cSShuhei Matsumoto 			  SPDK_DIF_FLAGS_REFTAG_CHECK;
29096716729cSShuhei Matsumoto 
29105681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2911cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
29126716729cSShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1,
2913a711d629SSlawomir Ptak 			       dif_check_flags, 22, 0xFFFF, 0x22, 0, GUARD_SEED, &dif_opts);
29146716729cSShuhei Matsumoto 	CU_ASSERT(rc == 0);
29156716729cSShuhei Matsumoto 
29166716729cSShuhei Matsumoto 	/* The first data buffer:
29176716729cSShuhei Matsumoto 	 * - Create iovec array to Leave a space for metadata for each block
29186716729cSShuhei Matsumoto 	 * - Split vectored read and so creating iovec array is done before every vectored read.
29196716729cSShuhei Matsumoto 	 */
29206716729cSShuhei Matsumoto 	buf1 = calloc(1, (4096 + 128) * 4);
29216716729cSShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf1 != NULL);
29226716729cSShuhei Matsumoto 	_iov_set_buf(&iov1, buf1, (4096 + 128) * 4);
29236716729cSShuhei Matsumoto 
2924d9ec66dfSShuhei Matsumoto 	data_offset = 0;
2925d9ec66dfSShuhei Matsumoto 	data_len = 4096 * 4;
2926d9ec66dfSShuhei Matsumoto 
2927d9ec66dfSShuhei Matsumoto 	/* 1st read */
29282821762aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 4, &iov1, 1,
2929d9ec66dfSShuhei Matsumoto 					     data_offset, data_len, &mapped_len, &ctx);
29306716729cSShuhei Matsumoto 	CU_ASSERT(rc == 4);
29316716729cSShuhei Matsumoto 	CU_ASSERT(mapped_len == 4096 * 4);
29326716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], buf1, 4096) == true);
29336716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], buf1 + 4096 + 128, 4096) == true);
29346716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], buf1 + (4096 + 128) * 2, 4096) == true);
29356716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], buf1 + (4096 + 128) * 3, 4096) == true);
29366716729cSShuhei Matsumoto 
2937d9ec66dfSShuhei Matsumoto 	read_len = ut_readv(data_offset, 1024, dif_iovs, 4);
2938d9ec66dfSShuhei Matsumoto 	CU_ASSERT(read_len == 1024);
29396716729cSShuhei Matsumoto 
2940d9ec66dfSShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov1, 1, data_offset, read_len, &ctx);
2941466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2942466ca6d4SShuhei Matsumoto 
2943d9ec66dfSShuhei Matsumoto 	data_offset += read_len;
294494f67dd5SShuhei Matsumoto 	data_len -= read_len;
2945d9ec66dfSShuhei Matsumoto 
2946d9ec66dfSShuhei Matsumoto 	/* 2nd read */
29472821762aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 4, &iov1, 1,
2948d9ec66dfSShuhei Matsumoto 					     data_offset, data_len, &mapped_len, &ctx);
29496716729cSShuhei Matsumoto 	CU_ASSERT(rc == 4);
29506716729cSShuhei Matsumoto 	CU_ASSERT(mapped_len == 3072 + 4096 * 3);
29516716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], buf1 + 1024, 3072) == true);
29526716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], buf1 + 4096 + 128, 4096) == true);
29536716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], buf1 + (4096 + 128) * 2, 4096) == true);
29546716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], buf1 + (4096 + 128) * 3, 4096) == true);
29556716729cSShuhei Matsumoto 
2956d9ec66dfSShuhei Matsumoto 	read_len = ut_readv(data_offset, 3071, dif_iovs, 4);
2957d9ec66dfSShuhei Matsumoto 	CU_ASSERT(read_len == 3071);
29586716729cSShuhei Matsumoto 
2959d9ec66dfSShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov1, 1, data_offset, read_len, &ctx);
2960466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2961466ca6d4SShuhei Matsumoto 
2962d9ec66dfSShuhei Matsumoto 	data_offset += read_len;
296394f67dd5SShuhei Matsumoto 	data_len -= read_len;
2964d9ec66dfSShuhei Matsumoto 
2965d9ec66dfSShuhei Matsumoto 	/* 3rd read */
29662821762aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 4, &iov1, 1,
2967d9ec66dfSShuhei Matsumoto 					     data_offset, data_len, &mapped_len, &ctx);
29686716729cSShuhei Matsumoto 	CU_ASSERT(rc == 4);
29696716729cSShuhei Matsumoto 	CU_ASSERT(mapped_len == 1 + 4096 * 3);
29706716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], buf1 + 4095, 1) == true);
29716716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], buf1 + 4096 + 128, 4096) == true);
29726716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], buf1 + (4096 + 128) * 2, 4096) == true);
29736716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], buf1 + (4096 + 128) * 3, 4096) == true);
29746716729cSShuhei Matsumoto 
2975d9ec66dfSShuhei Matsumoto 	read_len = ut_readv(data_offset, 1 + 4096 * 2 + 512, dif_iovs, 4);
2976d9ec66dfSShuhei Matsumoto 	CU_ASSERT(read_len == 1 + 4096 * 2 + 512);
29776716729cSShuhei Matsumoto 
2978d9ec66dfSShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov1, 1, data_offset, read_len, &ctx);
2979466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
2980466ca6d4SShuhei Matsumoto 
2981d9ec66dfSShuhei Matsumoto 	data_offset += read_len;
298294f67dd5SShuhei Matsumoto 	data_len -= read_len;
2983d9ec66dfSShuhei Matsumoto 
2984d9ec66dfSShuhei Matsumoto 	/* 4th read */
29852821762aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 4, &iov1, 1,
2986d9ec66dfSShuhei Matsumoto 					     data_offset, data_len, &mapped_len, &ctx);
29876716729cSShuhei Matsumoto 	CU_ASSERT(rc == 1);
29886716729cSShuhei Matsumoto 	CU_ASSERT(mapped_len == 3584);
29896716729cSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], buf1 + (4096 + 128) * 3 + 512, 3584) == true);
29906716729cSShuhei Matsumoto 
2991d9ec66dfSShuhei Matsumoto 	read_len = ut_readv(data_offset, 3584, dif_iovs, 1);
2992d9ec66dfSShuhei Matsumoto 	CU_ASSERT(read_len == 3584);
29936716729cSShuhei Matsumoto 
2994d9ec66dfSShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov1, 1, data_offset, read_len, &ctx);
29956716729cSShuhei Matsumoto 	CU_ASSERT(rc == 0);
29966716729cSShuhei Matsumoto 
2997d9ec66dfSShuhei Matsumoto 	data_offset += read_len;
2998d9ec66dfSShuhei Matsumoto 	CU_ASSERT(data_offset == 4096 * 4);
299994f67dd5SShuhei Matsumoto 	data_len -= read_len;
300094f67dd5SShuhei Matsumoto 	CU_ASSERT(data_len == 0);
3001d9ec66dfSShuhei Matsumoto 
30026716729cSShuhei Matsumoto 	/* The second data buffer:
30036716729cSShuhei Matsumoto 	 * - Set data pattern with a space for metadata for each block.
30046716729cSShuhei Matsumoto 	 */
30056716729cSShuhei Matsumoto 	buf2 = calloc(1, (4096 + 128) * 4);
30066716729cSShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf2 != NULL);
30076716729cSShuhei Matsumoto 	_iov_set_buf(&iov2, buf2, (4096 + 128) * 4);
30086716729cSShuhei Matsumoto 
30096716729cSShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov2, 1, 4096 + 128, 128, 4);
30106716729cSShuhei Matsumoto 	CU_ASSERT(rc == 0);
30116716729cSShuhei Matsumoto 	rc = spdk_dif_generate(&iov2, 1, 4, &ctx);
30126716729cSShuhei Matsumoto 	CU_ASSERT(rc == 0);
30136716729cSShuhei Matsumoto 
30146716729cSShuhei Matsumoto 	rc = spdk_dif_verify(&iov1, 1, 4, &ctx, &err_blk);
30156716729cSShuhei Matsumoto 	CU_ASSERT(rc == 0);
30166716729cSShuhei Matsumoto 
30176716729cSShuhei Matsumoto 	rc = spdk_dif_verify(&iov2, 1, 4, &ctx, &err_blk);
30186716729cSShuhei Matsumoto 	CU_ASSERT(rc == 0);
30196716729cSShuhei Matsumoto 
30206716729cSShuhei Matsumoto 	/* Compare the first and the second data buffer by byte. */
30216716729cSShuhei Matsumoto 	rc = memcmp(buf1, buf2, (4096 + 128) * 4);
30226716729cSShuhei Matsumoto 	CU_ASSERT(rc == 0);
30236716729cSShuhei Matsumoto 
30246716729cSShuhei Matsumoto 	free(buf1);
30256716729cSShuhei Matsumoto 	free(buf2);
30266716729cSShuhei Matsumoto }
30276716729cSShuhei Matsumoto 
3028466ca6d4SShuhei Matsumoto static void
3029cc4498acSSlawomir Ptak set_md_interleave_iovs_test(void)
3030cc4498acSSlawomir Ptak {
3031cc4498acSSlawomir Ptak 	_set_md_interleave_iovs_test(SPDK_DIF_PI_FORMAT_16);
3032cc4498acSSlawomir Ptak 	_set_md_interleave_iovs_test(SPDK_DIF_PI_FORMAT_32);
30335256f0efSSlawomir Ptak 	_set_md_interleave_iovs_test(SPDK_DIF_PI_FORMAT_64);
3034cc4498acSSlawomir Ptak }
3035cc4498acSSlawomir Ptak 
3036cc4498acSSlawomir Ptak static void
3037079ad446SShuhei Matsumoto set_md_interleave_iovs_split_test(void)
3038079ad446SShuhei Matsumoto {
3039079ad446SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
30403612ab7aSShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
304194c06a68SHailiang Wang 	struct iovec iovs1[7], iovs2[7], dif_iovs[8] = {};
3042d9ec66dfSShuhei Matsumoto 	uint32_t dif_check_flags, data_len, read_len, data_offset, mapped_len = 0;
3043079ad446SShuhei Matsumoto 	int rc, i;
3044a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
3045079ad446SShuhei Matsumoto 
3046079ad446SShuhei Matsumoto 	dif_check_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
3047079ad446SShuhei Matsumoto 			  SPDK_DIF_FLAGS_REFTAG_CHECK;
3048079ad446SShuhei Matsumoto 
30495681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3050a711d629SSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
3051079ad446SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 512 + 8, 8, true, false, SPDK_DIF_TYPE1,
3052a711d629SSlawomir Ptak 			       dif_check_flags, 22, 0xFFFF, 0x22, 0, GUARD_SEED, &dif_opts);
3053079ad446SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3054079ad446SShuhei Matsumoto 
3055079ad446SShuhei Matsumoto 	/* The first SGL data buffer:
3056079ad446SShuhei Matsumoto 	 * - Create iovec array to leave a space for metadata for each block
3057079ad446SShuhei Matsumoto 	 * - Split vectored read and so creating iovec array is done before every vectored read.
3058079ad446SShuhei Matsumoto 	 */
3059079ad446SShuhei Matsumoto 	_iov_alloc_buf(&iovs1[0], 512 + 8 + 128);
3060079ad446SShuhei Matsumoto 	_iov_alloc_buf(&iovs1[1], 128);
3061079ad446SShuhei Matsumoto 	_iov_alloc_buf(&iovs1[2], 256 + 8);
3062079ad446SShuhei Matsumoto 	_iov_alloc_buf(&iovs1[3], 100);
3063079ad446SShuhei Matsumoto 	_iov_alloc_buf(&iovs1[4], 412 + 5);
3064079ad446SShuhei Matsumoto 	_iov_alloc_buf(&iovs1[5], 3 + 300);
3065079ad446SShuhei Matsumoto 	_iov_alloc_buf(&iovs1[6], 212 + 8);
3066079ad446SShuhei Matsumoto 
3067d9ec66dfSShuhei Matsumoto 	data_offset = 0;
3068d9ec66dfSShuhei Matsumoto 	data_len = 512 * 4;
3069d9ec66dfSShuhei Matsumoto 
3070d9ec66dfSShuhei Matsumoto 	/* 1st read */
3071079ad446SShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 8, iovs1, 7,
3072d9ec66dfSShuhei Matsumoto 					     data_offset, data_len, &mapped_len, &ctx);
3073079ad446SShuhei Matsumoto 	CU_ASSERT(rc == 8);
3074079ad446SShuhei Matsumoto 	CU_ASSERT(mapped_len == 512 * 4);
3075079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], iovs1[0].iov_base, 512) == true);
3076079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], iovs1[0].iov_base + 512 + 8, 128) == true);
3077079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], iovs1[1].iov_base, 128) == true);
3078079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], iovs1[2].iov_base, 256) == true);
3079079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[4], iovs1[3].iov_base, 100) == true);
3080079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[5], iovs1[4].iov_base, 412) == true);
3081079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[6], iovs1[5].iov_base + 3, 300) == true);
3082079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[7], iovs1[6].iov_base, 212) == true);
3083079ad446SShuhei Matsumoto 
3084d9ec66dfSShuhei Matsumoto 	read_len = ut_readv(data_offset, 128, dif_iovs, 8);
3085d9ec66dfSShuhei Matsumoto 	CU_ASSERT(read_len == 128);
3086079ad446SShuhei Matsumoto 
3087d9ec66dfSShuhei Matsumoto 	rc = spdk_dif_generate_stream(iovs1, 7, data_offset, read_len, &ctx);
30883612ab7aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
30893612ab7aSShuhei Matsumoto 
3090d9ec66dfSShuhei Matsumoto 	data_offset += read_len;
309194f67dd5SShuhei Matsumoto 	data_len -= read_len;
3092d9ec66dfSShuhei Matsumoto 
3093d9ec66dfSShuhei Matsumoto 	/* 2nd read */
3094079ad446SShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 8, iovs1, 7,
3095d9ec66dfSShuhei Matsumoto 					     data_offset, data_len, &mapped_len, &ctx);
3096079ad446SShuhei Matsumoto 	CU_ASSERT(rc == 8);
3097079ad446SShuhei Matsumoto 	CU_ASSERT(mapped_len == 384 + 512 * 3);
3098079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], iovs1[0].iov_base + 128, 384) == true);
3099079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], iovs1[0].iov_base + 512 + 8, 128) == true);
3100079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], iovs1[1].iov_base, 128) == true);
3101079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], iovs1[2].iov_base, 256) == true);
3102079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[4], iovs1[3].iov_base, 100) == true);
3103079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[5], iovs1[4].iov_base, 412) == true);
3104079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[6], iovs1[5].iov_base + 3, 300) == true);
3105079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[7], iovs1[6].iov_base, 212) == true);
3106079ad446SShuhei Matsumoto 
3107d9ec66dfSShuhei Matsumoto 	read_len = ut_readv(data_offset, 383, dif_iovs, 8);
3108d9ec66dfSShuhei Matsumoto 	CU_ASSERT(read_len == 383);
3109079ad446SShuhei Matsumoto 
3110d9ec66dfSShuhei Matsumoto 	rc = spdk_dif_generate_stream(iovs1, 7, data_offset, read_len, &ctx);
31113612ab7aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
31123612ab7aSShuhei Matsumoto 
3113d9ec66dfSShuhei Matsumoto 	data_offset += read_len;
311494f67dd5SShuhei Matsumoto 	data_len -= read_len;
3115d9ec66dfSShuhei Matsumoto 
3116d9ec66dfSShuhei Matsumoto 	/* 3rd read */
3117079ad446SShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 8, iovs1, 7,
3118d9ec66dfSShuhei Matsumoto 					     data_offset, data_len, &mapped_len, &ctx);
3119079ad446SShuhei Matsumoto 	CU_ASSERT(rc == 8);
3120079ad446SShuhei Matsumoto 	CU_ASSERT(mapped_len == 1 + 512 * 3);
3121079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], iovs1[0].iov_base + 511, 1) == true);
3122079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], iovs1[0].iov_base + 512 + 8, 128) == true);
3123079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], iovs1[1].iov_base, 128) == true);
3124079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], iovs1[2].iov_base, 256) == true);
3125079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[4], iovs1[3].iov_base, 100) == true);
3126079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[5], iovs1[4].iov_base, 412) == true);
3127079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[6], iovs1[5].iov_base + 3, 300) == true);
3128079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[7], iovs1[6].iov_base, 212) == true);
3129079ad446SShuhei Matsumoto 
3130d9ec66dfSShuhei Matsumoto 	read_len = ut_readv(data_offset, 1 + 512 * 2 + 128, dif_iovs, 8);
3131d9ec66dfSShuhei Matsumoto 	CU_ASSERT(read_len == 1 + 512 * 2 + 128);
3132079ad446SShuhei Matsumoto 
3133d9ec66dfSShuhei Matsumoto 	rc = spdk_dif_generate_stream(iovs1, 7, data_offset, read_len, &ctx);
31343612ab7aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
31353612ab7aSShuhei Matsumoto 
3136d9ec66dfSShuhei Matsumoto 	data_offset += read_len;
313794f67dd5SShuhei Matsumoto 	data_len -= read_len;
3138d9ec66dfSShuhei Matsumoto 
3139d9ec66dfSShuhei Matsumoto 	/* 4th read */
3140079ad446SShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 8, iovs1, 7,
3141d9ec66dfSShuhei Matsumoto 					     data_offset, data_len, &mapped_len, &ctx);
3142079ad446SShuhei Matsumoto 	CU_ASSERT(rc == 2);
3143079ad446SShuhei Matsumoto 	CU_ASSERT(mapped_len == 384);
3144079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], iovs1[5].iov_base + 3 + 128, 172) == true);
3145079ad446SShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], iovs1[6].iov_base, 212) == true);
3146079ad446SShuhei Matsumoto 
3147d9ec66dfSShuhei Matsumoto 	read_len = ut_readv(data_offset, 384, dif_iovs, 8);
3148d9ec66dfSShuhei Matsumoto 	CU_ASSERT(read_len == 384);
3149079ad446SShuhei Matsumoto 
3150d9ec66dfSShuhei Matsumoto 	rc = spdk_dif_generate_stream(iovs1, 7, data_offset, read_len, &ctx);
31513612ab7aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
31523612ab7aSShuhei Matsumoto 
3153d9ec66dfSShuhei Matsumoto 	data_offset += read_len;
3154d9ec66dfSShuhei Matsumoto 	CU_ASSERT(data_offset == 512 * 4);
315594f67dd5SShuhei Matsumoto 	data_len -= read_len;
315694f67dd5SShuhei Matsumoto 	CU_ASSERT(data_len == 0);
3157d9ec66dfSShuhei Matsumoto 
31583612ab7aSShuhei Matsumoto 	/* The second SGL data buffer:
31593612ab7aSShuhei Matsumoto 	 * - Set data pattern with a space for metadata for each block.
31603612ab7aSShuhei Matsumoto 	 */
31613612ab7aSShuhei Matsumoto 	_iov_alloc_buf(&iovs2[0], 512 + 8 + 128);
31623612ab7aSShuhei Matsumoto 	_iov_alloc_buf(&iovs2[1], 128);
31633612ab7aSShuhei Matsumoto 	_iov_alloc_buf(&iovs2[2], 256 + 8);
31643612ab7aSShuhei Matsumoto 	_iov_alloc_buf(&iovs2[3], 100);
31653612ab7aSShuhei Matsumoto 	_iov_alloc_buf(&iovs2[4], 412 + 5);
31663612ab7aSShuhei Matsumoto 	_iov_alloc_buf(&iovs2[5], 3 + 300);
31673612ab7aSShuhei Matsumoto 	_iov_alloc_buf(&iovs2[6], 212 + 8);
31683612ab7aSShuhei Matsumoto 
31693612ab7aSShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs2, 7, 512 + 8, 8, 4);
31703612ab7aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
31713612ab7aSShuhei Matsumoto 	rc = spdk_dif_generate(iovs2, 7, 4, &ctx);
31723612ab7aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
31733612ab7aSShuhei Matsumoto 
31743612ab7aSShuhei Matsumoto 	rc = spdk_dif_verify(iovs1, 7, 4, &ctx, &err_blk);
31753612ab7aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
31763612ab7aSShuhei Matsumoto 
31773612ab7aSShuhei Matsumoto 	rc = spdk_dif_verify(iovs2, 7, 4, &ctx, &err_blk);
31783612ab7aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
31793612ab7aSShuhei Matsumoto 
31803612ab7aSShuhei Matsumoto 	/* Compare the first and the second SGL data buffer by byte. */
31813612ab7aSShuhei Matsumoto 	for (i = 0; i < 7; i++) {
31823612ab7aSShuhei Matsumoto 		rc = memcmp(iovs1[i].iov_base, iovs2[i].iov_base,
31833612ab7aSShuhei Matsumoto 			    iovs1[i].iov_len);
31843612ab7aSShuhei Matsumoto 		CU_ASSERT(rc == 0);
31853612ab7aSShuhei Matsumoto 	}
31863612ab7aSShuhei Matsumoto 
3187079ad446SShuhei Matsumoto 	for (i = 0; i < 7; i++) {
3188079ad446SShuhei Matsumoto 		_iov_free_buf(&iovs1[i]);
31893612ab7aSShuhei Matsumoto 		_iov_free_buf(&iovs2[i]);
3190079ad446SShuhei Matsumoto 	}
3191079ad446SShuhei Matsumoto }
3192079ad446SShuhei Matsumoto 
3193079ad446SShuhei Matsumoto static void
3194cc4498acSSlawomir Ptak dif_generate_stream_pi_16_test(void)
3195466ca6d4SShuhei Matsumoto {
3196466ca6d4SShuhei Matsumoto 	struct iovec iov;
3197466ca6d4SShuhei Matsumoto 	struct spdk_dif_ctx ctx;
3198466ca6d4SShuhei Matsumoto 	struct spdk_dif_error err_blk;
3199466ca6d4SShuhei Matsumoto 	uint32_t dif_flags;
3200466ca6d4SShuhei Matsumoto 	int rc;
3201a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
3202466ca6d4SShuhei Matsumoto 
3203466ca6d4SShuhei Matsumoto 	_iov_alloc_buf(&iov, (512 + 8) * 5);
3204466ca6d4SShuhei Matsumoto 
32051c21756aSShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov, 1, 512 + 8, 8, 5);
3206466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3207466ca6d4SShuhei Matsumoto 
3208466ca6d4SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
3209466ca6d4SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
3210466ca6d4SShuhei Matsumoto 
32115681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3212a711d629SSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
32131c21756aSShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 512 + 8, 8, true, false, SPDK_DIF_TYPE1, dif_flags,
3214a711d629SSlawomir Ptak 			       22, 0xFFFF, 0x22, 0, GUARD_SEED, &dif_opts);
3215466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3216466ca6d4SShuhei Matsumoto 
321717b2f5e9SShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov, 1, 0, 511, &ctx);
3218466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3219466ca6d4SShuhei Matsumoto 
322017b2f5e9SShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov, 1, 511, 1, &ctx);
3221466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3222466ca6d4SShuhei Matsumoto 
322317b2f5e9SShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov, 1, 512, 256, &ctx);
3224466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3225466ca6d4SShuhei Matsumoto 
322617b2f5e9SShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov, 1, 768, 512, &ctx);
3227466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3228466ca6d4SShuhei Matsumoto 
322917b2f5e9SShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov, 1, 1280, 1024, &ctx);
3230466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3231466ca6d4SShuhei Matsumoto 
323217b2f5e9SShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov, 1, 2304, 256, &ctx);
3233466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3234466ca6d4SShuhei Matsumoto 
323517b2f5e9SShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov, 1, 2560, 512, &ctx);
3236466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == -ERANGE);
3237466ca6d4SShuhei Matsumoto 
3238466ca6d4SShuhei Matsumoto 	rc = spdk_dif_verify(&iov, 1, 5, &ctx, &err_blk);
3239466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3240466ca6d4SShuhei Matsumoto 
32411c21756aSShuhei Matsumoto 	rc = ut_data_pattern_verify(&iov, 1, 512 + 8, 8, 5);
3242466ca6d4SShuhei Matsumoto 	CU_ASSERT(rc == 0);
3243466ca6d4SShuhei Matsumoto 
3244466ca6d4SShuhei Matsumoto 	_iov_free_buf(&iov);
3245466ca6d4SShuhei Matsumoto }
3246466ca6d4SShuhei Matsumoto 
32478b24fc4aSShuhei Matsumoto static void
32485256f0efSSlawomir Ptak _dif_generate_stream_test(enum spdk_dif_pi_format dif_pi_format)
3249cc4498acSSlawomir Ptak {
3250cc4498acSSlawomir Ptak 	struct iovec iov;
3251cc4498acSSlawomir Ptak 	struct spdk_dif_ctx ctx;
3252cc4498acSSlawomir Ptak 	struct spdk_dif_error err_blk;
3253cc4498acSSlawomir Ptak 	uint32_t dif_flags;
3254cc4498acSSlawomir Ptak 	int rc;
3255cc4498acSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
3256cc4498acSSlawomir Ptak 
3257cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iov, (4096 + 128) * 5);
3258cc4498acSSlawomir Ptak 
3259cc4498acSSlawomir Ptak 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 5);
3260cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3261cc4498acSSlawomir Ptak 
3262cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
3263cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
3264cc4498acSSlawomir Ptak 
32655681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
32665256f0efSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
3267cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1, dif_flags,
3268cc4498acSSlawomir Ptak 			       22, 0xFFFF, 0x22, 0, GUARD_SEED, &dif_opts);
3269cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3270cc4498acSSlawomir Ptak 
3271cc4498acSSlawomir Ptak 	rc = spdk_dif_generate_stream(&iov, 1, 0, 4095, &ctx);
3272cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3273cc4498acSSlawomir Ptak 
3274cc4498acSSlawomir Ptak 	rc = spdk_dif_generate_stream(&iov, 1, 4095, 1, &ctx);
3275cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3276cc4498acSSlawomir Ptak 
3277cc4498acSSlawomir Ptak 	rc = spdk_dif_generate_stream(&iov, 1, 4096, 2048, &ctx);
3278cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3279cc4498acSSlawomir Ptak 
3280cc4498acSSlawomir Ptak 	rc = spdk_dif_generate_stream(&iov, 1, 6144, 4096, &ctx);
3281cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3282cc4498acSSlawomir Ptak 
3283cc4498acSSlawomir Ptak 	rc = spdk_dif_generate_stream(&iov, 1, 10240, 8192, &ctx);
3284cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3285cc4498acSSlawomir Ptak 
3286cc4498acSSlawomir Ptak 	rc = spdk_dif_generate_stream(&iov, 1, 18432, 2048, &ctx);
3287cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3288cc4498acSSlawomir Ptak 
3289cc4498acSSlawomir Ptak 	rc = spdk_dif_generate_stream(&iov, 1, 20480, 4096, &ctx);
3290cc4498acSSlawomir Ptak 	CU_ASSERT(rc == -ERANGE);
3291cc4498acSSlawomir Ptak 
3292cc4498acSSlawomir Ptak 	rc = spdk_dif_verify(&iov, 1, 5, &ctx, &err_blk);
3293cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3294cc4498acSSlawomir Ptak 
3295cc4498acSSlawomir Ptak 	rc = ut_data_pattern_verify(&iov, 1, 4096 + 128, 128, 5);
3296cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3297cc4498acSSlawomir Ptak 
3298cc4498acSSlawomir Ptak 	_iov_free_buf(&iov);
3299cc4498acSSlawomir Ptak }
3300cc4498acSSlawomir Ptak 
3301cc4498acSSlawomir Ptak static void
33025256f0efSSlawomir Ptak dif_generate_stream_test(void)
33035256f0efSSlawomir Ptak {
33045256f0efSSlawomir Ptak 	_dif_generate_stream_test(SPDK_DIF_PI_FORMAT_32);
33055256f0efSSlawomir Ptak 	_dif_generate_stream_test(SPDK_DIF_PI_FORMAT_64);
33065256f0efSSlawomir Ptak }
33075256f0efSSlawomir Ptak 
33085256f0efSSlawomir Ptak static void
33098b24fc4aSShuhei Matsumoto set_md_interleave_iovs_alignment_test(void)
33108b24fc4aSShuhei Matsumoto {
331194c06a68SHailiang Wang 	struct iovec iovs[3], dif_iovs[5] = {};
33128b24fc4aSShuhei Matsumoto 	uint32_t mapped_len = 0;
33138b24fc4aSShuhei Matsumoto 	int rc;
33148b24fc4aSShuhei Matsumoto 	struct spdk_dif_ctx ctx;
3315a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
33168b24fc4aSShuhei Matsumoto 
33175681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3318a711d629SSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
33198b24fc4aSShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 512 + 8, 8, true, false, SPDK_DIF_TYPE1,
3320a711d629SSlawomir Ptak 			       0, 0, 0, 0, 0, 0, &dif_opts);
33218b24fc4aSShuhei Matsumoto 	CU_ASSERT(rc == 0);
33228b24fc4aSShuhei Matsumoto 
33238b24fc4aSShuhei Matsumoto 	/* The case that buffer size is smaller than necessary. */
33248b24fc4aSShuhei Matsumoto 	_iov_set_buf(&iovs[0], (uint8_t *)0xDEADBEEF, 1024);
33258b24fc4aSShuhei Matsumoto 	_iov_set_buf(&iovs[1], (uint8_t *)0xFEEDBEEF, 1024);
33268b24fc4aSShuhei Matsumoto 	_iov_set_buf(&iovs[2], (uint8_t *)0xC0FFEE, 24);
33278b24fc4aSShuhei Matsumoto 
33288b24fc4aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 5, iovs, 3, 0, 2048, &mapped_len, &ctx);
33298b24fc4aSShuhei Matsumoto 	CU_ASSERT(rc == -ERANGE);
33308b24fc4aSShuhei Matsumoto 
3331c9c7c281SJosh Soref 	/* The following are the normal cases. */
33328b24fc4aSShuhei Matsumoto 	_iov_set_buf(&iovs[2], (uint8_t *)0xC0FFEE, 32);
33338b24fc4aSShuhei Matsumoto 
33348b24fc4aSShuhei Matsumoto 	/* data length is less than a data block size. */
33358b24fc4aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 5, iovs, 3, 0, 500, &mapped_len, &ctx);
33368b24fc4aSShuhei Matsumoto 	CU_ASSERT(rc == 1);
33378b24fc4aSShuhei Matsumoto 	CU_ASSERT(mapped_len == 500);
33388b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], (void *)0xDEADBEEF, 500) == true);
33398b24fc4aSShuhei Matsumoto 
33408b24fc4aSShuhei Matsumoto 	/* Pass enough number of iovecs */
33418b24fc4aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 5, iovs, 3, 500, 1000, &mapped_len, &ctx);
33428b24fc4aSShuhei Matsumoto 	CU_ASSERT(rc == 4);
33438b24fc4aSShuhei Matsumoto 	CU_ASSERT(mapped_len == 1000);
33448b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], (void *)(0xDEADBEEF + 500), 12) == true);
33458b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], (void *)(0xDEADBEEF + 520), 504) == true);
33468b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], (void *)0xFEEDBEEF, 8) == true);
33478b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], (void *)(0xFEEDBEEF + 16), 476) == true);
33488b24fc4aSShuhei Matsumoto 
33498b24fc4aSShuhei Matsumoto 	/* Pass iovecs smaller than necessary */
33508b24fc4aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 3, iovs, 3, 500, 1000, &mapped_len, &ctx);
33518b24fc4aSShuhei Matsumoto 	CU_ASSERT(rc == 3);
33528b24fc4aSShuhei Matsumoto 	CU_ASSERT(mapped_len == 524);
33538b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], (void *)(0xDEADBEEF + 500), 12) == true);
33548b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], (void *)(0xDEADBEEF + 520), 504) == true);
33558b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], (void *)0xFEEDBEEF, 8) == true);
33568b24fc4aSShuhei Matsumoto 
33578b24fc4aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 5, iovs, 3, 1500, 500, &mapped_len, &ctx);
33588b24fc4aSShuhei Matsumoto 	CU_ASSERT(rc == 2);
33598b24fc4aSShuhei Matsumoto 	CU_ASSERT(mapped_len == 500);
33608b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], (void *)(0xFEEDBEEF + 492), 36) == true);
33618b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], (void *)(0xFEEDBEEF + 536), 464) == true);
33628b24fc4aSShuhei Matsumoto 
33638b24fc4aSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 5, iovs, 3, 2000, 48, &mapped_len, &ctx);
33648b24fc4aSShuhei Matsumoto 	CU_ASSERT(rc == 2);
33658b24fc4aSShuhei Matsumoto 	CU_ASSERT(mapped_len == 48);
33668b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], (void *)0xFEEDBEEF + 1000, 24) == true);
33678b24fc4aSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], (void *)0xC0FFEE, 24) ==  true);
33688b24fc4aSShuhei Matsumoto }
33698b24fc4aSShuhei Matsumoto 
3370f6a91b3bSShuhei Matsumoto static void
3371cc4498acSSlawomir Ptak _dif_generate_split_test(enum spdk_dif_pi_format dif_pi_format)
3372f6a91b3bSShuhei Matsumoto {
3373f6a91b3bSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
3374f6a91b3bSShuhei Matsumoto 	struct iovec iov;
3375f6a91b3bSShuhei Matsumoto 	uint8_t *buf1, *buf2;
3376f6a91b3bSShuhei Matsumoto 	struct _dif_sgl sgl;
33775256f0efSSlawomir Ptak 	uint64_t guard = 0, prev_guard;
3378f6a91b3bSShuhei Matsumoto 	uint32_t dif_flags;
3379f6a91b3bSShuhei Matsumoto 	int rc;
3380a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
3381f6a91b3bSShuhei Matsumoto 
3382f6a91b3bSShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
3383f6a91b3bSShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
3384f6a91b3bSShuhei Matsumoto 
33855681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3386cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
3387f6a91b3bSShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1,
3388a711d629SSlawomir Ptak 			       dif_flags, 0, 0, 0, 0, GUARD_SEED, &dif_opts);
3389f6a91b3bSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3390f6a91b3bSShuhei Matsumoto 
3391f6a91b3bSShuhei Matsumoto 	buf1 = calloc(1, 4096 + 128);
3392f6a91b3bSShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf1 != NULL);
3393f6a91b3bSShuhei Matsumoto 	_iov_set_buf(&iov, buf1, 4096 + 128);
3394f6a91b3bSShuhei Matsumoto 
3395f6a91b3bSShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 1);
3396f6a91b3bSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3397f6a91b3bSShuhei Matsumoto 
3398f6a91b3bSShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
3399f6a91b3bSShuhei Matsumoto 
3400f6a91b3bSShuhei Matsumoto 	guard = GUARD_SEED;
3401f6a91b3bSShuhei Matsumoto 	prev_guard = GUARD_SEED;
3402f6a91b3bSShuhei Matsumoto 
3403f6a91b3bSShuhei Matsumoto 	guard = _dif_generate_split(&sgl, 0, 1000, guard, 0, &ctx);
3404f6a91b3bSShuhei Matsumoto 	CU_ASSERT(sgl.iov_offset == 1000);
3405cc4498acSSlawomir Ptak 	CU_ASSERT(guard == _generate_guard(prev_guard, buf1, 1000, dif_pi_format));
3406f6a91b3bSShuhei Matsumoto 
3407f6a91b3bSShuhei Matsumoto 	prev_guard = guard;
3408f6a91b3bSShuhei Matsumoto 
3409f6a91b3bSShuhei Matsumoto 	guard = _dif_generate_split(&sgl, 1000, 3000, guard, 0, &ctx);
3410f6a91b3bSShuhei Matsumoto 	CU_ASSERT(sgl.iov_offset == 4000);
3411cc4498acSSlawomir Ptak 	CU_ASSERT(guard == _generate_guard(prev_guard, buf1 + 1000, 3000, dif_pi_format));
3412f6a91b3bSShuhei Matsumoto 
3413f6a91b3bSShuhei Matsumoto 	guard = _dif_generate_split(&sgl, 4000, 96 + 128, guard, 0, &ctx);
3414f6a91b3bSShuhei Matsumoto 	CU_ASSERT(guard == GUARD_SEED);
3415f6a91b3bSShuhei Matsumoto 	CU_ASSERT(sgl.iov_offset == 0);
3416f6a91b3bSShuhei Matsumoto 	CU_ASSERT(sgl.iovcnt == 0);
3417f6a91b3bSShuhei Matsumoto 
3418f6a91b3bSShuhei Matsumoto 	rc = ut_data_pattern_verify(&iov, 1, 4096 + 128, 128, 1);
3419f6a91b3bSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3420f6a91b3bSShuhei Matsumoto 
3421f6a91b3bSShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
3422f6a91b3bSShuhei Matsumoto 
3423f6a91b3bSShuhei Matsumoto 	rc = dif_verify(&sgl, 1, &ctx, NULL);
3424f6a91b3bSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3425f6a91b3bSShuhei Matsumoto 
3426f6a91b3bSShuhei Matsumoto 	buf2 = calloc(1, 4096 + 128);
3427f6a91b3bSShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf2 != NULL);
3428f6a91b3bSShuhei Matsumoto 	_iov_set_buf(&iov, buf2, 4096 + 128);
3429f6a91b3bSShuhei Matsumoto 
3430f6a91b3bSShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 1);
3431f6a91b3bSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3432f6a91b3bSShuhei Matsumoto 
3433f6a91b3bSShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
3434f6a91b3bSShuhei Matsumoto 
3435f6a91b3bSShuhei Matsumoto 	dif_generate(&sgl, 1, &ctx);
3436f6a91b3bSShuhei Matsumoto 
3437f6a91b3bSShuhei Matsumoto 	rc = ut_data_pattern_verify(&iov, 1, 4096 + 128, 128, 1);
3438f6a91b3bSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3439f6a91b3bSShuhei Matsumoto 
3440f6a91b3bSShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
3441f6a91b3bSShuhei Matsumoto 
3442f6a91b3bSShuhei Matsumoto 	rc = dif_verify(&sgl, 1, &ctx, NULL);
3443f6a91b3bSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3444f6a91b3bSShuhei Matsumoto 
3445f6a91b3bSShuhei Matsumoto 	rc = memcmp(buf1, buf2, 4096 + 128);
3446f6a91b3bSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3447f6a91b3bSShuhei Matsumoto 
3448f6a91b3bSShuhei Matsumoto 	free(buf1);
3449f6a91b3bSShuhei Matsumoto 	free(buf2);
3450f6a91b3bSShuhei Matsumoto }
3451f6a91b3bSShuhei Matsumoto 
34528c69654dSShuhei Matsumoto static void
3453cc4498acSSlawomir Ptak dif_generate_split_test(void)
3454cc4498acSSlawomir Ptak {
3455cc4498acSSlawomir Ptak 	_dif_generate_split_test(SPDK_DIF_PI_FORMAT_16);
3456cc4498acSSlawomir Ptak 	_dif_generate_split_test(SPDK_DIF_PI_FORMAT_32);
34575256f0efSSlawomir Ptak 	_dif_generate_split_test(SPDK_DIF_PI_FORMAT_64);
3458cc4498acSSlawomir Ptak }
3459cc4498acSSlawomir Ptak 
3460cc4498acSSlawomir Ptak static void
3461cc4498acSSlawomir Ptak _set_md_interleave_iovs_multi_segments_test(enum spdk_dif_pi_format dif_pi_format)
34628c69654dSShuhei Matsumoto {
34638c69654dSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
34648c69654dSShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
34658c69654dSShuhei Matsumoto 	struct iovec iov1 = {}, iov2 = {}, dif_iovs[4] = {};
34668c69654dSShuhei Matsumoto 	uint32_t dif_check_flags, data_len, read_len, data_offset, read_offset, mapped_len = 0;
34678c69654dSShuhei Matsumoto 	uint8_t *buf1, *buf2;
34688c69654dSShuhei Matsumoto 	int rc;
3469a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
34708c69654dSShuhei Matsumoto 
34718c69654dSShuhei Matsumoto 	dif_check_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
34728c69654dSShuhei Matsumoto 			  SPDK_DIF_FLAGS_REFTAG_CHECK;
34738c69654dSShuhei Matsumoto 
34745681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3475cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
34768c69654dSShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1,
3477a711d629SSlawomir Ptak 			       dif_check_flags, 22, 0xFFFF, 0x22, 0, GUARD_SEED, &dif_opts);
34788c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
34798c69654dSShuhei Matsumoto 
34808c69654dSShuhei Matsumoto 	/* The first data buffer:
34818c69654dSShuhei Matsumoto 	 * - Data buffer is split into multi data segments
34828c69654dSShuhei Matsumoto 	 * - For each data segment,
34838c69654dSShuhei Matsumoto 	 *  - Create iovec array to Leave a space for metadata for each block
34848c69654dSShuhei Matsumoto 	 *  - Split vectored read and so creating iovec array is done before every vectored read.
34858c69654dSShuhei Matsumoto 	 */
34868c69654dSShuhei Matsumoto 	buf1 = calloc(1, (4096 + 128) * 4);
34878c69654dSShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf1 != NULL);
34888c69654dSShuhei Matsumoto 	_iov_set_buf(&iov1, buf1, (4096 + 128) * 4);
34898c69654dSShuhei Matsumoto 
34908c69654dSShuhei Matsumoto 	/* 1st data segment */
34918c69654dSShuhei Matsumoto 	data_offset = 0;
34928c69654dSShuhei Matsumoto 	data_len = 1024;
34938c69654dSShuhei Matsumoto 
34948c69654dSShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, data_offset);
34958c69654dSShuhei Matsumoto 
34968c69654dSShuhei Matsumoto 	read_offset = 0;
34978c69654dSShuhei Matsumoto 
34988c69654dSShuhei Matsumoto 	/* 1st read in 1st data segment */
34998c69654dSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 4, &iov1, 1,
35008c69654dSShuhei Matsumoto 					     read_offset, data_len - read_offset,
35018c69654dSShuhei Matsumoto 					     &mapped_len, &ctx);
35028c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 1);
35038c69654dSShuhei Matsumoto 	CU_ASSERT(mapped_len == 1024);
35048c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], buf1, 1024) == true);
35058c69654dSShuhei Matsumoto 
35068c69654dSShuhei Matsumoto 	read_len = ut_readv(data_offset + read_offset, 1024, dif_iovs, 4);
35078c69654dSShuhei Matsumoto 	CU_ASSERT(read_len == 1024);
35088c69654dSShuhei Matsumoto 
35098c69654dSShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov1, 1, read_offset, read_len, &ctx);
35108c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
35118c69654dSShuhei Matsumoto 
35128c69654dSShuhei Matsumoto 	read_offset += read_len;
35138c69654dSShuhei Matsumoto 	CU_ASSERT(read_offset == data_len);
35148c69654dSShuhei Matsumoto 
35158c69654dSShuhei Matsumoto 	/* 2nd data segment */
35168c69654dSShuhei Matsumoto 	data_offset += data_len;
35178c69654dSShuhei Matsumoto 	data_len = 3072 + 4096 * 2 + 512;
35188c69654dSShuhei Matsumoto 
35198c69654dSShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, data_offset);
35208c69654dSShuhei Matsumoto 	_iov_set_buf(&iov1, buf1 + 1024, 3072 + 128 + (4096 + 128) * 3 + 512);
35218c69654dSShuhei Matsumoto 
35228c69654dSShuhei Matsumoto 	read_offset = 0;
35238c69654dSShuhei Matsumoto 
35248c69654dSShuhei Matsumoto 	/* 1st read in 2nd data segment */
35258c69654dSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 4, &iov1, 1,
35268c69654dSShuhei Matsumoto 					     read_offset, data_len - read_offset,
35278c69654dSShuhei Matsumoto 					     &mapped_len, &ctx);
35288c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 4);
35298c69654dSShuhei Matsumoto 	CU_ASSERT(mapped_len == 3072 + 4096 * 2 + 512);
35308c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], buf1 + 1024, 3072) == true);
35318c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], buf1 + 4096 + 128, 4096) == true);
35328c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], buf1 + (4096 + 128) * 2, 4096) == true);
35338c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], buf1 + (4096 + 128) * 3, 512) == true);
35348c69654dSShuhei Matsumoto 
35358c69654dSShuhei Matsumoto 	read_len = ut_readv(data_offset + read_offset, 3071, dif_iovs, 4);
35368c69654dSShuhei Matsumoto 	CU_ASSERT(read_len == 3071);
35378c69654dSShuhei Matsumoto 
35388c69654dSShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov1, 1, read_offset, read_len, &ctx);
35398c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
35408c69654dSShuhei Matsumoto 
35418c69654dSShuhei Matsumoto 	read_offset += read_len;
35428c69654dSShuhei Matsumoto 
35438c69654dSShuhei Matsumoto 	/* 2nd read in 2nd data segment */
35448c69654dSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 4, &iov1, 1,
35458c69654dSShuhei Matsumoto 					     read_offset, data_len - read_offset,
35468c69654dSShuhei Matsumoto 					     &mapped_len, &ctx);
35478c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 4);
35488c69654dSShuhei Matsumoto 	CU_ASSERT(mapped_len == 1 + 4096 * 2 + 512);
35498c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], buf1 + 4095, 1) == true);
35508c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[1], buf1 + 4096 + 128, 4096) == true);
35518c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[2], buf1 + (4096 + 128) * 2, 4096) == true);
35528c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[3], buf1 + (4096 + 128) * 3, 512) == true);
35538c69654dSShuhei Matsumoto 
35548c69654dSShuhei Matsumoto 	read_len = ut_readv(data_offset + read_offset, 1 + 4096 * 2 + 512, dif_iovs, 4);
35558c69654dSShuhei Matsumoto 	CU_ASSERT(read_len == 1 + 4096 * 2 + 512);
35568c69654dSShuhei Matsumoto 
35578c69654dSShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov1, 1, read_offset, read_len, &ctx);
35588c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
35598c69654dSShuhei Matsumoto 
35608c69654dSShuhei Matsumoto 	read_offset += read_len;
35618c69654dSShuhei Matsumoto 	CU_ASSERT(read_offset == data_len);
35628c69654dSShuhei Matsumoto 
35638c69654dSShuhei Matsumoto 	/* 3rd data segment */
35648c69654dSShuhei Matsumoto 	data_offset += data_len;
35658c69654dSShuhei Matsumoto 	data_len = 3584;
35668c69654dSShuhei Matsumoto 
35678c69654dSShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, data_offset);
35688c69654dSShuhei Matsumoto 	_iov_set_buf(&iov1, buf1 + (4096 + 128) * 3 + 512, 3584 + 128);
35698c69654dSShuhei Matsumoto 
35708c69654dSShuhei Matsumoto 	read_offset = 0;
35718c69654dSShuhei Matsumoto 
35728c69654dSShuhei Matsumoto 	/* 1st read in 3rd data segment */
35738c69654dSShuhei Matsumoto 	rc = spdk_dif_set_md_interleave_iovs(dif_iovs, 4, &iov1, 1,
35748c69654dSShuhei Matsumoto 					     read_offset, data_len - read_offset,
35758c69654dSShuhei Matsumoto 					     &mapped_len, &ctx);
35768c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 1);
35778c69654dSShuhei Matsumoto 	CU_ASSERT(mapped_len == 3584);
35788c69654dSShuhei Matsumoto 	CU_ASSERT(_iov_check(&dif_iovs[0], buf1 + (4096 + 128) * 3 + 512, 3584) == true);
35798c69654dSShuhei Matsumoto 
35808c69654dSShuhei Matsumoto 	read_len = ut_readv(data_offset + read_offset, 3584, dif_iovs, 1);
35818c69654dSShuhei Matsumoto 	CU_ASSERT(read_len == 3584);
35828c69654dSShuhei Matsumoto 
35838c69654dSShuhei Matsumoto 	rc = spdk_dif_generate_stream(&iov1, 1, read_offset, read_len, &ctx);
35848c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
35858c69654dSShuhei Matsumoto 
35868c69654dSShuhei Matsumoto 	read_offset += read_len;
35878c69654dSShuhei Matsumoto 	CU_ASSERT(read_offset == data_len);
35888c69654dSShuhei Matsumoto 	data_offset += data_len;
35898c69654dSShuhei Matsumoto 	CU_ASSERT(data_offset == 4096 * 4);
35908c69654dSShuhei Matsumoto 
35918c69654dSShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 0);
35928c69654dSShuhei Matsumoto 	_iov_set_buf(&iov1, buf1, (4096 + 128) * 4);
35938c69654dSShuhei Matsumoto 
35948c69654dSShuhei Matsumoto 	/* The second data buffer:
35958c69654dSShuhei Matsumoto 	 * - Set data pattern with a space for metadata for each block.
35968c69654dSShuhei Matsumoto 	 */
35978c69654dSShuhei Matsumoto 	buf2 = calloc(1, (4096 + 128) * 4);
35988c69654dSShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf2 != NULL);
35998c69654dSShuhei Matsumoto 	_iov_set_buf(&iov2, buf2, (4096 + 128) * 4);
36008c69654dSShuhei Matsumoto 
36018c69654dSShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov2, 1, 4096 + 128, 128, 4);
36028c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
36038c69654dSShuhei Matsumoto 
36048c69654dSShuhei Matsumoto 	rc = spdk_dif_generate(&iov2, 1, 4, &ctx);
36058c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
36068c69654dSShuhei Matsumoto 
36078c69654dSShuhei Matsumoto 	rc = spdk_dif_verify(&iov1, 1, 4, &ctx, &err_blk);
36088c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
36098c69654dSShuhei Matsumoto 
36108c69654dSShuhei Matsumoto 	rc = spdk_dif_verify(&iov2, 1, 4, &ctx, &err_blk);
36118c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
36128c69654dSShuhei Matsumoto 
36138c69654dSShuhei Matsumoto 	/* Compare the first and the second data buffer by byte. */
36148c69654dSShuhei Matsumoto 	rc = memcmp(buf1, buf2, (4096 + 128) * 4);
36158c69654dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
36168c69654dSShuhei Matsumoto 
36178c69654dSShuhei Matsumoto 	free(buf1);
36188c69654dSShuhei Matsumoto 	free(buf2);
36198c69654dSShuhei Matsumoto }
36208c69654dSShuhei Matsumoto 
362180f2ca0dSShuhei Matsumoto static void
3622cc4498acSSlawomir Ptak set_md_interleave_iovs_multi_segments_test(void)
3623cc4498acSSlawomir Ptak {
3624cc4498acSSlawomir Ptak 	_set_md_interleave_iovs_multi_segments_test(SPDK_DIF_PI_FORMAT_16);
3625cc4498acSSlawomir Ptak 	_set_md_interleave_iovs_multi_segments_test(SPDK_DIF_PI_FORMAT_32);
36265256f0efSSlawomir Ptak 	_set_md_interleave_iovs_multi_segments_test(SPDK_DIF_PI_FORMAT_64);
3627cc4498acSSlawomir Ptak }
3628cc4498acSSlawomir Ptak 
3629cc4498acSSlawomir Ptak static void
3630cc4498acSSlawomir Ptak _dif_verify_split_test(enum spdk_dif_pi_format dif_pi_format)
363180f2ca0dSShuhei Matsumoto {
363280f2ca0dSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
363380f2ca0dSShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
363480f2ca0dSShuhei Matsumoto 	struct iovec iov;
363580f2ca0dSShuhei Matsumoto 	uint8_t *buf;
363680f2ca0dSShuhei Matsumoto 	struct _dif_sgl sgl;
36375256f0efSSlawomir Ptak 	uint64_t guard = 0, prev_guard = 0;
363880f2ca0dSShuhei Matsumoto 	uint32_t dif_flags;
363980f2ca0dSShuhei Matsumoto 	int rc;
3640a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
364180f2ca0dSShuhei Matsumoto 
364280f2ca0dSShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
364380f2ca0dSShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
364480f2ca0dSShuhei Matsumoto 
36455681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3646cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
364780f2ca0dSShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1,
3648a711d629SSlawomir Ptak 			       dif_flags, 0, 0, 0, 0, GUARD_SEED, &dif_opts);
364980f2ca0dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
365080f2ca0dSShuhei Matsumoto 
365180f2ca0dSShuhei Matsumoto 	buf = calloc(1, 4096 + 128);
365280f2ca0dSShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf != NULL);
365380f2ca0dSShuhei Matsumoto 	_iov_set_buf(&iov, buf, 4096 + 128);
365480f2ca0dSShuhei Matsumoto 
365580f2ca0dSShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 1);
365680f2ca0dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
365780f2ca0dSShuhei Matsumoto 
365880f2ca0dSShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
365980f2ca0dSShuhei Matsumoto 
366080f2ca0dSShuhei Matsumoto 	dif_generate(&sgl, 1, &ctx);
366180f2ca0dSShuhei Matsumoto 
366280f2ca0dSShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
366380f2ca0dSShuhei Matsumoto 
366480f2ca0dSShuhei Matsumoto 	guard = GUARD_SEED;
366580f2ca0dSShuhei Matsumoto 	prev_guard = GUARD_SEED;
366680f2ca0dSShuhei Matsumoto 
366780f2ca0dSShuhei Matsumoto 	rc = _dif_verify_split(&sgl, 0, 1000, &guard, 0, &ctx, &err_blk);
366880f2ca0dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3669cc4498acSSlawomir Ptak 	CU_ASSERT(guard == _generate_guard(prev_guard, buf, 1000, dif_pi_format));
367080f2ca0dSShuhei Matsumoto 	CU_ASSERT(sgl.iov_offset == 1000);
367180f2ca0dSShuhei Matsumoto 
367280f2ca0dSShuhei Matsumoto 	prev_guard = guard;
367380f2ca0dSShuhei Matsumoto 
367480f2ca0dSShuhei Matsumoto 	rc = _dif_verify_split(&sgl, 1000, 3000, &guard, 0, &ctx, &err_blk);
367580f2ca0dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
3676cc4498acSSlawomir Ptak 	CU_ASSERT(guard == _generate_guard(prev_guard, buf + 1000, 3000, dif_pi_format));
367780f2ca0dSShuhei Matsumoto 	CU_ASSERT(sgl.iov_offset == 4000);
367880f2ca0dSShuhei Matsumoto 
367980f2ca0dSShuhei Matsumoto 	rc = _dif_verify_split(&sgl, 4000, 96 + 128, &guard, 0, &ctx, &err_blk);
368080f2ca0dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
368180f2ca0dSShuhei Matsumoto 	CU_ASSERT(guard == GUARD_SEED);
368280f2ca0dSShuhei Matsumoto 	CU_ASSERT(sgl.iov_offset == 0);
368380f2ca0dSShuhei Matsumoto 	CU_ASSERT(sgl.iovcnt == 0);
368480f2ca0dSShuhei Matsumoto 
368580f2ca0dSShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
368680f2ca0dSShuhei Matsumoto 
368780f2ca0dSShuhei Matsumoto 	rc = dif_verify(&sgl, 1, &ctx, &err_blk);
368880f2ca0dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
368980f2ca0dSShuhei Matsumoto 
369080f2ca0dSShuhei Matsumoto 	rc = ut_data_pattern_verify(&iov, 1, 4096 + 128, 128, 1);
369180f2ca0dSShuhei Matsumoto 	CU_ASSERT(rc == 0);
369280f2ca0dSShuhei Matsumoto 
369380f2ca0dSShuhei Matsumoto 	free(buf);
369480f2ca0dSShuhei Matsumoto }
369580f2ca0dSShuhei Matsumoto 
36966db126c2SShuhei Matsumoto static void
3697cc4498acSSlawomir Ptak dif_verify_split_test(void)
3698cc4498acSSlawomir Ptak {
3699cc4498acSSlawomir Ptak 	_dif_verify_split_test(SPDK_DIF_PI_FORMAT_16);
3700cc4498acSSlawomir Ptak 	_dif_verify_split_test(SPDK_DIF_PI_FORMAT_32);
37015256f0efSSlawomir Ptak 	_dif_verify_split_test(SPDK_DIF_PI_FORMAT_64);
3702cc4498acSSlawomir Ptak }
3703cc4498acSSlawomir Ptak 
3704cc4498acSSlawomir Ptak static void
3705cc4498acSSlawomir Ptak _dif_verify_stream_multi_segments_test(enum spdk_dif_pi_format dif_pi_format)
37066db126c2SShuhei Matsumoto {
37076db126c2SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
37086db126c2SShuhei Matsumoto 	struct spdk_dif_error err_blk = {};
37096db126c2SShuhei Matsumoto 	struct iovec iov = {};
37106db126c2SShuhei Matsumoto 	uint8_t *buf;
37116db126c2SShuhei Matsumoto 	uint32_t dif_flags;
37126db126c2SShuhei Matsumoto 	int rc;
3713a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
37146db126c2SShuhei Matsumoto 
37156db126c2SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
37166db126c2SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
37176db126c2SShuhei Matsumoto 
37185681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3719cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
37206db126c2SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1,
3721a711d629SSlawomir Ptak 			       dif_flags, 22, 0xFFFF, 0x22, 0, GUARD_SEED, &dif_opts);
37226db126c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37236db126c2SShuhei Matsumoto 
37246db126c2SShuhei Matsumoto 	buf = calloc(1, (4096 + 128) * 4);
37256db126c2SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf != NULL);
37266db126c2SShuhei Matsumoto 	_iov_set_buf(&iov, buf, (4096 + 128) * 4);
37276db126c2SShuhei Matsumoto 
37286db126c2SShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 4);
37296db126c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37306db126c2SShuhei Matsumoto 
37316db126c2SShuhei Matsumoto 	rc = spdk_dif_generate(&iov, 1, 4, &ctx);
37326db126c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37336db126c2SShuhei Matsumoto 
37346db126c2SShuhei Matsumoto 	/* 1st data segment */
37356db126c2SShuhei Matsumoto 	_iov_set_buf(&iov, buf, 1024);
37366db126c2SShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 0);
37376db126c2SShuhei Matsumoto 
37386db126c2SShuhei Matsumoto 	rc = spdk_dif_verify_stream(&iov, 1, 0, 1024, &ctx, &err_blk);
37396db126c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37406db126c2SShuhei Matsumoto 
37416db126c2SShuhei Matsumoto 	/* 2nd data segment */
37426db126c2SShuhei Matsumoto 	_iov_set_buf(&iov, buf + 1024, (3072 + 128) + (4096 + 128) * 2 + 512);
37436db126c2SShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 1024);
37446db126c2SShuhei Matsumoto 
37456db126c2SShuhei Matsumoto 	rc = spdk_dif_verify_stream(&iov, 1, 0, 3072 + 4096 * 2 + 512, &ctx, &err_blk);
37466db126c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37476db126c2SShuhei Matsumoto 
37486db126c2SShuhei Matsumoto 	/* 3rd data segment */
37496db126c2SShuhei Matsumoto 	_iov_set_buf(&iov, buf + (4096 + 128) * 3 + 512, 3584 + 128);
37506db126c2SShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 4096 * 3);
37516db126c2SShuhei Matsumoto 
37526db126c2SShuhei Matsumoto 	rc = spdk_dif_verify_stream(&iov, 1, 0, 3584, &ctx, &err_blk);
37536db126c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37546db126c2SShuhei Matsumoto 
37556db126c2SShuhei Matsumoto 	/* verify all data segments once */
37566db126c2SShuhei Matsumoto 	_iov_set_buf(&iov, buf, (4096 + 128) * 4);
37576db126c2SShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 0);
37586db126c2SShuhei Matsumoto 
37596db126c2SShuhei Matsumoto 	rc = spdk_dif_verify(&iov, 1, 4, &ctx, &err_blk);
37606db126c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37616db126c2SShuhei Matsumoto 
37626db126c2SShuhei Matsumoto 	rc = ut_data_pattern_verify(&iov, 1, 4096 + 128, 128, 4);
37636db126c2SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37646db126c2SShuhei Matsumoto 
37656db126c2SShuhei Matsumoto 	free(buf);
37666db126c2SShuhei Matsumoto }
37676db126c2SShuhei Matsumoto 
3768cc4498acSSlawomir Ptak static void
3769cc4498acSSlawomir Ptak dif_verify_stream_multi_segments_test(void)
3770cc4498acSSlawomir Ptak {
3771cc4498acSSlawomir Ptak 	_dif_verify_stream_multi_segments_test(SPDK_DIF_PI_FORMAT_16);
3772cc4498acSSlawomir Ptak 	_dif_verify_stream_multi_segments_test(SPDK_DIF_PI_FORMAT_32);
37735256f0efSSlawomir Ptak 	_dif_verify_stream_multi_segments_test(SPDK_DIF_PI_FORMAT_64);
3774cc4498acSSlawomir Ptak }
3775cc4498acSSlawomir Ptak 
37764fa79870SShuhei Matsumoto #define UT_CRC32C_XOR	0xffffffffUL
37774fa79870SShuhei Matsumoto 
37784fa79870SShuhei Matsumoto static void
3779cc4498acSSlawomir Ptak update_crc32c_pi_16_test(void)
37804fa79870SShuhei Matsumoto {
37814fa79870SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
37824fa79870SShuhei Matsumoto 	struct iovec iovs[7];
37834fa79870SShuhei Matsumoto 	uint32_t crc32c1, crc32c2, crc32c3, crc32c4;
37844fa79870SShuhei Matsumoto 	uint32_t dif_flags;
37854fa79870SShuhei Matsumoto 	int i, rc;
3786a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
37874fa79870SShuhei Matsumoto 
37884fa79870SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
37894fa79870SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
37904fa79870SShuhei Matsumoto 
37915681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3792a711d629SSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
37934fa79870SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 512 + 8, 8, true, false, SPDK_DIF_TYPE1,
3794a711d629SSlawomir Ptak 			       dif_flags, 0, 0, 0, 0, 0, &dif_opts);
37954fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
37964fa79870SShuhei Matsumoto 
37974fa79870SShuhei Matsumoto 	/* data[0][255:0] */
37984fa79870SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
37994fa79870SShuhei Matsumoto 
38004fa79870SShuhei Matsumoto 	/* data[0][511:256], md[0][0] */
38014fa79870SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256 + 1);
38024fa79870SShuhei Matsumoto 
38034fa79870SShuhei Matsumoto 	/* md[0][4:1] */
38044fa79870SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 4);
38054fa79870SShuhei Matsumoto 
38064fa79870SShuhei Matsumoto 	/* md[0][7:5], data[1][122:0] */
38074fa79870SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 3 + 123);
38084fa79870SShuhei Matsumoto 
38094fa79870SShuhei Matsumoto 	/* data[1][511:123], md[1][5:0] */
3810767c046eSShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 389 + 6);
38114fa79870SShuhei Matsumoto 
38124fa79870SShuhei Matsumoto 	/* md[1][7:6], data[2][511:0], md[2][7:0], data[3][431:0] */
38134fa79870SShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 2 + 512 + 8 + 432);
38144fa79870SShuhei Matsumoto 
38154fa79870SShuhei Matsumoto 	/* data[3][511:432], md[3][7:0] */
38164fa79870SShuhei Matsumoto 	_iov_alloc_buf(&iovs[6], 80 + 8);
38174fa79870SShuhei Matsumoto 
38184fa79870SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, 7, 512 + 8, 8, 4);
38194fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
38204fa79870SShuhei Matsumoto 
38214fa79870SShuhei Matsumoto 	crc32c1 = UT_CRC32C_XOR;
38224fa79870SShuhei Matsumoto 
38234fa79870SShuhei Matsumoto 	rc = spdk_dif_update_crc32c(iovs, 7, 4, &crc32c1, &ctx);
38244fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
38254fa79870SShuhei Matsumoto 
38264fa79870SShuhei Matsumoto 	/* Test if DIF doesn't affect CRC for split case. */
38274fa79870SShuhei Matsumoto 	rc = spdk_dif_generate(iovs, 7, 4, &ctx);
38284fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
38294fa79870SShuhei Matsumoto 
38304fa79870SShuhei Matsumoto 	crc32c2 = UT_CRC32C_XOR;
38314fa79870SShuhei Matsumoto 
38324fa79870SShuhei Matsumoto 	rc = spdk_dif_update_crc32c(iovs, 7, 4, &crc32c2, &ctx);
38334fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
38344fa79870SShuhei Matsumoto 
38354fa79870SShuhei Matsumoto 	CU_ASSERT(crc32c1 == crc32c2);
38364fa79870SShuhei Matsumoto 
38374fa79870SShuhei Matsumoto 	for (i = 0; i < 7; i++) {
38384fa79870SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
38394fa79870SShuhei Matsumoto 	}
38404fa79870SShuhei Matsumoto 
38414fa79870SShuhei Matsumoto 	/* Test if CRC is same regardless of splitting. */
38424fa79870SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
38434fa79870SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 512 + 8);
38444fa79870SShuhei Matsumoto 	}
38454fa79870SShuhei Matsumoto 
38464fa79870SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, 4, 512 + 8, 8, 4);
38474fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
38484fa79870SShuhei Matsumoto 
38494fa79870SShuhei Matsumoto 	crc32c3 = UT_CRC32C_XOR;
38504fa79870SShuhei Matsumoto 
38514fa79870SShuhei Matsumoto 	rc = spdk_dif_update_crc32c(iovs, 4, 4, &crc32c3, &ctx);
38524fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
38534fa79870SShuhei Matsumoto 
38544fa79870SShuhei Matsumoto 	CU_ASSERT(crc32c1 == crc32c3);
38554fa79870SShuhei Matsumoto 
38564fa79870SShuhei Matsumoto 	/* Test if DIF doesn't affect CRC for non-split case. */
38574fa79870SShuhei Matsumoto 	rc = spdk_dif_generate(iovs, 4, 4, &ctx);
38584fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
38594fa79870SShuhei Matsumoto 
38604fa79870SShuhei Matsumoto 	crc32c4 = UT_CRC32C_XOR;
38614fa79870SShuhei Matsumoto 
38624fa79870SShuhei Matsumoto 	rc = spdk_dif_update_crc32c(iovs, 4, 4, &crc32c4, &ctx);
38634fa79870SShuhei Matsumoto 	CU_ASSERT(rc == 0);
38644fa79870SShuhei Matsumoto 
38654fa79870SShuhei Matsumoto 	CU_ASSERT(crc32c1 == crc32c4);
38664fa79870SShuhei Matsumoto 
38674fa79870SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
38684fa79870SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
38694fa79870SShuhei Matsumoto 	}
38704fa79870SShuhei Matsumoto }
38714fa79870SShuhei Matsumoto 
38724c2e52b9SShuhei Matsumoto static void
38735256f0efSSlawomir Ptak _update_crc32c_test(enum spdk_dif_pi_format dif_pi_format)
3874cc4498acSSlawomir Ptak {
3875cc4498acSSlawomir Ptak 	struct spdk_dif_ctx ctx = {};
3876cc4498acSSlawomir Ptak 	struct iovec iovs[7];
3877cc4498acSSlawomir Ptak 	uint32_t crc32c1, crc32c2, crc32c3, crc32c4;
3878cc4498acSSlawomir Ptak 	uint32_t dif_flags;
3879cc4498acSSlawomir Ptak 	int i, rc;
3880cc4498acSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
3881cc4498acSSlawomir Ptak 
3882cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
3883cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
3884cc4498acSSlawomir Ptak 
38855681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3886cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_32;
3887cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1,
3888cc4498acSSlawomir Ptak 			       dif_flags, 0, 0, 0, 0, 0, &dif_opts);
3889cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3890cc4498acSSlawomir Ptak 
3891cc4498acSSlawomir Ptak 	/* data[0][2047:0] */
3892cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 2048);
3893cc4498acSSlawomir Ptak 
3894cc4498acSSlawomir Ptak 	/* data[0][4095:2048], md[0][0] */
3895cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 2048 + 1);
3896cc4498acSSlawomir Ptak 
3897cc4498acSSlawomir Ptak 	/* md[0][4:1] */
3898cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[2], 4);
3899cc4498acSSlawomir Ptak 
3900cc4498acSSlawomir Ptak 	/* md[0][127:5], data[1][122:0] */
3901cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[3], 123 + 123);
3902cc4498acSSlawomir Ptak 
3903cc4498acSSlawomir Ptak 	/* data[1][4095:123], md[1][5:0] */
3904cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[4], 3973 + 6);
3905cc4498acSSlawomir Ptak 
3906cc4498acSSlawomir Ptak 	/* md[1][127:6], data[2][4095:0], md[2][127:0], data[3][431:0] */
3907cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[5], 122 + 4096 + 128 + 432);
3908cc4498acSSlawomir Ptak 
3909cc4498acSSlawomir Ptak 	/* data[3][511:432], md[3][127:0] */
3910cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[6], 3665 + 128);
3911cc4498acSSlawomir Ptak 
3912cc4498acSSlawomir Ptak 	rc = ut_data_pattern_generate(iovs, 7, 4096 + 128, 128, 4);
3913cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3914cc4498acSSlawomir Ptak 
3915cc4498acSSlawomir Ptak 	crc32c1 = UT_CRC32C_XOR;
3916cc4498acSSlawomir Ptak 
3917cc4498acSSlawomir Ptak 	rc = spdk_dif_update_crc32c(iovs, 7, 4, &crc32c1, &ctx);
3918cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3919cc4498acSSlawomir Ptak 
3920cc4498acSSlawomir Ptak 	/* Test if DIF doesn't affect CRC for split case. */
3921cc4498acSSlawomir Ptak 	rc = spdk_dif_generate(iovs, 7, 4, &ctx);
3922cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3923cc4498acSSlawomir Ptak 
3924cc4498acSSlawomir Ptak 	crc32c2 = UT_CRC32C_XOR;
3925cc4498acSSlawomir Ptak 
3926cc4498acSSlawomir Ptak 	rc = spdk_dif_update_crc32c(iovs, 7, 4, &crc32c2, &ctx);
3927cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3928cc4498acSSlawomir Ptak 
3929cc4498acSSlawomir Ptak 	CU_ASSERT(crc32c1 == crc32c2);
3930cc4498acSSlawomir Ptak 
3931cc4498acSSlawomir Ptak 	for (i = 0; i < 7; i++) {
3932cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
3933cc4498acSSlawomir Ptak 	}
3934cc4498acSSlawomir Ptak 
3935cc4498acSSlawomir Ptak 	/* Test if CRC is same regardless of splitting. */
3936cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
3937cc4498acSSlawomir Ptak 		_iov_alloc_buf(&iovs[i], 4096 + 128);
3938cc4498acSSlawomir Ptak 	}
3939cc4498acSSlawomir Ptak 
3940cc4498acSSlawomir Ptak 	rc = ut_data_pattern_generate(iovs, 4, 4096 + 128, 128, 4);
3941cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3942cc4498acSSlawomir Ptak 
3943cc4498acSSlawomir Ptak 	crc32c3 = UT_CRC32C_XOR;
3944cc4498acSSlawomir Ptak 
3945cc4498acSSlawomir Ptak 	rc = spdk_dif_update_crc32c(iovs, 4, 4, &crc32c3, &ctx);
3946cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3947cc4498acSSlawomir Ptak 
3948cc4498acSSlawomir Ptak 	CU_ASSERT(crc32c1 == crc32c3);
3949cc4498acSSlawomir Ptak 
3950cc4498acSSlawomir Ptak 	/* Test if DIF doesn't affect CRC for non-split case. */
3951cc4498acSSlawomir Ptak 	rc = spdk_dif_generate(iovs, 4, 4, &ctx);
3952cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3953cc4498acSSlawomir Ptak 
3954cc4498acSSlawomir Ptak 	crc32c4 = UT_CRC32C_XOR;
3955cc4498acSSlawomir Ptak 
3956cc4498acSSlawomir Ptak 	rc = spdk_dif_update_crc32c(iovs, 4, 4, &crc32c4, &ctx);
3957cc4498acSSlawomir Ptak 	CU_ASSERT(rc == 0);
3958cc4498acSSlawomir Ptak 
3959cc4498acSSlawomir Ptak 	CU_ASSERT(crc32c1 == crc32c4);
3960cc4498acSSlawomir Ptak 
3961cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
3962cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
3963cc4498acSSlawomir Ptak 	}
3964cc4498acSSlawomir Ptak }
3965cc4498acSSlawomir Ptak 
3966cc4498acSSlawomir Ptak static void
39675256f0efSSlawomir Ptak update_crc32c_test(void)
39685256f0efSSlawomir Ptak {
39695256f0efSSlawomir Ptak 	_update_crc32c_test(SPDK_DIF_PI_FORMAT_32);
39705256f0efSSlawomir Ptak 	_update_crc32c_test(SPDK_DIF_PI_FORMAT_64);
39715256f0efSSlawomir Ptak }
39725256f0efSSlawomir Ptak 
39735256f0efSSlawomir Ptak static void
3974cc4498acSSlawomir Ptak _dif_update_crc32c_split_test(enum spdk_dif_pi_format dif_pi_format)
39754c2e52b9SShuhei Matsumoto {
39764c2e52b9SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
39774c2e52b9SShuhei Matsumoto 	struct iovec iov;
39784c2e52b9SShuhei Matsumoto 	uint8_t *buf;
39794c2e52b9SShuhei Matsumoto 	struct _dif_sgl sgl;
39804c2e52b9SShuhei Matsumoto 	uint32_t dif_flags, crc32c, prev_crc32c;
39814c2e52b9SShuhei Matsumoto 	int rc;
3982a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
39834c2e52b9SShuhei Matsumoto 
39844c2e52b9SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
39854c2e52b9SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
39864c2e52b9SShuhei Matsumoto 
39875681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
3988cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
39894c2e52b9SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1,
3990a711d629SSlawomir Ptak 			       dif_flags, 0, 0, 0, 0, GUARD_SEED, &dif_opts);
39914c2e52b9SShuhei Matsumoto 	CU_ASSERT(rc == 0);
39924c2e52b9SShuhei Matsumoto 
39934c2e52b9SShuhei Matsumoto 	buf = calloc(1, 4096 + 128);
39944c2e52b9SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf != NULL);
39954c2e52b9SShuhei Matsumoto 	_iov_set_buf(&iov, buf, 4096 + 128);
39964c2e52b9SShuhei Matsumoto 
39974c2e52b9SShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 1);
39984c2e52b9SShuhei Matsumoto 	CU_ASSERT(rc == 0);
39994c2e52b9SShuhei Matsumoto 
40004c2e52b9SShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
40014c2e52b9SShuhei Matsumoto 
40024c2e52b9SShuhei Matsumoto 	dif_generate(&sgl, 1, &ctx);
40034c2e52b9SShuhei Matsumoto 
40044c2e52b9SShuhei Matsumoto 	_dif_sgl_init(&sgl, &iov, 1);
40054c2e52b9SShuhei Matsumoto 
40064c2e52b9SShuhei Matsumoto 	crc32c = _dif_update_crc32c_split(&sgl, 0, 1000, UT_CRC32C_XOR, &ctx);
40074c2e52b9SShuhei Matsumoto 	CU_ASSERT(crc32c == spdk_crc32c_update(buf, 1000, UT_CRC32C_XOR));
40084c2e52b9SShuhei Matsumoto 
40094c2e52b9SShuhei Matsumoto 	prev_crc32c = crc32c;
40104c2e52b9SShuhei Matsumoto 
40114c2e52b9SShuhei Matsumoto 	crc32c = _dif_update_crc32c_split(&sgl, 1000, 3000, prev_crc32c, &ctx);
40124c2e52b9SShuhei Matsumoto 	CU_ASSERT(crc32c == spdk_crc32c_update(buf + 1000, 3000, prev_crc32c));
40134c2e52b9SShuhei Matsumoto 
40144c2e52b9SShuhei Matsumoto 	prev_crc32c = crc32c;
40154c2e52b9SShuhei Matsumoto 
40164c2e52b9SShuhei Matsumoto 	crc32c = _dif_update_crc32c_split(&sgl, 4000, 96 + 128, prev_crc32c, &ctx);
40174c2e52b9SShuhei Matsumoto 	CU_ASSERT(crc32c == spdk_crc32c_update(buf + 4000, 96, prev_crc32c));
40184c2e52b9SShuhei Matsumoto 
40194c2e52b9SShuhei Matsumoto 	CU_ASSERT(crc32c == spdk_crc32c_update(buf, 4096, UT_CRC32C_XOR));
40204c2e52b9SShuhei Matsumoto 
40214c2e52b9SShuhei Matsumoto 	free(buf);
40224c2e52b9SShuhei Matsumoto }
40234c2e52b9SShuhei Matsumoto 
4024767c046eSShuhei Matsumoto static void
4025cc4498acSSlawomir Ptak dif_update_crc32c_split_test(void)
4026cc4498acSSlawomir Ptak {
4027cc4498acSSlawomir Ptak 	_dif_update_crc32c_split_test(SPDK_DIF_PI_FORMAT_16);
4028cc4498acSSlawomir Ptak 	_dif_update_crc32c_split_test(SPDK_DIF_PI_FORMAT_32);
40295256f0efSSlawomir Ptak 	_dif_update_crc32c_split_test(SPDK_DIF_PI_FORMAT_64);
4030cc4498acSSlawomir Ptak }
4031cc4498acSSlawomir Ptak 
4032cc4498acSSlawomir Ptak static void
4033cc4498acSSlawomir Ptak _dif_update_crc32c_stream_multi_segments_test(enum spdk_dif_pi_format dif_pi_format)
4034767c046eSShuhei Matsumoto {
4035767c046eSShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
4036767c046eSShuhei Matsumoto 	struct iovec iov = {};
4037767c046eSShuhei Matsumoto 	uint8_t *buf;
4038767c046eSShuhei Matsumoto 	uint32_t dif_flags, crc32c1, crc32c2;
4039767c046eSShuhei Matsumoto 	int rc;
4040a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
4041767c046eSShuhei Matsumoto 
4042767c046eSShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
4043767c046eSShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
4044767c046eSShuhei Matsumoto 
40455681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
4046cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
4047767c046eSShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, SPDK_DIF_TYPE1,
4048a711d629SSlawomir Ptak 			       dif_flags, 22, 0xFFFF, 0x22, 0, GUARD_SEED, &dif_opts);
4049767c046eSShuhei Matsumoto 	CU_ASSERT(rc == 0);
4050767c046eSShuhei Matsumoto 
4051767c046eSShuhei Matsumoto 	buf = calloc(1, (4096 + 128) * 4);
4052767c046eSShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(buf != NULL);
4053767c046eSShuhei Matsumoto 	_iov_set_buf(&iov, buf, (4096 + 128) * 4);
4054767c046eSShuhei Matsumoto 
4055767c046eSShuhei Matsumoto 	rc = ut_data_pattern_generate(&iov, 1, 4096 + 128, 128, 4);
4056767c046eSShuhei Matsumoto 	CU_ASSERT(rc == 0);
4057767c046eSShuhei Matsumoto 
4058767c046eSShuhei Matsumoto 	rc = spdk_dif_generate(&iov, 1, 4, &ctx);
4059767c046eSShuhei Matsumoto 	CU_ASSERT(rc == 0);
4060767c046eSShuhei Matsumoto 
4061767c046eSShuhei Matsumoto 	crc32c1 = UT_CRC32C_XOR;
4062767c046eSShuhei Matsumoto 	crc32c2 = UT_CRC32C_XOR;
4063767c046eSShuhei Matsumoto 
4064767c046eSShuhei Matsumoto 	/* 1st data segment */
4065767c046eSShuhei Matsumoto 	_iov_set_buf(&iov, buf, 1024);
4066767c046eSShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 0);
4067767c046eSShuhei Matsumoto 
4068767c046eSShuhei Matsumoto 	rc = spdk_dif_update_crc32c_stream(&iov, 1, 0, 1024, &crc32c1, &ctx);
4069767c046eSShuhei Matsumoto 	CU_ASSERT(rc == 0);
4070767c046eSShuhei Matsumoto 
4071767c046eSShuhei Matsumoto 	/* 2nd data segment */
4072767c046eSShuhei Matsumoto 	_iov_set_buf(&iov, buf + 1024, (3072 + 128) + (4096 + 128) * 2 + 512);
4073767c046eSShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 1024);
4074767c046eSShuhei Matsumoto 
4075767c046eSShuhei Matsumoto 	rc = spdk_dif_update_crc32c_stream(&iov, 1, 0, 3072 + 4096 * 2 + 512, &crc32c1, &ctx);
4076767c046eSShuhei Matsumoto 	CU_ASSERT(rc == 0);
4077767c046eSShuhei Matsumoto 
4078767c046eSShuhei Matsumoto 	/* 3rd data segment */
4079767c046eSShuhei Matsumoto 	_iov_set_buf(&iov, buf + (4096 + 128) * 3 + 512, 3584 + 128);
4080767c046eSShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 4096 * 3);
4081767c046eSShuhei Matsumoto 
4082767c046eSShuhei Matsumoto 	rc = spdk_dif_update_crc32c_stream(&iov, 1, 0, 3584, &crc32c1, &ctx);
4083767c046eSShuhei Matsumoto 	CU_ASSERT(rc == 0);
4084767c046eSShuhei Matsumoto 
4085767c046eSShuhei Matsumoto 	/* Update CRC32C for all data segments once */
4086767c046eSShuhei Matsumoto 	_iov_set_buf(&iov, buf, (4096 + 128) * 4);
4087767c046eSShuhei Matsumoto 	spdk_dif_ctx_set_data_offset(&ctx, 0);
4088767c046eSShuhei Matsumoto 
4089767c046eSShuhei Matsumoto 	rc = spdk_dif_update_crc32c(&iov, 1, 4, &crc32c2, &ctx);
4090767c046eSShuhei Matsumoto 	CU_ASSERT(rc == 0);
4091767c046eSShuhei Matsumoto 
4092767c046eSShuhei Matsumoto 	CU_ASSERT(crc32c1 == crc32c2);
4093767c046eSShuhei Matsumoto 
4094767c046eSShuhei Matsumoto 	free(buf);
4095767c046eSShuhei Matsumoto }
4096767c046eSShuhei Matsumoto 
40971d1c60e5SShuhei Matsumoto static void
4098cc4498acSSlawomir Ptak dif_update_crc32c_stream_multi_segments_test(void)
4099cc4498acSSlawomir Ptak {
4100cc4498acSSlawomir Ptak 	_dif_update_crc32c_stream_multi_segments_test(SPDK_DIF_PI_FORMAT_16);
4101cc4498acSSlawomir Ptak 	_dif_update_crc32c_stream_multi_segments_test(SPDK_DIF_PI_FORMAT_32);
41025256f0efSSlawomir Ptak 	_dif_update_crc32c_stream_multi_segments_test(SPDK_DIF_PI_FORMAT_64);
4103cc4498acSSlawomir Ptak }
4104cc4498acSSlawomir Ptak 
4105cc4498acSSlawomir Ptak static void
41061d1c60e5SShuhei Matsumoto get_range_with_md_test(void)
41071d1c60e5SShuhei Matsumoto {
41081d1c60e5SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
41091d1c60e5SShuhei Matsumoto 	uint32_t buf_offset, buf_len;
41101d1c60e5SShuhei Matsumoto 	int rc;
4111a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
41121d1c60e5SShuhei Matsumoto 
41135681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
4114a711d629SSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
4115cc4498acSSlawomir Ptak 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, false, 0, 0,
4116cc4498acSSlawomir Ptak 			       0, 0, 0, 0, 0, &dif_opts);
41171d1c60e5SShuhei Matsumoto 	CU_ASSERT(rc == 0);
41181d1c60e5SShuhei Matsumoto 
41191d1c60e5SShuhei Matsumoto 	spdk_dif_get_range_with_md(0, 2048, &buf_offset, &buf_len, &ctx);
41201d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_offset == 0);
41211d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_len == 2048);
41221d1c60e5SShuhei Matsumoto 
41231d1c60e5SShuhei Matsumoto 	spdk_dif_get_range_with_md(2048, 4096, &buf_offset, &buf_len, &ctx);
41241d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_offset == 2048);
41251d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_len == 4096 + 128);
41261d1c60e5SShuhei Matsumoto 
41271d1c60e5SShuhei Matsumoto 	spdk_dif_get_range_with_md(4096, 10240, &buf_offset, &buf_len, &ctx);
41281d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_offset == 4096 + 128);
41291d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_len == 10240 + 256);
41301d1c60e5SShuhei Matsumoto 
41311d1c60e5SShuhei Matsumoto 	spdk_dif_get_range_with_md(10240, 2048, &buf_offset, &buf_len, &ctx);
41321d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_offset == 10240 + 256);
41331d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_len == 2048 + 128);
41341d1c60e5SShuhei Matsumoto 
41351d1c60e5SShuhei Matsumoto 	buf_len = spdk_dif_get_length_with_md(6144, &ctx);
41361d1c60e5SShuhei Matsumoto 	CU_ASSERT(buf_len == 6144 + 128);
41371d1c60e5SShuhei Matsumoto }
41381d1c60e5SShuhei Matsumoto 
4139f4a62a39SShuhei Matsumoto static void
4140f4a62a39SShuhei Matsumoto dif_generate_remap_and_verify(struct iovec *iovs, int iovcnt,
4141f4a62a39SShuhei Matsumoto 			      uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
4142f4a62a39SShuhei Matsumoto 			      bool dif_loc, enum spdk_dif_type dif_type, uint32_t dif_flags,
4143f4a62a39SShuhei Matsumoto 			      uint32_t init_ref_tag, uint32_t remapped_init_ref_tag,
4144cc4498acSSlawomir Ptak 			      uint16_t apptag_mask, uint16_t app_tag,
4145cc4498acSSlawomir Ptak 			      enum spdk_dif_pi_format dif_pi_format)
4146f4a62a39SShuhei Matsumoto {
4147f4a62a39SShuhei Matsumoto 	struct spdk_dif_ctx ctx = {};
4148f4a62a39SShuhei Matsumoto 	int rc;
4149a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
4150f4a62a39SShuhei Matsumoto 
4151f4a62a39SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, iovcnt, block_size, md_size, num_blocks);
4152f4a62a39SShuhei Matsumoto 	CU_ASSERT(rc == 0);
4153f4a62a39SShuhei Matsumoto 
41545681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
4155cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
4156f4a62a39SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, dif_loc, dif_type, dif_flags,
4157a711d629SSlawomir Ptak 			       init_ref_tag, apptag_mask, app_tag, 0, GUARD_SEED, &dif_opts);
4158f4a62a39SShuhei Matsumoto 	CU_ASSERT(rc == 0);
4159f4a62a39SShuhei Matsumoto 
4160f4a62a39SShuhei Matsumoto 	rc = spdk_dif_generate(iovs, iovcnt, num_blocks, &ctx);
4161f4a62a39SShuhei Matsumoto 	CU_ASSERT(rc == 0);
4162f4a62a39SShuhei Matsumoto 
4163f4a62a39SShuhei Matsumoto 	spdk_dif_ctx_set_remapped_init_ref_tag(&ctx, remapped_init_ref_tag);
4164f4a62a39SShuhei Matsumoto 
4165d112ea1aSSlawomir Ptak 	rc = spdk_dif_remap_ref_tag(iovs, iovcnt, num_blocks, &ctx, NULL, true);
4166f4a62a39SShuhei Matsumoto 	CU_ASSERT(rc == 0);
4167f4a62a39SShuhei Matsumoto 
4168f4a62a39SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, true, dif_loc, dif_type, dif_flags,
4169a711d629SSlawomir Ptak 			       remapped_init_ref_tag, apptag_mask, app_tag, 0, GUARD_SEED, &dif_opts);
4170f4a62a39SShuhei Matsumoto 	CU_ASSERT(rc == 0);
4171f4a62a39SShuhei Matsumoto 
4172f4a62a39SShuhei Matsumoto 	rc = spdk_dif_verify(iovs, iovcnt, num_blocks, &ctx, NULL);
4173f4a62a39SShuhei Matsumoto 	CU_ASSERT(rc == 0);
4174f4a62a39SShuhei Matsumoto 
4175f4a62a39SShuhei Matsumoto 	rc = ut_data_pattern_verify(iovs, iovcnt, block_size, md_size, num_blocks);
4176f4a62a39SShuhei Matsumoto 	CU_ASSERT(rc == 0);
4177f4a62a39SShuhei Matsumoto }
4178f4a62a39SShuhei Matsumoto 
4179f4a62a39SShuhei Matsumoto static void
4180cc4498acSSlawomir Ptak dif_sec_512_md_8_prchk_7_multi_iovs_remap_pi_16_test(void)
4181f4a62a39SShuhei Matsumoto {
4182f4a62a39SShuhei Matsumoto 	struct iovec iovs[4];
4183f4a62a39SShuhei Matsumoto 	int i, num_blocks;
4184f4a62a39SShuhei Matsumoto 	uint32_t dif_flags;
4185f4a62a39SShuhei Matsumoto 
4186f4a62a39SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
4187f4a62a39SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
4188f4a62a39SShuhei Matsumoto 
4189f4a62a39SShuhei Matsumoto 	num_blocks = 0;
4190f4a62a39SShuhei Matsumoto 
4191f4a62a39SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
4192f4a62a39SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], (512 + 8) * (i + 1));
4193f4a62a39SShuhei Matsumoto 		num_blocks += i + 1;
4194f4a62a39SShuhei Matsumoto 	}
4195f4a62a39SShuhei Matsumoto 
4196f4a62a39SShuhei Matsumoto 	dif_generate_remap_and_verify(iovs, 4, 512 + 8, 8, num_blocks, false, SPDK_DIF_TYPE1,
4197cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
4198f4a62a39SShuhei Matsumoto 
4199f4a62a39SShuhei Matsumoto 	dif_generate_remap_and_verify(iovs, 4, 512 + 8, 8, num_blocks, true, SPDK_DIF_TYPE1,
4200cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
4201cc4498acSSlawomir Ptak 
4202cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
4203cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
4204cc4498acSSlawomir Ptak 	}
4205cc4498acSSlawomir Ptak }
4206cc4498acSSlawomir Ptak 
4207cc4498acSSlawomir Ptak static void
42085256f0efSSlawomir Ptak dif_sec_4096_md_128_prchk_7_multi_iovs_remap_test(void)
4209cc4498acSSlawomir Ptak {
4210cc4498acSSlawomir Ptak 	struct iovec iovs[4];
4211cc4498acSSlawomir Ptak 	int i, num_blocks;
4212cc4498acSSlawomir Ptak 	uint32_t dif_flags;
4213cc4498acSSlawomir Ptak 
4214cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
4215cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
4216cc4498acSSlawomir Ptak 
4217cc4498acSSlawomir Ptak 	num_blocks = 0;
4218cc4498acSSlawomir Ptak 
4219cc4498acSSlawomir Ptak 	for (i = 0; i < 4; i++) {
4220cc4498acSSlawomir Ptak 		_iov_alloc_buf(&iovs[i], (4096 + 128) * (i + 1));
4221cc4498acSSlawomir Ptak 		num_blocks += i + 1;
4222cc4498acSSlawomir Ptak 	}
4223cc4498acSSlawomir Ptak 
4224cc4498acSSlawomir Ptak 	dif_generate_remap_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, false, SPDK_DIF_TYPE1,
4225cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
4226cc4498acSSlawomir Ptak 	dif_generate_remap_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, true, SPDK_DIF_TYPE1,
4227cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
42285256f0efSSlawomir Ptak 	dif_generate_remap_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, false, SPDK_DIF_TYPE1,
42295256f0efSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
42305256f0efSSlawomir Ptak 	dif_generate_remap_and_verify(iovs, 4, 4096 + 128, 128, num_blocks, true, SPDK_DIF_TYPE1,
42315256f0efSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
4232f4a62a39SShuhei Matsumoto 
4233f4a62a39SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
4234f4a62a39SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
4235f4a62a39SShuhei Matsumoto 	}
4236f4a62a39SShuhei Matsumoto }
4237f4a62a39SShuhei Matsumoto 
4238f4a62a39SShuhei Matsumoto static void
4239f4a62a39SShuhei Matsumoto dif_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_remap_test(void)
4240f4a62a39SShuhei Matsumoto {
4241f4a62a39SShuhei Matsumoto 	struct iovec iovs[11];
4242f4a62a39SShuhei Matsumoto 	uint32_t dif_flags;
4243f4a62a39SShuhei Matsumoto 	int i;
4244f4a62a39SShuhei Matsumoto 
4245f4a62a39SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
4246f4a62a39SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
4247f4a62a39SShuhei Matsumoto 
4248f4a62a39SShuhei Matsumoto 	/* data[0][1000:0] */
4249f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 1000);
4250f4a62a39SShuhei Matsumoto 
4251f4a62a39SShuhei Matsumoto 	/* data[0][3095:1000], guard[0][0] */
4252f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 3096 + 1);
4253f4a62a39SShuhei Matsumoto 
4254f4a62a39SShuhei Matsumoto 	/* guard[0][1], apptag[0][0] */
4255f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 1 + 1);
4256f4a62a39SShuhei Matsumoto 
4257f4a62a39SShuhei Matsumoto 	/* apptag[0][1], reftag[0][0] */
4258f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 1 + 1);
4259f4a62a39SShuhei Matsumoto 
4260f4a62a39SShuhei Matsumoto 	/* reftag[0][3:1], ignore[0][59:0] */
4261f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 3 + 60);
4262f4a62a39SShuhei Matsumoto 
4263f4a62a39SShuhei Matsumoto 	/* ignore[119:60], data[1][3050:0] */
4264f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 60 + 3051);
4265f4a62a39SShuhei Matsumoto 
4266f4a62a39SShuhei Matsumoto 	/* data[1][4095:3050], guard[1][0] */
4267f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[6], 1045 + 1);
4268f4a62a39SShuhei Matsumoto 
4269f4a62a39SShuhei Matsumoto 	/* guard[1][1], apptag[1][0] */
4270f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[7], 1 + 1);
4271f4a62a39SShuhei Matsumoto 
4272f4a62a39SShuhei Matsumoto 	/* apptag[1][1], reftag[1][0] */
4273f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[8], 1 + 1);
4274f4a62a39SShuhei Matsumoto 
4275f4a62a39SShuhei Matsumoto 	/* reftag[1][3:1], ignore[1][9:0] */
4276f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[9], 3 + 10);
4277f4a62a39SShuhei Matsumoto 
4278f4a62a39SShuhei Matsumoto 	/* ignore[1][127:9] */
4279f4a62a39SShuhei Matsumoto 	_iov_alloc_buf(&iovs[10], 118);
4280f4a62a39SShuhei Matsumoto 
4281f4a62a39SShuhei Matsumoto 	dif_generate_remap_and_verify(iovs, 11, 4096 + 128, 128, 2, false, SPDK_DIF_TYPE1, dif_flags,
4282cc4498acSSlawomir Ptak 				      22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
4283f4a62a39SShuhei Matsumoto 	dif_generate_remap_and_verify(iovs, 11, 4096 + 128, 128, 2, true, SPDK_DIF_TYPE1, dif_flags,
4284cc4498acSSlawomir Ptak 				      22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
4285cc4498acSSlawomir Ptak 	dif_generate_remap_and_verify(iovs, 11, 4096 + 128, 128, 2, false, SPDK_DIF_TYPE1, dif_flags,
4286cc4498acSSlawomir Ptak 				      22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
4287cc4498acSSlawomir Ptak 	dif_generate_remap_and_verify(iovs, 11, 4096 + 128, 128, 2, true, SPDK_DIF_TYPE1, dif_flags,
4288cc4498acSSlawomir Ptak 				      22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
42895256f0efSSlawomir Ptak 	dif_generate_remap_and_verify(iovs, 11, 4096 + 128, 128, 2, false, SPDK_DIF_TYPE1, dif_flags,
42905256f0efSSlawomir Ptak 				      22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
42915256f0efSSlawomir Ptak 	dif_generate_remap_and_verify(iovs, 11, 4096 + 128, 128, 2, true, SPDK_DIF_TYPE1, dif_flags,
42925256f0efSSlawomir Ptak 				      22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
4293f4a62a39SShuhei Matsumoto 
4294f4a62a39SShuhei Matsumoto 	for (i = 0; i < 11; i++) {
4295f4a62a39SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
4296f4a62a39SShuhei Matsumoto 	}
4297f4a62a39SShuhei Matsumoto }
4298f4a62a39SShuhei Matsumoto 
42997e70c3d1SShuhei Matsumoto static void
43007e70c3d1SShuhei Matsumoto dix_generate_remap_and_verify(struct iovec *iovs, int iovcnt, struct iovec *md_iov,
43017e70c3d1SShuhei Matsumoto 			      uint32_t block_size, uint32_t md_size, uint32_t num_blocks,
43027e70c3d1SShuhei Matsumoto 			      bool dif_loc, enum spdk_dif_type dif_type, uint32_t dif_flags,
43037e70c3d1SShuhei Matsumoto 			      uint32_t init_ref_tag, uint32_t remapped_init_ref_tag,
4304cc4498acSSlawomir Ptak 			      uint16_t apptag_mask, uint16_t app_tag,
4305cc4498acSSlawomir Ptak 			      enum spdk_dif_pi_format dif_pi_format)
43067e70c3d1SShuhei Matsumoto {
43077e70c3d1SShuhei Matsumoto 	struct spdk_dif_ctx ctx;
43087e70c3d1SShuhei Matsumoto 	int rc;
4309a711d629SSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
43107e70c3d1SShuhei Matsumoto 
43117e70c3d1SShuhei Matsumoto 	rc = ut_data_pattern_generate(iovs, iovcnt, block_size, 0, num_blocks);
43127e70c3d1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
43137e70c3d1SShuhei Matsumoto 
43145681a8a6SKonrad Sztyber 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
4315cc4498acSSlawomir Ptak 	dif_opts.dif_pi_format = dif_pi_format;
43167e70c3d1SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, false, dif_loc, dif_type, dif_flags,
4317a711d629SSlawomir Ptak 			       init_ref_tag, apptag_mask, app_tag, 0, GUARD_SEED, &dif_opts);
43187e70c3d1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
43197e70c3d1SShuhei Matsumoto 
43207e70c3d1SShuhei Matsumoto 	rc = spdk_dix_generate(iovs, iovcnt, md_iov, num_blocks, &ctx);
43217e70c3d1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
43227e70c3d1SShuhei Matsumoto 
43237e70c3d1SShuhei Matsumoto 	spdk_dif_ctx_set_remapped_init_ref_tag(&ctx, remapped_init_ref_tag);
43247e70c3d1SShuhei Matsumoto 
4325d112ea1aSSlawomir Ptak 	rc = spdk_dix_remap_ref_tag(md_iov, num_blocks, &ctx, NULL, true);
43267e70c3d1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
43277e70c3d1SShuhei Matsumoto 
43287e70c3d1SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&ctx, block_size, md_size, false, dif_loc, dif_type, dif_flags,
4329a711d629SSlawomir Ptak 			       remapped_init_ref_tag, apptag_mask, app_tag, 0, GUARD_SEED, &dif_opts);
43307e70c3d1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
43317e70c3d1SShuhei Matsumoto 
43327e70c3d1SShuhei Matsumoto 	rc = spdk_dix_verify(iovs, iovcnt, md_iov, num_blocks, &ctx, NULL);
43337e70c3d1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
43347e70c3d1SShuhei Matsumoto 
43357e70c3d1SShuhei Matsumoto 	rc = ut_data_pattern_verify(iovs, iovcnt, block_size, 0, num_blocks);
43367e70c3d1SShuhei Matsumoto 	CU_ASSERT(rc == 0);
43377e70c3d1SShuhei Matsumoto }
43387e70c3d1SShuhei Matsumoto 
43397e70c3d1SShuhei Matsumoto static void
43407e70c3d1SShuhei Matsumoto dix_sec_4096_md_128_prchk_7_multi_iovs_remap(void)
43417e70c3d1SShuhei Matsumoto {
43427e70c3d1SShuhei Matsumoto 	struct iovec iovs[4], md_iov;
43437e70c3d1SShuhei Matsumoto 	uint32_t dif_flags;
43447e70c3d1SShuhei Matsumoto 	int i, num_blocks;
43457e70c3d1SShuhei Matsumoto 
43467e70c3d1SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
43477e70c3d1SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
43487e70c3d1SShuhei Matsumoto 
43497e70c3d1SShuhei Matsumoto 	num_blocks = 0;
43507e70c3d1SShuhei Matsumoto 
43517e70c3d1SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
43527e70c3d1SShuhei Matsumoto 		_iov_alloc_buf(&iovs[i], 4096 * (i + 1));
43537e70c3d1SShuhei Matsumoto 		num_blocks += i + 1;
43547e70c3d1SShuhei Matsumoto 	}
43557e70c3d1SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 128 * num_blocks);
43567e70c3d1SShuhei Matsumoto 
43577e70c3d1SShuhei Matsumoto 	dix_generate_remap_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
4358cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
43597e70c3d1SShuhei Matsumoto 	dix_generate_remap_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, true, SPDK_DIF_TYPE1,
4360cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
4361cc4498acSSlawomir Ptak 	dix_generate_remap_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
4362cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
4363cc4498acSSlawomir Ptak 	dix_generate_remap_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, true, SPDK_DIF_TYPE1,
4364cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
43655256f0efSSlawomir Ptak 	dix_generate_remap_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, false, SPDK_DIF_TYPE1,
43665256f0efSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
43675256f0efSSlawomir Ptak 	dix_generate_remap_and_verify(iovs, 4, &md_iov, 4096, 128, num_blocks, true, SPDK_DIF_TYPE1,
43685256f0efSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
43697e70c3d1SShuhei Matsumoto 
43707e70c3d1SShuhei Matsumoto 	for (i = 0; i < 4; i++) {
43717e70c3d1SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
43727e70c3d1SShuhei Matsumoto 	}
43737e70c3d1SShuhei Matsumoto 	_iov_free_buf(&md_iov);
43747e70c3d1SShuhei Matsumoto }
43757e70c3d1SShuhei Matsumoto 
43767e70c3d1SShuhei Matsumoto static void
4377cc4498acSSlawomir Ptak dix_sec_512_md_8_prchk_7_multi_iovs_complex_splits_remap_pi_16_test(void)
43787e70c3d1SShuhei Matsumoto {
43797e70c3d1SShuhei Matsumoto 	struct iovec iovs[6], md_iov;
43807e70c3d1SShuhei Matsumoto 	uint32_t dif_flags;
43817e70c3d1SShuhei Matsumoto 	int i;
43827e70c3d1SShuhei Matsumoto 
43837e70c3d1SShuhei Matsumoto 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
43847e70c3d1SShuhei Matsumoto 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
43857e70c3d1SShuhei Matsumoto 
43867e70c3d1SShuhei Matsumoto 	/* data[0][255:0] */
43877e70c3d1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[0], 256);
43887e70c3d1SShuhei Matsumoto 
43897e70c3d1SShuhei Matsumoto 	/* data[0][511:256], data[1][255:0] */
43907e70c3d1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[1], 256 + 256);
43917e70c3d1SShuhei Matsumoto 
43927e70c3d1SShuhei Matsumoto 	/* data[1][382:256] */
43937e70c3d1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[2], 128);
43947e70c3d1SShuhei Matsumoto 
43957e70c3d1SShuhei Matsumoto 	/* data[1][383] */
43967e70c3d1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[3], 1);
43977e70c3d1SShuhei Matsumoto 
43987e70c3d1SShuhei Matsumoto 	/* data[1][510:384] */
43997e70c3d1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[4], 126);
44007e70c3d1SShuhei Matsumoto 
44017e70c3d1SShuhei Matsumoto 	/* data[1][511], data[2][511:0], data[3][511:0] */
44027e70c3d1SShuhei Matsumoto 	_iov_alloc_buf(&iovs[5], 1 + 512 * 2);
44037e70c3d1SShuhei Matsumoto 
44047e70c3d1SShuhei Matsumoto 	_iov_alloc_buf(&md_iov, 8 * 4);
44057e70c3d1SShuhei Matsumoto 
44067e70c3d1SShuhei Matsumoto 	dix_generate_remap_and_verify(iovs, 6, &md_iov, 512, 8, 4, false, SPDK_DIF_TYPE1,
4407cc4498acSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_16);
4408cc4498acSSlawomir Ptak 
4409cc4498acSSlawomir Ptak 	for (i = 0; i < 6; i++) {
4410cc4498acSSlawomir Ptak 		_iov_free_buf(&iovs[i]);
4411cc4498acSSlawomir Ptak 	}
4412cc4498acSSlawomir Ptak 	_iov_free_buf(&md_iov);
4413cc4498acSSlawomir Ptak }
4414cc4498acSSlawomir Ptak 
4415cc4498acSSlawomir Ptak static void
44165256f0efSSlawomir Ptak dix_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_remap_test(void)
4417cc4498acSSlawomir Ptak {
4418cc4498acSSlawomir Ptak 	struct iovec iovs[6], md_iov;
4419cc4498acSSlawomir Ptak 	uint32_t dif_flags;
4420cc4498acSSlawomir Ptak 	int i;
4421cc4498acSSlawomir Ptak 
4422cc4498acSSlawomir Ptak 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK |
4423cc4498acSSlawomir Ptak 		    SPDK_DIF_FLAGS_REFTAG_CHECK;
4424cc4498acSSlawomir Ptak 
4425cc4498acSSlawomir Ptak 	/* data[0][2047:0] */
4426cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[0], 2048);
4427cc4498acSSlawomir Ptak 
4428cc4498acSSlawomir Ptak 	/* data[0][4095:2048], data[1][2047:0] */
4429cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[1], 2048 + 2048);
4430cc4498acSSlawomir Ptak 
4431cc4498acSSlawomir Ptak 	/* data[1][3071:2048] */
4432cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[2], 1024);
4433cc4498acSSlawomir Ptak 
4434cc4498acSSlawomir Ptak 	/* data[1][3072] */
4435cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[3], 1);
4436cc4498acSSlawomir Ptak 
4437cc4498acSSlawomir Ptak 	/* data[1][4094:3073] */
4438cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[4], 1022);
4439cc4498acSSlawomir Ptak 
4440cc4498acSSlawomir Ptak 	/* data[1][4095], data[2][4095:0], data[3][4095:0] */
4441cc4498acSSlawomir Ptak 	_iov_alloc_buf(&iovs[5], 1 + 4096 * 2);
4442cc4498acSSlawomir Ptak 
4443cc4498acSSlawomir Ptak 	_iov_alloc_buf(&md_iov, 128 * 4);
4444cc4498acSSlawomir Ptak 
4445cc4498acSSlawomir Ptak 	dix_generate_remap_and_verify(iovs, 6, &md_iov, 4096, 128, 4, false, SPDK_DIF_TYPE1,
4446f7bc9635SSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_32);
44475256f0efSSlawomir Ptak 	dix_generate_remap_and_verify(iovs, 6, &md_iov, 4096, 128, 4, false, SPDK_DIF_TYPE1,
44485256f0efSSlawomir Ptak 				      dif_flags, 22, 99, 0xFFFF, 0x22, SPDK_DIF_PI_FORMAT_64);
44497e70c3d1SShuhei Matsumoto 
44507e70c3d1SShuhei Matsumoto 	for (i = 0; i < 6; i++) {
44517e70c3d1SShuhei Matsumoto 		_iov_free_buf(&iovs[i]);
44527e70c3d1SShuhei Matsumoto 	}
44537e70c3d1SShuhei Matsumoto 	_iov_free_buf(&md_iov);
44547e70c3d1SShuhei Matsumoto }
44557e70c3d1SShuhei Matsumoto 
4456247e4e6eSChangpeng Liu static void
4457247e4e6eSChangpeng Liu dif_generate_and_verify_unmap_test(void)
4458247e4e6eSChangpeng Liu {
4459247e4e6eSChangpeng Liu 	struct iovec iov;
4460247e4e6eSChangpeng Liu 	struct spdk_dif_ctx ctx = {};
4461247e4e6eSChangpeng Liu 	int rc;
4462247e4e6eSChangpeng Liu 	struct spdk_dif_ctx_init_ext_opts dif_opts;
4463247e4e6eSChangpeng Liu 	uint32_t dif_flags;
4464247e4e6eSChangpeng Liu 	struct spdk_dif *dif;
4465247e4e6eSChangpeng Liu 
4466247e4e6eSChangpeng Liu 	_iov_alloc_buf(&iov, 4096 + 128);
4467247e4e6eSChangpeng Liu 
4468247e4e6eSChangpeng Liu 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
4469247e4e6eSChangpeng Liu 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
4470247e4e6eSChangpeng Liu 	dif = (struct spdk_dif *)(iov.iov_base + 4096);
4471247e4e6eSChangpeng Liu 
4472247e4e6eSChangpeng Liu 	/* Case 1 for TYPE1 */
4473247e4e6eSChangpeng Liu 	memset(iov.iov_base, 0, 4096 + 128);
4474247e4e6eSChangpeng Liu 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK | SPDK_DIF_FLAGS_REFTAG_CHECK;
4475247e4e6eSChangpeng Liu 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, true, SPDK_DIF_TYPE1, dif_flags,
4476247e4e6eSChangpeng Liu 			       0x100, 0xFFFF, SPDK_DIF_APPTAG_IGNORE, 0, 0, &dif_opts);
4477247e4e6eSChangpeng Liu 	CU_ASSERT(rc == 0);
4478247e4e6eSChangpeng Liu 
4479247e4e6eSChangpeng Liu 	rc = spdk_dif_generate(&iov, 1, 1, &ctx);
4480247e4e6eSChangpeng Liu 	CU_ASSERT(rc == 0);
4481247e4e6eSChangpeng Liu 
4482247e4e6eSChangpeng Liu 	rc = spdk_dif_verify(&iov, 1, 1, &ctx, NULL);
4483247e4e6eSChangpeng Liu 	CU_ASSERT(rc == 0);
4484247e4e6eSChangpeng Liu 
4485247e4e6eSChangpeng Liu 	CU_ASSERT(_dif_get_apptag(dif, ctx.dif_pi_format) == SPDK_DIF_APPTAG_IGNORE);
4486247e4e6eSChangpeng Liu 	CU_ASSERT(_dif_get_reftag(dif, ctx.dif_pi_format) == 0x100);
4487247e4e6eSChangpeng Liu 
4488247e4e6eSChangpeng Liu 	/* Case 2 for TYPE3 */
4489247e4e6eSChangpeng Liu 	memset(iov.iov_base, 0, 4096 + 128);
4490247e4e6eSChangpeng Liu 
4491247e4e6eSChangpeng Liu 	dif_flags = SPDK_DIF_FLAGS_GUARD_CHECK | SPDK_DIF_FLAGS_APPTAG_CHECK | SPDK_DIF_FLAGS_REFTAG_CHECK;
4492247e4e6eSChangpeng Liu 	rc = spdk_dif_ctx_init(&ctx, 4096 + 128, 128, true, true, SPDK_DIF_TYPE3, dif_flags,
4493247e4e6eSChangpeng Liu 			       SPDK_DIF_REFTAG_IGNORE, 0xFFFF, SPDK_DIF_APPTAG_IGNORE, 0, 0, &dif_opts);
4494247e4e6eSChangpeng Liu 	CU_ASSERT(rc == 0);
4495247e4e6eSChangpeng Liu 
4496247e4e6eSChangpeng Liu 	rc = spdk_dif_generate(&iov, 1, 1, &ctx);
4497247e4e6eSChangpeng Liu 	CU_ASSERT(rc == 0);
4498247e4e6eSChangpeng Liu 
4499247e4e6eSChangpeng Liu 	rc = spdk_dif_verify(&iov, 1, 1, &ctx, NULL);
4500247e4e6eSChangpeng Liu 	CU_ASSERT(rc == 0);
4501247e4e6eSChangpeng Liu 
4502247e4e6eSChangpeng Liu 	CU_ASSERT(_dif_get_apptag(dif, ctx.dif_pi_format) == SPDK_DIF_APPTAG_IGNORE);
4503247e4e6eSChangpeng Liu 	CU_ASSERT(_dif_get_reftag(dif, ctx.dif_pi_format) == REFTAG_MASK_16);
4504247e4e6eSChangpeng Liu 
4505247e4e6eSChangpeng Liu 	_iov_free_buf(&iov);
4506247e4e6eSChangpeng Liu }
4507247e4e6eSChangpeng Liu 
450846854e4cSShuhei Matsumoto static void
450946854e4cSShuhei Matsumoto dif_pi_format_check_test(void)
451046854e4cSShuhei Matsumoto {
451146854e4cSShuhei Matsumoto 	CU_ASSERT(_dif_pi_format_is_valid(SPDK_DIF_PI_FORMAT_16) == true);
451246854e4cSShuhei Matsumoto 	CU_ASSERT(_dif_pi_format_is_valid(SPDK_DIF_PI_FORMAT_32) == true);
451346854e4cSShuhei Matsumoto 	CU_ASSERT(_dif_pi_format_is_valid(SPDK_DIF_PI_FORMAT_64) == true);
451446854e4cSShuhei Matsumoto 	CU_ASSERT(_dif_pi_format_is_valid(SPDK_DIF_PI_FORMAT_64 + 1) == false);
451546854e4cSShuhei Matsumoto }
451646854e4cSShuhei Matsumoto 
4517baa0c332SShuhei Matsumoto static void
4518baa0c332SShuhei Matsumoto dif_type_check_test(void)
4519baa0c332SShuhei Matsumoto {
4520baa0c332SShuhei Matsumoto 	CU_ASSERT(_dif_type_is_valid(SPDK_DIF_DISABLE) == true);
4521baa0c332SShuhei Matsumoto 	CU_ASSERT(_dif_type_is_valid(SPDK_DIF_TYPE1) == true);
4522baa0c332SShuhei Matsumoto 	CU_ASSERT(_dif_type_is_valid(SPDK_DIF_TYPE2) == true);
4523baa0c332SShuhei Matsumoto 	CU_ASSERT(_dif_type_is_valid(SPDK_DIF_TYPE3) == true);
4524baa0c332SShuhei Matsumoto 	CU_ASSERT(_dif_type_is_valid(SPDK_DIF_TYPE3 + 1) == false);
4525baa0c332SShuhei Matsumoto }
4526baa0c332SShuhei Matsumoto 
45278b6c22b1SShuhei Matsumoto int
45288b6c22b1SShuhei Matsumoto main(int argc, char **argv)
45298b6c22b1SShuhei Matsumoto {
45308b6c22b1SShuhei Matsumoto 	CU_pSuite	suite = NULL;
45318b6c22b1SShuhei Matsumoto 	unsigned int	num_failures;
45328b6c22b1SShuhei Matsumoto 
453378b696bcSVitaliy Mysak 	CU_initialize_registry();
45348b6c22b1SShuhei Matsumoto 
45358b6c22b1SShuhei Matsumoto 	suite = CU_add_suite("dif", NULL, NULL);
45368b6c22b1SShuhei Matsumoto 
4537dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_generate_and_verify_test);
4538dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_disable_check_test);
4539cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, dif_generate_and_verify_different_pi_formats_test);
4540b648aca5SSlawomir Ptak 	CU_ADD_TEST(suite, dif_apptag_mask_test);
4541f7d49034SShuhei Matsumoto 	CU_ADD_TEST(suite, dif_sec_8_md_8_error_test);
4542dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_0_error_test);
4543f7d49034SShuhei Matsumoto 	CU_ADD_TEST(suite, dif_sec_512_md_16_error_test);
4544f7d49034SShuhei Matsumoto 	CU_ADD_TEST(suite, dif_sec_4096_md_0_8_error_test);
45455256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4100_md_128_error_test);
4546dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_guard_seed_test);
4547cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, dif_guard_value_test);
4548dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_disable_sec_512_md_8_single_iov_test);
4549dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_0_single_iov_test);
45505256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_0_single_iov_test);
4551dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_0_1_2_4_multi_iovs_test);
45525256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test);
4553dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_test);
4554dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_7_multi_iovs_split_data_and_md_test);
45555256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_split_data_and_md_test);
4556dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_7_multi_iovs_split_data_test);
45575256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_split_data_test);
4558dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_7_multi_iovs_split_guard_test);
45595256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_split_guard_test);
4560dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_7_multi_iovs_split_apptag_test);
45615256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_split_apptag_test);
4562dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_7_multi_iovs_split_reftag_test);
45635256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_split_reftag_test);
4564dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_7_multi_iovs_complex_splits_test);
4565dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_test);
4566dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_test);
4567dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_data_and_md_test);
4568dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_data_test);
4569dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_guard_test);
45705256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_apptag_pi_16_test);
4571dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_apptag_test);
45725256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_reftag_pi_16_test);
4573dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_reftag_test);
4574dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_copy_sec_512_md_8_prchk_0_single_iov);
45754b88d742SShuhei Matsumoto 	CU_ADD_TEST(suite, dif_copy_sec_512_md_8_dif_disable_single_iov);
45765256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_copy_sec_4096_md_128_prchk_0_single_iov_test);
4577dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_copy_sec_512_md_8_prchk_0_1_2_4_multi_iovs);
45785256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test);
45792de3092aSShuhei Matsumoto 	CU_ADD_TEST(suite, dif_copy_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test);
4580*92fb2251SShuhei Matsumoto 	CU_ADD_TEST(suite, nvme_pract_sec_4096_md_128_prchk_0_1_2_4_multi_bounce_iovs_test);
4581dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_copy_sec_4096_md_128_prchk_7_multi_iovs);
4582dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_copy_sec_512_md_8_prchk_7_multi_iovs_split_data);
45835256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_copy_sec_4096_md_128_prchk_7_multi_iovs_split_data_test);
4584dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_copy_sec_512_md_8_prchk_7_multi_iovs_complex_splits);
45852de3092aSShuhei Matsumoto 	CU_ADD_TEST(suite, dif_copy_sec_512_md_8_prchk_7_multi_bounce_iovs_complex_splits);
45864b88d742SShuhei Matsumoto 	CU_ADD_TEST(suite, dif_copy_sec_512_md_8_dif_disable_multi_bounce_iovs_complex_splits);
45875256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_copy_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_test);
4588*92fb2251SShuhei Matsumoto 	CU_ADD_TEST(suite, nvme_pract_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_test);
4589dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_copy_sec_4096_md_128_inject_1_2_4_8_multi_iovs_test);
4590dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_copy_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_test);
4591f7d49034SShuhei Matsumoto 	CU_ADD_TEST(suite, dix_sec_0_md_8_error);
4592dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_512_md_0_error);
4593f7d49034SShuhei Matsumoto 	CU_ADD_TEST(suite, dix_sec_512_md_16_error);
4594f7d49034SShuhei Matsumoto 	CU_ADD_TEST(suite, dix_sec_4096_md_0_8_error);
4595dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_512_md_8_prchk_0_single_iov);
45965256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_prchk_0_single_iov_test);
4597dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_512_md_8_prchk_0_1_2_4_multi_iovs);
45985256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_prchk_0_1_2_4_multi_iovs_test);
4599dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_prchk_7_multi_iovs);
4600dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_512_md_8_prchk_7_multi_iovs_split_data);
46015256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_prchk_7_multi_iovs_split_data_test);
4602dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_512_md_8_prchk_7_multi_iovs_complex_splits);
46035256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_test);
4604dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_inject_1_2_4_8_multi_iovs_test);
4605dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_inject_1_2_4_8_multi_iovs_split_test);
4606dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, set_md_interleave_iovs_test);
4607dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, set_md_interleave_iovs_split_test);
4608cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, dif_generate_stream_pi_16_test);
46095256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_generate_stream_test);
4610dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, set_md_interleave_iovs_alignment_test);
4611cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, dif_generate_split_test);
4612dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, set_md_interleave_iovs_multi_segments_test);
4613cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, dif_verify_split_test);
4614dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_verify_stream_multi_segments_test);
4615cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, update_crc32c_pi_16_test);
46165256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, update_crc32c_test);
4617cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, dif_update_crc32c_split_test);
4618dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_update_crc32c_stream_multi_segments_test);
4619dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, get_range_with_md_test);
4620cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_512_md_8_prchk_7_multi_iovs_remap_pi_16_test);
46215256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_remap_test);
4622dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dif_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_remap_test);
4623dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_prchk_7_multi_iovs_remap);
4624cc4498acSSlawomir Ptak 	CU_ADD_TEST(suite, dix_sec_512_md_8_prchk_7_multi_iovs_complex_splits_remap_pi_16_test);
46255256f0efSSlawomir Ptak 	CU_ADD_TEST(suite, dix_sec_4096_md_128_prchk_7_multi_iovs_complex_splits_remap_test);
4626247e4e6eSChangpeng Liu 	CU_ADD_TEST(suite, dif_generate_and_verify_unmap_test);
462746854e4cSShuhei Matsumoto 	CU_ADD_TEST(suite, dif_pi_format_check_test);
4628baa0c332SShuhei Matsumoto 	CU_ADD_TEST(suite, dif_type_check_test);
46298b6c22b1SShuhei Matsumoto 
4630ea941caeSKonrad Sztyber 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
46318b6c22b1SShuhei Matsumoto 
46328b6c22b1SShuhei Matsumoto 	CU_cleanup_registry();
46338b6c22b1SShuhei Matsumoto 
46348b6c22b1SShuhei Matsumoto 	return num_failures;
46358b6c22b1SShuhei Matsumoto }
4636