diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index 14a326356..cf43476ec 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -44,6 +44,7 @@ #include "spdk/nvme.h" #include "spdk/nvmf_spec.h" #include "spdk/queue.h" +#include "spdk/uuid.h" #ifdef __cplusplus extern "C" { @@ -454,6 +455,13 @@ struct spdk_nvmf_ns_opts { * Fill with 0s if not specified. */ uint8_t eui64[8]; + + /** + * Namespace UUID + * + * Fill with 0s if not specified. + */ + struct spdk_uuid uuid; }; /** diff --git a/lib/event/subsystems/nvmf/nvmf_rpc.c b/lib/event/subsystems/nvmf/nvmf_rpc.c index bdffb1b56..bfed7b05c 100644 --- a/lib/event/subsystems/nvmf/nvmf_rpc.c +++ b/lib/event/subsystems/nvmf/nvmf_rpc.c @@ -263,6 +263,14 @@ dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct spdk_nvmf_subsystem *s json_write_hex_str(w, ns_opts.eui64, sizeof(ns_opts.eui64)); } + if (!spdk_mem_all_zero(&ns_opts.uuid, sizeof(ns_opts.uuid))) { + char uuid_str[SPDK_UUID_STRING_LEN]; + + spdk_uuid_fmt_lower(uuid_str, sizeof(uuid_str), &ns_opts.uuid); + spdk_json_write_name(w, "uuid"); + spdk_json_write_string(w, uuid_str); + } + spdk_json_write_object_end(w); } spdk_json_write_array_end(w); diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 2083061a8..1a5bfcf01 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -1073,15 +1073,16 @@ spdk_nvmf_ctrlr_identify_ns_id_descriptor_list( return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } -#define ADD_ID_DESC(type, data) \ +#define ADD_ID_DESC(type, data, size) \ do { \ - if (!spdk_mem_all_zero(data, sizeof(data))) { \ - _add_ns_id_desc(&buf_ptr, &buf_remain, type, data, sizeof(data)); \ + if (!spdk_mem_all_zero(data, size)) { \ + _add_ns_id_desc(&buf_ptr, &buf_remain, type, data, size); \ } \ } while (0) - ADD_ID_DESC(SPDK_NVME_NIDT_EUI64, ns->opts.eui64); - ADD_ID_DESC(SPDK_NVME_NIDT_NGUID, ns->opts.nguid); + ADD_ID_DESC(SPDK_NVME_NIDT_EUI64, ns->opts.eui64, sizeof(ns->opts.eui64)); + ADD_ID_DESC(SPDK_NVME_NIDT_NGUID, ns->opts.nguid, sizeof(ns->opts.nguid)); + ADD_ID_DESC(SPDK_NVME_NIDT_UUID, &ns->opts.uuid, sizeof(ns->opts.uuid)); /* * The list is automatically 0-terminated because controller to host buffers in diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index ff2306d1d..982e08687 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -885,6 +885,10 @@ spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bd memcpy(&opts, user_opts, spdk_min(sizeof(opts), opts_size)); } + if (spdk_mem_all_zero(&opts.uuid, sizeof(opts.uuid))) { + opts.uuid = *spdk_bdev_get_uuid(bdev); + } + if (opts.nsid == SPDK_NVME_GLOBAL_NS_TAG) { SPDK_ERRLOG("Invalid NSID %" PRIu32 "\n", opts.nsid); return 0; diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index f00d7df82..0d5be3152 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -635,6 +635,31 @@ test_get_ns_id_desc_list(void) CU_ASSERT(buf[16] == 0x22); CU_ASSERT(buf[31] == 0xEE); CU_ASSERT(buf[33] == 0); + + /* Valid NSID, EUI64, NGUID, and UUID defined */ + ns.opts.eui64[0] = 0x11; + ns.opts.eui64[7] = 0xFF; + ns.opts.nguid[0] = 0x22; + ns.opts.nguid[15] = 0xEE; + ns.opts.uuid.u.raw[0] = 0x33; + ns.opts.uuid.u.raw[15] = 0xDD; + memset(&rsp, 0, sizeof(rsp)); + CU_ASSERT(spdk_nvmf_ctrlr_process_admin_cmd(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); + CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_SUCCESS); + CU_ASSERT(buf[0] == SPDK_NVME_NIDT_EUI64); + CU_ASSERT(buf[1] == 8); + CU_ASSERT(buf[4] == 0x11); + CU_ASSERT(buf[11] == 0xFF); + CU_ASSERT(buf[12] == SPDK_NVME_NIDT_NGUID); + CU_ASSERT(buf[13] == 16); + CU_ASSERT(buf[16] == 0x22); + CU_ASSERT(buf[31] == 0xEE); + CU_ASSERT(buf[32] == SPDK_NVME_NIDT_UUID); + CU_ASSERT(buf[33] == 16); + CU_ASSERT(buf[36] == 0x33); + CU_ASSERT(buf[51] == 0xDD); + CU_ASSERT(buf[53] == 0); } int main(int argc, char **argv) diff --git a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c index 676729c00..3cc8841b8 100644 --- a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c +++ b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c @@ -76,6 +76,12 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev) return "test"; } +const struct spdk_uuid * +spdk_bdev_get_uuid(const struct spdk_bdev *bdev) +{ + return &bdev->uuid; +} + int spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport, const struct spdk_nvme_transport_id *trid) diff --git a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c index 8499af725..a59859e27 100644 --- a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c @@ -201,6 +201,12 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev) return "test"; } +const struct spdk_uuid * +spdk_bdev_get_uuid(const struct spdk_bdev *bdev) +{ + return &bdev->uuid; +} + static void test_spdk_nvmf_subsystem_add_ns(void) {