From 7dfae44795b74478b0b67746ad3c0d43aa71d985 Mon Sep 17 00:00:00 2001 From: Israel Rukshin Date: Thu, 18 Apr 2024 14:24:37 +0000 Subject: [PATCH] libnvme: Introduce functions to generate host identifier and host NQN The nvmf_hostid_generate() function generates a machine specific host identifier. This is useful when the host ID can't be derived from an NQN that doesn't contain a UUID. Also, add nvmf_hostnqn_generate_from_hostid() to explicitly set UUID when hostid is not NULL. Signed-off-by: Israel Rukshin Reviewed-by: Max Gurtovoy --- src/libnvme.map | 2 ++ src/nvme/fabrics.c | 29 ++++++++++++++++++++++------- src/nvme/fabrics.h | 20 ++++++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/libnvme.map b/src/libnvme.map index 748c4f7a..44c5c860 100644 --- a/src/libnvme.map +++ b/src/libnvme.map @@ -4,6 +4,8 @@ LIBNVME_1.10 { nvme_init_default_logging; nvme_parse_uri; nvme_free_uri; + nvmf_hostid_generate; + nvmf_hostnqn_generate_from_hostid; }; LIBNVME_1.9 { diff --git a/src/nvme/fabrics.c b/src/nvme/fabrics.c index e5921f8b..f06ad797 100644 --- a/src/nvme/fabrics.c +++ b/src/nvme/fabrics.c @@ -1342,27 +1342,42 @@ static int uuid_from_dmi(char *system_uuid) return ret; } -char *nvmf_hostnqn_generate() +char *nvmf_hostid_generate() { - char *hostnqn; int ret; char uuid_str[NVME_UUID_LEN_STRING]; unsigned char uuid[NVME_UUID_LEN]; ret = uuid_from_dmi(uuid_str); - if (ret < 0) { + if (ret < 0) ret = uuid_from_device_tree(uuid_str); - } if (ret < 0) { if (nvme_uuid_random(uuid) < 0) memset(uuid, 0, NVME_UUID_LEN); nvme_uuid_to_string(uuid, uuid_str); } - if (asprintf(&hostnqn, "nqn.2014-08.org.nvmexpress:uuid:%s", uuid_str) < 0) - return NULL; + return strdup(uuid_str); +} + +char *nvmf_hostnqn_generate_from_hostid(char *hostid) +{ + char *hid = NULL; + char *hostnqn; + int ret; + + if (!hostid) + hostid = hid = nvmf_hostid_generate(); + + ret = asprintf(&hostnqn, "nqn.2014-08.org.nvmexpress:uuid:%s", hostid); + free(hid); - return hostnqn; + return (ret < 0) ? NULL : hostnqn; +} + +char *nvmf_hostnqn_generate() +{ + return nvmf_hostnqn_generate_from_hostid(NULL); } static char *nvmf_read_file(const char *f, int len) diff --git a/src/nvme/fabrics.h b/src/nvme/fabrics.h index 3be35310..8e26e9f1 100644 --- a/src/nvme/fabrics.h +++ b/src/nvme/fabrics.h @@ -279,6 +279,26 @@ struct nvmf_discovery_log *nvmf_get_discovery_wargs(struct nvme_get_discovery_ar */ char *nvmf_hostnqn_generate(); +/** + * nvmf_hostnqn_generate_from_hostid() - Generate a host nqn from host identifier + * @hostid: Host identifier + * + * If @hostid is NULL, the function generates it based on the machine + * identifier. + * + * Return: On success, an NVMe Qualified Name for host identification. This + * name is based on the given host identifier. On failure, NULL. + */ +char *nvmf_hostnqn_generate_from_hostid(char *hostid); + +/** + * nvmf_hostid_generate() - Generate a machine specific host identifier + * + * Return: On success, an identifier string based on the machine identifier to + * be used as NVMe Host Identifier, or NULL on failure. + */ +char *nvmf_hostid_generate(); + /** * nvmf_hostnqn_from_file() - Reads the host nvm qualified name from the config * default location -- 2.50.1