Commit 206ace4a authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

nvmf: add spdk_nvmf_referral_opts structure



If we ever need to add more parameters, we won't have to break the ABI.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I5227b7f325b6e1d98b8837111744591d5ea5aa0a
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20898


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Community-CI: Mellanox Build Bot
parent ec37689b
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -151,30 +151,36 @@ struct spdk_nvmf_poll_group_stat {
 */
typedef void (*spdk_nvmf_tgt_subsystem_listen_done_fn)(void *ctx, int status);

struct spdk_nvmf_referral_opts {
	/** Size of this structure */
	size_t size;
	/** Transport ID of the referral */
	struct spdk_nvme_transport_id trid;
	/** The referral describes a referral to a subsystem which requires a secure channel */
	bool secure_channel;
};

/**
 * Add a discovery service referral to an NVMe-oF target
 *
 * \param tgt The target to which the referral will be added
 * \param trid Transport ID of the referral
 * \param secure_channel The referral describes a discovery service which
 * requires a secure channel
 * \param opts Options describing the referral referral.
 *
 * \return 0 on success or a negated errno on failure
 */
int spdk_nvmf_tgt_add_referral(struct spdk_nvmf_tgt *tgt,
			       struct spdk_nvme_transport_id *trid,
			       bool secure_channel);
			       const struct spdk_nvmf_referral_opts *opts);

/**
 * Remove a discovery service referral from an NVMeoF target
 *
 * \param tgt The target from which the referral will be removed
 * \param trid Transport ID of the referral to remove
 * \param opts Options describing the referral referral.
 *
 * \return 0 on success or a negated errno on failure.
 */
int spdk_nvmf_tgt_remove_referral(struct spdk_nvmf_tgt *tgt,
				  struct spdk_nvme_transport_id *trid);
				  const struct spdk_nvmf_referral_opts *opts);


/**
+11 −5
Original line number Diff line number Diff line
@@ -65,10 +65,13 @@ nvmf_tgt_find_referral(struct spdk_nvmf_tgt *tgt,

int
spdk_nvmf_tgt_add_referral(struct spdk_nvmf_tgt *tgt,
			   struct spdk_nvme_transport_id *trid,
			   bool secure_channel)
			   const struct spdk_nvmf_referral_opts *uopts)
{
	struct spdk_nvmf_referral *referral;
	struct spdk_nvmf_referral_opts opts = {};
	struct spdk_nvme_transport_id *trid = &opts.trid;

	memcpy(&opts, uopts, spdk_min(uopts->size, sizeof(opts)));

	/* If the entry already exists, just ignore it. */
	if (nvmf_tgt_find_referral(tgt, trid)) {
@@ -82,7 +85,7 @@ spdk_nvmf_tgt_add_referral(struct spdk_nvmf_tgt *tgt,
	}

	referral->entry.subtype = SPDK_NVMF_SUBTYPE_DISCOVERY;
	referral->entry.treq.secure_channel = secure_channel ?
	referral->entry.treq.secure_channel = opts.secure_channel ?
					      SPDK_NVMF_TREQ_SECURE_CHANNEL_REQUIRED
					      : SPDK_NVMF_TREQ_SECURE_CHANNEL_NOT_REQUIRED;
	referral->entry.cntlid =
@@ -102,11 +105,14 @@ spdk_nvmf_tgt_add_referral(struct spdk_nvmf_tgt *tgt,

int
spdk_nvmf_tgt_remove_referral(struct spdk_nvmf_tgt *tgt,
			      struct spdk_nvme_transport_id *trid)
			      const struct spdk_nvmf_referral_opts *uopts)
{
	struct spdk_nvmf_referral *referral;
	struct spdk_nvmf_referral_opts opts = {};

	memcpy(&opts, uopts, spdk_min(uopts->size, sizeof(opts)));

	referral = nvmf_tgt_find_referral(tgt, trid);
	referral = nvmf_tgt_find_referral(tgt, &opts.trid);
	if (referral == NULL) {
		return -ENOENT;
	}
+11 −2
Original line number Diff line number Diff line
@@ -1015,6 +1015,7 @@ rpc_nvmf_add_referral(struct spdk_jsonrpc_request *request,
	struct nvmf_rpc_referral_ctx ctx = {};
	struct spdk_nvme_transport_id trid = {};
	struct spdk_nvmf_tgt *tgt;
	struct spdk_nvmf_referral_opts opts = {};
	int rc;

	if (spdk_json_decode_object_relaxed(params, nvmf_rpc_referral_decoder,
@@ -1052,7 +1053,11 @@ rpc_nvmf_add_referral(struct spdk_jsonrpc_request *request,
		return;
	}

	rc = spdk_nvmf_tgt_add_referral(tgt, &trid, ctx.secure_channel);
	opts.size = SPDK_SIZEOF(&opts, secure_channel);
	opts.trid = trid;
	opts.secure_channel = ctx.secure_channel;

	rc = spdk_nvmf_tgt_add_referral(tgt, &opts);
	if (rc != 0) {
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						 "Internal error");
@@ -1074,6 +1079,7 @@ rpc_nvmf_remove_referral(struct spdk_jsonrpc_request *request,
{
	struct nvmf_rpc_referral_ctx ctx = {};
	struct spdk_nvme_transport_id trid = {};
	struct spdk_nvmf_referral_opts opts = {};
	struct spdk_nvmf_tgt *tgt;

	if (spdk_json_decode_object(params, nvmf_rpc_referral_decoder,
@@ -1101,7 +1107,10 @@ rpc_nvmf_remove_referral(struct spdk_jsonrpc_request *request,
		return;
	}

	if (spdk_nvmf_tgt_remove_referral(tgt, &trid)) {
	opts.size = SPDK_SIZEOF(&opts, secure_channel);
	opts.trid = trid;

	if (spdk_nvmf_tgt_remove_referral(tgt, &opts)) {
		SPDK_ERRLOG("Failed to remove referral.\n");
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						 "Unable to remove a referral.");