From 8dbf6e51e23628ad3ca0b9fa83de78a544ed76a4 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Tue, 17 Mar 2020 15:52:07 +0100 Subject: [PATCH 1/2] test: use scsi_set_uintX marshalling helpers for XCOPY Signed-off-by: David Disseldorp --- test-tool/iscsi-support.c | 53 +++++++++++---------------------------- test-tool/iscsi-support.h | 6 ++--- 2 files changed, 17 insertions(+), 42 deletions(-) diff --git a/test-tool/iscsi-support.c b/test-tool/iscsi-support.c index 0d4c9c1..32be830 100644 --- a/test-tool/iscsi-support.c +++ b/test-tool/iscsi-support.c @@ -2946,12 +2946,11 @@ void populate_ident_tgt_desc(unsigned char *buf, struct scsi_device *dev) scsi_free_scsi_task(inq_di_task); } -int populate_tgt_desc(unsigned char *desc, enum ec_descr_type_code desc_type, int luid_type, int nul, int peripheral_type, int rel_init_port_id, int pad, struct scsi_device *dev) +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) { desc[0] = desc_type; desc[1] = (luid_type << 6) | (nul << 5) | peripheral_type; - desc[2] = (rel_init_port_id >> 8) & 0xFF; - desc[3] = rel_init_port_id & 0xFF; + scsi_set_uint16(&desc[2], rel_init_port_id); if (desc_type == IDENT_DESCR_TGT_DESCR) populate_ident_tgt_desc(desc+4, dev); @@ -2967,44 +2966,27 @@ int populate_tgt_desc(unsigned char *desc, enum ec_descr_type_code desc_type, in return get_desc_len(desc_type); } -int populate_seg_desc_hdr(unsigned char *hdr, enum ec_descr_type_code desc_type, int dc, int cat, int src_index, int dst_index) +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 desc_len = get_desc_len(desc_type); hdr[0] = desc_type; hdr[1] = ((dc << 1) | cat) & 0xFF; - hdr[2] = (desc_len >> 8) & 0xFF; - hdr[3] = (desc_len - SEG_DESC_SRC_INDEX_OFFSET) & 0xFF; /* don't account for the first 4 bytes in descriptor header*/ - hdr[4] = (src_index >> 8) & 0xFF; - hdr[5] = src_index & 0xFF; - hdr[6] = (dst_index >> 8) & 0xFF; - hdr[7] = dst_index & 0xFF; + /* don't account for the first 4 bytes in descriptor header */ + scsi_set_uint16(&hdr[2], (desc_len - SEG_DESC_SRC_INDEX_OFFSET)); + scsi_set_uint16(&hdr[4], src_index); + scsi_set_uint16(&hdr[6], dst_index); return desc_len; } -int populate_seg_desc_b2b(unsigned char *desc, int dc, int cat, int src_index, int dst_index, int num_blks, uint64_t src_lba, uint64_t dst_lba) +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 desc_len = populate_seg_desc_hdr(desc, BLK_TO_BLK_SEG_DESCR, dc, cat, src_index, dst_index); - desc[10] = (num_blks >> 8) & 0xFF; - desc[11] = num_blks & 0xFF; - desc[12] = (src_lba >> 56) & 0xFF; - desc[13] = (src_lba >> 48) & 0xFF; - desc[14] = (src_lba >> 40) & 0xFF; - desc[15] = (src_lba >> 32) & 0xFF; - desc[16] = (src_lba >> 24) & 0xFF; - desc[17] = (src_lba >> 16) & 0xFF; - desc[18] = (src_lba >> 8) & 0xFF; - desc[19] = src_lba & 0xFF; - desc[20] = (dst_lba >> 56) & 0xFF; - desc[21] = (dst_lba >> 48) & 0xFF; - desc[22] = (dst_lba >> 40) & 0xFF; - desc[23] = (dst_lba >> 32) & 0xFF; - desc[24] = (dst_lba >> 24) & 0xFF; - desc[25] = (dst_lba >> 16) & 0xFF; - desc[26] = (dst_lba >> 8) & 0xFF; - desc[27] = dst_lba & 0xFF; + scsi_set_uint16(&desc[10], num_blks); + scsi_set_uint64(&desc[12], src_lba); + scsi_set_uint64(&desc[20], dst_lba); return desc_len; } @@ -3013,16 +2995,9 @@ void populate_param_header(unsigned char *buf, int list_id, int str, int list_id { buf[0] = list_id; buf[1] = ((str & 1) << 5) | ((list_id_usage & 3) << 3) | (prio & 7); - buf[2] = (tgt_desc_len >> 8) & 0xFF; - buf[3] = tgt_desc_len & 0xFF; - buf[8] = (seg_desc_len >> 24) & 0xFF; - buf[9] = (seg_desc_len >> 16) & 0xFF; - buf[10] = (seg_desc_len >> 8) & 0xFF; - buf[11] = seg_desc_len & 0xFF; - buf[12] = (inline_data_len >> 24) & 0xFF; - buf[13] = (inline_data_len >> 16) & 0xFF; - buf[14] = (inline_data_len >> 8) & 0xFF; - buf[15] = inline_data_len & 0xFF; + scsi_set_uint16(&buf[2], tgt_desc_len); + scsi_set_uint32(&buf[8], seg_desc_len); + scsi_set_uint32(&buf[12], inline_data_len); } int receive_copy_results(struct scsi_task **task, struct scsi_device *sdev, diff --git a/test-tool/iscsi-support.h b/test-tool/iscsi-support.h index 7b9c4de..4444c3c 100644 --- a/test-tool/iscsi-support.h +++ b/test-tool/iscsi-support.h @@ -914,9 +914,9 @@ int clear_swp(struct scsi_device *sdev); int extendedcopy(struct scsi_device *sdev, struct iscsi_data *data, int status, enum scsi_sense_key key, int *ascq, int num_ascq); 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, int 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, int src_index, int dst_index); -int populate_seg_desc_b2b(unsigned char *desc, int dc, int cat, int src_index, int dst_index, int num_blks, uint64_t src_lba, uint64_t dst_lba); +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); 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, From da7c1c4b0a4a857abd9f9ed066cad41e689de676 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Tue, 17 Mar 2020 18:09:05 +0100 Subject: [PATCH 2/2] test: use spec defined XCOPY segment descriptor lengths The SPC4r37 specification defines XCOPY Segment Descriptor lengths for each SD type. The spec defined SD lengths don't account for the four SD header bytes. To make it easier to match the spec to the implementation, use the spec defined lengths in get_desc_len() with a four byte SD header addition. Signed-off-by: David Disseldorp --- test-tool/iscsi-support.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test-tool/iscsi-support.c b/test-tool/iscsi-support.c index 32be830..0e224bb 100644 --- a/test-tool/iscsi-support.c +++ b/test-tool/iscsi-support.c @@ -2867,6 +2867,7 @@ int extendedcopy(struct scsi_device *sdev, struct iscsi_data *data, int status, return ret; } +/* return the length for a give descriptor type, including any SD header */ int get_desc_len(enum ec_descr_type_code desc_type) { int desc_len = 0; @@ -2874,16 +2875,16 @@ int get_desc_len(enum ec_descr_type_code desc_type) /* Segment Descriptors */ case BLK_TO_STRM_SEG_DESCR: case STRM_TO_BLK_SEG_DESCR: - desc_len = 0x18; + desc_len = 0x14 + SEG_DESC_SRC_INDEX_OFFSET; break; case BLK_TO_BLK_SEG_DESCR: - desc_len = 0x1C; + desc_len = 0x18 + SEG_DESC_SRC_INDEX_OFFSET; break; case STRM_TO_STRM_SEG_DESCR: - desc_len = 0x14; + desc_len = 0x10 + SEG_DESC_SRC_INDEX_OFFSET; break; - /* Target Descriptors */ + /* Target Descriptors */ case IPV6_TGT_DESCR: case IP_COPY_SVC_TGT_DESCR: desc_len = 64;