summaryrefslogtreecommitdiffstats
path: root/fabrics.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2023-04-07 12:43:34 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2023-04-07 12:43:34 +0000
commit8e1dcd44fcad7826e5f8fa6c5caa6c23989518d9 (patch)
tree8a5e1e9d02b2562d57d57ef88e26d4778ebeeab3 /fabrics.c
parentReleasing debian version 2.4+really2.3-2. (diff)
downloadnvme-cli-8e1dcd44fcad7826e5f8fa6c5caa6c23989518d9.tar.xz
nvme-cli-8e1dcd44fcad7826e5f8fa6c5caa6c23989518d9.zip
Merging upstream version 2.4+really2.4.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'fabrics.c')
-rw-r--r--fabrics.c111
1 files changed, 23 insertions, 88 deletions
diff --git a/fabrics.c b/fabrics.c
index b94097b..087a56c 100644
--- a/fabrics.c
+++ b/fabrics.c
@@ -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 {
/*