Bug Summary

File:.build-ci/../fabrics.c
Warning:line 497, column 6
Null pointer passed to 1st parameter expecting 'nonnull'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name fabrics.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/__w/nvme-cli/nvme-cli/.build-ci -fcoverage-compilation-dir=/__w/nvme-cli/nvme-cli/.build-ci -resource-dir /usr/lib/llvm-19/lib/clang/19 -include /__w/nvme-cli/nvme-cli/.build-ci/nvme-config.h -I nvme.p -I . -I .. -I ccan -I ../ccan -I libnvme/src -I ../libnvme/src -I /usr/include/json-c -D _FILE_OFFSET_BITS=64 -D _GNU_SOURCE -U NDEBUG -internal-isystem /usr/lib/llvm-19/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -std=gnu99 -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -vectorize-loops -vectorize-slp -analyzer-opt-analyze-headers -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /__w/nvme-cli/nvme-cli/.build-ci/scan-results/2026-06-24-175442-590-1 -x c ../fabrics.c
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2016 Intel Corporation. All rights reserved.
4 * Copyright (c) 2016 HGST, a Western Digital Company.
5 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License version
9 * 2 as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17 *
18 * This file implements the discovery controller feature of NVMe over
19 * Fabrics specification standard.
20 */
21
22#include <dirent.h>
23#include <errno(*__errno_location ()).h>
24#include <fcntl.h>
25#include <getopt.h>
26#include <inttypes.h>
27#include <libgen.h>
28#include <stdbool.h>
29#include <stddef.h>
30#include <stdint.h>
31#include <stdio.h>
32#include <stdlib.h>
33#include <time.h>
34#include <unistd.h>
35
36#include <sys/stat.h>
37#include <sys/types.h>
38
39#include <libnvme.h>
40
41#ifdef NVME_HAVE_LIBKMOD
42#include <libkmod.h>
43#endif
44
45#include "common.h"
46#include "nvme.h"
47#include "nvme-print.h"
48#include "fabrics.h"
49#include "util/cleanup.h"
50#include "logging.h"
51#include "util/sighdl.h"
52
53#define PATH_NVMF_DISC"/usr/local/etc" "/nvme/discovery.conf" SYSCONFDIR"/usr/local/etc" "/nvme/discovery.conf"
54#define PATH_NVMF_CONFIG"/usr/local/etc" "/nvme/config.json" SYSCONFDIR"/usr/local/etc" "/nvme/config.json"
55#define PATH_NVMF_RUNDIR"/usr/local/run" "/nvme" RUNDIR"/usr/local/run" "/nvme"
56#define MAX_DISC_ARGS32 32
57#define MAX_DISC_RETRIES10 10
58
59#define NVMF_DEF_DISC_TMO30 30
60
61/* Name of file to output log pages in their raw format */
62static char *raw;
63static bool_Bool persistent;
64static bool_Bool quiet;
65static bool_Bool dump_config;
66
67static const char *nvmf_tport = "transport type";
68static const char *nvmf_traddr = "transport address";
69static const char *nvmf_nqn = "subsystem nqn";
70static const char *nvmf_trsvcid = "transport service id (e.g. IP port)";
71static const char *nvmf_htraddr = "host traddr (e.g. FC WWN's)";
72static const char *nvmf_hiface = "host interface (for tcp transport)";
73static const char *nvmf_hostnqn = "user-defined hostnqn";
74static const char *nvmf_hostid = "user-defined hostid (if default not used)";
75static const char *nvmf_hostkey = "user-defined dhchap key (if default not used)";
76static const char *nvmf_ctrlkey = "user-defined dhchap controller key (for bi-directional authentication)";
77static const char *nvmf_nr_io_queues = "number of io queues to use (default is core count)";
78static const char *nvmf_nr_write_queues = "number of write queues to use (default 0)";
79static const char *nvmf_nr_poll_queues = "number of poll queues to use (default 0)";
80static const char *nvmf_queue_size = "number of io queue elements to use (default 128)";
81static const char *nvmf_keep_alive_tmo = "keep alive timeout period in seconds";
82static const char *nvmf_reconnect_delay = "reconnect timeout period in seconds";
83static const char *nvmf_ctrl_loss_tmo = "controller loss timeout period in seconds";
84static const char *nvmf_fast_io_fail_tmo = "fast I/O fail timeout (default off)";
85static const char *nvmf_tos = "type of service";
86static const char *nvmf_keyring = "Keyring for TLS key lookup (key id or keyring name)";
87static const char *nvmf_tls_key = "TLS key to use (key id or key in interchange format)";
88static const char *nvmf_tls_key_legacy = "TLS key to use (key id)";
89static const char *nvmf_tls_key_identity = "TLS key identity";
90static const char *nvmf_dup_connect = "allow duplicate connections between same transport host and subsystem port";
91static const char *nvmf_disable_sqflow = "disable controller sq flow control (default false)";
92static const char *nvmf_hdr_digest = "enable transport protocol header digest (TCP transport)";
93static const char *nvmf_data_digest = "enable transport protocol data digest (TCP transport)";
94static const char *nvmf_tls = "enable TLS";
95static const char *nvmf_concat = "enable secure concatenation";
96static const char *nvmf_config_file = "Use specified JSON configuration file or 'none' to disable";
97
98struct nvmf_args {
99 const char *subsysnqn;
100 const char *transport;
101 const char *traddr;
102 const char *host_traddr;
103 const char *host_iface;
104 const char *trsvcid;
105 const char *hostnqn;
106 const char *hostid;
107 const char *hostkey;
108 const char *ctrlkey;
109 const char *keyring;
110 const char *tls_key;
111 const char *tls_key_identity;
112 int queue_size;
113 int nr_io_queues;
114 int reconnect_delay;
115 int ctrl_loss_tmo;
116 int fast_io_fail_tmo;
117 int keep_alive_tmo;
118 int nr_write_queues;
119 int nr_poll_queues;
120 int tos;
121 long keyring_id;
122 long tls_key_id;
123 long tls_configured_key_id;
124 bool_Bool duplicate_connect;
125 bool_Bool disable_sqflow;
126 bool_Bool hdr_digest;
127 bool_Bool data_digest;
128 bool_Bool tls;
129 bool_Bool concat;
130};
131
132#define NVMF_ARGS(n, f, ...)struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ..., {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0
, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT
, &nvme_args.verbose, 0, "Increase output verbosity", 0, }
, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args.output_format
, 1, "Output format: normal|json|binary|tabular", 0, }, {"timeout"
, 0, "NUM", CFG_POSITIVE, &nvme_args.timeout, 1, "timeout value, in milliseconds"
, 0, }, {"dry-run", 0, ((void*)0), CFG_FLAG, &nvme_args.dry_run
, 0, "show command instead of executing", 0, }, {"no-retries"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_retries, 0, "disable retry logic on errors"
, 0, }, {"no-ioctl-probing", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_ioctl_probing, 0, "disable 64-bit IOCTL support probing",
0, }, {"output-format-version", 0, "NUM", CFG_POSITIVE, &
nvme_args.output_format_ver, 1, "output format version: 1|2",
0, }, {"human-readable", 'H', ((void*)0), CFG_FLAG, &nvme_args
.verbose, 0, ((void*)0), 0, ((void*)0), 1}, { ((void*)0) } }
\
133 NVME_ARGS(n, \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
134 OPT_STRING("transport", 't', "STR", &f.transport, nvmf_tport), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
135 OPT_STRING("nqn", 'n', "STR", &f.subsysnqn, nvmf_nqn), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
136 OPT_STRING("traddr", 'a', "STR", &f.traddr, nvmf_traddr), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
137 OPT_STRING("trsvcid", 's', "STR", &f.trsvcid, nvmf_trsvcid), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
138 OPT_STRING("host-traddr", 'w', "STR", &f.host_traddr, nvmf_htraddr), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
139 OPT_STRING("host-iface", 'f', "STR", &f.host_iface, nvmf_hiface), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
140 OPT_STRING("hostnqn", 'q', "STR", &f.hostnqn, nvmf_hostnqn), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
141 OPT_STRING("hostid", 'I', "STR", &f.hostid, nvmf_hostid), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
142 OPT_STRING("dhchap-secret", 'S', "STR", &f.hostkey, nvmf_hostkey), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
143 OPT_STRING("dhchap-ctrl-secret", 'C', "STR", &f.ctrlkey, nvmf_ctrlkey), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
144 OPT_STRING("keyring", 0, "STR", &f.keyring, nvmf_keyring), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
145 OPT_STRING("tls-key", 0, "STR", &f.tls_key, nvmf_tls_key), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
146 OPT_STRING("tls-key-identity", 0, "STR", &f.tls_key_identity, nvmf_tls_key_identity), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
147 OPT_INT("nr-io-queues", 'i', &f.nr_io_queues, nvmf_nr_io_queues), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
148 OPT_INT("nr-write-queues", 'W', &f.nr_write_queues, nvmf_nr_write_queues), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
149 OPT_INT("nr-poll-queues", 'P', &f.nr_poll_queues, nvmf_nr_poll_queues), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
150 OPT_INT("queue-size", 'Q', &f.queue_size, nvmf_queue_size), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
151 OPT_INT("keep-alive-tmo", 'k', &f.keep_alive_tmo, nvmf_keep_alive_tmo), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
152 OPT_INT("reconnect-delay", 'c', &f.reconnect_delay, nvmf_reconnect_delay), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
153 OPT_INT("ctrl-loss-tmo", 'l', &f.ctrl_loss_tmo, nvmf_ctrl_loss_tmo), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
154 OPT_INT("fast_io_fail_tmo", 'F', &f.fast_io_fail_tmo, nvmf_fast_io_fail_tmo),\struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
155 OPT_INT("tos", 'T', &f.tos, nvmf_tos), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
156 OPT_INT("tls_key", 0, &f.tls_key_id, nvmf_tls_key_legacy), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
157 OPT_FLAG("duplicate-connect", 'D', &f.duplicate_connect, nvmf_dup_connect), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
158 OPT_FLAG("disable-sqflow", 0, &f.disable_sqflow, nvmf_disable_sqflow), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
159 OPT_FLAG("hdr-digest", 'g', &f.hdr_digest, nvmf_hdr_digest), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
160 OPT_FLAG("data-digest", 'G', &f.data_digest, nvmf_data_digest), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
161 OPT_FLAG("tls", 0, &f.tls, nvmf_tls), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
162 OPT_FLAG("concat", 0, &f.concat, nvmf_concat), \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
163 ##__VA_ARGS__ \struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
164 )struct argconfig_commandline_options n[] = { {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void*
)0)}, {"transport", 't', "STR", CFG_STRING, &f.transport,
1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &f.
subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &f.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &f.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &f.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &f.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
f.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &f.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S',
"STR", CFG_STRING, &f.hostkey, 1, nvmf_hostkey, 0, }, {"dhchap-ctrl-secret"
, 'C', "STR", CFG_STRING, &f.ctrlkey, 1, nvmf_ctrlkey, 0,
}, {"keyring", 0, "STR", CFG_STRING, &f.keyring, 1, nvmf_keyring
, 0, }, {"tls-key", 0, "STR", CFG_STRING, &f.tls_key, 1, nvmf_tls_key
, 0, }, {"tls-key-identity", 0, "STR", CFG_STRING, &f.tls_key_identity
, 1, nvmf_tls_key_identity, 0, }, {"nr-io-queues", 'i', "NUM"
, CFG_INT, &f.nr_io_queues, 1, nvmf_nr_io_queues, 0, }, {
"nr-write-queues", 'W', "NUM", CFG_INT, &f.nr_write_queues
, 1, nvmf_nr_write_queues, 0, }, {"nr-poll-queues", 'P', "NUM"
, CFG_INT, &f.nr_poll_queues, 1, nvmf_nr_poll_queues, 0, }
, {"queue-size", 'Q', "NUM", CFG_INT, &f.queue_size, 1, nvmf_queue_size
, 0, }, {"keep-alive-tmo", 'k', "NUM", CFG_INT, &f.keep_alive_tmo
, 1, nvmf_keep_alive_tmo, 0, }, {"reconnect-delay", 'c', "NUM"
, CFG_INT, &f.reconnect_delay, 1, nvmf_reconnect_delay, 0
, }, {"ctrl-loss-tmo", 'l', "NUM", CFG_INT, &f.ctrl_loss_tmo
, 1, nvmf_ctrl_loss_tmo, 0, }, {"fast_io_fail_tmo", 'F', "NUM"
, CFG_INT, &f.fast_io_fail_tmo, 1, nvmf_fast_io_fail_tmo,
0, }, {"tos", 'T', "NUM", CFG_INT, &f.tos, 1, nvmf_tos, 0
, }, {"tls_key", 0, "NUM", CFG_INT, &f.tls_key_id, 1, nvmf_tls_key_legacy
, 0, }, {"duplicate-connect", 'D', ((void*)0), CFG_FLAG, &
f.duplicate_connect, 0, nvmf_dup_connect, 0, }, {"disable-sqflow"
, 0, ((void*)0), CFG_FLAG, &f.disable_sqflow, 0, nvmf_disable_sqflow
, 0, }, {"hdr-digest", 'g', ((void*)0), CFG_FLAG, &f.hdr_digest
, 0, nvmf_hdr_digest, 0, }, {"data-digest", 'G', ((void*)0), CFG_FLAG
, &f.data_digest, 0, nvmf_data_digest, 0, }, {"tls", 0, (
(void*)0), CFG_FLAG, &f.tls, 0, nvmf_tls, 0, }, {"concat"
, 0, ((void*)0), CFG_FLAG, &f.concat, 0, nvmf_concat, 0, }
, ##__VA_ARGS__, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
165
166static void nvmf_default_args(struct nvmf_args *fa)
167{
168 fa->tos = -1;
169 fa->ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO600;
170}
171
172static void save_discovery_log(char *raw, struct nvmf_discovery_log *log)
173{
174 uint64_t numrec = le64_to_cpu(log->numrec);
175 int fd, len, ret;
176
177 fd = open(raw, O_CREAT0100 | O_RDWR02 | O_TRUNC01000, 0600);
178 if (fd < 0) {
179 fprintf(stderrstderr, "failed to open %s: %s\n", raw, libnvme_strerror(errno(*__errno_location ())));
180 return;
181 }
182
183 len = sizeof(struct nvmf_discovery_log) + numrec * sizeof(struct nvmf_disc_log_entry);
184
185 ret = write(fd, log, len);
186 if (ret < 0)
187 fprintf(stderrstderr, "failed to write to %s: %s\n",
188 raw, libnvme_strerror(errno(*__errno_location ())));
189 else
190 printf("Discovery log is saved to %s\n", raw);
191
192 close(fd);
193}
194
195static int setup_common_context(struct libnvmf_context *fctx,
196 struct nvmf_args *fa);
197
198struct hook_fabrics_data {
199 struct nvmf_args *fa;
200 nvme_print_flags_t flags;
201 bool_Bool quiet;
202 char *raw;
203 char **argv;
204 FILE *f;
205};
206
207static bool_Bool hook_decide_retry(struct libnvmf_context *fctx, int err,
208 void *user_data)
209{
210 if (err == -EAGAIN11 || (err == -EINTR4 && !nvme_sigint_received)) {
211 print_debug("libnvmf_add_ctrl returned '%s'\n", libnvme_strerror(-err))do { if (is_printable_at_level(LIBNVME_LOG_DEBUG)) printf("libnvmf_add_ctrl returned '%s'\n"
, libnvme_strerror(-err)); } while (0)
;
212 return true1;
213 }
214
215 return false0;
216}
217
218static void hook_connected(struct libnvmf_context *fctx,
219 struct libnvme_ctrl *c, void *user_data)
220{
221 struct hook_fabrics_data *hfd = user_data;
222
223 if (hfd->quiet)
224 return;
225
226 if (hfd->flags == NORMAL) {
227 printf("connecting to device: %s\n", libnvme_ctrl_get_name(c));
228 return;
229 }
230
231#ifdef CONFIG_JSONC
232 if (hfd->flags == JSON) {
233 struct json_object *root;
234
235 root = json_create_object()json_object_new_object();
236
237 json_object_add_value_string(root, "device",
238 libnvme_ctrl_get_name(c));
239
240 json_print_object(root, NULL)printf("%s", json_object_to_json_string_ext(root, (1 <<
1) | (1 << 4)))
;
241 printf("\n");
242 json_free_object(root)json_object_put(root);
243 }
244#endif
245}
246
247static void hook_already_connected(struct libnvmf_context *fctx,
248 struct libnvme_host *host, const char *subsysnqn,
249 const char *transport, const char *traddr,
250 const char *trsvcid, void *user_data)
251{
252 if (quiet)
253 return;
254
255 fprintf(stderrstderr, "already connected to hostnqn=%s,nqn=%s,transport=%s,traddr=%s,trsvcid=%s\n",
256 libnvme_host_get_hostnqn(host), subsysnqn,
257 transport, traddr, trsvcid);
258}
259
260static void hook_discovery_log(struct libnvmf_context *fctx,
261 bool_Bool connect, struct nvmf_discovery_log *log,
262 uint64_t numrec, void *user_data)
263{
264 struct hook_fabrics_data *hfd = user_data;
265
266 if (hfd->raw)
267 save_discovery_log(hfd->raw, log);
268 else if (!connect)
269 nvme_show_discovery_log(log, numrec, hfd->flags);
270}
271
272static int hook_parser_init(struct libnvmf_context *dctx, void *user_data)
273{
274 struct hook_fabrics_data *hfd = user_data;
275
276 hfd->f = fopen(PATH_NVMF_DISC"/usr/local/etc" "/nvme/discovery.conf", "r");
277 if (hfd->f == NULL((void*)0)) {
278 fprintf(stderrstderr, "No params given and no %s\n", PATH_NVMF_DISC"/usr/local/etc" "/nvme/discovery.conf");
279 return -ENOENT2;
280 }
281
282 hfd->argv = calloc(MAX_DISC_ARGS32, sizeof(char *));
283 if (!hfd->argv)
284 return -1;
285
286 hfd->argv[0] = "discover";
287
288 return 0;
289}
290
291static void hook_parser_cleanup(struct libnvmf_context *fctx, void *user_data)
292{
293 struct hook_fabrics_data *hfd = user_data;
294
295 free(hfd->argv);
296 fclose(hfd->f);
297}
298
299static int set_fabrics_options(struct libnvmf_context *fctx,
300 struct nvmf_args *fa)
301{
302 libnvmf_context_set_io_queues(fctx, fa->nr_io_queues,
303 fa->nr_write_queues, fa->nr_poll_queues,
304 fa->queue_size, fa->disable_sqflow);
305 libnvmf_context_set_reconnect_policy(fctx, fa->ctrl_loss_tmo,
306 fa->reconnect_delay, fa->fast_io_fail_tmo);
307 libnvmf_context_set_keep_alive_tmo(fctx, fa->keep_alive_tmo);
308 libnvmf_context_set_tos(fctx, fa->tos);
309 libnvmf_context_set_keyring_id(fctx, fa->keyring_id);
310 libnvmf_context_set_tls_key_id(fctx, fa->tls_key_id);
311 libnvmf_context_set_tls_configured_key_id(fctx,
312 fa->tls_configured_key_id);
313 libnvmf_context_set_duplicate_connect(fctx, fa->duplicate_connect);
314 libnvmf_context_set_hdr_digest(fctx, fa->hdr_digest);
315 libnvmf_context_set_data_digest(fctx, fa->data_digest);
316 libnvmf_context_set_tls(fctx, fa->tls);
317 libnvmf_context_set_concat(fctx, fa->concat);
318
319 return 0;
320}
321
322static int hook_parser_next_line(struct libnvmf_context *fctx, void *user_data)
323{
324 struct hook_fabrics_data *hfd = user_data;
325 struct nvmf_args fa;
326 char *ptr, *p;
327 static char line[4096];
328 int argc, ret = 0;
329 bool_Bool force = false0;
330
331 NVMF_ARGS(opts, fa,struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG
, &persistent, 0, "persistent discovery connection", 0, }
, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0
, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT
, &nvme_args.verbose, 0, "Increase output verbosity", 0, }
, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args.output_format
, 1, "Output format: normal|json|binary|tabular", 0, }, {"timeout"
, 0, "NUM", CFG_POSITIVE, &nvme_args.timeout, 1, "timeout value, in milliseconds"
, 0, }, {"dry-run", 0, ((void*)0), CFG_FLAG, &nvme_args.dry_run
, 0, "show command instead of executing", 0, }, {"no-retries"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_retries, 0, "disable retry logic on errors"
, 0, }, {"no-ioctl-probing", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_ioctl_probing, 0, "disable 64-bit IOCTL support probing",
0, }, {"output-format-version", 0, "NUM", CFG_POSITIVE, &
nvme_args.output_format_ver, 1, "output format version: 1|2",
0, }, {"human-readable", 'H', ((void*)0), CFG_FLAG, &nvme_args
.verbose, 0, ((void*)0), 0, ((void*)0), 1}, { ((void*)0) } }
332 OPT_FLAG("persistent", 'p', &persistent, "persistent discovery connection"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG
, &persistent, 0, "persistent discovery connection", 0, }
, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0
, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT
, &nvme_args.verbose, 0, "Increase output verbosity", 0, }
, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args.output_format
, 1, "Output format: normal|json|binary|tabular", 0, }, {"timeout"
, 0, "NUM", CFG_POSITIVE, &nvme_args.timeout, 1, "timeout value, in milliseconds"
, 0, }, {"dry-run", 0, ((void*)0), CFG_FLAG, &nvme_args.dry_run
, 0, "show command instead of executing", 0, }, {"no-retries"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_retries, 0, "disable retry logic on errors"
, 0, }, {"no-ioctl-probing", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_ioctl_probing, 0, "disable 64-bit IOCTL support probing",
0, }, {"output-format-version", 0, "NUM", CFG_POSITIVE, &
nvme_args.output_format_ver, 1, "output format version: 1|2",
0, }, {"human-readable", 'H', ((void*)0), CFG_FLAG, &nvme_args
.verbose, 0, ((void*)0), 0, ((void*)0), 1}, { ((void*)0) } }
333 OPT_FLAG("force", 0, &force, "Force persistent discovery controller creation"))struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG
, &persistent, 0, "persistent discovery connection", 0, }
, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0
, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT
, &nvme_args.verbose, 0, "Increase output verbosity", 0, }
, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args.output_format
, 1, "Output format: normal|json|binary|tabular", 0, }, {"timeout"
, 0, "NUM", CFG_POSITIVE, &nvme_args.timeout, 1, "timeout value, in milliseconds"
, 0, }, {"dry-run", 0, ((void*)0), CFG_FLAG, &nvme_args.dry_run
, 0, "show command instead of executing", 0, }, {"no-retries"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_retries, 0, "disable retry logic on errors"
, 0, }, {"no-ioctl-probing", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_ioctl_probing, 0, "disable 64-bit IOCTL support probing",
0, }, {"output-format-version", 0, "NUM", CFG_POSITIVE, &
nvme_args.output_format_ver, 1, "output format version: 1|2",
0, }, {"human-readable", 'H', ((void*)0), CFG_FLAG, &nvme_args
.verbose, 0, ((void*)0), 0, ((void*)0), 1}, { ((void*)0) } }
;
334
335 memcpy(&fa, hfd->fa, sizeof(fa));
336 do {
337 if (fgets(line, sizeof(line), hfd->f) == NULL((void*)0))
338 return -EOF(-1);
339
340 if (line[0] == '#' || line[0] == '\n')
341 continue;
342
343 argc = 1;
344 p = line;
345 while ((ptr = strsep(&p, " =\n")) != NULL((void*)0))
346 hfd->argv[argc++] = ptr;
347 hfd->argv[argc] = NULL((void*)0);
348
349 fa.subsysnqn = NVME_DISC_SUBSYS_NAME"nqn.2014-08.org.nvmexpress.discovery";
350 if (argconfig_parse(argc, hfd->argv, "config", opts))
351 continue;
352 } while (!fa.transport && !fa.traddr);
353
354 if (!fa.trsvcid)
355 fa.trsvcid = libnvmf_get_default_trsvcid(fa.transport, true1);
356
357 ret = setup_common_context(fctx, &fa);
358 if (ret)
359 return ret;
360
361 libnvmf_context_set_discovery_hooks(fctx, hook_discovery_log,
362 hook_parser_init, hook_parser_cleanup, hook_parser_next_line);
363
364 return 0;
365}
366
367static int setup_common_context(struct libnvmf_context *fctx,
368 struct nvmf_args *fa)
369{
370 int err;
371
372 err = libnvmf_context_set_connection(fctx,
373 fa->subsysnqn, fa->transport,
374 fa->traddr, fa->trsvcid,
375 fa->host_traddr, fa->host_iface);
376 if (err)
377 return err;
378
379 err = libnvmf_context_set_hostnqn(fctx,
380 fa->hostnqn, fa->hostid);
381 if (err)
382 return err;
383
384 err = libnvmf_context_set_crypto(fctx,
385 fa->hostkey, fa->ctrlkey,
386 fa->keyring, fa->tls_key,
387 fa->tls_key_identity);
388 if (err)
389 return err;
390
391 return set_fabrics_options(fctx, fa);
392}
393
394static int create_common_context(struct libnvme_global_ctx *ctx,
395 bool_Bool persistent, struct nvmf_args *fa,
396 void *user_data, struct libnvmf_context **fctxp)
397{
398 struct libnvmf_context *fctx;
399 int err;
400
401 err = libnvmf_context_create(ctx, hook_decide_retry, hook_connected,
402 hook_already_connected, user_data, &fctx);
403 if (err)
404 return err;
405
406 err = setup_common_context(fctx, fa);
407 if (err)
408 goto err;
409
410 err = libnvmf_context_set_crypto(fctx, fa->hostkey, fa->ctrlkey,
411 fa->keyring, fa->tls_key, fa->tls_key_identity);
412 if (err)
413 goto err;
414
415 libnvmf_context_set_persistent(fctx, persistent);
416
417 *fctxp = fctx;
418
419 return 0;
420
421err:
422 libnvmf_context_free(fctx);
423 return err;
424}
425
426static int create_discovery_context(struct libnvme_global_ctx *ctx,
427 bool_Bool persistent, const char *device,
428 struct nvmf_args *fa,
429 void *user_data, struct libnvmf_context **fctxp)
430{
431 struct libnvmf_context *fctx;
432 int err;
433
434 err = create_common_context(ctx, persistent, fa, user_data,
435 &fctx);
436 if (err)
437 return err;
438
439 err = libnvmf_context_set_discovery_hooks(fctx, hook_discovery_log,
440 hook_parser_init, hook_parser_cleanup, hook_parser_next_line);
441 if (err)
442 goto err;
443
444 libnvmf_context_set_default_max_discovery_retries(fctx,
445 MAX_DISC_RETRIES10);
446 libnvmf_context_set_default_keep_alive_timeout(fctx, NVMF_DEF_DISC_TMO30);
447
448 err = libnvmf_context_set_device(fctx, device);
449 if (err)
450 goto err;
451
452 *fctxp = fctx;
453 return 0;
454
455err:
456 libnvmf_context_free(fctx);
457 return err;
458}
459
460static int nvme_read_volatile_config(struct libnvme_global_ctx *ctx)
461{
462 char *filename, *ext;
463 struct dirent *dir;
464 DIR *d;
465 int ret = -ENOENT2;
466
467 d = opendir(PATH_NVMF_RUNDIR"/usr/local/run" "/nvme");
468 if (!d)
469 return -ENOTDIR20;
470
471 while ((dir = readdir(d))) {
472 if (dir->d_type != DT_REGDT_REG)
473 continue;
474
475 ext = strchr(dir->d_name, '.');
476 if (!ext || strcmp("json", ext + 1))
477 continue;
478
479 if (asprintf(&filename, "%s/%s", PATH_NVMF_RUNDIR"/usr/local/run" "/nvme", dir->d_name) < 0) {
480 ret = -ENOMEM12;
481 break;
482 }
483
484 if (libnvme_read_config(ctx, filename))
485 ret = 0;
486
487 free(filename);
488 }
489 closedir(d);
490
491 return ret;
492}
493
494static int nvme_read_config_checked(struct libnvme_global_ctx *ctx,
495 const char *filename)
496{
497 if (access(filename, F_OK0))
13
Null pointer passed to 1st parameter expecting 'nonnull'
498 return -errno(*__errno_location ());
499
500 return libnvme_read_config(ctx, filename);
501}
502
503static void load_nvme_fabrics_module(void)
504{
505#ifdef NVME_HAVE_LIBKMOD
506 struct kmod_ctx *ctx;
507 struct kmod_module *mod;
508 int err, state;
509 int timeout = 20; /* 2 seconds */
510
511 ctx = kmod_new(NULL((void*)0), NULL((void*)0));
512 if (!ctx)
513 return;
514
515 err = kmod_module_new_from_name(ctx, "nvme-fabrics", &mod);
516 if (err)
517 goto unref;
518
519 state = kmod_module_get_initstate(mod);
520 if (state != KMOD_MODULE_LIVE && state != KMOD_MODULE_BUILTIN) {
521 err = kmod_module_probe_insert_module(mod,
522 KMOD_PROBE_APPLY_BLACKLIST, NULL((void*)0), NULL((void*)0), NULL((void*)0), NULL((void*)0));
523 if (err)
524 goto mod_unref;
525
526 while (timeout--) {
527 state = kmod_module_get_initstate(mod);
528 if (state == KMOD_MODULE_LIVE)
529 goto mod_unref;
530
531 /* 100 ms */
532 usleep(100 * 1000);
533 }
534 err = -ENOENT2;
535 }
536
537mod_unref:
538 kmod_module_unref(mod);
539unref:
540 kmod_unref(ctx);
541
542 if (err)
543 fprintf(stderrstderr, "Couldn't load the nvme-fabrics module\n");
544#endif
545}
546
547#define NBFT_SYSFS_PATH"/sys/firmware/acpi/tables" "/sys/firmware/acpi/tables"
548
549int fabrics_discovery(const char *desc, int argc, char **argv, bool_Bool connect)
550{
551 char *config_file = PATH_NVMF_CONFIG"/usr/local/etc" "/nvme/config.json";
552 nvme_print_flags_t flags;
553 __cleanup_nvme_global_ctx__attribute__((cleanup(cleanup_nvme_global_ctx))) struct libnvme_global_ctx *ctx = NULL((void*)0);
554 __cleanup_nvmf_context__attribute__((cleanup(cleanup_nvmf_context))) struct libnvmf_context *fctx = NULL((void*)0);
555 int ret;
556 struct nvmf_args fa = { .subsysnqn = NVME_DISC_SUBSYS_NAME"nqn.2014-08.org.nvmexpress.discovery" };
557 char *device = NULL((void*)0);
558 bool_Bool force = false0;
559 bool_Bool json_config = false0;
560 bool_Bool nbft = false0, nonbft = false0;
561 char *nbft_path = NBFT_SYSFS_PATH"/sys/firmware/acpi/tables";
562 char *owner = NULL((void*)0);
563
564 NVMF_ARGS(opts, fa,struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
565 OPT_STRING("device", 'd', "DEV", &device, "use existing discovery controller device"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
566 OPT_FILE("raw", 'r', &raw, "save raw output to file"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
567 OPT_FLAG("persistent", 'p', &persistent, "persistent discovery connection"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
568 OPT_FLAG("quiet", 0, &quiet, "suppress already connected errors"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
569 OPT_STRING("config", 'J', "FILE", &config_file, nvmf_config_file),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
570 OPT_FLAG("dump-config", 'O', &dump_config, "Dump configuration file to stdout"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
571 OPT_FLAG("force", 0, &force, "Force persistent discovery controller creation"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
572 OPT_FLAG("nbft", 0, &nbft, "Only look at NBFT tables"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
573 OPT_FLAG("no-nbft", 0, &nonbft, "Do not look at NBFT tables"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
574 OPT_STRING("owner", 0, "NAME", &owner, "record this owner in the registry"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
575 OPT_STRING("nbft-path", 0, "STR", &nbft_path, "user-defined path for NBFT tables"))struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"device", 'd', "DEV", CFG_STRING, &
device, 1, "use existing discovery controller device", 0, }, {
"raw", 'r', "FILE", CFG_STRING, &raw, 1, "save raw output to file"
, 0, }, {"persistent", 'p', ((void*)0), CFG_FLAG, &persistent
, 0, "persistent discovery connection", 0, }, {"quiet", 0, ((
void*)0), CFG_FLAG, &quiet, 0, "suppress already connected errors"
, 0, }, {"config", 'J', "FILE", CFG_STRING, &config_file,
1, nvmf_config_file, 0, }, {"dump-config", 'O', ((void*)0), CFG_FLAG
, &dump_config, 0, "Dump configuration file to stdout", 0
, }, {"force", 0, ((void*)0), CFG_FLAG, &force, 0, "Force persistent discovery controller creation"
, 0, }, {"nbft", 0, ((void*)0), CFG_FLAG, &nbft, 0, "Only look at NBFT tables"
, 0, }, {"no-nbft", 0, ((void*)0), CFG_FLAG, &nonbft, 0, "Do not look at NBFT tables"
, 0, }, {"owner", 0, "NAME", CFG_STRING, &owner, 1, "record this owner in the registry"
, 0, }, {"nbft-path", 0, "STR", CFG_STRING, &nbft_path, 1
, "user-defined path for NBFT tables", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
;
576
577 nvmf_default_args(&fa);
578
579 load_nvme_fabrics_module();
580
581 ret = argconfig_parse(argc, argv, desc, opts);
582 if (ret)
1
Assuming 'ret' is 0
2
Taking false branch
583 return ret;
584
585 ret = validate_output_format(nvme_args.output_format, &flags);
586 if (ret < 0) {
3
Assuming 'ret' is >= 0
4
Taking false branch
587 nvme_show_error("Invalid output format")nvme_show_message(1, "Invalid output format");
588 return ret;
589 }
590
591 if (!strcmp(config_file, "none"))
5
Taking true branch
592 config_file = NULL((void*)0);
6
Null pointer value stored to 'config_file'
593
594 log_level = map_log_level(nvme_args.verbose, quiet);
595
596 ctx = libnvme_create_global_ctx(stderrstderr, log_level);
597 if (!ctx) {
7
Assuming 'ctx' is non-null
598 fprintf(stderrstderr, "Failed to create topology root: %s\n",
599 libnvme_strerror(errno(*__errno_location ())));
600 return -ENOMEM12;
601 }
602 /*
603 * --nbft defaults the owner to "nbft" so legacy boot scripts that
604 * call "connect-all --nbft" record ownership unchanged. An explicit
605 * --owner overrides that default.
606 */
607 if (owner || nbft) {
8
Assuming 'owner' is null
9
Assuming 'nbft' is false
10
Taking false branch
608 ret = libnvme_set_owner(ctx, owner ? owner : "nbft");
609 if (ret) {
610 fprintf(stderrstderr, "failed to set owner: %s\n",
611 libnvme_strerror(-ret));
612 return ret;
613 }
614 }
615
616 if (!nvme_read_config_checked(ctx, config_file))
11
Passing null pointer value via 2nd parameter 'filename'
12
Calling 'nvme_read_config_checked'
617 json_config = true1;
618 if (!nvme_read_volatile_config(ctx))
619 json_config = true1;
620
621 libnvme_skip_namespaces(ctx);
622 ret = libnvme_scan_topology(ctx, NULL((void*)0), NULL((void*)0));
623 if (ret < 0) {
624 fprintf(stderrstderr, "Failed to scan topology: %s\n",
625 libnvme_strerror(-ret));
626 return ret;
627 }
628
629 if (device) {
630 if (!strcmp(device, "none"))
631 device = NULL((void*)0);
632 else if (!strncmp(device, "/dev/", 5))
633 device += 5;
634 }
635
636 struct hook_fabrics_data dld = {
637 .fa = &fa,
638 .flags = flags,
639 .raw = raw,
640 };
641 ret = create_discovery_context(ctx, persistent, device, &fa,
642 &dld, &fctx);
643 if (ret)
644 return ret;
645
646 if (!device && !fa.transport && !fa.traddr) {
647 if (!nonbft)
648 ret = libnvmf_discovery_nbft(ctx, fctx,
649 connect, nbft_path);
650 if (nbft)
651 goto out_free;
652
653 if (json_config)
654 ret = libnvmf_discovery_config_json(ctx, fctx,
655 connect, force);
656 if (ret || access(PATH_NVMF_DISC"/usr/local/etc" "/nvme/discovery.conf", F_OK0))
657 goto out_free;
658
659 ret = libnvmf_discovery_config_file(ctx, fctx, connect, force);
660 goto out_free;
661 }
662
663 ret = libnvmf_discovery(ctx, fctx, connect, force);
664
665out_free:
666 if (dump_config)
667 libnvme_dump_config(ctx, STDOUT_FILENO1);
668
669 return ret;
670}
671
672int fabrics_connect(const char *desc, int argc, char **argv)
673{
674 __cleanup_free__attribute__((cleanup(freep))) char *hnqn = NULL((void*)0);
675 __cleanup_free__attribute__((cleanup(freep))) char *hid = NULL((void*)0);
676 char *config_file = NULL((void*)0);
677 char *owner = NULL((void*)0);
678 __cleanup_nvme_global_ctx__attribute__((cleanup(cleanup_nvme_global_ctx))) struct libnvme_global_ctx *ctx = NULL((void*)0);
679 __cleanup_nvmf_context__attribute__((cleanup(cleanup_nvmf_context))) struct libnvmf_context *fctx = NULL((void*)0);
680 __cleanup_nvme_ctrl__attribute__((cleanup(cleanup_nvme_ctrl))) libnvme_ctrl_t c = NULL((void*)0);
681 int ret;
682 nvme_print_flags_t flags;
683 struct nvmf_args fa = { 0 };
684
685 NVMF_ARGS(opts, fa,struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"owner", 0, "NAME", CFG_STRING
, &owner, 1, "record this owner in the registry", 0, }, {
"dump-config", 'O', ((void*)0), CFG_FLAG, &dump_config, 0
, "Dump JSON configuration to stdout", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
686 OPT_STRING("config", 'J', "FILE", &config_file, nvmf_config_file),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"owner", 0, "NAME", CFG_STRING
, &owner, 1, "record this owner in the registry", 0, }, {
"dump-config", 'O', ((void*)0), CFG_FLAG, &dump_config, 0
, "Dump JSON configuration to stdout", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
687 OPT_STRING("owner", 0, "NAME", &owner, "record this owner in the registry"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"owner", 0, "NAME", CFG_STRING
, &owner, 1, "record this owner in the registry", 0, }, {
"dump-config", 'O', ((void*)0), CFG_FLAG, &dump_config, 0
, "Dump JSON configuration to stdout", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
688 OPT_FLAG("dump-config", 'O', &dump_config, "Dump JSON configuration to stdout"))struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"owner", 0, "NAME", CFG_STRING
, &owner, 1, "record this owner in the registry", 0, }, {
"dump-config", 'O', ((void*)0), CFG_FLAG, &dump_config, 0
, "Dump JSON configuration to stdout", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
;
689
690 nvmf_default_args(&fa);
691
692 load_nvme_fabrics_module();
693
694 ret = argconfig_parse(argc, argv, desc, opts);
695 if (ret)
696 return ret;
697
698 ret = validate_output_format(nvme_args.output_format, &flags);
699 if (ret < 0) {
700 nvme_show_error("Invalid output format")nvme_show_message(1, "Invalid output format");
701 return ret;
702 }
703
704 if (config_file && strcmp(config_file, "none"))
705 goto do_connect;
706
707 if (!fa.subsysnqn) {
708 fprintf(stderrstderr,
709 "required argument [--nqn | -n] not specified\n");
710 return -EINVAL22;
711 }
712
713 if (!fa.transport) {
714 fprintf(stderrstderr,
715 "required argument [--transport | -t] not specified\n");
716 return -EINVAL22;
717 }
718
719 if (strcmp(fa.transport, "loop")) {
720 if (!fa.traddr) {
721 fprintf(stderrstderr,
722 "required argument [--traddr | -a] not specified for transport %s\n",
723 fa.transport);
724 return -EINVAL22;
725 }
726 }
727
728do_connect:
729 log_level = map_log_level(nvme_args.verbose, quiet);
730
731 ctx = libnvme_create_global_ctx(stderrstderr, log_level);
732 if (!ctx) {
733 fprintf(stderrstderr, "Failed to create topology root: %s\n",
734 libnvme_strerror(errno(*__errno_location ())));
735 return -ENOMEM12;
736 }
737 if (owner) {
738 ret = libnvme_set_owner(ctx, owner);
739 if (ret) {
740 fprintf(stderrstderr, "failed to set owner: %s\n",
741 libnvme_strerror(-ret));
742 return ret;
743 }
744 }
745
746 libnvme_read_config(ctx, config_file);
747 nvme_read_volatile_config(ctx);
748
749 libnvme_skip_namespaces(ctx);
750 ret = libnvme_scan_topology(ctx, NULL((void*)0), NULL((void*)0));
751 if (ret < 0) {
752 fprintf(stderrstderr, "Failed to scan topology: %s\n",
753 libnvme_strerror(-ret));
754 return ret;
755 }
756
757 struct hook_fabrics_data hfd = {
758 .flags = flags,
759 .quiet = dump_config,
760 .raw = raw,
761 };
762 ret = create_common_context(ctx, persistent, &fa, &hfd, &fctx);
763 if (ret)
764 return ret;
765
766 if (config_file)
767 return libnvmf_connect_config_json(ctx, fctx);
768
769 ret = libnvmf_connect(ctx, fctx);
770 if (ret) {
771 fprintf(stderrstderr, "failed to connect: %s\n",
772 libnvme_strerror(-ret));
773 return ret;
774 }
775
776 if (dump_config)
777 libnvme_dump_config(ctx, STDOUT_FILENO1);
778
779 return 0;
780}
781
782static libnvme_ctrl_t lookup_nvme_ctrl(struct libnvme_global_ctx *ctx,
783 const char *name)
784{
785 libnvme_host_t h;
786 libnvme_subsystem_t s;
787 libnvme_ctrl_t c;
788
789 libnvme_for_each_host(ctx, h)for (h = libnvme_first_host(ctx); h != ((void*)0); h = libnvme_next_host
(ctx, h))
{
790 libnvme_for_each_subsystem(h, s)for (s = libnvme_first_subsystem(h); s != ((void*)0); s = libnvme_next_subsystem
(h, s))
{
791 libnvme_subsystem_for_each_ctrl(s, c)for (c = libnvme_subsystem_first_ctrl(s); c != ((void*)0); c =
libnvme_subsystem_next_ctrl(s, c))
{
792 if (!strcmp(libnvme_ctrl_get_name(c), name))
793 return c;
794 }
795 }
796 }
797 return NULL((void*)0);
798}
799
800static void nvmf_disconnect_nqn(struct libnvme_global_ctx *ctx, char *nqn)
801{
802 int i = 0;
803 char *n = nqn;
804 char *p;
805 libnvme_host_t h;
806 libnvme_subsystem_t s;
807 libnvme_ctrl_t c;
808
809 while ((p = strsep(&n, ",")) != NULL((void*)0)) {
810 if (!strlen(p))
811 continue;
812 libnvme_for_each_host(ctx, h)for (h = libnvme_first_host(ctx); h != ((void*)0); h = libnvme_next_host
(ctx, h))
{
813 libnvme_for_each_subsystem(h, s)for (s = libnvme_first_subsystem(h); s != ((void*)0); s = libnvme_next_subsystem
(h, s))
{
814 if (strcmp(libnvme_subsystem_get_subsysnqn(s), p))
815 continue;
816 libnvme_subsystem_for_each_ctrl(s, c)for (c = libnvme_subsystem_first_ctrl(s); c != ((void*)0); c =
libnvme_subsystem_next_ctrl(s, c))
{
817 if (!libnvmf_disconnect_ctrl(c))
818 i++;
819 }
820 }
821 }
822 }
823 printf("NQN:%s disconnected %d controller(s)\n", nqn, i);
824}
825
826int fabrics_disconnect(const char *desc, int argc, char **argv)
827{
828 const char *device = "nvme device handle";
829 __cleanup_nvme_global_ctx__attribute__((cleanup(cleanup_nvme_global_ctx))) struct libnvme_global_ctx *ctx = NULL((void*)0);
830 libnvme_ctrl_t c;
831 char *p;
832 int ret;
833
834 struct config {
835 char *nqn;
836 char *device;
837 };
838
839 struct config cfg = { 0 };
840
841 NVME_ARGS(opts,struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"nqn", 'n', "NAME", CFG_STRING, &cfg.nqn, 1, nvmf_nqn
, 0, }, {"device", 'd', "DEV", CFG_STRING, &cfg.device, 1
, device, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
842 OPT_STRING("nqn", 'n', "NAME", &cfg.nqn, nvmf_nqn),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"nqn", 'n', "NAME", CFG_STRING, &cfg.nqn, 1, nvmf_nqn
, 0, }, {"device", 'd', "DEV", CFG_STRING, &cfg.device, 1
, device, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
843 OPT_STRING("device", 'd', "DEV", &cfg.device, device))struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"nqn", 'n', "NAME", CFG_STRING, &cfg.nqn, 1, nvmf_nqn
, 0, }, {"device", 'd', "DEV", CFG_STRING, &cfg.device, 1
, device, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void
*)0), 0, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM"
, CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
;
844
845 ret = argconfig_parse(argc, argv, desc, opts);
846 if (ret)
847 return ret;
848
849 if (cfg.nqn && cfg.device) {
850 fprintf(stderrstderr,
851 "Both device name [--device | -d] and NQN [--nqn | -n] are specified\n");
852 return -EINVAL22;
853 }
854 if (!cfg.nqn && !cfg.device) {
855 fprintf(stderrstderr,
856 "Neither device name [--device | -d] nor NQN [--nqn | -n] provided\n");
857 return -EINVAL22;
858 }
859
860 log_level = map_log_level(nvme_args.verbose, false0);
861
862 ctx = libnvme_create_global_ctx(stderrstderr, log_level);
863 if (!ctx) {
864 fprintf(stderrstderr, "Failed to create topology root: %s\n",
865 libnvme_strerror(errno(*__errno_location ())));
866 return -ENOMEM12;
867 }
868 libnvme_skip_namespaces(ctx);
869 ret = libnvme_scan_topology(ctx, NULL((void*)0), NULL((void*)0));
870 if (ret < 0) {
871 /*
872 * Do not report an error when the modules are not
873 * loaded, this allows the user to unconditionally call
874 * disconnect.
875 */
876 if (ret == -ENOENT2)
877 return 0;
878
879 fprintf(stderrstderr, "Failed to scan topology: %s\n",
880 libnvme_strerror(-ret));
881 return ret;
882 }
883
884 if (cfg.nqn)
885 nvmf_disconnect_nqn(ctx, cfg.nqn);
886
887 if (cfg.device) {
888 char *d;
889
890 d = cfg.device;
891 while ((p = strsep(&d, ",")) != NULL((void*)0)) {
892 if (!strncmp(p, "/dev/", 5))
893 p += 5;
894 c = lookup_nvme_ctrl(ctx, p);
895 if (!c) {
896 fprintf(stderrstderr,
897 "Did not find device %s\n", p);
898 return -ENODEV19;
899 }
900 ret = libnvmf_disconnect_ctrl(c);
901 if (ret)
902 fprintf(stderrstderr,
903 "Failed to disconnect %s: %s\n",
904 p, libnvme_strerror(-ret));
905 }
906 }
907
908 return 0;
909}
910
911/* disconnect-all policy: should controller @c be torn down? */
912static bool_Bool disconnect_all_match(struct libnvme_global_ctx *ctx,
913 libnvme_ctrl_t c, const char *transport,
914 const char *owner, bool_Bool force)
915{
916 if (transport && strcmp(transport, libnvme_ctrl_get_transport(c)))
917 return false0;
918 if (!libnvme_ctrl_is_transport_fabric(c))
919 return false0;
920 if (force)
921 return true1;
922
923 /*
924 * attr_equal() returns 0 only on an exact match; a read error (<0)
925 * compares as "not a match", so we never disconnect on error.
926 */
927 return libnvmf_registry_attr_equal(ctx, libnvme_ctrl_get_name(c),
928 "owner", owner) == 0;
929}
930
931int fabrics_disconnect_all(const char *desc, int argc, char **argv)
932{
933 const char *owner_help = "disconnect only controllers owned by NAME";
934 const char *force_help = "disconnect all controllers regardless of ownership";
935 __cleanup_nvme_global_ctx__attribute__((cleanup(cleanup_nvme_global_ctx))) struct libnvme_global_ctx *ctx = NULL((void*)0);
936 libnvme_host_t h;
937 libnvme_subsystem_t s;
938 libnvme_ctrl_t c;
939 int ret;
940
941 struct config {
942 char *transport;
943 char *owner;
944 bool_Bool force;
945 };
946
947 struct config cfg = { 0 };
948
949 NVME_ARGS(opts,struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &cfg.transport
, 1, nvmf_tport, 0, }, {"owner", 0, "NAME", CFG_STRING, &
cfg.owner, 1, owner_help, 0, }, {"force", 0, ((void*)0), CFG_FLAG
, &cfg.force, 0, force_help, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR
, ((void*)0), 0, "Global options", 0, ((void*)0)}, {"verbose"
, 'v', "NUM", CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
950 OPT_STRING("transport", 't', "STR", &cfg.transport, nvmf_tport),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &cfg.transport
, 1, nvmf_tport, 0, }, {"owner", 0, "NAME", CFG_STRING, &
cfg.owner, 1, owner_help, 0, }, {"force", 0, ((void*)0), CFG_FLAG
, &cfg.force, 0, force_help, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR
, ((void*)0), 0, "Global options", 0, ((void*)0)}, {"verbose"
, 'v', "NUM", CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
951 OPT_STRING("owner", 0, "NAME", &cfg.owner, owner_help),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &cfg.transport
, 1, nvmf_tport, 0, }, {"owner", 0, "NAME", CFG_STRING, &
cfg.owner, 1, owner_help, 0, }, {"force", 0, ((void*)0), CFG_FLAG
, &cfg.force, 0, force_help, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR
, ((void*)0), 0, "Global options", 0, ((void*)0)}, {"verbose"
, 'v', "NUM", CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
952 OPT_FLAG("force", 0, &cfg.force, force_help))struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &cfg.transport
, 1, nvmf_tport, 0, }, {"owner", 0, "NAME", CFG_STRING, &
cfg.owner, 1, owner_help, 0, }, {"force", 0, ((void*)0), CFG_FLAG
, &cfg.force, 0, force_help, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR
, ((void*)0), 0, "Global options", 0, ((void*)0)}, {"verbose"
, 'v', "NUM", CFG_INCREMENT, &nvme_args.verbose, 0, "Increase output verbosity"
, 0, }, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args
.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
;
953
954 ret = argconfig_parse(argc, argv, desc, opts);
955 if (ret)
956 return ret;
957
958 if (cfg.force && cfg.owner) {
959 fprintf(stderrstderr, "--force and --owner are mutually exclusive\n");
960 return -EINVAL22;
961 }
962
963 if ((cfg.force || cfg.owner) && isatty(STDIN_FILENO0)) {
964 char ans[8] = { 0 };
965
966 if (cfg.force)
967 fprintf(stderrstderr,
968 "WARNING: --force disconnects all NVMeoF controllers\n"
969 "regardless of ownership. Type 'yes' to confirm: ");
970 else
971 fprintf(stderrstderr,
972 "WARNING: --owner disconnects all NVMeoF controllers\n"
973 "owned by '%s'. Type 'yes' to confirm: ",
974 cfg.owner);
975 if (!fgets(ans, sizeof(ans), stdinstdin)) {
976 fprintf(stderrstderr, "Aborted.\n");
977 return -EINVAL22;
978 }
979 ans[strcspn(ans, "\n")] = '\0';
980 if (strcmp(ans, "yes") != 0) {
981 fprintf(stderrstderr, "Aborted.\n");
982 return -EINVAL22;
983 }
984 }
985
986 log_level = map_log_level(nvme_args.verbose, false0);
987
988 ctx = libnvme_create_global_ctx(stderrstderr, log_level);
989 if (!ctx) {
990 fprintf(stderrstderr, "Failed to create topology root: %s\n",
991 libnvme_strerror(errno(*__errno_location ())));
992 return -ENOMEM12;
993 }
994 libnvme_skip_namespaces(ctx);
995 ret = libnvme_scan_topology(ctx, NULL((void*)0), NULL((void*)0));
996 if (ret < 0) {
997 /*
998 * Do not report an error when the modules are not
999 * loaded, this allows the user to unconditionally call
1000 * disconnect.
1001 */
1002 if (ret == -ENOENT2)
1003 return 0;
1004
1005 fprintf(stderrstderr, "Failed to scan topology: %s\n",
1006 libnvme_strerror(-ret));
1007 return ret;
1008 }
1009
1010 libnvme_for_each_host(ctx, h)for (h = libnvme_first_host(ctx); h != ((void*)0); h = libnvme_next_host
(ctx, h))
{
1011 libnvme_for_each_subsystem(h, s)for (s = libnvme_first_subsystem(h); s != ((void*)0); s = libnvme_next_subsystem
(h, s))
{
1012 libnvme_subsystem_for_each_ctrl(s, c)for (c = libnvme_subsystem_first_ctrl(s); c != ((void*)0); c =
libnvme_subsystem_next_ctrl(s, c))
{
1013 if (!disconnect_all_match(ctx, c, cfg.transport,
1014 cfg.owner, cfg.force))
1015 continue;
1016 if (libnvmf_disconnect_ctrl(c))
1017 fprintf(stderrstderr,
1018 "failed to disconnect %s\n",
1019 libnvme_ctrl_get_name(c));
1020 }
1021 }
1022 }
1023
1024 return 0;
1025}
1026
1027int fabrics_config(const char *desc, int argc, char **argv)
1028{
1029 bool_Bool scan_tree = false0, modify_config = false0, update_config = false0;
1030 __cleanup_nvme_global_ctx__attribute__((cleanup(cleanup_nvme_global_ctx))) struct libnvme_global_ctx *ctx = NULL((void*)0);
1031 char *config_file = PATH_NVMF_CONFIG"/usr/local/etc" "/nvme/config.json";
1032 struct nvmf_args fa = { };
1033 int ret;
1034
1035 NVMF_ARGS(opts, fa,struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"scan", 'R', ((void*
)0), CFG_FLAG, &scan_tree, 0, "Scan current NVMeoF topology"
, 0, }, {"modify", 'M', ((void*)0), CFG_FLAG, &modify_config
, 0, "Modify JSON configuration file", 0, }, {"dump", 'O', ((
void*)0), CFG_FLAG, &dump_config, 0, "Dump JSON configuration to stdout"
, 0, }, {"update", 'U', ((void*)0), CFG_FLAG, &update_config
, 0, "Update JSON configuration file", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
1036 OPT_STRING("config", 'J', "FILE", &config_file, nvmf_config_file),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"scan", 'R', ((void*
)0), CFG_FLAG, &scan_tree, 0, "Scan current NVMeoF topology"
, 0, }, {"modify", 'M', ((void*)0), CFG_FLAG, &modify_config
, 0, "Modify JSON configuration file", 0, }, {"dump", 'O', ((
void*)0), CFG_FLAG, &dump_config, 0, "Dump JSON configuration to stdout"
, 0, }, {"update", 'U', ((void*)0), CFG_FLAG, &update_config
, 0, "Update JSON configuration file", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
1037 OPT_FLAG("scan", 'R', &scan_tree, "Scan current NVMeoF topology"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"scan", 'R', ((void*
)0), CFG_FLAG, &scan_tree, 0, "Scan current NVMeoF topology"
, 0, }, {"modify", 'M', ((void*)0), CFG_FLAG, &modify_config
, 0, "Modify JSON configuration file", 0, }, {"dump", 'O', ((
void*)0), CFG_FLAG, &dump_config, 0, "Dump JSON configuration to stdout"
, 0, }, {"update", 'U', ((void*)0), CFG_FLAG, &update_config
, 0, "Update JSON configuration file", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
1038 OPT_FLAG("modify", 'M', &modify_config, "Modify JSON configuration file"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"scan", 'R', ((void*
)0), CFG_FLAG, &scan_tree, 0, "Scan current NVMeoF topology"
, 0, }, {"modify", 'M', ((void*)0), CFG_FLAG, &modify_config
, 0, "Modify JSON configuration file", 0, }, {"dump", 'O', ((
void*)0), CFG_FLAG, &dump_config, 0, "Dump JSON configuration to stdout"
, 0, }, {"update", 'U', ((void*)0), CFG_FLAG, &update_config
, 0, "Update JSON configuration file", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
1039 OPT_FLAG("dump", 'O', &dump_config, "Dump JSON configuration to stdout"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"scan", 'R', ((void*
)0), CFG_FLAG, &scan_tree, 0, "Scan current NVMeoF topology"
, 0, }, {"modify", 'M', ((void*)0), CFG_FLAG, &modify_config
, 0, "Modify JSON configuration file", 0, }, {"dump", 'O', ((
void*)0), CFG_FLAG, &dump_config, 0, "Dump JSON configuration to stdout"
, 0, }, {"update", 'U', ((void*)0), CFG_FLAG, &update_config
, 0, "Update JSON configuration file", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
1040 OPT_FLAG("update", 'U', &update_config, "Update JSON configuration file"))struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"transport", 't', "STR", CFG_STRING, &fa.transport
, 1, nvmf_tport, 0, }, {"nqn", 'n', "STR", CFG_STRING, &fa
.subsysnqn, 1, nvmf_nqn, 0, }, {"traddr", 'a', "STR", CFG_STRING
, &fa.traddr, 1, nvmf_traddr, 0, }, {"trsvcid", 's', "STR"
, CFG_STRING, &fa.trsvcid, 1, nvmf_trsvcid, 0, }, {"host-traddr"
, 'w', "STR", CFG_STRING, &fa.host_traddr, 1, nvmf_htraddr
, 0, }, {"host-iface", 'f', "STR", CFG_STRING, &fa.host_iface
, 1, nvmf_hiface, 0, }, {"hostnqn", 'q', "STR", CFG_STRING, &
fa.hostnqn, 1, nvmf_hostnqn, 0, }, {"hostid", 'I', "STR", CFG_STRING
, &fa.hostid, 1, nvmf_hostid, 0, }, {"dhchap-secret", 'S'
, "STR", CFG_STRING, &fa.hostkey, 1, nvmf_hostkey, 0, }, {
"dhchap-ctrl-secret", 'C', "STR", CFG_STRING, &fa.ctrlkey
, 1, nvmf_ctrlkey, 0, }, {"keyring", 0, "STR", CFG_STRING, &
fa.keyring, 1, nvmf_keyring, 0, }, {"tls-key", 0, "STR", CFG_STRING
, &fa.tls_key, 1, nvmf_tls_key, 0, }, {"tls-key-identity"
, 0, "STR", CFG_STRING, &fa.tls_key_identity, 1, nvmf_tls_key_identity
, 0, }, {"nr-io-queues", 'i', "NUM", CFG_INT, &fa.nr_io_queues
, 1, nvmf_nr_io_queues, 0, }, {"nr-write-queues", 'W', "NUM",
CFG_INT, &fa.nr_write_queues, 1, nvmf_nr_write_queues, 0
, }, {"nr-poll-queues", 'P', "NUM", CFG_INT, &fa.nr_poll_queues
, 1, nvmf_nr_poll_queues, 0, }, {"queue-size", 'Q', "NUM", CFG_INT
, &fa.queue_size, 1, nvmf_queue_size, 0, }, {"keep-alive-tmo"
, 'k', "NUM", CFG_INT, &fa.keep_alive_tmo, 1, nvmf_keep_alive_tmo
, 0, }, {"reconnect-delay", 'c', "NUM", CFG_INT, &fa.reconnect_delay
, 1, nvmf_reconnect_delay, 0, }, {"ctrl-loss-tmo", 'l', "NUM"
, CFG_INT, &fa.ctrl_loss_tmo, 1, nvmf_ctrl_loss_tmo, 0, }
, {"fast_io_fail_tmo", 'F', "NUM", CFG_INT, &fa.fast_io_fail_tmo
, 1, nvmf_fast_io_fail_tmo, 0, }, {"tos", 'T', "NUM", CFG_INT
, &fa.tos, 1, nvmf_tos, 0, }, {"tls_key", 0, "NUM", CFG_INT
, &fa.tls_key_id, 1, nvmf_tls_key_legacy, 0, }, {"duplicate-connect"
, 'D', ((void*)0), CFG_FLAG, &fa.duplicate_connect, 0, nvmf_dup_connect
, 0, }, {"disable-sqflow", 0, ((void*)0), CFG_FLAG, &fa.disable_sqflow
, 0, nvmf_disable_sqflow, 0, }, {"hdr-digest", 'g', ((void*)0
), CFG_FLAG, &fa.hdr_digest, 0, nvmf_hdr_digest, 0, }, {"data-digest"
, 'G', ((void*)0), CFG_FLAG, &fa.data_digest, 0, nvmf_data_digest
, 0, }, {"tls", 0, ((void*)0), CFG_FLAG, &fa.tls, 0, nvmf_tls
, 0, }, {"concat", 0, ((void*)0), CFG_FLAG, &fa.concat, 0
, nvmf_concat, 0, }, {"config", 'J', "FILE", CFG_STRING, &
config_file, 1, nvmf_config_file, 0, }, {"scan", 'R', ((void*
)0), CFG_FLAG, &scan_tree, 0, "Scan current NVMeoF topology"
, 0, }, {"modify", 'M', ((void*)0), CFG_FLAG, &modify_config
, 0, "Modify JSON configuration file", 0, }, {"dump", 'O', ((
void*)0), CFG_FLAG, &dump_config, 0, "Dump JSON configuration to stdout"
, 0, }, {"update", 'U', ((void*)0), CFG_FLAG, &update_config
, 0, "Update JSON configuration file", 0, }, {"", 0, ((void*)
0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Global options", 0, (
(void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT, &nvme_args
.verbose, 0, "Increase output verbosity", 0, }, {"output-format"
, 'o', "FMT", CFG_STRING, &nvme_args.output_format, 1, "Output format: normal|json|binary|tabular"
, 0, }, {"timeout", 0, "NUM", CFG_POSITIVE, &nvme_args.timeout
, 1, "timeout value, in milliseconds", 0, }, {"dry-run", 0, (
(void*)0), CFG_FLAG, &nvme_args.dry_run, 0, "show command instead of executing"
, 0, }, {"no-retries", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_retries, 0, "disable retry logic on errors", 0, }, {"no-ioctl-probing"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_ioctl_probing, 0
, "disable 64-bit IOCTL support probing", 0, }, {"output-format-version"
, 0, "NUM", CFG_POSITIVE, &nvme_args.output_format_ver, 1
, "output format version: 1|2", 0, }, {"human-readable", 'H',
((void*)0), CFG_FLAG, &nvme_args.verbose, 0, ((void*)0),
0, ((void*)0), 1}, { ((void*)0) } }
;
1041
1042 nvmf_default_args(&fa);
1043
1044 ret = argconfig_parse(argc, argv, desc, opts);
1045 if (ret)
1046 return ret;
1047
1048 if (!strcmp(config_file, "none"))
1049 config_file = NULL((void*)0);
1050
1051 log_level = map_log_level(nvme_args.verbose, quiet);
1052
1053 ctx = libnvme_create_global_ctx(stderrstderr, log_level);
1054 if (!ctx) {
1055 fprintf(stderrstderr, "Failed to create topology root: %s\n",
1056 libnvme_strerror(errno(*__errno_location ())));
1057 return -ENOMEM12;
1058 }
1059
1060 libnvme_read_config(ctx, config_file);
1061
1062 if (scan_tree) {
1063 libnvme_skip_namespaces(ctx);
1064 ret = libnvme_scan_topology(ctx, NULL((void*)0), NULL((void*)0));
1065 if (ret < 0) {
1066 fprintf(stderrstderr, "Failed to scan topology: %s\n",
1067 libnvme_strerror(-ret));
1068 return -ret;
1069 }
1070 }
1071
1072 if (modify_config) {
1073 __cleanup_nvmf_context__attribute__((cleanup(cleanup_nvmf_context))) struct libnvmf_context *fctx = NULL((void*)0);
1074
1075 if (!fa.subsysnqn) {
1076 fprintf(stderrstderr,
1077 "required argument [--nqn | -n] needed with --modify\n");
1078 return -EINVAL22;
1079 }
1080
1081 if (!fa.transport) {
1082 fprintf(stderrstderr,
1083 "required argument [--transport | -t] needed with --modify\n");
1084 return -EINVAL22;
1085 }
1086
1087 ret = create_common_context(ctx, persistent, &fa, NULL((void*)0), &fctx);
1088 if (ret)
1089 return ret;
1090
1091 ret = libnvmf_config_modify(ctx, fctx);
1092 if (ret) {
1093 fprintf(stderrstderr, "failed to update config\n");
1094 return ret;
1095 }
1096 }
1097
1098 if (update_config) {
1099 __cleanup_fd__attribute__((cleanup(cleanup_fd))) int fd = -1;
1100
1101 fd = open(config_file, O_RDONLY00, 0);
1102 if (fd != -1)
1103 libnvme_dump_config(ctx, fd);
1104 }
1105
1106 if (dump_config)
1107 libnvme_dump_config(ctx, STDOUT_FILENO1);
1108
1109 return 0;
1110}
1111
1112static int dim_operation(libnvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name)
1113{
1114 static const char * const task[] = {
1115 [NVMF_DIM_TAS_REGISTER] = "register",
1116 [NVMF_DIM_TAS_DEREGISTER] = "deregister",
1117 };
1118 const char *t;
1119 int status;
1120 __u32 result;
1121
1122 t = (tas > NVMF_DIM_TAS_DEREGISTER || !task[tas]) ? "reserved" : task[tas];
1123 status = libnvmf_register_ctrl(c, tas, &result);
1124 if (status == NVME_SC_SUCCESS) {
1125 printf("%s DIM %s command success\n", name, t);
1126 } else if (status < NVME_SC_SUCCESS) {
1127 fprintf(stderrstderr, "%s DIM %s command error. Status:0x%04x - %s\n",
1128 name, t, status, libnvme_status_to_string(status, false0));
1129 } else {
1130 fprintf(stderrstderr, "%s DIM %s command error. Result:0x%04x, Status:0x%04x - %s\n",
1131 name, t, result, status, libnvme_status_to_string(status, false0));
1132 }
1133
1134 return libnvme_status_to_errno(status, true1);
1135}
1136
1137int fabrics_dim(const char *desc, int argc, char **argv)
1138{
1139 __cleanup_nvme_global_ctx__attribute__((cleanup(cleanup_nvme_global_ctx))) struct libnvme_global_ctx *ctx = NULL((void*)0);
1140 enum nvmf_dim_tas tas;
1141 libnvme_ctrl_t c;
1142 char *p;
1143 int ret;
1144
1145 struct {
1146 char *nqn;
1147 char *device;
1148 char *tas;
1149 } cfg = { 0 };
1150
1151 NVME_ARGS(opts,struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"nqn", 'n', "NAME", CFG_STRING, &cfg.nqn, 1, "Comma-separated list of DC nqn"
, 0, }, {"device", 'd', "DEV", CFG_STRING, &cfg.device, 1
, "Comma-separated list of DC nvme device handle.", 0, }, {"task"
, 't', "TASK", CFG_STRING, &cfg.tas, 1, "[register|deregister]"
, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0
, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT
, &nvme_args.verbose, 0, "Increase output verbosity", 0, }
, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args.output_format
, 1, "Output format: normal|json|binary|tabular", 0, }, {"timeout"
, 0, "NUM", CFG_POSITIVE, &nvme_args.timeout, 1, "timeout value, in milliseconds"
, 0, }, {"dry-run", 0, ((void*)0), CFG_FLAG, &nvme_args.dry_run
, 0, "show command instead of executing", 0, }, {"no-retries"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_retries, 0, "disable retry logic on errors"
, 0, }, {"no-ioctl-probing", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_ioctl_probing, 0, "disable 64-bit IOCTL support probing",
0, }, {"output-format-version", 0, "NUM", CFG_POSITIVE, &
nvme_args.output_format_ver, 1, "output format version: 1|2",
0, }, {"human-readable", 'H', ((void*)0), CFG_FLAG, &nvme_args
.verbose, 0, ((void*)0), 0, ((void*)0), 1}, { ((void*)0) } }
1152 OPT_STRING("nqn", 'n', "NAME", &cfg.nqn, "Comma-separated list of DC nqn"),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"nqn", 'n', "NAME", CFG_STRING, &cfg.nqn, 1, "Comma-separated list of DC nqn"
, 0, }, {"device", 'd', "DEV", CFG_STRING, &cfg.device, 1
, "Comma-separated list of DC nvme device handle.", 0, }, {"task"
, 't', "TASK", CFG_STRING, &cfg.tas, 1, "[register|deregister]"
, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0
, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT
, &nvme_args.verbose, 0, "Increase output verbosity", 0, }
, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args.output_format
, 1, "Output format: normal|json|binary|tabular", 0, }, {"timeout"
, 0, "NUM", CFG_POSITIVE, &nvme_args.timeout, 1, "timeout value, in milliseconds"
, 0, }, {"dry-run", 0, ((void*)0), CFG_FLAG, &nvme_args.dry_run
, 0, "show command instead of executing", 0, }, {"no-retries"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_retries, 0, "disable retry logic on errors"
, 0, }, {"no-ioctl-probing", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_ioctl_probing, 0, "disable 64-bit IOCTL support probing",
0, }, {"output-format-version", 0, "NUM", CFG_POSITIVE, &
nvme_args.output_format_ver, 1, "output format version: 1|2",
0, }, {"human-readable", 'H', ((void*)0), CFG_FLAG, &nvme_args
.verbose, 0, ((void*)0), 0, ((void*)0), 1}, { ((void*)0) } }
1153 OPT_STRING("device", 'd', "DEV", &cfg.device, "Comma-separated list of DC nvme device handle."),struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"nqn", 'n', "NAME", CFG_STRING, &cfg.nqn, 1, "Comma-separated list of DC nqn"
, 0, }, {"device", 'd', "DEV", CFG_STRING, &cfg.device, 1
, "Comma-separated list of DC nvme device handle.", 0, }, {"task"
, 't', "TASK", CFG_STRING, &cfg.tas, 1, "[register|deregister]"
, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0
, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT
, &nvme_args.verbose, 0, "Increase output verbosity", 0, }
, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args.output_format
, 1, "Output format: normal|json|binary|tabular", 0, }, {"timeout"
, 0, "NUM", CFG_POSITIVE, &nvme_args.timeout, 1, "timeout value, in milliseconds"
, 0, }, {"dry-run", 0, ((void*)0), CFG_FLAG, &nvme_args.dry_run
, 0, "show command instead of executing", 0, }, {"no-retries"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_retries, 0, "disable retry logic on errors"
, 0, }, {"no-ioctl-probing", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_ioctl_probing, 0, "disable 64-bit IOCTL support probing",
0, }, {"output-format-version", 0, "NUM", CFG_POSITIVE, &
nvme_args.output_format_ver, 1, "output format version: 1|2",
0, }, {"human-readable", 'H', ((void*)0), CFG_FLAG, &nvme_args
.verbose, 0, ((void*)0), 0, ((void*)0), 1}, { ((void*)0) } }
1154 OPT_STRING("task", 't', "TASK", &cfg.tas, "[register|deregister]"))struct argconfig_commandline_options opts[] = { {"", 0, ((void
*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0, "Options", 0, ((void
*)0)}, {"nqn", 'n', "NAME", CFG_STRING, &cfg.nqn, 1, "Comma-separated list of DC nqn"
, 0, }, {"device", 'd', "DEV", CFG_STRING, &cfg.device, 1
, "Comma-separated list of DC nvme device handle.", 0, }, {"task"
, 't', "TASK", CFG_STRING, &cfg.tas, 1, "[register|deregister]"
, 0, }, {"", 0, ((void*)0), CFG_GROUP_SEPARATOR, ((void*)0), 0
, "Global options", 0, ((void*)0)}, {"verbose", 'v', "NUM", CFG_INCREMENT
, &nvme_args.verbose, 0, "Increase output verbosity", 0, }
, {"output-format", 'o', "FMT", CFG_STRING, &nvme_args.output_format
, 1, "Output format: normal|json|binary|tabular", 0, }, {"timeout"
, 0, "NUM", CFG_POSITIVE, &nvme_args.timeout, 1, "timeout value, in milliseconds"
, 0, }, {"dry-run", 0, ((void*)0), CFG_FLAG, &nvme_args.dry_run
, 0, "show command instead of executing", 0, }, {"no-retries"
, 0, ((void*)0), CFG_FLAG, &nvme_args.no_retries, 0, "disable retry logic on errors"
, 0, }, {"no-ioctl-probing", 0, ((void*)0), CFG_FLAG, &nvme_args
.no_ioctl_probing, 0, "disable 64-bit IOCTL support probing",
0, }, {"output-format-version", 0, "NUM", CFG_POSITIVE, &
nvme_args.output_format_ver, 1, "output format version: 1|2",
0, }, {"human-readable", 'H', ((void*)0), CFG_FLAG, &nvme_args
.verbose, 0, ((void*)0), 0, ((void*)0), 1}, { ((void*)0) } }
;
1155
1156 ret = argconfig_parse(argc, argv, desc, opts);
1157 if (ret)
1158 return ret;
1159
1160 if (!cfg.nqn && !cfg.device) {
1161 fprintf(stderrstderr,
1162 "Neither device name [--device | -d] nor NQN [--nqn | -n] provided\n");
1163 return -EINVAL22;
1164 }
1165
1166 if (!cfg.tas) {
1167 fprintf(stderrstderr,
1168 "Task [--task | -t] must be specified\n");
1169 return -EINVAL22;
1170 }
1171
1172 /* Allow partial name (e.g. "reg" for "register" */
1173 if (strstarts("register", cfg.tas)(strncmp(("register"),(cfg.tas),strlen(cfg.tas)) == 0)) {
1174 tas = NVMF_DIM_TAS_REGISTER;
1175 } else if (strstarts("deregister", cfg.tas)(strncmp(("deregister"),(cfg.tas),strlen(cfg.tas)) == 0)) {
1176 tas = NVMF_DIM_TAS_DEREGISTER;
1177 } else {
1178 fprintf(stderrstderr, "Invalid --task: %s\n", cfg.tas);
1179 return -EINVAL22;
1180 }
1181
1182 log_level = map_log_level(nvme_args.verbose, false0);
1183
1184 ctx = libnvme_create_global_ctx(stderrstderr, log_level);
1185 if (!ctx) {
1186 fprintf(stderrstderr, "Failed to create topology root: %s\n",
1187 libnvme_strerror(errno(*__errno_location ())));
1188 return -ENODEV19;
1189 }
1190 libnvme_skip_namespaces(ctx);
1191 ret = libnvme_scan_topology(ctx, NULL((void*)0), NULL((void*)0));
1192 if (ret < 0) {
1193 fprintf(stderrstderr, "Failed to scan topology: %s\n",
1194 libnvme_strerror(-ret));
1195 return ret;
1196 }
1197
1198 if (cfg.nqn) {
1199 libnvme_host_t h;
1200 libnvme_subsystem_t s;
1201 char *n = cfg.nqn;
1202
1203 while ((p = strsep(&n, ",")) != NULL((void*)0)) {
1204 if (!strlen(p))
1205 continue;
1206 libnvme_for_each_host(ctx, h)for (h = libnvme_first_host(ctx); h != ((void*)0); h = libnvme_next_host
(ctx, h))
{
1207 libnvme_for_each_subsystem(h, s)for (s = libnvme_first_subsystem(h); s != ((void*)0); s = libnvme_next_subsystem
(h, s))
{
1208 if (strcmp(libnvme_subsystem_get_subsysnqn(s), p))
1209 continue;
1210 libnvme_subsystem_for_each_ctrl(s, c)for (c = libnvme_subsystem_first_ctrl(s); c != ((void*)0); c =
libnvme_subsystem_next_ctrl(s, c))
1211 ret = dim_operation(c, tas, p);
1212 }
1213 }
1214 }
1215 }
1216
1217 if (cfg.device) {
1218 char *d = cfg.device;
1219
1220 while ((p = strsep(&d, ",")) != NULL((void*)0)) {
1221 if (!strncmp(p, "/dev/", 5))
1222 p += 5;
1223 ret = libnvme_scan_ctrl(ctx, p, &c);
1224 if (ret) {
1225 fprintf(stderrstderr,
1226 "Did not find device %s: %s\n",
1227 p, libnvme_strerror(ret));
1228 return ret;
1229 }
1230 ret = dim_operation(c, tas, p);
1231 }
1232 }
1233
1234 return ret;
1235}