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

test/nvmf: add auth timeout unit tests



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


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent b2dcccf3
Loading
Loading
Loading
Loading
+91 −1
Original line number Diff line number Diff line
@@ -11,7 +11,13 @@

DEFINE_STUB(spdk_nvme_dhchap_get_digest_name, const char *, (int d), NULL);
DEFINE_STUB(spdk_nvme_dhchap_get_dhgroup_name, const char *, (int d), NULL);
DEFINE_STUB(spdk_nvmf_qpair_disconnect, int, (struct spdk_nvmf_qpair *q), 0);

int
spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair)
{
	qpair->state = SPDK_NVMF_QPAIR_ERROR;
	return 0;
}

static bool g_req_completed;

@@ -408,6 +414,89 @@ test_auth_negotiate(void)
	nvmf_qpair_auth_destroy(&qpair);
}

static void
test_auth_timeout(void)
{
	union nvmf_c2h_msg rsp = {};
	struct spdk_nvmf_subsystem subsys = {};
	struct spdk_nvmf_ctrlr ctrlr = { .subsys = &subsys };
	struct spdk_nvmf_qpair qpair = { .ctrlr = &ctrlr };
	struct spdk_nvmf_request req = { .qpair = &qpair, .rsp = &rsp };
	struct spdk_nvmf_fabric_auth_send_cmd cmd = {};
	struct spdk_nvmf_qpair_auth *auth;
	struct spdk_nvmf_auth_negotiate *msg;
	struct spdk_nvmf_auth_descriptor *desc;
	uint8_t msgbuf[4096];
	int rc;

	msg = (void *)msgbuf;
	ut_prep_send_cmd(&req, &cmd, msgbuf, sizeof(*msg) + sizeof(*desc));
	MOCK_SET(spdk_get_ticks_hz, 1000 * 1000);
	qpair.state = SPDK_NVMF_QPAIR_AUTHENTICATING;

	/* Check that a timeout is correctly detected and qpair is disconnected */
	rc = nvmf_qpair_auth_init(&qpair);
	SPDK_CU_ASSERT_FATAL(rc == 0);
	MOCK_SET(spdk_get_ticks, NVMF_AUTH_DEFAULT_KATO_US - 1);
	poll_threads();
	CU_ASSERT_EQUAL(qpair.state, SPDK_NVMF_QPAIR_AUTHENTICATING);
	MOCK_SET(spdk_get_ticks, NVMF_AUTH_DEFAULT_KATO_US);
	poll_threads();
	CU_ASSERT_EQUAL(qpair.state, SPDK_NVMF_QPAIR_ERROR);
	nvmf_qpair_auth_destroy(&qpair);
	qpair.state = SPDK_NVMF_QPAIR_AUTHENTICATING;
	MOCK_SET(spdk_get_ticks, 0);

	/* Check a case where a non-zero kato is set in controller features */
	ctrlr.feat.keep_alive_timer.bits.kato = 10 * 1000;
	rc = nvmf_qpair_auth_init(&qpair);
	SPDK_CU_ASSERT_FATAL(rc == 0);
	MOCK_SET(spdk_get_ticks, 10 * 1000 * 1000 - 1);
	poll_threads();
	CU_ASSERT_EQUAL(qpair.state, SPDK_NVMF_QPAIR_AUTHENTICATING);
	MOCK_SET(spdk_get_ticks, 10 * 1000 * 1000);
	poll_threads();
	CU_ASSERT_EQUAL(qpair.state, SPDK_NVMF_QPAIR_ERROR);
	nvmf_qpair_auth_destroy(&qpair);
	qpair.state = SPDK_NVMF_QPAIR_AUTHENTICATING;
	ctrlr.feat.keep_alive_timer.bits.kato = 0;
	MOCK_SET(spdk_get_ticks, 0);

	/* Check that reception of a command rearms the timeout poller */
	rc = nvmf_qpair_auth_init(&qpair);
	SPDK_CU_ASSERT_FATAL(rc == 0);
	auth = qpair.auth;

	MOCK_SET(spdk_get_ticks, NVMF_AUTH_DEFAULT_KATO_US / 2);
	g_req_completed = false;
	msg->auth_type = SPDK_NVMF_AUTH_TYPE_COMMON_MESSAGE;
	msg->auth_id = SPDK_NVMF_AUTH_ID_NEGOTIATE;
	msg->sc_c = SPDK_NVMF_AUTH_SCC_DISABLED;
	msg->napd = 1;
	desc = &msg->descriptors[0];
	desc->auth_id = SPDK_NVMF_AUTH_TYPE_DHCHAP;
	desc->halen = 1;
	desc->hash_id_list[0] = SPDK_NVMF_DHCHAP_HASH_SHA256;
	desc->dhlen = 1;
	desc->dhg_id_list[0] = SPDK_NVMF_DHCHAP_DHGROUP_NULL;

	nvmf_auth_send_exec(&req);
	CU_ASSERT(g_req_completed);
	CU_ASSERT_EQUAL(auth->digest, SPDK_NVMF_DHCHAP_HASH_SHA256);
	CU_ASSERT_EQUAL(auth->state, NVMF_QPAIR_AUTH_CHALLENGE);

	MOCK_SET(spdk_get_ticks, NVMF_AUTH_DEFAULT_KATO_US);
	poll_threads();
	CU_ASSERT_EQUAL(qpair.state, SPDK_NVMF_QPAIR_AUTHENTICATING);
	CU_ASSERT_EQUAL(auth->state, NVMF_QPAIR_AUTH_CHALLENGE);

	MOCK_SET(spdk_get_ticks, NVMF_AUTH_DEFAULT_KATO_US + NVMF_AUTH_DEFAULT_KATO_US / 2);
	poll_threads();
	CU_ASSERT_EQUAL(qpair.state, SPDK_NVMF_QPAIR_ERROR);
	nvmf_qpair_auth_destroy(&qpair);
	MOCK_SET(spdk_get_ticks, 0);
}

int
main(int argc, char **argv)
{
@@ -418,6 +507,7 @@ main(int argc, char **argv)
	suite = CU_add_suite("nvmf_auth", NULL, NULL);
	CU_ADD_TEST(suite, test_auth_send_recv_error);
	CU_ADD_TEST(suite, test_auth_negotiate);
	CU_ADD_TEST(suite, test_auth_timeout);

	allocate_threads(1);
	set_thread(0);