aboutsummaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2025-01-30 15:50:58 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2025-01-30 15:50:58 +0000
commitec282601f720c1ebda50d9c7065d1b629f38f69f (patch)
tree94cb5a51ed09a7dc84958a2a067a2509e196ce84 /sbin
parent10d188ae2c4716108030a7943c981cf25495cf35 (diff)
nvmecontrol: Only do name resolution once for Fabrics connections
Reuse the addrinfo structure from the admin queue to establish connections to I/O queues for the TCP transport. Reviewed by: dab, imp Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D48456
Diffstat (limited to 'sbin')
-rw-r--r--sbin/nvmecontrol/fabrics.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/sbin/nvmecontrol/fabrics.c b/sbin/nvmecontrol/fabrics.c
index 89589c88f7e3..5fdbf68127d4 100644
--- a/sbin/nvmecontrol/fabrics.c
+++ b/sbin/nvmecontrol/fabrics.c
@@ -148,7 +148,8 @@ nvmf_parse_cntlid(const char *cntlid)
static bool
tcp_qpair_params(struct nvmf_qpair_params *params, int adrfam,
- const char *address, const char *port)
+ const char *address, const char *port, struct addrinfo **aip,
+ struct addrinfo **listp)
{
struct addrinfo hints, *ai, *list;
int error, s;
@@ -173,7 +174,11 @@ tcp_qpair_params(struct nvmf_qpair_params *params, int adrfam,
}
params->tcp.fd = s;
- freeaddrinfo(list);
+ if (listp != NULL) {
+ *aip = ai;
+ *listp = list;
+ } else
+ freeaddrinfo(list);
return (true);
}
warn("Failed to connect to controller at %s:%s", address, port);
@@ -181,6 +186,24 @@ tcp_qpair_params(struct nvmf_qpair_params *params, int adrfam,
return (false);
}
+static bool
+tcp_qpair_params_ai(struct nvmf_qpair_params *params, struct addrinfo *ai)
+{
+ int s;
+
+ s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if (s == -1)
+ return (false);
+
+ if (connect(s, ai->ai_addr, ai->ai_addrlen) != 0) {
+ close(s);
+ return (false);
+ }
+
+ params->tcp.fd = s;
+ return (true);
+}
+
static void
tcp_discovery_association_params(struct nvmf_association_params *params)
{
@@ -228,7 +251,7 @@ connect_discovery_adminq(enum nvmf_trtype trtype, const char *address,
err(EX_IOERR, "Failed to create discovery association");
memset(&qparams, 0, sizeof(qparams));
qparams.admin = true;
- if (!tcp_qpair_params(&qparams, AF_UNSPEC, address, port))
+ if (!tcp_qpair_params(&qparams, AF_UNSPEC, address, port, NULL, NULL))
exit(EX_NOHOST);
qp = nvmf_connect(na, &qparams, 0, NVME_MIN_ADMIN_ENTRIES, hostid,
NVMF_CNTLID_DYNAMIC, NVMF_DISCOVERY_NQN, hostnqn, 0);
@@ -417,6 +440,7 @@ connect_nvm_queues(const struct nvmf_association_params *aparams,
{
struct nvmf_qpair_params qparams;
struct nvmf_association *na;
+ struct addrinfo *ai, *list;
u_int queues;
int error;
uint16_t mqes;
@@ -446,7 +470,7 @@ connect_nvm_queues(const struct nvmf_association_params *aparams,
/* Admin queue. */
memset(&qparams, 0, sizeof(qparams));
qparams.admin = true;
- if (!tcp_qpair_params(&qparams, adrfam, address, port)) {
+ if (!tcp_qpair_params(&qparams, adrfam, address, port, &ai, &list)) {
nvmf_free_association(na);
return (EX_NOHOST);
}
@@ -454,6 +478,7 @@ connect_nvm_queues(const struct nvmf_association_params *aparams,
kato, &mqes);
if (error != 0) {
nvmf_free_association(na);
+ freeaddrinfo(list);
return (error);
}
@@ -495,7 +520,9 @@ connect_nvm_queues(const struct nvmf_association_params *aparams,
for (u_int i = 0; i < num_io_queues; i++) {
memset(&qparams, 0, sizeof(qparams));
qparams.admin = false;
- if (!tcp_qpair_params(&qparams, adrfam, address, port)) {
+ if (!tcp_qpair_params_ai(&qparams, ai)) {
+ warn("Failed to connect to controller at %s:%s",
+ address, port);
error = EX_NOHOST;
goto out;
}
@@ -509,11 +536,13 @@ connect_nvm_queues(const struct nvmf_association_params *aparams,
}
}
nvmf_free_association(na);
+ freeaddrinfo(list);
return (0);
out:
disconnect_nvm_queues(*admin, io, num_io_queues);
nvmf_free_association(na);
+ freeaddrinfo(list);
return (error);
}