diff --git a/include/spdk/nvme_spec.h b/include/spdk/nvme_spec.h index 2908d95d3..547b3357b 100644 --- a/include/spdk/nvme_spec.h +++ b/include/spdk/nvme_spec.h @@ -687,6 +687,15 @@ enum spdk_nvme_identify_cns { SPDK_NVME_IDENTIFY_CTRLR_LIST = 0x13, }; +/** NVMe over Fabrics controller model */ +enum spdk_nvmf_ctrlr_model { + /** NVM subsystem uses dynamic controller model */ + SPDK_NVMF_CTRLR_MODEL_DYNAMIC = 0, + + /** NVM subsystem uses static controller model */ + SPDK_NVMF_CTRLR_MODEL_STATIC = 1, +}; + struct __attribute__((packed)) spdk_nvme_ctrlr_data { /* bytes 0-255: controller capabilities and features */ @@ -939,7 +948,29 @@ struct __attribute__((packed)) spdk_nvme_ctrlr_data { uint8_t reserved5[768]; - uint8_t nvmf_specific[256]; + /** NVMe over Fabrics-specific fields */ + struct { + /** I/O queue command capsule supported size (16-byte units) */ + uint32_t ioccsz; + + /** I/O queue response capsule supported size (16-byte units) */ + uint32_t iorcsz; + + /** In-capsule data offset (16-byte units) */ + uint16_t icdoff; + + /** Controller attributes */ + struct { + /** Controller model: \ref spdk_nvmf_ctrlr_model */ + uint8_t ctrlr_model : 1; + uint8_t reserved : 7; + } ctrattr; + + /** Maximum SGL block descriptors (0 = no limit) */ + uint8_t msdbd; + + uint8_t reserved[244]; + } nvmf_specific; /* bytes 2048-3071: power state descriptors */ struct spdk_nvme_power_state psd[32]; diff --git a/include/spdk/nvmf_spec.h b/include/spdk/nvmf_spec.h index cca43447e..eac6e07b9 100644 --- a/include/spdk/nvmf_spec.h +++ b/include/spdk/nvmf_spec.h @@ -319,16 +319,6 @@ struct spdk_nvmf_fabric_prop_set_cmd { }; SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_fabric_prop_set_cmd) == 64, "Incorrect size"); -struct spdk_nvmf_extended_identify_ctrlr_data { - uint32_t ioccsz; - uint32_t iorcsz; - uint16_t icdoff; - uint8_t ctrattr; - uint8_t msdbd; - uint8_t reserved[244]; -}; -SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_extended_identify_ctrlr_data) == 256, "Incorrect size"); - #define SPDK_NVMF_NQN_MAX_LEN 223 #define SPDK_NVMF_DISCOVERY_NQN "nqn.2014-08.org.nvmexpress.discovery" diff --git a/lib/nvmf/session.c b/lib/nvmf/session.c index ebfc0812f..3f9705d0d 100644 --- a/lib/nvmf/session.c +++ b/lib/nvmf/session.c @@ -45,18 +45,15 @@ static void nvmf_init_discovery_session_properties(struct nvmf_session *session) { - struct spdk_nvmf_extended_identify_ctrlr_data *nvmfdata; - session->vcdata.maxcmd = g_nvmf_tgt.max_queue_depth; /* extended data for get log page supportted */ session->vcdata.lpa.edlp = 1; session->vcdata.cntlid = 0; /* There is one controller per subsystem, so its id is 0 */ - nvmfdata = (struct spdk_nvmf_extended_identify_ctrlr_data *)session->vcdata.nvmf_specific; - nvmfdata->ioccsz = sizeof(struct spdk_nvme_cmd) / 16; - nvmfdata->iorcsz = sizeof(struct spdk_nvme_cpl) / 16; - nvmfdata->icdoff = 0; /* offset starts directly after SQE */ - nvmfdata->ctrattr = 0; /* dynamic controller model */ - nvmfdata->msdbd = 1; /* target supports single SGL in capsule */ + session->vcdata.nvmf_specific.ioccsz = sizeof(struct spdk_nvme_cmd) / 16; + session->vcdata.nvmf_specific.iorcsz = sizeof(struct spdk_nvme_cpl) / 16; + session->vcdata.nvmf_specific.icdoff = 0; /* offset starts directly after SQE */ + session->vcdata.nvmf_specific.ctrattr.ctrlr_model = SPDK_NVMF_CTRLR_MODEL_DYNAMIC; + session->vcdata.nvmf_specific.msdbd = 1; /* target supports single SGL in capsule */ session->vcdata.sgls.keyed_sgl = 1; session->vcdata.sgls.sgl_offset = 1; @@ -85,7 +82,6 @@ static void nvmf_init_nvme_session_properties(struct nvmf_session *session) { const struct spdk_nvme_ctrlr_data *cdata; - struct spdk_nvmf_extended_identify_ctrlr_data *nvmfdata; /* Here we are going to initialize the features, properties, and @@ -105,28 +101,27 @@ nvmf_init_nvme_session_properties(struct nvmf_session *session) session->vcdata.sgls.keyed_sgl = 1; session->vcdata.sgls.sgl_offset = 1; - nvmfdata = (struct spdk_nvmf_extended_identify_ctrlr_data *)session->vcdata.nvmf_specific; - nvmfdata->ioccsz = sizeof(struct spdk_nvme_cmd) / 16; - nvmfdata->iorcsz = sizeof(struct spdk_nvme_cpl) / 16; - nvmfdata->icdoff = 0; /* offset starts directly after SQE */ - nvmfdata->ctrattr = 0; /* dynamic controller model */ - nvmfdata->msdbd = 1; /* target supports single SGL in capsule */ + session->vcdata.nvmf_specific.ioccsz = sizeof(struct spdk_nvme_cmd) / 16; + session->vcdata.nvmf_specific.iorcsz = sizeof(struct spdk_nvme_cpl) / 16; + session->vcdata.nvmf_specific.icdoff = 0; /* offset starts directly after SQE */ + session->vcdata.nvmf_specific.ctrattr.ctrlr_model = SPDK_NVMF_CTRLR_MODEL_DYNAMIC; + session->vcdata.nvmf_specific.msdbd = 1; /* target supports single SGL in capsule */ /* TODO: this should be set by the transport */ - nvmfdata->ioccsz += SPDK_NVMF_MAX_RECV_DATA_TRANSFER_SIZE / 16; + session->vcdata.nvmf_specific.ioccsz += SPDK_NVMF_MAX_RECV_DATA_TRANSFER_SIZE / 16; SPDK_TRACELOG(SPDK_TRACE_NVMF, " ctrlr data: maxcmd %x\n", session->vcdata.maxcmd); SPDK_TRACELOG(SPDK_TRACE_NVMF, " ext ctrlr data: ioccsz %x\n", - nvmfdata->ioccsz); + session->vcdata.nvmf_specific.ioccsz); SPDK_TRACELOG(SPDK_TRACE_NVMF, " ext ctrlr data: iorcsz %x\n", - nvmfdata->iorcsz); + session->vcdata.nvmf_specific.iorcsz); SPDK_TRACELOG(SPDK_TRACE_NVMF, " ext ctrlr data: icdoff %x\n", - nvmfdata->icdoff); + session->vcdata.nvmf_specific.icdoff); SPDK_TRACELOG(SPDK_TRACE_NVMF, " ext ctrlr data: ctrattr %x\n", - nvmfdata->ctrattr); + *(uint8_t *)&session->vcdata.nvmf_specific.ctrattr); SPDK_TRACELOG(SPDK_TRACE_NVMF, " ext ctrlr data: msdbd %x\n", - nvmfdata->msdbd); + session->vcdata.nvmf_specific.msdbd); SPDK_TRACELOG(SPDK_TRACE_NVMF, " sgls data: 0x%x\n", *(uint32_t *)&session->vcdata.sgls);