Commit ffd098cf authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Jim Harris
Browse files

nvme/auth: process auth transactions inside transports



We chose to process auth transactions in the common fabrics code to
avoid code duplication.  However, it makes it difficult to implement
reauthentication, as the transports are polling for fabrics connect,
which doesn't happen once a connection has been established.

So, polling for the authentication will now be done by the transports.
Also, the next patch will add a transport callback that moves a qpair
back to the AUTHENTICATING state after it's been connected, which will
be used to implement reauthentication.

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


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
parent b95aae63
Loading
Loading
Loading
Loading
+3 −47
Original line number Diff line number Diff line
@@ -576,13 +576,12 @@ nvme_fabric_qpair_connect_async(struct spdk_nvme_qpair *qpair, uint32_t num_entr
	}

	qpair->auth.flags = 0;
	qpair->connect_state = NVME_QPAIR_CONNECT_STATE_CONNECTING;
	qpair->poll_status = status;
	return 0;
}

static int
_nvme_fabric_qpair_connect_poll(struct spdk_nvme_qpair *qpair)
int
nvme_fabric_qpair_connect_poll(struct spdk_nvme_qpair *qpair)
{
	struct nvme_completion_poll_status *status;
	struct spdk_nvmf_fabric_connect_rsp *rsp;
@@ -637,7 +636,7 @@ finish:
	return rc;
}

static bool
bool
nvme_fabric_qpair_auth_required(struct spdk_nvme_qpair *qpair)
{
	struct spdk_nvme_ctrlr *ctrlr = qpair->ctrlr;
@@ -646,49 +645,6 @@ nvme_fabric_qpair_auth_required(struct spdk_nvme_qpair *qpair)
	       ctrlr->opts.dhchap_ctrlr_key != NULL;
}

int
nvme_fabric_qpair_connect_poll(struct spdk_nvme_qpair *qpair)
{
	int rc;

	switch (qpair->connect_state) {
	case NVME_QPAIR_CONNECT_STATE_CONNECTING:
		rc = _nvme_fabric_qpair_connect_poll(qpair);
		if (rc != 0) {
			break;
		}
		if (nvme_fabric_qpair_auth_required(qpair)) {
			rc = nvme_fabric_qpair_authenticate_async(qpair);
			if (rc == 0) {
				qpair->connect_state = NVME_QPAIR_CONNECT_STATE_AUTHENTICATING;
				rc = -EAGAIN;
			}
			break;
		}
		qpair->connect_state = NVME_QPAIR_CONNECT_STATE_CONNECTED;
		break;
	case NVME_QPAIR_CONNECT_STATE_AUTHENTICATING:
		rc = nvme_fabric_qpair_authenticate_poll(qpair);
		if (rc == 0) {
			qpair->connect_state = NVME_QPAIR_CONNECT_STATE_CONNECTED;
		}
		break;
	/* Once qpair is connected or a failure occurs, users mustn't call this function anymore */
	case NVME_QPAIR_CONNECT_STATE_CONNECTED:
	case NVME_QPAIR_CONNECT_STATE_FAILED:
	default:
		assert(0 && "invalid state");
		rc = -EINVAL;
		break;
	}

	if (rc != 0 && rc != -EAGAIN) {
		qpair->connect_state = NVME_QPAIR_CONNECT_STATE_FAILED;
	}

	return rc;
}

