From c8992f45b1e5f13fcb78f248f552c7afea662967 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Wed, 18 Mar 2020 15:04:11 +0100 Subject: [PATCH] test: add support for 0x0A type XCOPY segment descriptors Type 0x0A segment descriptors provide a 32-bit wide number-of-bytes field, allowing for much larger copy offloads with a single segment descriptor. Signed-off-by: David Disseldorp --- include/scsi-lowlevel.h | 1 + test-tool/iscsi-support.c | 20 ++++++++++++++++++++ test-tool/iscsi-support.h | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/include/scsi-lowlevel.h b/include/scsi-lowlevel.h index bedefd8..a70dcf7 100644 --- a/include/scsi-lowlevel.h +++ b/include/scsi-lowlevel.h @@ -1167,6 +1167,7 @@ enum ec_descr_type_code { STRM_TO_BLK_SEG_DESCR = 0x01, BLK_TO_BLK_SEG_DESCR = 0x02, STRM_TO_STRM_SEG_DESCR = 0x03, + BLK_TO_BLK_OFF_SEG_DESCR = 0x0A, /* Target descriptors : 0xEO to 0xFE */ IDENT_DESCR_TGT_DESCR = 0xE4, diff --git a/test-tool/iscsi-support.c b/test-tool/iscsi-support.c index 0e224bb..498e06e 100644 --- a/test-tool/iscsi-support.c +++ b/test-tool/iscsi-support.c @@ -2883,6 +2883,9 @@ int get_desc_len(enum ec_descr_type_code desc_type) case STRM_TO_STRM_SEG_DESCR: desc_len = 0x10 + SEG_DESC_SRC_INDEX_OFFSET; break; + case BLK_TO_BLK_OFF_SEG_DESCR: + desc_len = 0x1C + SEG_DESC_SRC_INDEX_OFFSET; + break; /* Target Descriptors */ case IPV6_TGT_DESCR: @@ -2992,6 +2995,23 @@ int populate_seg_desc_b2b(unsigned char *desc, int dc, int cat, int src_index, i return desc_len; } +int populate_seg_desc_b2b_off(unsigned char *desc, int cat, int src_index, + int dst_index, uint32_t num_bytes, + uint64_t src_lba, uint64_t dst_lba, + uint16_t src_byte_off, uint16_t dst_byte_off) +{ + int desc_len = populate_seg_desc_hdr(desc, BLK_TO_BLK_OFF_SEG_DESCR, 0, + cat, src_index, dst_index); + + scsi_set_uint32(&desc[8], num_bytes); + scsi_set_uint64(&desc[12], src_lba); + scsi_set_uint64(&desc[20], dst_lba); + scsi_set_uint16(&desc[28], src_byte_off); + scsi_set_uint16(&desc[30], dst_byte_off); + + return desc_len; +} + void populate_param_header(unsigned char *buf, int list_id, int str, int list_id_usage, int prio, int tgt_desc_len, int seg_desc_len, int inline_data_len) { buf[0] = list_id; diff --git a/test-tool/iscsi-support.h b/test-tool/iscsi-support.h index 4444c3c..78a20cc 100644 --- a/test-tool/iscsi-support.h +++ b/test-tool/iscsi-support.h @@ -917,6 +917,10 @@ int get_desc_len(enum ec_descr_type_code desc_type); int populate_tgt_desc(unsigned char *desc, enum ec_descr_type_code desc_type, int luid_type, int nul, int peripheral_type, uint16_t rel_init_port_id, int pad, struct scsi_device *dev); int populate_seg_desc_hdr(unsigned char *hdr, enum ec_descr_type_code desc_type, int dc, int cat, uint16_t src_index, uint16_t dst_index); int populate_seg_desc_b2b(unsigned char *desc, int dc, int cat, int src_index, int dst_index, uint16_t num_blks, uint64_t src_lba, uint64_t dst_lba); +int populate_seg_desc_b2b_off(unsigned char *desc, int cat, int src_index, + int dst_index, uint32_t num_bytes, + uint64_t src_lba, uint64_t dst_lba, + uint16_t src_byte_off, uint16_t dst_byte_off); void populate_param_header(unsigned char *buf, int list_id, int str, int list_id_usage, int prio, int tgt_desc_len, int seg_desc_len, int inline_data_len); int receive_copy_results(struct scsi_task **task, struct scsi_device *sdev, enum scsi_copy_results_sa sa, int list_id,