Beispiel #1
0
static void
nvmf_init_conn_properites(struct spdk_nvmf_conn *conn,
			  struct nvmf_session *session,
			  struct spdk_nvmf_fabric_connect_rsp *response)
{

	struct spdk_nvmf_extended_identify_ctrlr_data *lcdata;
	uint32_t mdts;

	conn->cntlid = response->status_code_specific.success.cntlid;
	session->max_connections_allowed = g_nvmf_tgt.MaxConnectionsPerSession;
	nvmf_init_session_properties(session, conn->sq_depth);

	/* Update the session logical controller data with any
	 * application fabric side limits
	 */
	/* reset mdts in vcdata to equal the application default maximum */
	mdts = SPDK_NVMF_MAX_RECV_DATA_TRANSFER_SIZE /
	       (1 << (12 + session->vcprop.cap_hi.bits.mpsmin));
	if (mdts == 0) {
		SPDK_ERRLOG("Min page size exceeds max transfer size!\n");
		SPDK_ERRLOG("Verify setting of SPDK_NVMF_MAX_RECV_DATA_TRANSFER_SIZE and mpsmin\n");
		session->vcdata.mdts = 1; /* Support single page for now */
	} else {
		/* set mdts as a power of 2 representing number of mpsmin units */
		session->vcdata.mdts = 0;
		while ((1ULL << session->vcdata.mdts) < mdts) {
			session->vcdata.mdts++;
		}
	}

