linux.h
linux-specific utility functions
-
int nvme_fw_download_seq(int fd, __u32 size, __u32 xfer, __u32 offset, void *buf)
Firmware download sequence
Parameters
int fdFile descriptor of nvme device
__u32 sizeTotal size of the firmware image to transfer
__u32 xferMaximum size to send with each partial transfer
__u32 offsetStarting offset to send with this firmware download
void *bufAddress of buffer containing all or part of the firmware image.
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_set_etdas(int fd, bool *changed)
Set the Extended Telemetry Data Area 4 Supported bit
Parameters
int fdFile descriptor of nvme device
bool *changedboolean to indicate whether or not the host behavior support feature had been changed
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_clear_etdas(int fd, bool *changed)
Clear the Extended Telemetry Data Area 4 Supported bit
Parameters
int fdFile descriptor of nvme device
bool *changedboolean to indicate whether or not the host behavior support feature had been changed
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_get_uuid_list(int fd, struct nvme_id_uuid_list *uuid_list)
Returns the uuid list (if supported)
Parameters
int fdFile descriptor of nvme device
struct nvme_id_uuid_list *uuid_listUUID list returned by identify UUID
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_get_telemetry_max(int fd, enum nvme_telemetry_da *da, size_t *max_data_tx)
Get telemetry limits
Parameters
int fdFile descriptor of nvme device
enum nvme_telemetry_da *daOn success return max supported data area
size_t *max_data_txOn success set to max transfer chunk supported by the controller
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_get_telemetry_log(int fd, bool create, bool ctrl, bool rae, size_t max_data_tx, enum nvme_telemetry_da da, struct nvme_telemetry_log **log, size_t *size)
Get specified telemetry log
Parameters
int fdFile descriptor of nvme device
bool createGenerate new host initated telemetry capture
bool ctrlGet controller Initiated log
bool raeRetain asynchronous events
size_t max_data_txSet the max data transfer size to be used retrieving telemetry.
enum nvme_telemetry_da daLog page data area, valid values:
enum nvme_telemetry_da.struct nvme_telemetry_log **logOn success, set to the value of the allocated and retrieved log.
size_t *sizePtr to the telemetry log size, so it can be returned
Description
- The total size allocated can be calculated as:
(nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_get_ctrl_telemetry(int fd, bool rae, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
Get controller telemetry log
Parameters
int fdFile descriptor of nvme device
bool raeRetain asynchronous events
struct nvme_telemetry_log **logOn success, set to the value of the allocated and retrieved log.
enum nvme_telemetry_da daLog page data area, valid values:
enum nvme_telemetry_dasize_t *sizePtr to the telemetry log size, so it can be returned
Description
- The total size allocated can be calculated as:
(nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_get_host_telemetry(int fd, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
Get host telemetry log
Parameters
int fdFile descriptor of nvme device
struct nvme_telemetry_log **logOn success, set to the value of the allocated and retrieved log.
enum nvme_telemetry_da daLog page data area, valid values:
enum nvme_telemetry_dasize_t *sizePtr to the telemetry log size, so it can be returned
Description
- The total size allocated can be calculated as:
(nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_get_new_host_telemetry(int fd, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
Get new host telemetry log
Parameters
int fdFile descriptor of nvme device
struct nvme_telemetry_log **logOn success, set to the value of the allocated and retrieved log.
enum nvme_telemetry_da daLog page data area, valid values:
enum nvme_telemetry_dasize_t *sizePtr to the telemetry log size, so it can be returned
Description
- The total size allocated can be calculated as:
(nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
size_t nvme_get_ana_log_len_from_id_ctrl(const struct nvme_id_ctrl *id_ctrl, bool rgo)
Retrieve maximum possible ANA log size
Parameters
const struct nvme_id_ctrl *id_ctrlController identify data
bool rgoIf true, return maximum log page size without NSIDs
Return
A byte limit on the size of the controller’s ANA log page
-
int nvme_get_ana_log_len(int fd, size_t *analen)
Retrieve size of the current ANA log
Parameters
int fdFile descriptor of nvme device
size_t *analenPointer to where the length will be set on success
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_get_logical_block_size(int fd, __u32 nsid, int *blksize)
Retrieve block size
Parameters
int fdFile descriptor of nvme device
__u32 nsidNamespace id
int *blksizePointer to where the block size will be set on success
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_get_lba_status_log(int fd, bool rae, struct nvme_lba_status_log **log)
Retrieve the LBA Status log page
Parameters
int fdFile descriptor of the nvme device
bool raeRetain asynchronous events
struct nvme_lba_status_log **logOn success, set to the value of the allocated and retrieved log.
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_namespace_attach_ctrls(int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist)
Attach namespace to controller(s)
Parameters
int fdFile descriptor of nvme device
__u32 nsidNamespace ID to attach
__u16 num_ctrlsNumber of controllers in ctrlist
__u16 *ctrlistList of controller IDs to perform the attach action
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_namespace_detach_ctrls(int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist)
Detach namespace from controller(s)
Parameters
int fdFile descriptor of nvme device
__u32 nsidNamespace ID to detach
__u16 num_ctrlsNumber of controllers in ctrlist
__u16 *ctrlistList of controller IDs to perform the detach action
Return
The nvme command status if a response was received (see
enum nvme_status_field) or -1 with errno set otherwise.
-
int nvme_open(const char *name)
Open an nvme controller or namespace device
Parameters
const char *nameThe basename of the device to open
Description
This will look for the handle in /dev/ and validate the name and filetype match linux conventions.
Return
A file descriptor for the device on a successful open, or -1 with errno set otherwise.
-
enum nvme_hmac_alg
HMAC algorithm
Constants
NVME_HMAC_ALG_NONENo HMAC algorithm
NVME_HMAC_ALG_SHA2_256SHA2-256
NVME_HMAC_ALG_SHA2_384SHA2-384
NVME_HMAC_ALG_SHA2_512SHA2-512
-
int nvme_gen_dhchap_key(char *hostnqn, enum nvme_hmac_alg hmac, unsigned int key_len, unsigned char *secret, unsigned char *key)
DH-HMAC-CHAP key generation
Parameters
char *hostnqnHost NVMe Qualified Name
enum nvme_hmac_alg hmacHMAC algorithm
unsigned int key_lenOutput key length
unsigned char *secretSecret to used for digest
unsigned char *keyGenerated DH-HMAC-CHAP key
Return
If key generation was successful the function returns 0 or -1 with errno set otherwise.
-
long nvme_lookup_keyring(const char *keyring)
Lookup keyring serial number
Parameters
const char *keyringKeyring name
Description
Looks up the serial number of the keyring keyring.
Return
The key serial number of the keyring or 0 with errno set otherwise.
-
char *nvme_describe_key_serial(long key_id)
Return key description
Parameters
long key_idKey serial number
Description
Fetches the description of the key or keyring identified by the serial number key_id.
Return
The description of key_id or NULL on failure. The returned string needs to be freed by the caller.
-
long nvme_lookup_key(const char *type, const char *identity)
Lookup key serial number
Parameters
const char *typeKey type
const char *identityKey description
Description
Looks up the serial number of the key identity
with type type in the current session keyring.
Return
The key serial number of the key or 0 with errno set otherwise.
-
int nvme_set_keyring(long keyring_id)
Link keyring for lookup
Parameters
long keyring_idKeyring id
Description
Links keyring_id into the session keyring such that its keys are available for further key lookups.
Return
0 on success, a negative number on error with errno set.
-
unsigned char *nvme_read_key(long keyring_id, long key_id, int *len)
Read key raw data
Parameters
long keyring_idId of the keyring holding
key_idlong key_idKey id
int *lenLength of the returned data
Description
Links the keyring specified by keyring_id into the session keyring and reads the payload of the key specified by key_id. len holds the size of the returned buffer. If keyring is 0 the default keyring ‘.nvme’ is used.
Return
Pointer to the payload on success, or NULL with errno set otherwise.
-
long nvme_update_key(long keyring_id, const char *key_type, const char *identity, unsigned char *key_data, int key_len)
Update key raw data
Parameters
long keyring_idId of the keyring holding
key_idconst char *key_typeType of the key to insert
const char *identityKey identity string
unsigned char *key_dataRaw data of the key
int key_lenLength of key_data
Description
Links the keyring specified by keyring_id into the session keyring and updates the key reference by identity with key_data. The old key with identity identity will be revoked to make it inaccessible.
Return
Key id of the new key or 0 with errno set otherwise.
-
nvme_scan_tls_keys_cb_t
Typedef: Callback for iterating TLS keys
Syntax
void nvme_scan_tls_keys_cb_t (long keyring, long key, char *desc, int desc_len, void *data)
Parameters
long keyringKeyring which has been iterated
long keyKey for which the callback has been invoked
char *descDescription of the key
int desc_lenLength of desc
void *dataPointer for caller data
Description
Called for each TLS PSK in the keyring.
-
int nvme_scan_tls_keys(const char *keyring, nvme_scan_tls_keys_cb_t cb, void *data)
Iterate over TLS keys in a keyring
Parameters
const char *keyringKeyring holding TLS keys
nvme_scan_tls_keys_cb_t cbCallback function
void *dataPointer for data to be passed to cb
Description
Iterates keyring and call cb for each TLS key. When keyring is NULL the default ‘.nvme’ keyring is used. A TLS key must be of type ‘psk’ and the description must be of the form ‘NVMe<0|1><R|G>0<1|2> <identity>’, otherwise it will be skipped during iteration.
Return
Number of keys for which cb was called, or -1 with errno set on error.
-
long nvme_insert_tls_key(const char *keyring, const char *key_type, const char *hostnqn, const char *subsysnqn, int hmac, unsigned char *configured_key, int key_len)
Derive and insert TLS key
Parameters
const char *keyringKeyring to use
const char *key_typeType of the resulting key
const char *hostnqnHost NVMe Qualified Name
const char *subsysnqnSubsystem NVMe Qualified Name
int hmacHMAC algorithm
unsigned char *configured_keyConfigured key data to derive the key from
int key_lenLength of configured_key
Description
Derives a ‘retained’ TLS key as specified in NVMe TCP 1.0a and stores it as type key_type in the keyring specified by keyring.
Return
The key serial number if the key could be inserted into the keyring or 0 with errno otherwise.
-
long nvme_insert_tls_key_versioned(const char *keyring, const char *key_type, const char *hostnqn, const char *subsysnqn, int version, int hmac, unsigned char *configured_key, int key_len)
Derive and insert TLS key
Parameters
const char *keyringKeyring to use
const char *key_typeType of the resulting key
const char *hostnqnHost NVMe Qualified Name
const char *subsysnqnSubsystem NVMe Qualified Name
int versionKey version to use
int hmacHMAC algorithm
unsigned char *configured_keyConfigured key data to derive the key from
int key_lenLength of configured_key
Description
Derives a ‘retained’ TLS key as specified in NVMe TCP 1.0a (if version s set to ‘0’) or NVMe TP8028 (if version is set to ‘1) and stores it as type key_type in the keyring specified by keyring.
Return
The key serial number if the key could be inserted into the keyring or 0 with errno otherwise.
-
long nvme_insert_tls_key_compat(const char *keyring, const char *key_type, const char *hostnqn, const char *subsysnqn, int version, int hmac, unsigned char *configured_key, int key_len)
Derive and insert TLS key
Parameters
const char *keyringKeyring to use
const char *key_typeType of the resulting key
const char *hostnqnHost NVMe Qualified Name
const char *subsysnqnSubsystem NVMe Qualified Name
int versionKey version to use
int hmacHMAC algorithm
unsigned char *configured_keyConfigured key data to derive the key from
int key_lenLength of configured_key
Description
Derives a ‘retained’ TLS key as specified in NVMe TCP 1.0a (if version s set to ‘0’) or NVMe TP8028 (if version is set to ‘1) and stores it as type key_type in the keyring specified by keyring. This version differs from nvme_insert_tls_key_versioned() in that it uses the original implementation for HKDF Expand-Label which does not prefix the ‘info’ and ‘label’ strings with the length.
Return
The key serial number if the key could be inserted into the keyring or 0 with errno otherwise.
-
char *nvme_generate_tls_key_identity(const char *hostnqn, const char *subsysnqn, int version, int hmac, unsigned char *configured_key, int key_len)
Generate the TLS key identity
Parameters
const char *hostnqnHost NVMe Qualified Name
const char *subsysnqnSubsystem NVMe Qualified Name
int versionKey version to use
int hmacHMAC algorithm
unsigned char *configured_keyConfigured key data to derive the key from
int key_lenLength of configured_key
Description
Derives a ‘retained’ TLS key as specified in NVMe TCP and generate the corresponding TLs identity.
Return
The string containing the TLS identity. It is the responsibility of the caller to free the returned string. On error NULL is returned with errno set.
-
char *nvme_generate_tls_key_identity_compat(const char *hostnqn, const char *subsysnqn, int version, int hmac, unsigned char *configured_key, int key_len)
Generate the TLS key identity
Parameters
const char *hostnqnHost NVMe Qualified Name
const char *subsysnqnSubsystem NVMe Qualified Name
int versionKey version to use
int hmacHMAC algorithm
unsigned char *configured_keyConfigured key data to derive the key from
int key_lenLength of configured_key
Description
Derives a ‘retained’ TLS key as specified in NVMe TCP and generate the corresponding TLs identity. This version differs from nvme_generate_tls_key_identity() in that it uses the original implementation for HKDF-Expand-Label which does not prefix the ‘info’ and ‘label’ string with the length.
Return
The string containing the TLS identity. It is the responsibility of the caller to free the returned string.
-
long nvme_revoke_tls_key(const char *keyring, const char *key_type, const char *identity)
Revoke TLS key from keyring
Parameters
const char *keyringKeyring to use
const char *key_typeType of the key to revoke
const char *identityKey identity string
Return
0 on success or on failure -1 with errno set.
-
char *nvme_export_tls_key(const unsigned char *key_data, int key_len)
Export a TLS key
Parameters
const unsigned char *key_dataRaw data of the key
int key_lenLength of key_data
Description
Returns key_data in the PSK Interchange format as defined in section 3.6.1.5 of the NVMe TCP Transport specification.
Return
The string containing the TLS identity or NULL with errno set on error. It is the responsibility of the caller to free the returned string.
-
char *nvme_export_tls_key_versioned(unsigned char version, unsigned char hmac, const unsigned char *key_data, size_t key_len)
Export a TLS pre-shared key
Parameters
unsigned char versionIndicated the representation of the TLS PSK
unsigned char hmacHMAC algorithm used to transfor the configured PSK in a retained PSK
const unsigned char *key_dataRaw data of the key
size_t key_lenLength of key_data
Description
Returns key_data in the PSK Interchange format as defined in section 3.6.1.5 of the NVMe TCP Transport specification.
Return
The string containing the TLS identity or NULL with errno set on error. It is the responsibility of the caller to free the returned string.
-
unsigned char *nvme_import_tls_key(const char *encoded_key, int *key_len, unsigned int *hmac)
Import a TLS key
Parameters
const char *encoded_keyTLS key in PSK interchange format
int *key_lenLength of the resulting key data
unsigned int *hmacHMAC algorithm
Description
Imports key_data in the PSK Interchange format as defined in section 3.6.1.5 of the NVMe TCP Transport specification.
Return
The raw data of the PSK or NULL with errno set on error. It is the responsibility of the caller to free the returned string.
-
unsigned char *nvme_import_tls_key_versioned(const char *encoded_key, unsigned char *version, unsigned char *hmac, size_t *key_len)
Import a TLS key
Parameters
const char *encoded_keyTLS key in PSK interchange format
unsigned char *versionIndicated the representation of the TLS PSK
unsigned char *hmacHMAC algorithm used to transfor the configured PSK in a retained PSK
size_t *key_lenLength of the resulting key data
Description
Imports key_data in the PSK Interchange format as defined in section 3.6.1.5 of the NVMe TCP Transport specification.
Return
The raw data of the PSK or NULL with errno set on error. It is the responsibility of the caller to free the returned string.
-
int nvme_submit_passthru(int fd, unsigned long ioctl_cmd, struct nvme_passthru_cmd *cmd, __u32 *result)
Low level ioctl wrapper for passthru commands
Parameters
int fdFile descriptor of the nvme device
unsigned long ioctl_cmdIOCTL command id
struct nvme_passthru_cmd *cmdPasshtru command
__u32 *resultOptional field to return the result
Description
This is a low level library function which should not be used directly. It is exposed as weak symbol so that the user application is able to provide their own implementation of this function with additional debugging or logging code.
Return
The value from the ioctl system call (see ioctl documentation)
-
int nvme_submit_passthru64(int fd, unsigned long ioctl_cmd, struct nvme_passthru_cmd64 *cmd, __u64 *result)
Low level ioctl wrapper for passthru commands
Parameters
int fdFile descriptor of the nvme device
unsigned long ioctl_cmdIOCTL command id
struct nvme_passthru_cmd64 *cmdPasshtru command
__u64 *resultOptional field to return the result
Description
This is a low level library function which should not be used directly. It is exposed as weak symbol so that the user application is able to provide their own implementation of this function with additional debugging or logging code.
Return
The value from the ioctl system call (see ioctl documentation)