diff --git a/Makefile.am b/Makefile.am index 01c0daa..1e0a677 100644 --- a/Makefile.am +++ b/Makefile.am @@ -200,6 +200,7 @@ bin_iscsi_test_cu_SOURCES = test-tool/iscsi-test-cu.c \ test-tool/test_iscsi_cmdsn_toolow.c \ test-tool/test_mandatory_sbc.c \ test-tool/test_modesense6_all_pages.c \ + test-tool/test_modesense6_residuals.c \ test-tool/test_nomedia_sbc.c \ test-tool/test_orwrite_simple.c \ test-tool/test_orwrite_beyond_eol.c \ diff --git a/test-tool/iscsi-test-cu.c b/test-tool/iscsi-test-cu.c index 9f2f02d..6818c6a 100644 --- a/test-tool/iscsi-test-cu.c +++ b/test-tool/iscsi-test-cu.c @@ -84,6 +84,7 @@ static CU_TestInfo tests_mandatory[] = { static CU_TestInfo tests_modesense6[] = { { (char *)"AllPages", test_modesense6_all_pages }, + { (char *)"Residuals", test_modesense6_residuals }, CU_TEST_INFO_NULL }; diff --git a/test-tool/iscsi-test-cu.h b/test-tool/iscsi-test-cu.h index 8132ea4..4b8d6b4 100644 --- a/test-tool/iscsi-test-cu.h +++ b/test-tool/iscsi-test-cu.h @@ -57,6 +57,7 @@ void test_iscsi_cmdsn_toolow(void); void test_mandatory_sbc(void); void test_modesense6_all_pages(void); +void test_modesense6_residuals(void); void test_nomedia_sbc(void); diff --git a/test-tool/test_modesense6_residuals.c b/test-tool/test_modesense6_residuals.c new file mode 100644 index 0000000..9acb9bc --- /dev/null +++ b/test-tool/test_modesense6_residuals.c @@ -0,0 +1,110 @@ +/* + Copyright (C) 2013 by Ronnie Sahlberg + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . +*/ + +#include + +#include + +#include "iscsi.h" +#include "scsi-lowlevel.h" +#include "iscsi-support.h" +#include "iscsi-test-cu.h" + +void +test_modesense6_residuals(void) +{ + logging(LOG_VERBOSE, LOG_BLANK_LINE); + logging(LOG_VERBOSE, "Test of MODESENSE6 Residuals"); + + logging(LOG_VERBOSE, "MODESENSE6 command should not result in any " + "residuals"); + + + logging(LOG_VERBOSE, "Try a MODESENSE6 command with 4 bytes of " + "transfer length and verify that we dont get residuals."); + if (task != NULL) { + scsi_free_scsi_task(task); + task = NULL; + } + task = iscsi_modesense6_sync(iscsic, tgt_lun, 0, + SCSI_MODESENSE_PC_CURRENT, + SCSI_MODESENSE_PAGECODE_RETURN_ALL_PAGES, + 0, 4); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + logging(LOG_VERBOSE, "[FAILED] Failed to send MODE_SENSE6 " + "command:%s", + iscsi_get_error(iscsic)); + CU_FAIL("[FAILED] Failed to fetch the All Pages page."); + return; + } + logging(LOG_VERBOSE, "[SUCCESS] All Pages fetched."); + + + logging(LOG_VERBOSE, "Verify that we got at most 4 bytes of DATA-IN"); + if (task->datain.size > 4) { + logging(LOG_NORMAL, "[FAILED] got more than 4 bytes of " + "DATA-IN."); + } else { + logging(LOG_VERBOSE, "[SUCCESS] <= 4 bytes of DATA-IN " + "received."); + } + CU_ASSERT_TRUE(task->datain.size <= 4); + + + logging(LOG_VERBOSE, "Verify residual overflow flag not set"); + if (task->residual_status == SCSI_RESIDUAL_OVERFLOW) { + logging(LOG_VERBOSE, "[FAILED] Target set residual " + "overflow flag"); + } + CU_ASSERT_NOT_EQUAL(task->residual_status, SCSI_RESIDUAL_OVERFLOW); + + + + logging(LOG_VERBOSE, "Try a MODESENSE6 command with 255 bytes of " + "transfer length and verify that we dont get residuals."); + if (task != NULL) { + scsi_free_scsi_task(task); + task = NULL; + } + task = iscsi_modesense6_sync(iscsic, tgt_lun, 0, + SCSI_MODESENSE_PC_CURRENT, + SCSI_MODESENSE_PAGECODE_RETURN_ALL_PAGES, + 0, 255); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + logging(LOG_VERBOSE, "[FAILED] Failed to send MODE_SENSE6 " + "command:%s", + iscsi_get_error(iscsic)); + CU_FAIL("[FAILED] Failed to fetch the All Pages page."); + return; + } + logging(LOG_VERBOSE, "[SUCCESS] All Pages fetched."); + + + logging(LOG_VERBOSE, "Verify residual underflow flag not set"); + if (task->residual_status == SCSI_RESIDUAL_UNDERFLOW) { + logging(LOG_VERBOSE, "[FAILED] Target set residual " + "underflow flag"); + } + CU_ASSERT_NOT_EQUAL(task->residual_status, SCSI_RESIDUAL_UNDERFLOW); + + + + if (task != NULL) { + scsi_free_scsi_task(task); + task = NULL; + } +}