Skip to content

Commit 057e347

Browse files
committed
fabrics: move __discover to the library
This is generic code for discovery, thus move it the library. Signed-off-by: Daniel Wagner <[email protected]>
1 parent 6e93142 commit 057e347

6 files changed

Lines changed: 374 additions & 127 deletions

File tree

fabrics.c

Lines changed: 101 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -301,127 +301,21 @@ static void save_discovery_log(char *raw, struct nvmf_discovery_log *log)
301301
close(fd);
302302
}
303303

304-
static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg,
305-
char *raw, bool connect, bool persistent,
306-
nvme_print_flags_t flags)
307-
{
308-
struct nvmf_discovery_log *log = NULL;
309-
nvme_subsystem_t s = nvme_ctrl_get_subsystem(c);
310-
nvme_host_t h = nvme_subsystem_get_host(s);
311-
uint64_t numrec;
312-
int err;
313-
314-
struct nvme_get_discovery_args args = {
315-
.c = c,
316-
.args_size = sizeof(args),
317-
.max_retries = MAX_DISC_RETRIES,
318-
.result = 0,
319-
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
320-
.lsp = 0,
321-
};
322-
323-
err = nvmf_get_discovery_wargs(&args, &log);
324-
if (err) {
325-
fprintf(stderr, "failed to get discovery log: %s\n",
326-
nvme_strerror(err));
327-
return err;
328-
}
329-
330-
numrec = le64_to_cpu(log->numrec);
331-
if (raw)
332-
save_discovery_log(raw, log);
333-
else if (!connect) {
334-
nvme_show_discovery_log(log, numrec, flags);
335-
} else if (connect) {
336-
int i;
337-
338-
for (i = 0; i < numrec; i++) {
339-
struct nvmf_disc_log_entry *e = &log->entries[i];
340-
nvme_ctrl_t cl;
341-
bool discover = false;
342-
bool disconnect;
343-
nvme_ctrl_t child;
344-
int tmo = defcfg->keep_alive_tmo;
345-
346-
struct tr_config trcfg = {
347-
.subsysnqn = e->subnqn,
348-
.transport = nvmf_trtype_str(e->trtype),
349-
.traddr = e->traddr,
350-
.host_traddr = defcfg->host_traddr,
351-
.host_iface = defcfg->host_iface,
352-
.trsvcid = e->trsvcid,
353-
};
354-
355-
/* Already connected ? */
356-
cl = lookup_ctrl(h, &trcfg);
357-
if (cl && nvme_ctrl_get_name(cl))
358-
continue;
359-
360-
/* Skip connect if the transport types don't match */
361-
if (strcmp(nvme_ctrl_get_transport(c),
362-
nvmf_trtype_str(e->trtype)))
363-
continue;
364-
365-
if (e->subtype == NVME_NQN_DISC ||
366-
e->subtype == NVME_NQN_CURR) {
367-
__u16 eflags = le16_to_cpu(e->eflags);
368-
/*
369-
* Does this discovery controller return the
370-
* same information?
371-
*/
372-
if (eflags & NVMF_DISC_EFLAGS_DUPRETINFO)
373-
continue;
374-
375-
/* Are we supposed to keep the discovery controller around? */
376-
disconnect = !persistent;
377-
378-
if (strcmp(e->subnqn, NVME_DISC_SUBSYS_NAME)) {
379-
/*
380-
* Does this discovery controller doesn't
381-
* support explicit persistent connection?
382-
*/
383-
if (!(eflags & NVMF_DISC_EFLAGS_EPCSD))
384-
disconnect = true;
385-
else
386-
disconnect = false;
387-
}
388-
389-
set_discovery_kato(defcfg);
390-
} else {
391-
/* NVME_NQN_NVME */
392-
disconnect = false;
393-
}
394-
395-
err = nvmf_connect_disc_entry(h, e, defcfg,
396-
&discover, &child);
397-
398-
defcfg->keep_alive_tmo = tmo;
399-
400-
if (!child) {
401-
if (discover)
402-
__discover(child, defcfg, raw,
403-
true, persistent, flags);
404-
405-
if (disconnect) {
406-
nvme_disconnect_ctrl(child);
407-
nvme_free_ctrl(child);
408-
}
409-
} else if (err == -ENVME_CONNECT_ALREADY && !quiet) {
410-
const char *subnqn = log->entries[i].subnqn;
411-
const char *trtype = nvmf_trtype_str(log->entries[i].trtype);
412-
const char *traddr = log->entries[i].traddr;
413-
const char *trsvcid = log->entries[i].trsvcid;
304+
struct cb_discovery_log_data {
305+
nvme_print_flags_t flags;
306+
char *raw;
307+
};
414308

415-
fprintf(stderr,
416-
"already connected to hostnqn=%s,nqn=%s,transport=%s,traddr=%s,trsvcid=%s\n",
417-
nvme_host_get_hostnqn(h), subnqn,
418-
trtype, traddr, trsvcid);
419-
}
420-
}
421-
}
309+
static void cb_discovery_log(struct nvmf_discovery_ctx *dctx,
310+
bool connect, struct nvmf_discovery_log *log,
311+
uint64_t numrec, void *user_data)
312+
{
313+
struct cb_discovery_log_data *dld = user_data;
422314

423-
free(log);
424-
return 0;
315+
if (dld->raw)
316+
save_discovery_log(dld->raw, log);
317+
else if (!connect)
318+
nvme_show_discovery_log(log, numrec, dld->flags);
425319
}
426320

427321
char * nvmf_get_default_trsvcid(const char *transport, bool discovery_ctrl)
@@ -442,13 +336,70 @@ char * nvmf_get_default_trsvcid(const char *transport, bool discovery_ctrl)
442336
return NULL;
443337
}
444338

