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 <arpa/inet.h> 35 36 #include "spdk/conf.h" 37 #include "spdk/nvmf.h" 38 #include "spdk/trace.h" 39 40 #include "spdk_internal/log.h" 41 42 #include "subsystem.h" 43 #include "transport.h" 44 45 SPDK_LOG_REGISTER_TRACE_FLAG("nvmf", SPDK_TRACE_NVMF) 46 47 #define MAX_SUBSYSTEMS 4 48 49 struct spdk_nvmf_tgt g_nvmf_tgt; 50 51 int 52 spdk_nvmf_tgt_init(uint16_t max_queue_depth, uint16_t max_queues_per_sess, 53 uint32_t in_capsule_data_size, uint32_t max_io_size) 54 { 55 int rc; 56 57 g_nvmf_tgt.max_queues_per_session = max_queues_per_sess; 58 g_nvmf_tgt.max_queue_depth = max_queue_depth; 59 g_nvmf_tgt.in_capsule_data_size = in_capsule_data_size; 60 g_nvmf_tgt.max_io_size = max_io_size; 61 g_nvmf_tgt.discovery_genctr = 0; 62 g_nvmf_tgt.discovery_log_page = NULL; 63 g_nvmf_tgt.discovery_log_page_size = 0; 64 g_nvmf_tgt.current_subsystem_id = 0; 65 TAILQ_INIT(&g_nvmf_tgt.subsystems); 66 TAILQ_INIT(&g_nvmf_tgt.listen_addrs); 67 68 SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max Queues Per Session: %d\n", max_queues_per_sess); 69 SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max Queue Depth: %d\n", max_queue_depth); 70 SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max In Capsule Data: %d bytes\n", in_capsule_data_size); 71 SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max I/O Size: %d bytes\n", max_io_size); 72 73 rc = spdk_nvmf_transport_init(); 74 if (rc < 0) { 75 SPDK_ERRLOG("Transport initialization failed\n"); 76 return -1; 77 } 78 79 return 0; 80 } 81 82 int 83 spdk_nvmf_tgt_fini(void) 84 { 85 struct spdk_nvmf_listen_addr *listen_addr, *listen_addr_tmp; 86 87 TAILQ_FOREACH_SAFE(listen_addr, &g_nvmf_tgt.listen_addrs, link, listen_addr_tmp) { 88 TAILQ_REMOVE(&g_nvmf_tgt.listen_addrs, listen_addr, link); 89 g_nvmf_tgt.discovery_genctr++; 90 91 spdk_nvmf_listen_addr_destroy(listen_addr); 92 } 93 94 spdk_nvmf_transport_fini(); 95 96 return 0; 97 } 98 99 struct spdk_nvmf_listen_addr * 100 spdk_nvmf_listen_addr_create(const char *trname, const char *traddr, const char *trsvcid) 101 { 102 struct spdk_nvmf_listen_addr *listen_addr; 103 const struct spdk_nvmf_transport *transport; 104 105 transport = spdk_nvmf_transport_get(trname); 106 if (!transport) { 107 return NULL; 108 } 109 110 listen_addr = calloc(1, sizeof(*listen_addr)); 111 if (!listen_addr) { 112 return NULL; 113 } 114 115 listen_addr->traddr = strdup(traddr); 116 if (!listen_addr->traddr) { 117 free(listen_addr); 118 return NULL; 119 } 120 121 listen_addr->trsvcid = strdup(trsvcid); 122 if (!listen_addr->trsvcid) { 123 free(listen_addr->traddr); 124 free(listen_addr); 125 return NULL; 126 } 127 128 listen_addr->trname = strdup(trname); 129 if (!listen_addr->trname) { 130 free(listen_addr->traddr); 131 free(listen_addr->trsvcid); 132 free(listen_addr); 133 return NULL; 134 } 135 136 return listen_addr; 137 } 138 139 void 140 spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) 141 { 142 const struct spdk_nvmf_transport *transport; 143 144 transport = spdk_nvmf_transport_get(addr->trname); 145 assert(transport != NULL); 146 transport->listen_addr_remove(addr); 147 148 spdk_nvmf_listen_addr_cleanup(addr); 149 } 150 151 void 152 spdk_nvmf_listen_addr_cleanup(struct spdk_nvmf_listen_addr *addr) 153 { 154 free(addr->trname); 155 free(addr->trsvcid); 156 free(addr->traddr); 157 free(addr); 158 } 159 160 SPDK_TRACE_REGISTER_FN(nvmf_trace) 161 { 162 spdk_trace_register_object(OBJECT_NVMF_IO, 'r'); 163 spdk_trace_register_description("NVMF_IO_START", "", TRACE_NVMF_IO_START, 164 OWNER_NONE, OBJECT_NVMF_IO, 1, 0, 0, ""); 165 spdk_trace_register_description("NVMF_RDMA_READ_START", "", TRACE_RDMA_READ_START, 166 OWNER_NONE, OBJECT_NVMF_IO, 0, 0, 0, ""); 167 spdk_trace_register_description("NVMF_RDMA_WRITE_START", "", TRACE_RDMA_WRITE_START, 168 OWNER_NONE, OBJECT_NVMF_IO, 0, 0, 0, ""); 169 spdk_trace_register_description("NVMF_RDMA_READ_COMPLETE", "", TRACE_RDMA_READ_COMPLETE, 170 OWNER_NONE, OBJECT_NVMF_IO, 0, 0, 0, ""); 171 spdk_trace_register_description("NVMF_RDMA_WRITE_COMPLETE", "", TRACE_RDMA_WRITE_COMPLETE, 172 OWNER_NONE, OBJECT_NVMF_IO, 0, 0, 0, ""); 173 spdk_trace_register_description("NVMF_LIB_READ_START", "", TRACE_NVMF_LIB_READ_START, 174 OWNER_NONE, OBJECT_NVMF_IO, 0, 0, 0, ""); 175 spdk_trace_register_description("NVMF_LIB_WRITE_START", "", TRACE_NVMF_LIB_WRITE_START, 176 OWNER_NONE, OBJECT_NVMF_IO, 0, 0, 0, ""); 177 spdk_trace_register_description("NVMF_LIB_COMPLETE", "", TRACE_NVMF_LIB_COMPLETE, 178 OWNER_NONE, OBJECT_NVMF_IO, 0, 0, 0, ""); 179 spdk_trace_register_description("NVMF_IO_COMPLETION_DONE", "", TRACE_NVMF_IO_COMPLETE, 180 OWNER_NONE, OBJECT_NVMF_IO, 0, 0, 0, ""); 181 } 182