	/* increase the I/O recv capsule size for in_capsule data */
	lcdata = (struct spdk_nvmf_extended_identify_ctrlr_data *)&session->vcdata.reserved5[1088];
	lcdata->ioccsz += (g_nvmf_tgt.MaxInCapsuleData / 16);

}
Beispiel #2
0
static void
nvmf_test_property_get(void)
{
	struct nvmf_session *sess;
	struct spdk_nvmf_fabric_prop_get_cmd cmd;
	struct spdk_nvmf_fabric_prop_get_rsp response;
	union spdk_nvme_cap_lo_register *cap_lo;
	union spdk_nvme_cap_hi_register *cap_hi;
	union spdk_nvme_csts_register *csts;
	union spdk_nvme_aqa_register *aqa;
	union spdk_nvmf_property_size *propsz;

	sess = nvmf_find_session_by_id("subsystem1", SS_SC_CNTLID);
	nvmf_init_session_properties(sess, 64);
	sess->vcprop.csts.bits.rdy = 1;
	/* vs */
	BUILD_PROPERTY_CMD(vs, 0, 17);
	RUN_AND_CHECK_PROPERTY_RESULT(0, 17);
	CU_ASSERT_EQUAL(response.value.u32.low, 0x10000);
	/* cap_lo */
	BUILD_PROPERTY_CMD(cap_lo, 1, 18);
	RUN_AND_CHECK_PROPERTY_RESULT(0, 18);
	cap_lo = (union spdk_nvme_cap_lo_register *)&response.value.u32.low;
	cap_hi = (union spdk_nvme_cap_hi_register *)&response.value.u32.high;
	CU_ASSERT_EQUAL(cap_lo->bits.to, 1);
	CU_ASSERT_EQUAL(cap_hi->bits.css_nvm, 1);
	/* cc */
	BUILD_PROPERTY_CMD(cc, 0, 19);
	RUN_AND_CHECK_PROPERTY_RESULT(0, 19);
	CU_ASSERT_EQUAL(response.value.u32.low, 0);
	/* csts */
	BUILD_PROPERTY_CMD(csts, 0, 20);
	RUN_AND_CHECK_PROPERTY_RESULT(0, 20);
	csts = (union spdk_nvme_csts_register *)&response.value.u32.low;
	CU_ASSERT_EQUAL(csts->bits.rdy, 1);
	/* aqa */
	BUILD_PROPERTY_CMD(aqa, 0, 21);
	RUN_AND_CHECK_PROPERTY_RESULT(0, 21);
	aqa = (union spdk_nvme_aqa_register *)&response.value.u32.low;
	CU_ASSERT_EQUAL(aqa->bits.asqs, 64);
	CU_ASSERT_EQUAL(aqa->bits.acqs, 64);
	/* propsz */
	BUILD_PROPERTY_CMD(propsz, 0, 22);
	RUN_AND_CHECK_PROPERTY_RESULT(0, 22);
	propsz = (union spdk_nvmf_property_size *)&response.value.u32.low;
	CU_ASSERT_EQUAL(propsz->bits.size, sizeof(struct spdk_nvmf_ctrlr_properties) / 64);
	/* cap_hi */
	BUILD_PROPERTY_CMD(cap_hi, 0, 23);
	RUN_AND_CHECK_PROPERTY_RESULT(0, 23);
	cap_hi = (union spdk_nvme_cap_hi_register *)&response.value.u32.low;
	CU_ASSERT_EQUAL(cap_hi->bits.css_nvm, 1);
	/* intms */
	BUILD_PROPERTY_CMD(intms, 0, 24);
	RUN_AND_CHECK_PROPERTY_RESULT(SPDK_NVMF_FABRIC_SC_INVALID_PARAM, 24);
	/* intmc */
	BUILD_PROPERTY_CMD(intmc, 0, 25);
	RUN_AND_CHECK_PROPERTY_RESULT(SPDK_NVMF_FABRIC_SC_INVALID_PARAM, 25);
	/* nssr */
	BUILD_PROPERTY_CMD(nssr, 0, 26);
	RUN_AND_CHECK_PROPERTY_RESULT(0, 26);
	/* asq */
	BUILD_PROPERTY_CMD(asq, 0, 27);
	RUN_AND_CHECK_PROPERTY_RESULT(SPDK_NVMF_FABRIC_SC_INVALID_PARAM, 27);
	/* acq */
	BUILD_PROPERTY_CMD(acq, 0, 28);
	RUN_AND_CHECK_PROPERTY_RESULT(SPDK_NVMF_FABRIC_SC_INVALID_PARAM, 28);
	/* begin to check error condition */
#define TEST_SIZE_NOT_RIGHT(prop_name, attr, c_id) \
	do { \
		BUILD_PROPERTY_CMD(prop_name, attr, c_id); \
		RUN_AND_CHECK_PROPERTY_RESULT(SPDK_NVMF_FABRIC_SC_INVALID_PARAM, c_id); \
	} while (0)

	TEST_SIZE_NOT_RIGHT(cc, 1, 22);
	TEST_SIZE_NOT_RIGHT(csts, 1, 23);
	TEST_SIZE_NOT_RIGHT(aqa, 1, 24);
	TEST_SIZE_NOT_RIGHT(propsz, 1, 25);
	TEST_SIZE_NOT_RIGHT(vs, 1, 26);
	TEST_SIZE_NOT_RIGHT(nssr, 1, 27);
	TEST_SIZE_NOT_RIGHT(capattr_hi, 1, 28);
	/* invalid offset */
	cmd.ofst = 0xffff;
	cmd.attrib = 0;
	cmd.cid = 29;
	nvmf_property_get(sess, &cmd, &response);
	CU_ASSERT_EQUAL(response.status.sc, SPDK_NVMF_FABRIC_SC_INVALID_PARAM);
}
Beispiel #3
0
static void
nvmf_test_connect(void)
{
	uint64_t fabric_conn = 0;
	uint64_t fabric_conn_admin = 1;
	uint64_t fabric_conn_IO = 2;
	struct nvmf_session *sess, *io_sess;
	struct spdk_nvmf_fabric_connect_cmd connect = {};
	struct spdk_nvmf_fabric_connect_data connect_data = {};
	struct spdk_nvmf_fabric_connect_rsp response = {};
	struct spdk_nvmf_fabric_connect_rsp expect_rsp = {};


	connect.opcode = 0x7f;
	connect.cid = 0x01;
	connect.fctype = 0x01;
	connect_data.cntlid = 0xffff;
	connect.qid = 0;
	connect.sqsize = 64;

	/* change cmd field to do failure test first */
	/* invalid subnqn and qid = 0*/
	strcpy((char *)connect_data.subnqn, "fake");
	CU_ASSERT_PTR_NULL(nvmf_connect((void *)fabric_conn, &connect, &connect_data, &response));
	CU_ASSERT_NOT_EQUAL(response.status.sc, 0);
	/* valid subnqn and qid = 0 and cntlid != 0xfffff */
	strcpy((char *)connect_data.subnqn, "subsystem1");
	connect_data.cntlid = 0x000f;
	CU_ASSERT_PTR_NULL(nvmf_connect((void *)fabric_conn, &connect, &connect_data, &response));
	CU_ASSERT_EQUAL(response.status.sc, SPDK_NVMF_FABRIC_SC_INVALID_PARAM);
	/* invalid subnqn and qid = 1 */
	strcpy((char *)connect_data.subnqn, "fake");
	connect.qid = 1;
	connect_data.cntlid = 0;
	CU_ASSERT_PTR_NULL(nvmf_connect((void *)fabric_conn, &connect, &connect_data, &response));
	CU_ASSERT_EQUAL(response.status.sc, SPDK_NVMF_FABRIC_SC_RESTART_DISCOVERY);
	/* valid subnqn but session is not created. */
	strcpy((char *)connect_data.subnqn, "subsystem1");
	connect_data.cntlid = 0;
	CU_ASSERT_PTR_NULL(nvmf_connect((void *)fabric_conn, &connect, &connect_data, &response));
	CU_ASSERT_EQUAL(response.status.sc, SPDK_NVMF_FABRIC_SC_RESTART_DISCOVERY);
	/* create admin connection */
	connect.qid = 0;
	connect_data.cntlid = 0xffff;
	sess = nvmf_connect((void *)fabric_conn_admin, &connect, &connect_data, &response);
	SPDK_CU_ASSERT_FATAL(sess != NULL);
	nvmf_init_session_properties(sess, 64);
	sess->max_connections_allowed = 2;
	CU_ASSERT_EQUAL(sess->num_connections, 1);
	CU_ASSERT_PTR_EQUAL(sess->connections.tqh_first->fabric_conn, fabric_conn_admin);
	expect_rsp.status_code_specific.success.cntlid = SS_SC_CNTLID;
	expect_rsp.status.sc = 0;
	help_response_check(&response, &expect_rsp);
	/* create IO connection */
	connect.cid = 0x02;
	connect.qid = 1;
	connect_data.cntlid = SS_SC_CNTLID;
	io_sess = nvmf_connect((void *)fabric_conn_IO, &connect, &connect_data, &response);
	SPDK_CU_ASSERT_FATAL(io_sess != NULL);
	CU_ASSERT_EQUAL(io_sess->num_connections, 2);
	/* check admin and io connection are in same session. */
	CU_ASSERT_PTR_EQUAL(io_sess, sess);
	expect_rsp.status_code_specific.success.cntlid = SS_SC_CNTLID;
	expect_rsp.status.sc = 0;
	help_response_check(&response, &expect_rsp);
	/* right subnqn, session is created, but wrong cntlid */
	connect_data.cntlid = 1;
	connect.qid = 2;
	CU_ASSERT_PTR_NULL(nvmf_connect((void *)&fabric_conn, &connect, &connect_data, &response));
	CU_ASSERT_EQUAL(response.status.sc, SPDK_NVMF_FABRIC_SC_RESTART_DISCOVERY);
}