Commit 7efdf905 authored by Slawomir Ptak's avatar Slawomir Ptak Committed by Tomasz Zawadzki
Browse files

lib/nvmf: TP 8014 - Current Discovery Subsystem



Added support for the Current Discovery Subsystem
value of the Subsystem Type in the Discovery
Log Page Entry.

Change introduced in TP 8014

Change-Id: I9a35ba24ecfdc2bbcc81baae80575e37ae1a866d
Signed-off-by: default avatarSlawomir Ptak <slawomir.ptak@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19839


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent 7df18078
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -429,7 +429,7 @@ nvmf_create_nvmf_tgt(void)
	 *	3,The ability to discover controllers that are statically configured.
	 */
	subsystem = spdk_nvmf_subsystem_create(g_nvmf_tgt.tgt, SPDK_NVMF_DISCOVERY_NQN,
					       SPDK_NVMF_SUBTYPE_DISCOVERY, 0);
					       SPDK_NVMF_SUBTYPE_DISCOVERY_CURRENT, 0);
	if (subsystem == NULL) {
		fprintf(stderr, "failed to create discovery nvmf library subsystem\n");
		goto error;
+11 −0
Original line number Diff line number Diff line
@@ -1035,6 +1035,17 @@ enum spdk_nvmf_subtype spdk_nvmf_subsystem_get_type(struct spdk_nvmf_subsystem *
 */
uint32_t spdk_nvmf_subsystem_get_max_nsid(struct spdk_nvmf_subsystem *subsystem);

/**
 * Checks whether a given subsystem is a discovery subsystem
 *
 * \param subsystem Subsystem to check.
 *
 * \return true if a given subsystem is a discovery subsystem, false
 *	   if the subsystem is an nvm subsystem
 */
bool spdk_nvmf_subsystem_is_discovery(struct spdk_nvmf_subsystem *subsystem);


/**
 * Initialize transport options
 *
+8 −8
Original line number Diff line number Diff line
@@ -409,7 +409,7 @@ nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
	/* Coalescing Disable */
	ctrlr->feat.interrupt_vector_configuration.bits.cd = 1;

	if (ctrlr->subsys->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
	if (spdk_nvmf_subsystem_is_discovery(ctrlr->subsys)) {
		/*
		 * If keep-alive timeout is not set, discovery controllers use some
		 * arbitrary high value in order to cleanup stale discovery sessions
@@ -582,7 +582,7 @@ nvmf_ctrlr_add_io_qpair(void *ctx)
		goto end;
	}

	if (ctrlr->subsys->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
	if (spdk_nvmf_subsystem_is_discovery(ctrlr->subsys)) {
		SPDK_ERRLOG("I/O connect not allowed on discovery controller\n");
		SPDK_NVMF_INVALID_CONNECT_CMD(rsp, qid);
		goto end;
@@ -2557,7 +2557,7 @@ nvmf_ctrlr_get_log_page(struct spdk_nvmf_request *req)
	SPDK_DEBUGLOG(nvmf, "Get log page: LID=0x%02X offset=0x%" PRIx64 " len=0x%" PRIx64 " rae=%u\n",
		      lid, offset, len, rae);

	if (subsystem->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
	if (spdk_nvmf_subsystem_is_discovery(subsystem)) {
		switch (lid) {
		case SPDK_NVME_LOG_DISCOVERY:
			if (spdk_nvmf_qpair_get_listen_trid(req->qpair, &cmd_source_trid)) {
@@ -2757,7 +2757,7 @@ spdk_nvmf_ctrlr_identify_ctrlr(struct spdk_nvmf_ctrlr *ctrlr, struct spdk_nvme_c
	SPDK_DEBUGLOG(nvmf, "sgls data: 0x%x\n", from_le32(&cdata->sgls));


	if (subsystem->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
	if (spdk_nvmf_subsystem_is_discovery(subsystem)) {
		/*
		 * NVM Discovery subsystem fields
		 */
@@ -3071,7 +3071,7 @@ nvmf_ctrlr_identify(struct spdk_nvmf_request *req)

	cns = cmd->cdw10_bits.identify.cns;

	if (subsystem->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY &&
	if (spdk_nvmf_subsystem_is_discovery(subsystem) &&
	    cns != SPDK_NVME_IDENTIFY_CTRLR) {
		/* Discovery controllers only support Identify Controller */
		goto invalid_cns;
@@ -3316,7 +3316,7 @@ nvmf_ctrlr_get_features(struct spdk_nvmf_request *req)

	feature = cmd->cdw10_bits.get_features.fid;

	if (ctrlr->subsys->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
	if (spdk_nvmf_subsystem_is_discovery(ctrlr->subsys)) {
		/*
		 * Features supported by Discovery controller
		 */
@@ -3414,7 +3414,7 @@ nvmf_ctrlr_set_features(struct spdk_nvmf_request *req)

	feature = cmd->cdw10_bits.set_features.fid;

	if (ctrlr->subsys->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
	if (spdk_nvmf_subsystem_is_discovery(ctrlr->subsys)) {
		/*
		 * Features supported by Discovery controller
		 */
@@ -3565,7 +3565,7 @@ nvmf_ctrlr_process_admin_cmd(struct spdk_nvmf_request *req)
		spdk_iov_memset(req->iov, req->iovcnt, 0);
	}

	if (ctrlr->subsys->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
	if (spdk_nvmf_subsystem_is_discovery(ctrlr->subsys)) {
		/* Discovery controllers only support these admin OPS. */
		switch (cmd->opc) {
		case SPDK_NVME_OPC_IDENTIFY:
+11 −17
Original line number Diff line number Diff line
@@ -99,23 +99,6 @@ nvmf_generate_discovery_log(struct spdk_nvmf_tgt *tgt, const char *hostnqn, size

		for (listener = spdk_nvmf_subsystem_get_first_listener(subsystem); listener != NULL;
		     listener = spdk_nvmf_subsystem_get_next_listener(subsystem, listener)) {
			if (subsystem->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
				struct spdk_nvme_transport_id source_trid = *cmd_source_trid;
				struct spdk_nvme_transport_id listener_trid = *listener->trid;

				/* Do not generate an entry for the transport ID for the listener
				 * entry associated with the discovery controller that generated
				 * this command.  We compare a copy of the trids, since the trids
				 * here don't contain the subnqn, and the transport_id_compare()
				 * function will compare the subnqns.
				 */
				source_trid.subnqn[0] = '\0';
				listener_trid.subnqn[0] = '\0';
				if (!spdk_nvme_transport_id_compare(&listener_trid, &source_trid)) {
					continue;
				}
			}

			if ((tgt->discovery_filter & SPDK_NVMF_TGT_DISCOVERY_MATCH_TRANSPORT_TYPE) != 0 &&
			    !nvmf_discovery_compare_trtype(listener->trid, cmd_source_trid)) {
				SPDK_DEBUGLOG(nvmf, "ignore listener type %d (%s) due to type mismatch\n",
@@ -157,6 +140,17 @@ nvmf_generate_discovery_log(struct spdk_nvmf_tgt *tgt, const char *hostnqn, size
			entry->subtype = subsystem->subtype;
			snprintf(entry->subnqn, sizeof(entry->subnqn), "%s", subsystem->subnqn);

			if (subsystem->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY_CURRENT) {
				/* Each listener in the Current Discovery Subsystem provides access
				 * to the same Discovery Log Pages, so set the Duplicate Returned
				 * Information flag. */
				entry->eflags |= SPDK_NVMF_DISCOVERY_LOG_EFLAGS_DUPRETINFO;
				/* Since the SPDK NVMeoF target supports Asynchronous Event Request
				 * and Keep Alive commands, set the Explicit Persistent Connection
				 * Support for Discovery flag. */
				entry->eflags |= SPDK_NVMF_DISCOVERY_LOG_EFLAGS_EPCSD;
			}

			nvmf_transport_listener_discover(listener->transport, listener->trid, entry);

			numrec++;
+1 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@
	spdk_nvmf_poll_group_dump_stat;
	spdk_nvmf_rdma_init_hooks;
	spdk_nvmf_subsystem_set_ana_reporting;
	spdk_nvmf_subsystem_is_discovery;

	# public functions in nvmf_cmd.h
	spdk_nvmf_ctrlr_identify_ctrlr;
Loading