Пример #1
0
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);

}
Пример #2
0
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);
}
Пример #3
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"));
}
Пример #4
0
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;
}
Пример #5
0
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);
}
Пример #6
0
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);
}
Пример #7
0
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);
}
Пример #8
0
static void
nvmf_test_find_subsystem(void)
{
	CU_ASSERT_PTR_NULL(nvmf_find_subsystem(NULL));
	CU_ASSERT_PTR_NULL(nvmf_find_subsystem("fake"));
}