1 /*- 2 * BSD LICENSE 3 * 4 * Copyright (c) Intel Corporation. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include "spdk/stdinc.h" 35 36 #include "spdk_cunit.h" 37 38 #include "ctrlr.c" 39 40 SPDK_LOG_REGISTER_TRACE_FLAG("nvmf", SPDK_TRACE_NVMF) 41 42 struct spdk_nvmf_tgt g_nvmf_tgt; 43 44 struct spdk_nvmf_subsystem * 45 spdk_nvmf_find_subsystem_with_cntlid(uint16_t cntlid) 46 { 47 return NULL; 48 } 49 50 struct spdk_nvmf_subsystem * 51 spdk_nvmf_find_subsystem(const char *subnqn) 52 { 53 return NULL; 54 } 55 56 const struct spdk_nvme_ctrlr_data * 57 spdk_nvme_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr) 58 { 59 return NULL; 60 } 61 62 struct spdk_nvmf_poll_group * 63 spdk_nvmf_transport_poll_group_create(struct spdk_nvmf_transport *transport) 64 { 65 return NULL; 66 } 67 68 void 69 spdk_nvmf_transport_poll_group_destroy(struct spdk_nvmf_poll_group *group) 70 { 71 } 72 73 void 74 spdk_nvmf_transport_qpair_fini(struct spdk_nvmf_qpair *qpair) 75 { 76 } 77 78 int 79 spdk_nvmf_transport_poll_group_add(struct spdk_nvmf_poll_group *group, 80 struct spdk_nvmf_qpair *qpair) 81 { 82 return 0; 83 } 84 85 int 86 spdk_nvmf_transport_poll_group_remove(struct spdk_nvmf_poll_group *group, 87 struct spdk_nvmf_qpair *qpair) 88 { 89 return 0; 90 } 91 92 int 93 spdk_nvmf_transport_qpair_poll(struct spdk_nvmf_qpair *qpair) 94 { 95 return 0; 96 } 97 98 const char * 99 spdk_nvmf_subsystem_get_sn(const struct spdk_nvmf_subsystem *subsystem) 100 { 101 abort(); 102 return NULL; 103 } 104 105 struct spdk_nvmf_ns * 106 spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid) 107 { 108 abort(); 109 return NULL; 110 } 111 112 struct spdk_nvmf_ns * 113 spdk_nvmf_subsystem_get_first_ns(struct spdk_nvmf_subsystem *subsystem) 114 { 115 abort(); 116 return NULL; 117 } 118 119 struct spdk_nvmf_ns * 120 spdk_nvmf_subsystem_get_next_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_ns *prev_ns) 121 { 122 abort(); 123 return NULL; 124 } 125 126 bool 127 spdk_nvmf_ctrlr_dsm_supported(struct spdk_nvmf_ctrlr *ctrlr) 128 { 129 abort(); 130 return false; 131 } 132 133 int 134 spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_bdev *bdev, struct spdk_nvme_ns_data *nsdata) 135 { 136 abort(); 137 return -1; 138 } 139 140 void 141 spdk_nvmf_get_discovery_log_page(void *buffer, uint64_t offset, uint32_t length) 142 { 143 abort(); 144 } 145 146 int 147 spdk_nvmf_request_complete(struct spdk_nvmf_request *req) 148 { 149 return -1; 150 } 151 152 int 153 spdk_nvmf_request_abort(struct spdk_nvmf_request *req) 154 { 155 return -1; 156 } 157 158 static void 159 test_get_log_page(void) 160 { 161 struct spdk_nvmf_subsystem subsystem = {}; 162 struct spdk_nvmf_request req = {}; 163 struct spdk_nvmf_qpair qpair = {}; 164 struct spdk_nvmf_ctrlr ctrlr = {}; 165 union nvmf_h2c_msg cmd = {}; 166 union nvmf_c2h_msg rsp = {}; 167 char data[4096]; 168 169 subsystem.subtype = SPDK_NVMF_SUBTYPE_NVME; 170 171 ctrlr.subsys = &subsystem; 172 173 qpair.ctrlr = &ctrlr; 174 175 req.qpair = &qpair; 176 req.cmd = &cmd; 177 req.rsp = &rsp; 178 req.data = &data; 179 req.length = sizeof(data); 180 181 /* Get Log Page - all valid */ 182 memset(&cmd, 0, sizeof(cmd)); 183 memset(&rsp, 0, sizeof(rsp)); 184 cmd.nvme_cmd.opc = SPDK_NVME_OPC_GET_LOG_PAGE; 185 cmd.nvme_cmd.cdw10 = SPDK_NVME_LOG_ERROR | (req.length / 4 - 1) << 16; 186 CU_ASSERT(spdk_nvmf_ctrlr_get_log_page(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); 187 CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); 188 CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_SUCCESS); 189 190 /* Get Log Page with invalid log ID */ 191 memset(&cmd, 0, sizeof(cmd)); 192 memset(&rsp, 0, sizeof(rsp)); 193 cmd.nvme_cmd.opc = SPDK_NVME_OPC_GET_LOG_PAGE; 194 cmd.nvme_cmd.cdw10 = 0; 195 CU_ASSERT(spdk_nvmf_ctrlr_get_log_page(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); 196 CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); 197 CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); 198 199 /* Get Log Page with invalid offset (not dword aligned) */ 200 memset(&cmd, 0, sizeof(cmd)); 201 memset(&rsp, 0, sizeof(rsp)); 202 cmd.nvme_cmd.opc = SPDK_NVME_OPC_GET_LOG_PAGE; 203 cmd.nvme_cmd.cdw10 = SPDK_NVME_LOG_ERROR | (req.length / 4 - 1) << 16; 204 cmd.nvme_cmd.cdw12 = 2; 205 CU_ASSERT(spdk_nvmf_ctrlr_get_log_page(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); 206 CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); 207 CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); 208 209 /* Get Log Page without data buffer */ 210 memset(&cmd, 0, sizeof(cmd)); 211 memset(&rsp, 0, sizeof(rsp)); 212 req.data = NULL; 213 cmd.nvme_cmd.opc = SPDK_NVME_OPC_GET_LOG_PAGE; 214 cmd.nvme_cmd.cdw10 = SPDK_NVME_LOG_ERROR | (req.length / 4 - 1) << 16; 215 CU_ASSERT(spdk_nvmf_ctrlr_get_log_page(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); 216 CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); 217 CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); 218 req.data = data; 219 } 220 221 int main(int argc, char **argv) 222 { 223 CU_pSuite suite = NULL; 224 unsigned int num_failures; 225 226 if (CU_initialize_registry() != CUE_SUCCESS) { 227 return CU_get_error(); 228 } 229 230 suite = CU_add_suite("nvmf", NULL, NULL); 231 if (suite == NULL) { 232 CU_cleanup_registry(); 233 return CU_get_error(); 234 } 235 236 if ( 237 CU_add_test(suite, "get_log_page", test_get_log_page) == NULL) { 238 CU_cleanup_registry(); 239 return CU_get_error(); 240 } 241 242 CU_basic_set_mode(CU_BRM_VERBOSE); 243 CU_basic_run_tests(); 244 num_failures = CU_get_number_of_failures(); 245 CU_cleanup_registry(); 246 return num_failures; 247 } 248