xref: /spdk/test/unit/lib/nvmf/auth.c/auth_ut.c (revision 245743507d89cb9e3eae0d7a3c6f591890d53293)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2024 Intel Corporation. All rights reserved.
3  */
4 #include "spdk/stdinc.h"
5 
6 #include "spdk_internal/cunit.h"
7 #include "spdk_internal/mock.h"
8 
9 #include "common/lib/ut_multithread.c"
10 #include "nvmf/auth.c"
11 
12 DEFINE_STUB(spdk_nvme_dhchap_get_digest_name, const char *, (int d), NULL);
13 DEFINE_STUB(spdk_nvme_dhchap_get_dhgroup_name, const char *, (int d), NULL);
14 DEFINE_STUB(spdk_nvmf_qpair_disconnect, int, (struct spdk_nvmf_qpair *q), 0);
15 
16 static bool g_req_completed;
17 
18 int
19 spdk_nvmf_request_complete(struct spdk_nvmf_request *req)
20 {
21 	g_req_completed = true;
22 	return 0;
23 }
24 
25 static void
26 ut_clear_resp(struct spdk_nvmf_request *req)
27 {
28 	memset(&req->rsp->nvme_cpl, 0, sizeof(req->rsp->nvme_cpl));
29 }
30 
31 #define ut_prep_cmd(_req, _cmd, _buf, _len, _lfield)		\
32 	do {							\
33 		(_req)->cmd = (void *)_cmd;			\
34 		(_req)->iov[0].iov_base = _buf;			\
35 		(_req)->iov[0].iov_len = _len;			\
36 		(_req)->iovcnt = 1;				\
37 		(_req)->length = _len;				\
38 		(_cmd)->secp = SPDK_NVMF_AUTH_SECP_NVME;	\
39 		(_cmd)->spsp0 = 1;				\
40 		(_cmd)->spsp1 = 1;				\
41 		(_cmd)->_lfield = _len;				\
42 	} while (0)
43 
44 #define ut_prep_send_cmd(req, cmd, buf, len) ut_prep_cmd(req, cmd, buf, len, tl)
45 #define ut_prep_recv_cmd(req, cmd, buf, len) ut_prep_cmd(req, cmd, buf, len, al)
46 
47 static void
48 test_auth_send_recv_error(void)
49 {
50 	union nvmf_c2h_msg rsp = {};
51 	struct spdk_nvmf_subsystem subsys = {};
52 	struct spdk_nvmf_ctrlr ctrlr = { .subsys = &subsys };
53 	struct spdk_nvmf_qpair qpair = { .ctrlr = &ctrlr };
54 	struct spdk_nvmf_request req = { .qpair = &qpair, .rsp = &rsp };
55 	struct spdk_nvme_cpl *cpl = &rsp.nvme_cpl;
56 	struct spdk_nvmf_fabric_auth_send_cmd send_cmd = {};
57 	struct spdk_nvmf_fabric_auth_recv_cmd recv_cmd = {};
58 	int rc;
59 
60 	rc = nvmf_qpair_auth_init(&qpair);
61 	SPDK_CU_ASSERT_FATAL(rc == 0);
62 	ut_prep_send_cmd(&req, &send_cmd, NULL, 255);
63 	ut_prep_recv_cmd(&req, &recv_cmd, NULL, 255);
64 
65 	/* Bad secp (send) */
66 	g_req_completed = false;
67 	req.cmd = (void *)&send_cmd;
68 	ut_clear_resp(&req);
69 	send_cmd.secp = SPDK_NVMF_AUTH_SECP_NVME + 1;
70 
71 	nvmf_auth_send_exec(&req);
72 	CU_ASSERT(g_req_completed);
73 	CU_ASSERT_EQUAL(cpl->status.sct, SPDK_NVME_SCT_GENERIC);
74 	CU_ASSERT_EQUAL(cpl->status.sc, SPDK_NVME_SC_INVALID_FIELD);
75 	CU_ASSERT_EQUAL(cpl->status.dnr, 1);
76 	send_cmd.secp = SPDK_NVMF_AUTH_SECP_NVME;
77 
78 	/* Bad secp (recv) */
79 	g_req_completed = false;
80 	req.cmd = (void *)&recv_cmd;
81 	ut_clear_resp(&req);
82 	recv_cmd.secp = SPDK_NVMF_AUTH_SECP_NVME + 1;
83 
84 	nvmf_auth_recv_exec(&req);
85 	CU_ASSERT(g_req_completed);
86 	CU_ASSERT_EQUAL(cpl->status.sct, SPDK_NVME_SCT_GENERIC);
87 	CU_ASSERT_EQUAL(cpl->status.sc, SPDK_NVME_SC_INVALID_FIELD);
88 	CU_ASSERT_EQUAL(cpl->status.dnr, 1);
89 	recv_cmd.secp = SPDK_NVMF_AUTH_SECP_NVME;
90 
91 	/* Bad spsp0 (send) */
92 	g_req_completed = false;
93 	req.cmd = (void *)&send_cmd;
94 	ut_clear_resp(&req);
95 	send_cmd.spsp0 = 2;
96 
97 	nvmf_auth_send_exec(&req);
98 	CU_ASSERT(g_req_completed);
99 	CU_ASSERT_EQUAL(cpl->status.sct, SPDK_NVME_SCT_GENERIC);
100 	CU_ASSERT_EQUAL(cpl->status.sc, SPDK_NVME_SC_INVALID_FIELD);
101 	CU_ASSERT_EQUAL(cpl->status.dnr, 1);
102 	send_cmd.spsp0 = 1;
103 
104 	/* Bad spsp0 (recv) */
105 	g_req_completed = false;
106 	req.cmd = (void *)&recv_cmd;
107 	ut_clear_resp(&req);
108 	recv_cmd.spsp0 = 2;
109 
110 	nvmf_auth_recv_exec(&req);
111 	CU_ASSERT(g_req_completed);
112 	CU_ASSERT_EQUAL(cpl->status.sct, SPDK_NVME_SCT_GENERIC);
113 	CU_ASSERT_EQUAL(cpl->status.sc, SPDK_NVME_SC_INVALID_FIELD);
114 	CU_ASSERT_EQUAL(cpl->status.dnr, 1);
115 	recv_cmd.spsp0 = 1;
116 
117 	/* Bad spsp1 (send) */
118 	g_req_completed = false;
119 	req.cmd = (void *)&send_cmd;
120 	ut_clear_resp(&req);
121 	send_cmd.spsp1 = 2;
122 
123 	nvmf_auth_send_exec(&req);
124 	CU_ASSERT(g_req_completed);
125 	CU_ASSERT_EQUAL(cpl->status.sct, SPDK_NVME_SCT_GENERIC);
126 	CU_ASSERT_EQUAL(cpl->status.sc, SPDK_NVME_SC_INVALID_FIELD);
127 	CU_ASSERT_EQUAL(cpl->status.dnr, 1);
128 	send_cmd.spsp1 = 1;
129 
130 	/* Bad spsp1 (recv) */
131 	g_req_completed = false;
132 	req.cmd = (void *)&recv_cmd;
133 	ut_clear_resp(&req);
134 	recv_cmd.spsp1 = 2;
135 
136 	nvmf_auth_recv_exec(&req);
137 	CU_ASSERT(g_req_completed);
138 	CU_ASSERT_EQUAL(cpl->status.sct, SPDK_NVME_SCT_GENERIC);
139 	CU_ASSERT_EQUAL(cpl->status.sc, SPDK_NVME_SC_INVALID_FIELD);
140 	CU_ASSERT_EQUAL(cpl->status.dnr, 1);
141 	recv_cmd.spsp1 = 1;
142 
143 	/* Bad length (send) */
144 	g_req_completed = false;
145 	req.cmd = (void *)&send_cmd;
146 	ut_clear_resp(&req);
147 	send_cmd.tl = req.length + 1;
148 
149 	nvmf_auth_recv_exec(&req);
150 	CU_ASSERT(g_req_completed);
151 	CU_ASSERT_EQUAL(cpl->status.sct, SPDK_NVME_SCT_GENERIC);
152 	CU_ASSERT_EQUAL(cpl->status.sc, SPDK_NVME_SC_INVALID_FIELD);
153 	CU_ASSERT_EQUAL(cpl->status.dnr, 1);
154 	send_cmd.tl = req.length;
155 
156 	/* Bad length (recv) */
157 	g_req_completed = false;
158 	req.cmd = (void *)&recv_cmd;
159 	ut_clear_resp(&req);
160 	recv_cmd.al = req.length - 1;
161 
162 	nvmf_auth_recv_exec(&req);
163 	CU_ASSERT(g_req_completed);
164 	CU_ASSERT_EQUAL(cpl->status.sct, SPDK_NVME_SCT_GENERIC);
165 	CU_ASSERT_EQUAL(cpl->status.sc, SPDK_NVME_SC_INVALID_FIELD);
166 	CU_ASSERT_EQUAL(cpl->status.dnr, 1);
167 	recv_cmd.al = req.length;
168 
169 	nvmf_qpair_auth_destroy(&qpair);
170 }
171 
172 int
173 main(int argc, char **argv)
174 {
175 	CU_pSuite suite = NULL;
176 	unsigned int num_failures;
177 
178 	CU_initialize_registry();
179 	suite = CU_add_suite("nvmf_auth", NULL, NULL);
180 	CU_ADD_TEST(suite, test_auth_send_recv_error);
181 
182 	allocate_threads(1);
183 	set_thread(0);
184 
185 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
186 	CU_cleanup_registry();
187 
188 	free_threads();
189 
190 	return num_failures;
191 }
192