339+
static void already_connected(struct nvme_host *host,
340+
struct nvmf_disc_log_entry *entry,
341+
void *user_data)
342+
{
343+
if (quiet)
344+
return;
345+
346+
fprintf(stderr, "already connected to hostnqn=%s,nqn=%s,transport=%s,traddr=%s,trsvcid=%s\n",
347+
nvme_host_get_hostnqn(host), entry->subnqn,
348+
nvmf_trtype_str(entry->trtype), entry->traddr, entry->trsvcid);
349+
}
350+
351+
static int create_discovery_log_ctx(struct nvme_global_ctx *ctx,
352+
bool persistent,
353+
struct nvme_fabrics_config *defcfg,
354+
void *user_data, struct nvmf_discovery_ctx **dctxp)
355+
{
356+
struct nvmf_discovery_ctx *dctx;
357+
int err;
358+
359+
err = nvmf_discovery_ctx_create(ctx, user_data, &dctx);
360+
if (err)
361+
return err;
362+
363+
err = nvmf_discovery_ctx_max_retries(dctx, MAX_DISC_RETRIES);
364+
if (err)
365+
goto err;
366+
367+
err = nvmf_discovery_ctx_keep_alive_timeout(dctx, NVMF_DEF_DISC_TMO);
368+
if (err)
369+
goto err;
370+
371+
err = nvmf_discovery_ctx_discovery_log_set(dctx, cb_discovery_log);
372+
if (err)
373+
goto err;
374+
375+
err = nvmf_discovery_ctx_already_connected_set(dctx, already_connected);
376+
if (err)
377+
goto err;
378+
379+
err = nvmf_discovery_ctx_persistent_set(dctx, persistent);
380+
if (err)
381+
goto err;
382+
383+
err = nvmf_discovery_ctx_default_fabrics_config_set(dctx, defcfg);
384+
if (err)
385+
goto err;
386+
387+
*dctxp = dctx;
388+
return 0;
389+
390+
err:
391+
free(dctx);
392+
return err;
393+
}
394+
445395
static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
446396
const char *desc, bool connect,
447397
const struct nvme_fabrics_config *defcfg)
448398
{
449399
char *transport = NULL, *traddr = NULL, *trsvcid = NULL;
450400
char *hostnqn = NULL, *hostid = NULL, *hostkey = NULL;
451401
char *subsysnqn = NULL, *keyring = NULL, *tls_key = NULL;
402+
_cleanup_free_ struct nvmf_discovery_ctx *dctx = NULL;
452403
char *tls_key_identity = NULL;
453404
char *ptr, **argv, *p, line[4096];
454405
int argc, ret = 0;
@@ -458,7 +409,6 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
458409
char *format = "normal";
459410
struct nvme_fabrics_config cfg;
460411
bool force = false;
461-
462412
NVMF_ARGS(opts, cfg,
463413
OPT_FMT("output-format", 'o', &format, output_format),
464414
OPT_FILE("raw", 'r', &raw, "save raw output to file"),
@@ -519,11 +469,18 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
519469
.trsvcid = trsvcid,
520470
};
521471

472+
struct cb_discovery_log_data dld = {
473+
.flags = flags,
474+
.raw = raw,
475+
};
476+
ret = create_discovery_log_ctx(ctx, true, &cfg, &dld, &dctx);
477+
if (ret)
478+
return ret;
479+
522480
if (!force) {
523481
c = lookup_ctrl(h, &trcfg);
524482
if (c) {
525-
__discover(c, &cfg, raw, connect,
526-
true, flags);
483+
nvmf_discovery(ctx, dctx, connect, c);
527484
goto next;
528485
}
529486
}
@@ -532,7 +489,8 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
532489
if (ret)
533490
goto next;
534491

535-
__discover(c, &cfg, raw, connect, persistent, flags);
492+
nvmf_discovery_ctx_persistent_set(dctx, persistent);
493+
nvmf_discovery(ctx, dctx, connect, c);
536494
if (!(persistent || is_persistent_discovery_ctrl(h, c)))
537495
ret = nvme_disconnect_ctrl(c);
538496
nvme_free_ctrl(c);
@@ -551,6 +509,7 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
551509
const struct nvme_fabrics_config *defcfg,
552510
nvme_print_flags_t flags, bool force)
553511
{
512+
_cleanup_free_ struct nvmf_discovery_ctx *dctx = NULL;
554513
const char *transport, *traddr, *host_traddr;
555514
const char *host_iface, *trsvcid, *subsysnqn;
556515
struct nvme_fabrics_config cfg;
@@ -611,10 +570,16 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
611570
.trsvcid = trsvcid,
612571
};
613572