int
nvme_fabric_qpair_connect(struct spdk_nvme_qpair *qpair, uint32_t num_entries)
{
+1 −8
Original line number Diff line number Diff line
@@ -410,13 +410,6 @@ enum nvme_qpair_state {
	NVME_QPAIR_DESTROYING,
};

enum nvme_qpair_connect_state {
	NVME_QPAIR_CONNECT_STATE_CONNECTING,
	NVME_QPAIR_CONNECT_STATE_AUTHENTICATING,
	NVME_QPAIR_CONNECT_STATE_CONNECTED,
	NVME_QPAIR_CONNECT_STATE_FAILED,
};

enum nvme_qpair_auth_state {
	NVME_QPAIR_AUTH_STATE_NEGOTIATE,
	NVME_QPAIR_AUTH_STATE_AWAIT_NEGOTIATE,
@@ -519,7 +512,6 @@ struct spdk_nvme_qpair {
	/* Entries below here are not touched in the main I/O path. */

	struct nvme_completion_poll_status	*poll_status;
	enum nvme_qpair_connect_state		connect_state;

	/* List entry for spdk_nvme_ctrlr::active_io_qpairs */
	TAILQ_ENTRY(spdk_nvme_qpair)		tailq;
@@ -1353,6 +1345,7 @@ int nvme_fabric_ctrlr_discover(struct spdk_nvme_ctrlr *ctrlr,
int	nvme_fabric_qpair_connect(struct spdk_nvme_qpair *qpair, uint32_t num_entries);
int	nvme_fabric_qpair_connect_async(struct spdk_nvme_qpair *qpair, uint32_t num_entries);
int	nvme_fabric_qpair_connect_poll(struct spdk_nvme_qpair *qpair);
bool	nvme_fabric_qpair_auth_required(struct spdk_nvme_qpair *qpair);
int	nvme_fabric_qpair_authenticate_async(struct spdk_nvme_qpair *qpair);
int	nvme_fabric_qpair_authenticate_poll(struct spdk_nvme_qpair *qpair);

+18 −2
Original line number Diff line number Diff line
@@ -156,6 +156,7 @@ enum nvme_rdma_qpair_state {
	NVME_RDMA_QPAIR_STATE_INITIALIZING,
	NVME_RDMA_QPAIR_STATE_FABRIC_CONNECT_SEND,
	NVME_RDMA_QPAIR_STATE_FABRIC_CONNECT_POLL,
	NVME_RDMA_QPAIR_STATE_AUTHENTICATING,
	NVME_RDMA_QPAIR_STATE_RUNNING,
	NVME_RDMA_QPAIR_STATE_EXITING,
	NVME_RDMA_QPAIR_STATE_LINGERING,
@@ -1328,12 +1329,27 @@ nvme_rdma_ctrlr_connect_qpair_poll(struct spdk_nvme_ctrlr *ctrlr,
	case NVME_RDMA_QPAIR_STATE_FABRIC_CONNECT_POLL:
		rc = nvme_fabric_qpair_connect_poll(qpair);
		if (rc == 0) {
			if (nvme_fabric_qpair_auth_required(qpair)) {
				rc = nvme_fabric_qpair_authenticate_async(qpair);
				if (rc == 0) {
					rqpair->state = NVME_RDMA_QPAIR_STATE_AUTHENTICATING;
					rc = -EAGAIN;
				}
			} else {
				rqpair->state = NVME_RDMA_QPAIR_STATE_RUNNING;
				nvme_qpair_set_state(qpair, NVME_QPAIR_CONNECTED);
			}
		} else if (rc != -EAGAIN) {
			SPDK_ERRLOG("Failed to poll NVMe-oF Fabric CONNECT command\n");
		}
		break;
	case NVME_RDMA_QPAIR_STATE_AUTHENTICATING:
		rc = nvme_fabric_qpair_authenticate_poll(qpair);
		if (rc == 0) {
			rqpair->state = NVME_RDMA_QPAIR_STATE_RUNNING;
			nvme_qpair_set_state(qpair, NVME_QPAIR_CONNECTED);
		}
		break;
	case NVME_RDMA_QPAIR_STATE_RUNNING:
		rc = 0;
		break;
+22 −5
Original line number Diff line number Diff line
@@ -46,9 +46,10 @@ enum nvme_tcp_qpair_state {
	NVME_TCP_QPAIR_STATE_INITIALIZING = 1,
	NVME_TCP_QPAIR_STATE_FABRIC_CONNECT_SEND = 2,
	NVME_TCP_QPAIR_STATE_FABRIC_CONNECT_POLL = 3,
	NVME_TCP_QPAIR_STATE_RUNNING = 4,
	NVME_TCP_QPAIR_STATE_EXITING = 5,
	NVME_TCP_QPAIR_STATE_EXITED = 6,
	NVME_TCP_QPAIR_STATE_AUTHENTICATING = 4,
	NVME_TCP_QPAIR_STATE_RUNNING = 5,
	NVME_TCP_QPAIR_STATE_EXITING = 6,
	NVME_TCP_QPAIR_STATE_EXITED = 7,
};

/* NVMe TCP transport extensions for spdk_nvme_ctrlr */
@@ -1175,6 +1176,7 @@ nvme_tcp_qpair_recv_state_valid(struct nvme_tcp_qpair *tqpair)
	switch (tqpair->state) {
	case NVME_TCP_QPAIR_STATE_FABRIC_CONNECT_SEND:
	case NVME_TCP_QPAIR_STATE_FABRIC_CONNECT_POLL:
	case NVME_TCP_QPAIR_STATE_AUTHENTICATING:
	case NVME_TCP_QPAIR_STATE_RUNNING:
		return true;
	default:
@@ -2443,12 +2445,27 @@ nvme_tcp_ctrlr_connect_qpair_poll(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvm
	case NVME_TCP_QPAIR_STATE_FABRIC_CONNECT_POLL:
		rc = nvme_fabric_qpair_connect_poll(&tqpair->qpair);
		if (rc == 0) {
			if (nvme_fabric_qpair_auth_required(qpair)) {
				rc = nvme_fabric_qpair_authenticate_async(qpair);
				if (rc == 0) {
					tqpair->state = NVME_TCP_QPAIR_STATE_AUTHENTICATING;
					rc = -EAGAIN;
				}
			} else {
				tqpair->state = NVME_TCP_QPAIR_STATE_RUNNING;
				nvme_qpair_set_state(qpair, NVME_QPAIR_CONNECTED);
			}
		} else if (rc != -EAGAIN) {
			SPDK_ERRLOG("Failed to poll NVMe-oF Fabric CONNECT command\n");
		}
		break;
	case NVME_TCP_QPAIR_STATE_AUTHENTICATING:
		rc = nvme_fabric_qpair_authenticate_poll(qpair);
		if (rc == 0) {
			tqpair->state = NVME_TCP_QPAIR_STATE_RUNNING;
			nvme_qpair_set_state(qpair, NVME_QPAIR_CONNECTED);
		}
		break;
	case NVME_TCP_QPAIR_STATE_RUNNING:
		rc = 0;
		break;
+3 −0
Original line number Diff line number Diff line
@@ -93,6 +93,9 @@ DEFINE_STUB(nvme_fabric_qpair_connect, int, (struct spdk_nvme_qpair *qpair, uint
DEFINE_STUB(nvme_fabric_qpair_connect_async, int, (struct spdk_nvme_qpair *qpair,
		uint32_t num_entries), 0);
DEFINE_STUB(nvme_fabric_qpair_connect_poll, int, (struct spdk_nvme_qpair *qpair), 0);
DEFINE_STUB(nvme_fabric_qpair_auth_required, bool, (struct spdk_nvme_qpair *qpair), false);
DEFINE_STUB(nvme_fabric_qpair_authenticate_async, int, (struct spdk_nvme_qpair *qpair), 0);
DEFINE_STUB(nvme_fabric_qpair_authenticate_poll, int, (struct spdk_nvme_qpair *qpair), 0);
DEFINE_STUB_V(nvme_transport_ctrlr_disconnect_qpair, (struct spdk_nvme_ctrlr *ctrlr,
		struct spdk_nvme_qpair *qpair));
DEFINE_STUB(nvme_poll_group_disconnect_qpair, int, (struct spdk_nvme_qpair *qpair), 0);