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