573+
struct cb_discovery_log_data dld = {
574+
.flags = flags,
575+
.raw = raw,
576+
};
577+
ret = create_discovery_log_ctx(ctx, true, &cfg, &dld, &dctx);
578+
614579
if (!force) {
615580
cn = lookup_ctrl(h, &trcfg);
616581
if (cn) {
617-
__discover(cn, &cfg, raw, connect, true, flags);
582+
nvmf_discovery(ctx, dctx, connect, cn);
618583
return 0;
619584
}
620585
}
@@ -623,7 +588,8 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
623588
if (ret)
624589
return 0;
625590

626-
__discover(cn, &cfg, raw, connect, persistent, flags);
591+
nvmf_discovery_ctx_persistent_set(dctx, persistent);
592+
nvmf_discovery(ctx, dctx, connect, cn);
627593
if (!(persistent || is_persistent_discovery_ctrl(h, cn)))
628594
ret = nvme_disconnect_ctrl(cn);
629595
nvme_free_ctrl(cn);
@@ -732,6 +698,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
732698
char *context = NULL;
733699
nvme_print_flags_t flags;
734700
_cleanup_nvme_global_ctx_ struct nvme_global_ctx *ctx = NULL;
701+
_cleanup_free_ struct nvmf_discovery_ctx *dctx = NULL;
735702
nvme_host_t h;
736703
nvme_ctrl_t c = NULL;
737704
unsigned int verbose = 0;
@@ -917,7 +884,15 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
917884
}
918885
}
919886

920-
ret = __discover(c, &cfg, raw, connect, persistent, flags);
887+
struct cb_discovery_log_data dld = {
888+
.flags = flags,
889+
.raw = raw,
890+
};
891+
ret = create_discovery_log_ctx(ctx, persistent, &cfg, &dld, &dctx);
892+
if (ret)
893+
return ret;
894+
895+
ret = nvmf_discovery(ctx, dctx, connect, c);
921896
if (!(persistent || is_persistent_discovery_ctrl(h, c)))
922897
nvme_disconnect_ctrl(c);
923898
nvme_free_ctrl(c);

libnvme/src/libnvme.map

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,14 @@ LIBNVME_2_0 {
291291
nvmf_connect_ctrl;
292292
nvmf_connect_disc_entry;
293293
nvmf_default_config;
294+
nvmf_discovery;
295+
nvmf_discovery_ctx_already_connected_set;
296+
nvmf_discovery_ctx_create;
297+
nvmf_discovery_ctx_default_fabrics_config_set;
298+
nvmf_discovery_ctx_discovery_log_set;
299+
nvmf_discovery_ctx_keep_alive_timeout;
300+
nvmf_discovery_ctx_max_retries;
301+
nvmf_discovery_ctx_persistent_set;
294302
nvmf_eflags_str;
295303
nvmf_exat_ptr_next;
296304
nvmf_get_discovery_log;

0 commit comments

Comments
 (0)