static void nvmf_test_create_session(void) { int fake_session_count = 5; int i; struct nvmf_session *session; struct spdk_nvmf_subsystem *subsystem; /* create session in non-exist subsystem */ CU_ASSERT_PTR_NULL(nvmf_create_session("subsystem2")); /* create session and check init values */ subsystem = nvmf_find_subsystem("subsystem1"); session = nvmf_create_session("subsystem1"); SPDK_CU_ASSERT_FATAL(session != NULL); CU_ASSERT_EQUAL(session->cntlid, SS_SC_CNTLID); CU_ASSERT_TRUE(session->is_valid); CU_ASSERT_EQUAL(session->num_connections, 0); CU_ASSERT_EQUAL(session->active_queues, 0); CU_ASSERT_EQUAL(subsystem->num_sessions, 1); /* add multi-sessions to one subsystem * if multi-sessions is not suported in the future * we need to change the check condition. */ for (i = 0; i != fake_session_count; i++) { nvmf_create_session("subsystem1"); } CU_ASSERT_EQUAL(session->subsys->num_sessions, fake_session_count + 1); }
static void nvmf_test_delete_subsystem(void) { struct spdk_nvmf_subsystem *subsystem; struct nvmf_session *sess; sess = nvmf_create_session("subsystem1"); SPDK_CU_ASSERT_FATAL(sess != NULL); subsystem = nvmf_find_subsystem("subsystem1"); CU_ASSERT_EQUAL(nvmf_delete_subsystem(subsystem), 0); }
static void nvmf_test_find_subsystem(void) { struct spdk_nvmf_subsystem *subsystem; //char long_name[MAX_NQN_SIZE]; CU_ASSERT_PTR_NULL(nvmf_find_subsystem(NULL)); subsystem = nvmf_find_subsystem("subsystem1"); CU_ASSERT_EQUAL(subsystem->num, 1); CU_ASSERT_STRING_EQUAL(subsystem->subnqn, "subsystem1"); /* check long name */ /* segment fault. Comment it */ /* memset(long_name, 'a', MAX_NQN_SIZE); subsystem = nvmf_find_subsystem(long_name); CU_ASSERT_EQUAL(subsystem->num, 2); CU_ASSERT_STRING_EQUAL(subsystem->subnqn, long_name); */ /* check none-exist subsystem */ CU_ASSERT_PTR_NULL(nvmf_find_subsystem("fake")); }
static spdk_nvmf_request_exec_status nvmf_process_connect(struct spdk_nvmf_request *req) { struct spdk_nvmf_subsystem *subsystem; struct spdk_nvmf_fabric_connect_data *data = (struct spdk_nvmf_fabric_connect_data *) req->data; struct spdk_nvmf_fabric_connect_cmd *cmd = &req->cmd->connect_cmd; struct spdk_nvmf_fabric_connect_rsp *rsp = &req->rsp->connect_rsp; void *end; #define INVALID_CONNECT_DATA(field) invalid_connect_response(rsp, 1, offsetof(struct spdk_nvmf_fabric_connect_data, field)) if (cmd->recfmt != 0) { SPDK_ERRLOG("Connect command unsupported RECFMT %u\n", cmd->recfmt); rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC; rsp->status.sc = SPDK_NVMF_FABRIC_SC_INCOMPATIBLE_FORMAT; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } if (req->length < sizeof(struct spdk_nvmf_fabric_connect_data)) { SPDK_ERRLOG("Connect command data length 0x%x too small\n", req->length); req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_INVALID_FIELD; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } /* Ensure that subnqn and hostnqn are null terminated */ end = memchr(data->subnqn, '\0', SPDK_NVMF_NQN_MAX_LEN); if (!end) { SPDK_ERRLOG("Connect SUBNQN is not null terminated\n"); INVALID_CONNECT_DATA(subnqn); return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } end = memchr(data->hostnqn, '\0', SPDK_NVMF_NQN_MAX_LEN); if (!end) { SPDK_ERRLOG("Connect HOSTNQN is not null terminated\n"); INVALID_CONNECT_DATA(hostnqn); return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } /* Look up the requested subsystem */ subsystem = nvmf_find_subsystem(data->subnqn, data->hostnqn); if (subsystem == NULL) { SPDK_ERRLOG("Could not find subsystem '%s'\n", data->subnqn); INVALID_CONNECT_DATA(subnqn); return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } subsystem->connect_cb(subsystem->cb_ctx, req); return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; }
static void nvmf_test_check_io_completions(void) { struct nvmf_session *sess; struct spdk_nvmf_subsystem *subsystem; struct spdk_nvme_ctrlr ctrlr1, ctrlr2; int i; ctrlr1.a = 1; ctrlr2.a = 2; sess = nvmf_find_session_by_id("subsystem1", SS_SC_CNTLID); subsystem = nvmf_find_subsystem("subsystem1"); /* preload ns_list_map */ #define PRELOAD_NS_LIST(index, nvme_ctrlr, ns_id) \ do { \ subsystem->ns_list_map[index].ctrlr = nvme_ctrlr; \ subsystem->ns_list_map[index].qpair = spdk_nvme_ctrlr_alloc_io_qpair(nvme_ctrlr, 0); \ subsystem->ns_list_map[index].ns = NULL; \ subsystem->ns_list_map[index].nvme_ns_id = ns_id; \ \ } while (0) for (i = 0; i < MAX_PER_SUBSYSTEM_NAMESPACES; i++) { PRELOAD_NS_LIST(i, NULL, 0); } PRELOAD_NS_LIST(0, &ctrlr1, 4); PRELOAD_NS_LIST(1, &ctrlr1, 1); PRELOAD_NS_LIST(2, &ctrlr2, 2); PRELOAD_NS_LIST(3, NULL, 1); PRELOAD_NS_LIST(4, &ctrlr1, 3); PRELOAD_NS_LIST(5, &ctrlr1, 1); PRELOAD_NS_LIST(6, &ctrlr1, 2); PRELOAD_NS_LIST(7, NULL, 2); PRELOAD_NS_LIST(8, NULL, 3); PRELOAD_NS_LIST(9, &ctrlr2, 4); #undef PRELOAD_NS_LIST /* make sure the check completion is done by * ctrlr1,ctrlr2,ctrlr1,ctrlr2 */ controller_checked[0] = -1; nvmf_check_io_completions(sess); CU_ASSERT_EQUAL(controller_checked[0], 1); CU_ASSERT_EQUAL(controller_checked[1], 2); CU_ASSERT_EQUAL(controller_checked[2], 1); CU_ASSERT_EQUAL(controller_checked[3], 2); CU_ASSERT_EQUAL(controller_checked[4], -1); }
static void nvmf_test_delete_session(void) { int i; int fake_session_count = 5; struct nvmf_session *session; struct spdk_nvmf_subsystem *subsystem; subsystem = nvmf_find_subsystem("subsystem1"); for (i = 0; i != fake_session_count + 1; i++) { session = nvmf_find_session_by_id("subsystem1", (subsystem->num << NVMF_CNTLID_SUBS_SHIFT) + (i + 1)); SPDK_CU_ASSERT_FATAL(session != NULL); nvmf_delete_session(session); } CU_ASSERT_EQUAL(subsystem->num_sessions, 0); CU_ASSERT_PTR_NULL(subsystem->sessions.tqh_first); }
static void nvmf_test_disconnect(void) { uint64_t fabric_conn_admin = 1; uint64_t fabric_conn_IO = 2; struct nvmf_session *sess; struct spdk_nvmf_subsystem *subsystem; sess = nvmf_find_session_by_id("subsystem1", SS_SC_CNTLID); /* delete non-exist connection */ nvmf_disconnect((void *)6, sess); /* we have two connections admin and io */ CU_ASSERT_EQUAL(sess->num_connections, 2); /* delete IO connection */ nvmf_disconnect((void *)fabric_conn_IO, sess); CU_ASSERT_EQUAL(sess->num_connections, 1); /* delete admin connection */ nvmf_disconnect((void *)fabric_conn_admin, sess); subsystem = nvmf_find_subsystem("subsystem1"); CU_ASSERT_EQUAL(subsystem->num_sessions, 0); }
static void nvmf_test_find_subsystem(void) { CU_ASSERT_PTR_NULL(nvmf_find_subsystem(NULL)); CU_ASSERT_PTR_NULL(nvmf_find_subsystem("fake")); }