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