1
0
Fork 0

Merging upstream version 2.4.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-16 12:21:44 +01:00
parent 23e83cb1c3
commit cc86d37eef
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
458 changed files with 7148 additions and 5151 deletions

111
fabrics.c
View file

@ -42,6 +42,7 @@
#include "nvme.h"
#include "libnvme.h"
#include "nvme-print.h"
#include "nvme-print-json.h"
#define PATH_NVMF_DISC SYSCONFDIR "/nvme/discovery.conf"
#define PATH_NVMF_CONFIG SYSCONFDIR "/nvme/config.json"
@ -74,21 +75,24 @@ static const char *nvmf_keep_alive_tmo = "keep alive timeout period in seconds";
static const char *nvmf_reconnect_delay = "reconnect timeout period in seconds";
static const char *nvmf_ctrl_loss_tmo = "controller loss timeout period in seconds";
static const char *nvmf_tos = "type of service";
static const char *nvmf_keyring = "Keyring for TLS key lookup";
static const char *nvmf_tls_key = "TLS key to use";
static const char *nvmf_dup_connect = "allow duplicate connections between same transport host and subsystem port";
static const char *nvmf_disable_sqflow = "disable controller sq flow control (default false)";
static const char *nvmf_hdr_digest = "enable transport protocol header digest (TCP transport)";
static const char *nvmf_data_digest = "enable transport protocol data digest (TCP transport)";
static const char *nvmf_tls = "enable TLS";
static const char *nvmf_config_file = "Use specified JSON configuration file or 'none' to disable";
#define NVMF_OPTS(c) \
OPT_STRING("transport", 't', "STR", &transport, nvmf_tport), \
OPT_STRING("nqn", 'n', "STR", &subsysnqn, nvmf_nqn), \
OPT_STRING("traddr", 'a', "STR", &traddr, nvmf_traddr), \
OPT_STRING("trsvcid", 's', "STR", &trsvcid, nvmf_trsvcid), \
OPT_STRING("host-traddr", 'w', "STR", &c.host_traddr, nvmf_htraddr), \
OPT_STRING("host-iface", 'f', "STR", &c.host_iface, nvmf_hiface), \
OPT_STRING("hostnqn", 'q', "STR", &hostnqn, nvmf_hostnqn), \
OPT_STRING("hostid", 'I', "STR", &hostid, nvmf_hostid), \
OPT_STRING("nqn", 'n', "STR", &subsysnqn, nvmf_nqn), \
OPT_STRING("dhchap-secret", 'S', "STR", &hostkey, nvmf_hostkey), \
OPT_INT("nr-io-queues", 'i', &c.nr_io_queues, nvmf_nr_io_queues), \
OPT_INT("nr-write-queues", 'W', &c.nr_write_queues, nvmf_nr_write_queues),\
@ -98,10 +102,13 @@ static const char *nvmf_config_file = "Use specified JSON configuration file or
OPT_INT("reconnect-delay", 'c', &c.reconnect_delay, nvmf_reconnect_delay),\
OPT_INT("ctrl-loss-tmo", 'l', &c.ctrl_loss_tmo, nvmf_ctrl_loss_tmo), \
OPT_INT("tos", 'T', &c.tos, nvmf_tos), \
OPT_INT("keyring", 0, &c.keyring, nvmf_keyring), \
OPT_INT("tls_key", 0, &c.tls_key, nvmf_tls_key), \
OPT_FLAG("duplicate-connect", 'D', &c.duplicate_connect, nvmf_dup_connect), \
OPT_FLAG("disable-sqflow", 'd', &c.disable_sqflow, nvmf_disable_sqflow), \
OPT_FLAG("hdr-digest", 'g', &c.hdr_digest, nvmf_hdr_digest), \
OPT_FLAG("data-digest", 'G', &c.data_digest, nvmf_data_digest) \
OPT_FLAG("data-digest", 'G', &c.data_digest, nvmf_data_digest), \
OPT_FLAG("tls", 0, &c.tls, nvmf_tls) \
struct tr_config {
const char *subsysnqn;
@ -112,18 +119,6 @@ struct tr_config {
const char *trsvcid;
};
static void space_strip_len(int max, char *str)
{
int i;
for (i = max - 1; i >= 0; i--) {
if (str[i] != '\0' && str[i] != ' ')
return;
else
str[i] = '\0';
}
}
/*
* Compare two C strings and handle NULL pointers gracefully.
* If either of the two strings is NULL, return 0
@ -304,9 +299,6 @@ static void print_discovery_log(struct nvmf_discovery_log *log, int numrec)
for (i = 0; i < numrec; i++) {
struct nvmf_disc_log_entry *e = &log->entries[i];
space_strip_len(NVMF_TRSVCID_SIZE, e->trsvcid);
space_strip_len(NVMF_TRADDR_SIZE, e->traddr);
printf("=====Discovery Log Entry %d======\n", i);
printf("trtype: %s\n", nvmf_trtype_str(e->trtype));
printf("adrfam: %s\n",
@ -340,64 +332,6 @@ static void print_discovery_log(struct nvmf_discovery_log *log, int numrec)
}
}
static void json_discovery_log(struct nvmf_discovery_log *log, int numrec)
{
struct json_object *root;
struct json_object *entries;
int i;
root = json_create_object();
entries = json_create_array();
json_object_add_value_uint64(root, "genctr", le64_to_cpu(log->genctr));
json_object_add_value_array(root, "records", entries);
for (i = 0; i < numrec; i++) {
struct nvmf_disc_log_entry *e = &log->entries[i];
struct json_object *entry = json_create_object();
space_strip_len(NVMF_TRSVCID_SIZE, e->trsvcid);
space_strip_len(NVMF_NQN_SIZE, e->subnqn);
space_strip_len(NVMF_TRADDR_SIZE, e->traddr);
json_object_add_value_string(entry, "trtype",
nvmf_trtype_str(e->trtype));
json_object_add_value_string(entry, "adrfam",
nvmf_adrfam_str(e->adrfam));
json_object_add_value_string(entry, "subtype",
nvmf_subtype_str(e->subtype));
json_object_add_value_string(entry,"treq",
nvmf_treq_str(e->treq));
json_object_add_value_uint(entry, "portid",
le16_to_cpu(e->portid));
json_object_add_value_string(entry, "trsvcid", e->trsvcid);
json_object_add_value_string(entry, "subnqn", e->subnqn);
json_object_add_value_string(entry, "traddr", e->traddr);
json_object_add_value_string(entry, "eflags",
nvmf_eflags_str(le16_to_cpu(e->eflags)));
switch (e->trtype) {
case NVMF_TRTYPE_RDMA:
json_object_add_value_string(entry, "rdma_prtype",
nvmf_prtype_str(e->tsas.rdma.prtype));
json_object_add_value_string(entry, "rdma_qptype",
nvmf_qptype_str(e->tsas.rdma.qptype));
json_object_add_value_string(entry, "rdma_cms",
nvmf_cms_str(e->tsas.rdma.cms));
json_object_add_value_uint(entry, "rdma_pkey",
le16_to_cpu(e->tsas.rdma.pkey));
break;
case NVMF_TRTYPE_TCP:
json_object_add_value_string(entry, "sectype",
nvmf_sectype_str(e->tsas.tcp.sectype));
break;
}
json_array_add_value_object(entries, entry);
}
json_print_object(root, NULL);
printf("\n");
json_free_object(root);
}
static void save_discovery_log(char *raw, struct nvmf_discovery_log *log)
{
uint64_t numrec = le64_to_cpu(log->numrec);
@ -427,18 +361,6 @@ static void print_connect_msg(nvme_ctrl_t c)
printf("device: %s\n", nvme_ctrl_get_name(c));
}
static void json_connect_msg(nvme_ctrl_t c)
{
struct json_object *root;
root = json_create_object();
json_object_add_value_string(root, "device", nvme_ctrl_get_name(c));
json_print_object(root, NULL);
printf("\n");
json_free_object(root);
}
static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg,
char *raw, bool connect, bool persistent,
enum nvme_print_flags flags)
@ -563,7 +485,6 @@ static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg,
} else if (errno == ENVME_CONNECT_ALREADY && !quiet) {
char *traddr = log->entries[i].traddr;
space_strip_len(NVMF_TRADDR_SIZE, traddr);
fprintf(stderr,
"traddr=%s is already connected\n",
traddr);
@ -908,6 +829,20 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
* on exit.
*/
persistent = true;
/*
* When --host-traddr/--host-iface are not specified on the
* command line, use the discovery controller's (c) host-
* traddr/host-iface for the connections to controllers
* returned in the Discovery Log Pages. This is essential
* when invoking "connect-all" with --device to reuse an
* existing persistent discovery controller (as is done
* for the udev rules). This ensures that host-traddr/
* host-iface are consistent with the discovery controller (c).
*/
if (!cfg.host_traddr)
cfg.host_traddr = (char *)nvme_ctrl_get_host_traddr(c);
if (!cfg.host_iface)
cfg.host_iface = (char *)nvme_ctrl_get_host_iface(c);
}
} else {
/*