Skip to content

Commit

Permalink
libnvme: Introduce functions to generate host identifier and host NQN
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Max Gurtovoy <[email protected]>
  • Loading branch information
israelru authored and igaw committed May 22, 2024
1 parent 1ec2432 commit 7dfae44
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 7 deletions.
2 changes: 2 additions & 0 deletions src/libnvme.map
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
29 changes: 22 additions & 7 deletions src/nvme/fabrics.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
20 changes: 20 additions & 0 deletions src/nvme/fabrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 7dfae44

Please sign in to comment.