Skip to content

Commit c865292

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 618227e commit c865292

6 files changed

Lines changed: 380 additions & 127 deletions

File tree

fabrics.c

Lines changed: 102 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,71 @@ 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,
347+
"already connected to hostnqn=%s,nqn=%s,transport=%s,traddr=%s,trsvcid=%s\n",
348+
nvme_host_get_hostnqn(host), entry->subnqn,
349+
nvmf_trtype_str(entry->trtype), entry->traddr, entry->trsvcid);
350+
}
351+
352+
static int create_discovery_log_ctx(struct nvme_global_ctx *ctx,
353+
bool persistent,
354+
struct nvme_fabrics_config *defcfg,
355+
void *user_data, struct nvmf_discovery_ctx **dctxp)
356+
{
357+
struct nvmf_discovery_ctx *dctx;
358+
int err;
359+
360+
err = nvmf_discovery_ctx_create(ctx, user_data, &dctx);
361+
if (err)
362+
return err;
363+
364+
err = nvmf_discovery_ctx_max_retries(dctx, MAX_DISC_RETRIES);
365+
if (err)
366+
goto err;
367+
368+
err = nvmf_discovery_ctx_keep_alive_timeout(dctx, NVMF_DEF_DISC_TMO);
369+
if (err)
370+
goto err;
371+
372+
err = nvmf_discovery_ctx_discovery_log_set(dctx, cb_discovery_log);
373+
if (err)
374+
goto err;
375+
376+
err = nvmf_discovery_ctx_already_connected_set(dctx, already_connected);
377+
if (err)
378+
goto err;
379+
380+
err = nvmf_discovery_ctx_persistent_set(dctx, persistent);
381+
if (err)
382+
goto err;
383+
384+
err = nvmf_discovery_ctx_default_fabrics_config_set(dctx, defcfg);
385+
if (err)
386+
goto err;
387+
388+
*dctxp = dctx;
389+
return 0;
390+
391+
err:
392+
free(dctx);
393+
return err;
394+
}
395+
445396
static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
446397
const char *desc, bool connect,
447398
const struct nvme_fabrics_config *defcfg)
448399
{
449400
char *transport = NULL, *traddr = NULL, *trsvcid = NULL;
450401
char *hostnqn = NULL, *hostid = NULL, *hostkey = NULL;
451402
char *subsysnqn = NULL, *keyring = NULL, *tls_key = NULL;
403+
_cleanup_free_ struct nvmf_discovery_ctx *dctx = NULL;
452404
char *tls_key_identity = NULL;
453405
char *ptr, **argv, *p, line[4096];
454406
int argc, ret = 0;
@@ -458,7 +410,6 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
458410
char *format = "normal";
459411
struct nvme_fabrics_config cfg;
460412
bool force = false;
461-
462413
NVMF_ARGS(opts, cfg,
463414
OPT_FMT("output-format", 'o', &format, output_format),
464415
OPT_FILE("raw", 'r', &raw, "save raw output to file"),
@@ -519,11 +470,18 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
519470
.trsvcid = trsvcid,
520471
};
521472

473+
struct cb_discovery_log_data dld = {
474+
.flags = flags,
475+
.raw = raw,
476+
};
477+
ret = create_discovery_log_ctx(ctx, true, &cfg, &dld, &dctx);
478+
if (ret)
479+
return ret;
480+
522481
if (!force) {
523482
c = lookup_ctrl(h, &trcfg);
524483
if (c) {
525-
__discover(c, &cfg, raw, connect,
526-
true, flags);
484+
nvmf_discovery(ctx, dctx, connect, c);
527485
goto next;
528486
}
529487
}
@@ -532,7 +490,8 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
532490
if (ret)
533491
goto next;
534492

535-
__discover(c, &cfg, raw, connect, persistent, flags);
493+
nvmf_discovery_ctx_persistent_set(dctx, persistent);
494+
nvmf_discovery(ctx, dctx, connect, c);
536495
if (!(persistent || is_persistent_discovery_ctrl(h, c)))
537496
ret = nvme_disconnect_ctrl(c);
538497
nvme_free_ctrl(c);
@@ -551,6 +510,7 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
551510
const struct nvme_fabrics_config *defcfg,
552511
nvme_print_flags_t flags, bool force)
553512
{
513+
_cleanup_free_ struct nvmf_discovery_ctx *dctx = NULL;
554514
const char *transport, *traddr, *host_traddr;
555515
const char *host_iface, *trsvcid, *subsysnqn;
556516
struct nvme_fabrics_config cfg;
@@ -611,10 +571,16 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
611571
.trsvcid = trsvcid,
612572
};
613573

574+
struct cb_discovery_log_data dld = {
575+
.flags = flags,
576+
.raw = raw,
577+
};
578+
ret = create_discovery_log_ctx(ctx, true, &cfg, &dld, &dctx);
579+
614580
if (!force) {
615581
cn = lookup_ctrl(h, &trcfg);
616582
if (cn) {
617-
__discover(cn, &cfg, raw, connect, true, flags);
583+
nvmf_discovery(ctx, dctx, connect, cn);
618584
return 0;
619585
}
620586
}
@@ -623,7 +589,8 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
623589
if (ret)
624590
return 0;
625591

626-
__discover(cn, &cfg, raw, connect, persistent, flags);
592+
nvmf_discovery_ctx_persistent_set(dctx, persistent);
593+
nvmf_discovery(ctx, dctx, connect, cn);
627594
if (!(persistent || is_persistent_discovery_ctrl(h, cn)))
628595
ret = nvme_disconnect_ctrl(cn);
629596
nvme_free_ctrl(cn);
@@ -732,6 +699,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
732699
char *context = NULL;
733700
nvme_print_flags_t flags;
734701
_cleanup_nvme_global_ctx_ struct nvme_global_ctx *ctx = NULL;
702+
_cleanup_free_ struct nvmf_discovery_ctx *dctx = NULL;
735703
nvme_host_t h;
736704
nvme_ctrl_t c = NULL;
737705
unsigned int verbose = 0;
@@ -917,7 +885,15 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
917885
}
918886
}
919887

920-
ret = __discover(c, &cfg, raw, connect, persistent, flags);
888+
struct cb_discovery_log_data dld = {
889+
.flags = flags,
890+
.raw = raw,
891+
};
892+
ret = create_discovery_log_ctx(ctx, persistent, &cfg, &dld, &dctx);
893+
if (ret)
894+
return ret;
895+
896+
ret = nvmf_discovery(ctx, dctx, connect, c);
921897
if (!(persistent || is_persistent_discovery_ctrl(h, c)))
922898
nvme_disconnect_ctrl(c);
923899
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)