static bool nvmf_process_property_get(struct spdk_nvmf_request *req) { struct spdk_nvmf_fabric_prop_get_rsp *response; struct spdk_nvmf_fabric_prop_get_cmd *cmd; cmd = &req->cmd->prop_get_cmd; response = &req->rsp->prop_get_rsp; nvmf_property_get(req->conn->sess, cmd, response); return true; }
static int nvmf_process_property_get(struct spdk_nvmf_conn *conn, struct nvme_qp_tx_desc *tx_desc) { struct spdk_nvmf_fabric_prop_get_rsp *response; struct nvmf_request *req = &tx_desc->req_state; struct spdk_nvmf_fabric_prop_get_cmd *cmd; int ret; cmd = &req->cmd->prop_get_cmd; response = &req->rsp->prop_get_rsp; nvmf_property_get(conn->sess, cmd, response); /* send the nvmf response if setup by NVMf library */ SPDK_TRACELOG(SPDK_TRACE_DEBUG, "send property get capsule response\n"); ret = spdk_nvmf_send_response(conn, req); if (ret) { SPDK_ERRLOG("Unable to send aq qp tx descriptor\n"); return -1; } return 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); }