1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse * Copyright (C) 2020 Intel Corporation.
3ed56a3d4SAnil Veerabhadrappa * Copyright (c) 2018-2019 Broadcom. All Rights Reserved.
4ed56a3d4SAnil Veerabhadrappa * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
5ed56a3d4SAnil Veerabhadrappa */
6ed56a3d4SAnil Veerabhadrappa
7ed56a3d4SAnil Veerabhadrappa /* NVMF FC LS Command Processor Unit Test */
8ed56a3d4SAnil Veerabhadrappa
9ed56a3d4SAnil Veerabhadrappa #include "spdk/env.h"
10ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
11ed56a3d4SAnil Veerabhadrappa #include "spdk/nvmf.h"
12ed56a3d4SAnil Veerabhadrappa #include "spdk/endian.h"
13ed56a3d4SAnil Veerabhadrappa #include "spdk/trace.h"
144e8e97c8STomasz Zawadzki #include "spdk/log.h"
15ed56a3d4SAnil Veerabhadrappa
16ed56a3d4SAnil Veerabhadrappa #include "ut_multithread.c"
17ed56a3d4SAnil Veerabhadrappa
18ed56a3d4SAnil Veerabhadrappa #include "transport.h"
19ed56a3d4SAnil Veerabhadrappa #include "nvmf_internal.h"
20ed56a3d4SAnil Veerabhadrappa #include "nvmf_fc.h"
21ed56a3d4SAnil Veerabhadrappa
22ed56a3d4SAnil Veerabhadrappa #include "fc_ls.c"
23ed56a3d4SAnil Veerabhadrappa
24ed56a3d4SAnil Veerabhadrappa #define LAST_RSLT_STOP_TEST 999
25ed56a3d4SAnil Veerabhadrappa
26ed56a3d4SAnil Veerabhadrappa void spdk_set_thread(struct spdk_thread *thread);
27ed56a3d4SAnil Veerabhadrappa
28ed56a3d4SAnil Veerabhadrappa /*
29ed56a3d4SAnil Veerabhadrappa * SPDK Stuff
30ed56a3d4SAnil Veerabhadrappa */
31ed56a3d4SAnil Veerabhadrappa
32ed56a3d4SAnil Veerabhadrappa DEFINE_STUB(spdk_nvmf_request_complete, int, (struct spdk_nvmf_request *req), -ENOSPC);
33ed56a3d4SAnil Veerabhadrappa DEFINE_STUB(spdk_nvmf_subsystem_host_allowed, bool,
34ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_subsystem *subsystem, const char *hostnqn), true);
359857ff60SAnil Veerabhadrappa DEFINE_STUB_V(spdk_nvme_trid_populate_transport, (struct spdk_nvme_transport_id *trid,
369857ff60SAnil Veerabhadrappa enum spdk_nvme_transport_type trtype));
37608b54a2SKonrad Sztyber DEFINE_STUB(spdk_nvmf_qpair_disconnect, int, (struct spdk_nvmf_qpair *qpair), 0);
38b50c6bc2SNaresh Gottumukkala DEFINE_STUB(rte_hash_del_key, int32_t, (const struct rte_hash *h, const void *key), 0);
39b50c6bc2SNaresh Gottumukkala DEFINE_STUB(rte_hash_lookup_data, int, (const struct rte_hash *h, const void *key, void **data),
40b50c6bc2SNaresh Gottumukkala -ENOENT);
41b50c6bc2SNaresh Gottumukkala DEFINE_STUB(rte_hash_add_key_data, int, (const struct rte_hash *h, const void *key, void *data), 0);
42b50c6bc2SNaresh Gottumukkala DEFINE_STUB(rte_hash_create, struct rte_hash *, (const struct rte_hash_parameters *params),
43b50c6bc2SNaresh Gottumukkala (void *)1);
44b50c6bc2SNaresh Gottumukkala DEFINE_STUB_V(rte_hash_free, (struct rte_hash *h));
45dc0d8962SNaresh Gottumukkala DEFINE_STUB(nvmf_fc_poll_group_valid, bool, (struct spdk_nvmf_fc_poll_group *fgroup), true);
46ed56a3d4SAnil Veerabhadrappa
47ed56a3d4SAnil Veerabhadrappa static const char *fc_ut_subsystem_nqn =
48ed56a3d4SAnil Veerabhadrappa "nqn.2017-11.io.spdk:sn.390c0dc7c87011e786b300a0989adc53:subsystem.good";
49ed56a3d4SAnil Veerabhadrappa static struct spdk_nvmf_host fc_ut_initiator = {
50ed56a3d4SAnil Veerabhadrappa .nqn = "nqn.2017-11.fc_host",
51ed56a3d4SAnil Veerabhadrappa };
52ed56a3d4SAnil Veerabhadrappa static struct spdk_nvmf_host *fc_ut_host = &fc_ut_initiator;
53ed56a3d4SAnil Veerabhadrappa static struct spdk_nvmf_tgt g_nvmf_tgt;
54ed56a3d4SAnil Veerabhadrappa static struct spdk_nvmf_transport_opts g_nvmf_transport_opts = {
55ed56a3d4SAnil Veerabhadrappa .max_queue_depth = 128,
56ed56a3d4SAnil Veerabhadrappa .max_qpairs_per_ctrlr = 4,
57ed56a3d4SAnil Veerabhadrappa .max_aq_depth = 32,
58ed56a3d4SAnil Veerabhadrappa };
59ed56a3d4SAnil Veerabhadrappa static struct spdk_nvmf_subsystem g_nvmf_subsystem;
60ed56a3d4SAnil Veerabhadrappa
6161d85773SSeth Howell void nvmf_fc_request_abort(struct spdk_nvmf_fc_request *fc_req, bool send_abts,
62ed56a3d4SAnil Veerabhadrappa spdk_nvmf_fc_caller_cb cb, void *cb_args);
63ed56a3d4SAnil Veerabhadrappa void spdk_bdev_io_abort(struct spdk_bdev_io *bdev_io, void *ctx);
6461d85773SSeth Howell void nvmf_fc_request_abort_complete(void *arg1);
6561d85773SSeth Howell bool nvmf_fc_req_in_xfer(struct spdk_nvmf_fc_request *fc_req);
66ed56a3d4SAnil Veerabhadrappa
67ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_subsystem *
spdk_nvmf_tgt_find_subsystem(struct spdk_nvmf_tgt * tgt,const char * subnqn)68ed56a3d4SAnil Veerabhadrappa spdk_nvmf_tgt_find_subsystem(struct spdk_nvmf_tgt *tgt, const char *subnqn)
69ed56a3d4SAnil Veerabhadrappa {
70ed56a3d4SAnil Veerabhadrappa if (!strcmp(subnqn, g_nvmf_subsystem.subnqn)) {
71ed56a3d4SAnil Veerabhadrappa return &g_nvmf_subsystem;
72ed56a3d4SAnil Veerabhadrappa }
73ed56a3d4SAnil Veerabhadrappa return NULL;
74ed56a3d4SAnil Veerabhadrappa }
75ed56a3d4SAnil Veerabhadrappa
76ed56a3d4SAnil Veerabhadrappa int
spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group * group,struct spdk_nvmf_qpair * qpair)77ed56a3d4SAnil Veerabhadrappa spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group *group,
78ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_qpair *qpair)
79ed56a3d4SAnil Veerabhadrappa {
80*781d42adSKonrad Sztyber qpair->state = SPDK_NVMF_QPAIR_ENABLED;
81ed56a3d4SAnil Veerabhadrappa return 0;
82ed56a3d4SAnil Veerabhadrappa }
83ed56a3d4SAnil Veerabhadrappa
84ed56a3d4SAnil Veerabhadrappa const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = {
85ed56a3d4SAnil Veerabhadrappa .type = (enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC,
86ed56a3d4SAnil Veerabhadrappa .create = NULL,
87ed56a3d4SAnil Veerabhadrappa .destroy = NULL,
88ed56a3d4SAnil Veerabhadrappa
89ed56a3d4SAnil Veerabhadrappa .listen = NULL,
90ed56a3d4SAnil Veerabhadrappa .stop_listen = NULL,
91ed56a3d4SAnil Veerabhadrappa
92ed56a3d4SAnil Veerabhadrappa .listener_discover = NULL,
93ed56a3d4SAnil Veerabhadrappa
94ed56a3d4SAnil Veerabhadrappa .poll_group_create = NULL,
95ed56a3d4SAnil Veerabhadrappa .poll_group_destroy = NULL,
96ed56a3d4SAnil Veerabhadrappa .poll_group_add = NULL,
97ed56a3d4SAnil Veerabhadrappa .poll_group_poll = NULL,
98ed56a3d4SAnil Veerabhadrappa
99ed56a3d4SAnil Veerabhadrappa .req_complete = NULL,
100ed56a3d4SAnil Veerabhadrappa
101ed56a3d4SAnil Veerabhadrappa .qpair_fini = NULL,
102ed56a3d4SAnil Veerabhadrappa
103ed56a3d4SAnil Veerabhadrappa };
104ed56a3d4SAnil Veerabhadrappa
105ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_transport g_nvmf_transport = {
106ed56a3d4SAnil Veerabhadrappa .ops = &spdk_nvmf_transport_fc,
107ed56a3d4SAnil Veerabhadrappa .tgt = &g_nvmf_tgt,
108ed56a3d4SAnil Veerabhadrappa };
109ed56a3d4SAnil Veerabhadrappa
110ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_transport *
spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt * tgt,const char * transport_name)111b397546eSSeth Howell spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt, const char *transport_name)
112ed56a3d4SAnil Veerabhadrappa {
113ed56a3d4SAnil Veerabhadrappa return &g_nvmf_transport;
114ed56a3d4SAnil Veerabhadrappa }
115ed56a3d4SAnil Veerabhadrappa
1165584232cSBen Walker void
spdk_nvmf_tgt_new_qpair(struct spdk_nvmf_tgt * tgt,struct spdk_nvmf_qpair * qpair)1175584232cSBen Walker spdk_nvmf_tgt_new_qpair(struct spdk_nvmf_tgt *tgt, struct spdk_nvmf_qpair *qpair)
118ed56a3d4SAnil Veerabhadrappa {
119ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_conn *fc_conn;
120561a9f26SNaresh Gottumukkala struct spdk_nvmf_fc_hwqp *hwqp = NULL;
121ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_add_conn_api_data *api_data = NULL;
122ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_port *fc_port;
123561a9f26SNaresh Gottumukkala static int hwqp_idx = 0;
124ed56a3d4SAnil Veerabhadrappa
125ed56a3d4SAnil Veerabhadrappa fc_conn = SPDK_CONTAINEROF(qpair, struct spdk_nvmf_fc_conn, qpair);
126ed56a3d4SAnil Veerabhadrappa api_data = &fc_conn->create_opd->u.add_conn;
127ed56a3d4SAnil Veerabhadrappa
128ed56a3d4SAnil Veerabhadrappa fc_port = fc_conn->fc_assoc->tgtport->fc_port;
129561a9f26SNaresh Gottumukkala hwqp = &fc_port->io_queues[hwqp_idx];
130ed56a3d4SAnil Veerabhadrappa
131561a9f26SNaresh Gottumukkala if (!nvmf_fc_assign_conn_to_hwqp(hwqp,
132ed56a3d4SAnil Veerabhadrappa &fc_conn->conn_id,
133ed56a3d4SAnil Veerabhadrappa fc_conn->max_queue_depth)) {
134ed56a3d4SAnil Veerabhadrappa goto err;
135ed56a3d4SAnil Veerabhadrappa }
136ed56a3d4SAnil Veerabhadrappa
137561a9f26SNaresh Gottumukkala fc_conn->hwqp = hwqp;
138ed56a3d4SAnil Veerabhadrappa
139ed56a3d4SAnil Veerabhadrappa /* If this is for ADMIN connection, then update assoc ID. */
140ed56a3d4SAnil Veerabhadrappa if (fc_conn->qpair.qid == 0) {
141ed56a3d4SAnil Veerabhadrappa fc_conn->fc_assoc->assoc_id = fc_conn->conn_id;
142ed56a3d4SAnil Veerabhadrappa }
143ed56a3d4SAnil Veerabhadrappa
144561a9f26SNaresh Gottumukkala nvmf_fc_poller_api_func(hwqp, SPDK_NVMF_FC_POLLER_API_ADD_CONNECTION, &api_data->args);
145561a9f26SNaresh Gottumukkala hwqp_idx++;
146ed56a3d4SAnil Veerabhadrappa return;
147ed56a3d4SAnil Veerabhadrappa err:
148ed56a3d4SAnil Veerabhadrappa nvmf_fc_ls_add_conn_failure(api_data->assoc, api_data->ls_rqst,
149ed56a3d4SAnil Veerabhadrappa api_data->args.fc_conn, api_data->aq_conn);
150ed56a3d4SAnil Veerabhadrappa }
151ed56a3d4SAnil Veerabhadrappa
152561a9f26SNaresh Gottumukkala void
nvmf_fc_free_conn_reqpool(struct spdk_nvmf_fc_conn * fc_conn)153561a9f26SNaresh Gottumukkala nvmf_fc_free_conn_reqpool(struct spdk_nvmf_fc_conn *fc_conn)
154561a9f26SNaresh Gottumukkala {
155561a9f26SNaresh Gottumukkala }
156561a9f26SNaresh Gottumukkala
157561a9f26SNaresh Gottumukkala int
nvmf_fc_create_conn_reqpool(struct spdk_nvmf_fc_conn * fc_conn)158561a9f26SNaresh Gottumukkala nvmf_fc_create_conn_reqpool(struct spdk_nvmf_fc_conn *fc_conn)
159561a9f26SNaresh Gottumukkala {
160561a9f26SNaresh Gottumukkala return 0;
161561a9f26SNaresh Gottumukkala }
162561a9f26SNaresh Gottumukkala
163ed56a3d4SAnil Veerabhadrappa /*
164ed56a3d4SAnil Veerabhadrappa * LLD functions
165ed56a3d4SAnil Veerabhadrappa */
166ed56a3d4SAnil Veerabhadrappa
167ed56a3d4SAnil Veerabhadrappa bool
nvmf_fc_assign_conn_to_hwqp(struct spdk_nvmf_fc_hwqp * hwqp,uint64_t * conn_id,uint32_t sq_size)168ed56a3d4SAnil Veerabhadrappa nvmf_fc_assign_conn_to_hwqp(struct spdk_nvmf_fc_hwqp *hwqp,
169ed56a3d4SAnil Veerabhadrappa uint64_t *conn_id, uint32_t sq_size)
170ed56a3d4SAnil Veerabhadrappa {
1719ae43465SNaresh Gottumukkala static uint16_t conn_cnt = 0;
1729ae43465SNaresh Gottumukkala
1732172c432STomasz Zawadzki SPDK_DEBUGLOG(nvmf_fc_ls, "Assign connection to HWQP\n");
174ed56a3d4SAnil Veerabhadrappa
175ed56a3d4SAnil Veerabhadrappa /* create connection ID */
1769ae43465SNaresh Gottumukkala *conn_id = ((uint64_t)hwqp->hwqp_id | (conn_cnt++ << 8));
177ed56a3d4SAnil Veerabhadrappa
1782172c432STomasz Zawadzki SPDK_DEBUGLOG(nvmf_fc_ls,
179561a9f26SNaresh Gottumukkala "New connection assigned to HWQP%d, conn_id 0x%lx\n",
180561a9f26SNaresh Gottumukkala hwqp->hwqp_id, *conn_id);
181ed56a3d4SAnil Veerabhadrappa return true;
182ed56a3d4SAnil Veerabhadrappa }
183ed56a3d4SAnil Veerabhadrappa
184ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hwqp *
nvmf_fc_get_hwqp_from_conn_id(struct spdk_nvmf_fc_hwqp * queues,uint32_t num_queues,uint64_t conn_id)185ed56a3d4SAnil Veerabhadrappa nvmf_fc_get_hwqp_from_conn_id(struct spdk_nvmf_fc_hwqp *queues,
186ed56a3d4SAnil Veerabhadrappa uint32_t num_queues, uint64_t conn_id)
187ed56a3d4SAnil Veerabhadrappa {
188ed56a3d4SAnil Veerabhadrappa return &queues[(conn_id & 0xff) % num_queues];
189ed56a3d4SAnil Veerabhadrappa }
190ed56a3d4SAnil Veerabhadrappa
191ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_srsr_bufs *
nvmf_fc_alloc_srsr_bufs(size_t rqst_len,size_t rsp_len)192ed56a3d4SAnil Veerabhadrappa nvmf_fc_alloc_srsr_bufs(size_t rqst_len, size_t rsp_len)
193ed56a3d4SAnil Veerabhadrappa {
194ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_srsr_bufs *srsr_bufs;
195ed56a3d4SAnil Veerabhadrappa
196ed56a3d4SAnil Veerabhadrappa srsr_bufs = calloc(1, sizeof(struct spdk_nvmf_fc_srsr_bufs));
197ed56a3d4SAnil Veerabhadrappa if (!srsr_bufs) {
198ed56a3d4SAnil Veerabhadrappa return NULL;
199ed56a3d4SAnil Veerabhadrappa }
200ed56a3d4SAnil Veerabhadrappa
201ed56a3d4SAnil Veerabhadrappa srsr_bufs->rqst = calloc(1, rqst_len + rsp_len);
202ed56a3d4SAnil Veerabhadrappa if (srsr_bufs->rqst) {
203ed56a3d4SAnil Veerabhadrappa srsr_bufs->rqst_len = rqst_len;
204ed56a3d4SAnil Veerabhadrappa srsr_bufs->rsp = srsr_bufs->rqst + rqst_len;
205ed56a3d4SAnil Veerabhadrappa srsr_bufs->rsp_len = rsp_len;
206ed56a3d4SAnil Veerabhadrappa } else {
207ed56a3d4SAnil Veerabhadrappa free(srsr_bufs);
208ed56a3d4SAnil Veerabhadrappa srsr_bufs = NULL;
209ed56a3d4SAnil Veerabhadrappa }
210ed56a3d4SAnil Veerabhadrappa
211ed56a3d4SAnil Veerabhadrappa return srsr_bufs;
212ed56a3d4SAnil Veerabhadrappa }
213ed56a3d4SAnil Veerabhadrappa
214ed56a3d4SAnil Veerabhadrappa void
nvmf_fc_free_srsr_bufs(struct spdk_nvmf_fc_srsr_bufs * srsr_bufs)215ed56a3d4SAnil Veerabhadrappa nvmf_fc_free_srsr_bufs(struct spdk_nvmf_fc_srsr_bufs *srsr_bufs)
216ed56a3d4SAnil Veerabhadrappa {
217ed56a3d4SAnil Veerabhadrappa if (srsr_bufs) {
218ed56a3d4SAnil Veerabhadrappa free(srsr_bufs->rqst);
219ed56a3d4SAnil Veerabhadrappa free(srsr_bufs);
220ed56a3d4SAnil Veerabhadrappa }
221ed56a3d4SAnil Veerabhadrappa }
222ed56a3d4SAnil Veerabhadrappa
223ed56a3d4SAnil Veerabhadrappa /*
224ed56a3d4SAnil Veerabhadrappa * The Tests
225ed56a3d4SAnil Veerabhadrappa */
226ed56a3d4SAnil Veerabhadrappa
227ed56a3d4SAnil Veerabhadrappa enum _test_run_type {
228ed56a3d4SAnil Veerabhadrappa TEST_RUN_TYPE_CREATE_ASSOC = 1,
229ed56a3d4SAnil Veerabhadrappa TEST_RUN_TYPE_CREATE_CONN,
230ed56a3d4SAnil Veerabhadrappa TEST_RUN_TYPE_DISCONNECT,
231ed56a3d4SAnil Veerabhadrappa TEST_RUN_TYPE_CONN_BAD_ASSOC,
232ed56a3d4SAnil Veerabhadrappa TEST_RUN_TYPE_FAIL_LS_RSP,
233ed56a3d4SAnil Veerabhadrappa TEST_RUN_TYPE_DISCONNECT_BAD_ASSOC,
234ed56a3d4SAnil Veerabhadrappa TEST_RUN_TYPE_CREATE_MAX_ASSOC,
235ed56a3d4SAnil Veerabhadrappa };
236ed56a3d4SAnil Veerabhadrappa
237ed56a3d4SAnil Veerabhadrappa static uint32_t g_test_run_type = 0;
238ed56a3d4SAnil Veerabhadrappa static uint64_t g_curr_assoc_id = 0;
239ed56a3d4SAnil Veerabhadrappa static uint16_t g_create_conn_test_cnt = 0;
240ed56a3d4SAnil Veerabhadrappa static int g_last_rslt = 0;
241ed56a3d4SAnil Veerabhadrappa static bool g_spdk_nvmf_fc_xmt_srsr_req = false;
242ed56a3d4SAnil Veerabhadrappa static struct spdk_nvmf_fc_remote_port_info g_rem_port;
243ed56a3d4SAnil Veerabhadrappa
244ed56a3d4SAnil Veerabhadrappa static void
run_create_assoc_test(const char * subnqn,struct spdk_nvmf_host * host,struct spdk_nvmf_fc_nport * tgt_port)245ed56a3d4SAnil Veerabhadrappa run_create_assoc_test(const char *subnqn,
246ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_host *host,
247ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_nport *tgt_port)
248ed56a3d4SAnil Veerabhadrappa {
249ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_rqst ls_rqst;
250ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_cr_assoc_rqst ca_rqst;
251ed56a3d4SAnil Veerabhadrappa uint8_t respbuf[128];
252ed56a3d4SAnil Veerabhadrappa
253ed56a3d4SAnil Veerabhadrappa memset(&ca_rqst, 0, sizeof(struct spdk_nvmf_fc_ls_cr_assoc_rqst));
254ed56a3d4SAnil Veerabhadrappa
255ed56a3d4SAnil Veerabhadrappa ca_rqst.w0.ls_cmd = FCNVME_LS_CREATE_ASSOCIATION;
256ed56a3d4SAnil Veerabhadrappa to_be32(&ca_rqst.desc_list_len,
257ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_cr_assoc_rqst) -
258ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
259ed56a3d4SAnil Veerabhadrappa to_be32(&ca_rqst.assoc_cmd.desc_tag, FCNVME_LSDESC_CREATE_ASSOC_CMD);
260ed56a3d4SAnil Veerabhadrappa to_be32(&ca_rqst.assoc_cmd.desc_len,
261ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_cr_assoc_cmd) -
262ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
263ed56a3d4SAnil Veerabhadrappa to_be16(&ca_rqst.assoc_cmd.ersp_ratio, (g_nvmf_transport.opts.max_aq_depth / 2));
264ed56a3d4SAnil Veerabhadrappa to_be16(&ca_rqst.assoc_cmd.sqsize, g_nvmf_transport.opts.max_aq_depth - 1);
265ed56a3d4SAnil Veerabhadrappa snprintf(&ca_rqst.assoc_cmd.subnqn[0], strlen(subnqn) + 1, "%s", subnqn);
266ed56a3d4SAnil Veerabhadrappa snprintf(&ca_rqst.assoc_cmd.hostnqn[0], strlen(host->nqn) + 1, "%s", host->nqn);
267ed56a3d4SAnil Veerabhadrappa ls_rqst.rqstbuf.virt = &ca_rqst;
268ed56a3d4SAnil Veerabhadrappa ls_rqst.rspbuf.virt = respbuf;
269ed56a3d4SAnil Veerabhadrappa ls_rqst.rqst_len = sizeof(struct spdk_nvmf_fc_ls_cr_assoc_rqst);
270ed56a3d4SAnil Veerabhadrappa ls_rqst.rsp_len = 0;
271ed56a3d4SAnil Veerabhadrappa ls_rqst.rpi = 5000;
272ed56a3d4SAnil Veerabhadrappa ls_rqst.private_data = NULL;
273ed56a3d4SAnil Veerabhadrappa ls_rqst.s_id = 0;
274ed56a3d4SAnil Veerabhadrappa ls_rqst.nport = tgt_port;
275ed56a3d4SAnil Veerabhadrappa ls_rqst.rport = &g_rem_port;
276ed56a3d4SAnil Veerabhadrappa ls_rqst.nvmf_tgt = &g_nvmf_tgt;
277ed56a3d4SAnil Veerabhadrappa
27861d85773SSeth Howell nvmf_fc_handle_ls_rqst(&ls_rqst);
279ed56a3d4SAnil Veerabhadrappa poll_thread(0);
280ed56a3d4SAnil Veerabhadrappa }
281ed56a3d4SAnil Veerabhadrappa
282ed56a3d4SAnil Veerabhadrappa static void
run_create_conn_test(struct spdk_nvmf_host * host,struct spdk_nvmf_fc_nport * tgt_port,uint64_t assoc_id,uint16_t qid)283ed56a3d4SAnil Veerabhadrappa run_create_conn_test(struct spdk_nvmf_host *host,
284ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_nport *tgt_port,
285ed56a3d4SAnil Veerabhadrappa uint64_t assoc_id,
286ed56a3d4SAnil Veerabhadrappa uint16_t qid)
287ed56a3d4SAnil Veerabhadrappa {
288ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_rqst ls_rqst;
289ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_cr_conn_rqst cc_rqst;
290ed56a3d4SAnil Veerabhadrappa uint8_t respbuf[128];
291ed56a3d4SAnil Veerabhadrappa
292ed56a3d4SAnil Veerabhadrappa memset(&cc_rqst, 0, sizeof(struct spdk_nvmf_fc_ls_cr_conn_rqst));
293ed56a3d4SAnil Veerabhadrappa
294ed56a3d4SAnil Veerabhadrappa /* fill in request descriptor */
295ed56a3d4SAnil Veerabhadrappa cc_rqst.w0.ls_cmd = FCNVME_LS_CREATE_CONNECTION;
296ed56a3d4SAnil Veerabhadrappa to_be32(&cc_rqst.desc_list_len,
297ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_cr_conn_rqst) -
298ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
299ed56a3d4SAnil Veerabhadrappa
300ed56a3d4SAnil Veerabhadrappa /* fill in connect command descriptor */
301ed56a3d4SAnil Veerabhadrappa to_be32(&cc_rqst.connect_cmd.desc_tag, FCNVME_LSDESC_CREATE_CONN_CMD);
302ed56a3d4SAnil Veerabhadrappa to_be32(&cc_rqst.connect_cmd.desc_len,
303ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_cr_conn_cmd) -
304ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
305ed56a3d4SAnil Veerabhadrappa
306ed56a3d4SAnil Veerabhadrappa to_be16(&cc_rqst.connect_cmd.ersp_ratio, (g_nvmf_transport.opts.max_queue_depth / 2));
307ed56a3d4SAnil Veerabhadrappa to_be16(&cc_rqst.connect_cmd.sqsize, g_nvmf_transport.opts.max_queue_depth - 1);
308ed56a3d4SAnil Veerabhadrappa to_be16(&cc_rqst.connect_cmd.qid, qid);
309ed56a3d4SAnil Veerabhadrappa
310ed56a3d4SAnil Veerabhadrappa /* fill in association id descriptor */
311ed56a3d4SAnil Veerabhadrappa to_be32(&cc_rqst.assoc_id.desc_tag, FCNVME_LSDESC_ASSOC_ID),
312ed56a3d4SAnil Veerabhadrappa to_be32(&cc_rqst.assoc_id.desc_len,
313ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_assoc_id) -
314ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
315c9c7c281SJosh Soref cc_rqst.assoc_id.association_id = assoc_id; /* already be64 */
316ed56a3d4SAnil Veerabhadrappa
317ed56a3d4SAnil Veerabhadrappa ls_rqst.rqstbuf.virt = &cc_rqst;
318ed56a3d4SAnil Veerabhadrappa ls_rqst.rspbuf.virt = respbuf;
319ed56a3d4SAnil Veerabhadrappa ls_rqst.rqst_len = sizeof(struct spdk_nvmf_fc_ls_cr_conn_rqst);
320ed56a3d4SAnil Veerabhadrappa ls_rqst.rsp_len = 0;
321ed56a3d4SAnil Veerabhadrappa ls_rqst.rpi = 5000;
322ed56a3d4SAnil Veerabhadrappa ls_rqst.private_data = NULL;
323ed56a3d4SAnil Veerabhadrappa ls_rqst.s_id = 0;
324ed56a3d4SAnil Veerabhadrappa ls_rqst.nport = tgt_port;
325ed56a3d4SAnil Veerabhadrappa ls_rqst.rport = &g_rem_port;
326ed56a3d4SAnil Veerabhadrappa ls_rqst.nvmf_tgt = &g_nvmf_tgt;
327ed56a3d4SAnil Veerabhadrappa
32861d85773SSeth Howell nvmf_fc_handle_ls_rqst(&ls_rqst);
329ed56a3d4SAnil Veerabhadrappa poll_thread(0);
330ed56a3d4SAnil Veerabhadrappa }
331ed56a3d4SAnil Veerabhadrappa
332ed56a3d4SAnil Veerabhadrappa static void
run_disconn_test(struct spdk_nvmf_fc_nport * tgt_port,uint64_t assoc_id)333ed56a3d4SAnil Veerabhadrappa run_disconn_test(struct spdk_nvmf_fc_nport *tgt_port,
334ed56a3d4SAnil Veerabhadrappa uint64_t assoc_id)
335ed56a3d4SAnil Veerabhadrappa {
336ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_rqst ls_rqst;
337ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_disconnect_rqst dc_rqst;
338ed56a3d4SAnil Veerabhadrappa uint8_t respbuf[128];
339ed56a3d4SAnil Veerabhadrappa
340ed56a3d4SAnil Veerabhadrappa memset(&dc_rqst, 0, sizeof(struct spdk_nvmf_fc_ls_disconnect_rqst));
341ed56a3d4SAnil Veerabhadrappa
342ed56a3d4SAnil Veerabhadrappa /* fill in request descriptor */
343ed56a3d4SAnil Veerabhadrappa dc_rqst.w0.ls_cmd = FCNVME_LS_DISCONNECT;
344ed56a3d4SAnil Veerabhadrappa to_be32(&dc_rqst.desc_list_len,
345ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_disconnect_rqst) -
346ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
347ed56a3d4SAnil Veerabhadrappa
348ed56a3d4SAnil Veerabhadrappa /* fill in disconnect command descriptor */
349ed56a3d4SAnil Veerabhadrappa to_be32(&dc_rqst.disconn_cmd.desc_tag, FCNVME_LSDESC_DISCONN_CMD);
350ed56a3d4SAnil Veerabhadrappa to_be32(&dc_rqst.disconn_cmd.desc_len,
351ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_disconn_cmd) -
352ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
353ed56a3d4SAnil Veerabhadrappa
354ed56a3d4SAnil Veerabhadrappa /* fill in association id descriptor */
355ed56a3d4SAnil Veerabhadrappa to_be32(&dc_rqst.assoc_id.desc_tag, FCNVME_LSDESC_ASSOC_ID),
356ed56a3d4SAnil Veerabhadrappa to_be32(&dc_rqst.assoc_id.desc_len,
357ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_assoc_id) -
358ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
359c9c7c281SJosh Soref dc_rqst.assoc_id.association_id = assoc_id; /* already be64 */
360ed56a3d4SAnil Veerabhadrappa
361ed56a3d4SAnil Veerabhadrappa ls_rqst.rqstbuf.virt = &dc_rqst;
362ed56a3d4SAnil Veerabhadrappa ls_rqst.rspbuf.virt = respbuf;
363ed56a3d4SAnil Veerabhadrappa ls_rqst.rqst_len = sizeof(struct spdk_nvmf_fc_ls_disconnect_rqst);
364ed56a3d4SAnil Veerabhadrappa ls_rqst.rsp_len = 0;
365ed56a3d4SAnil Veerabhadrappa ls_rqst.rpi = 5000;
366ed56a3d4SAnil Veerabhadrappa ls_rqst.private_data = NULL;
367ed56a3d4SAnil Veerabhadrappa ls_rqst.s_id = 0;
368ed56a3d4SAnil Veerabhadrappa ls_rqst.nport = tgt_port;
369ed56a3d4SAnil Veerabhadrappa ls_rqst.rport = &g_rem_port;
370ed56a3d4SAnil Veerabhadrappa ls_rqst.nvmf_tgt = &g_nvmf_tgt;
371ed56a3d4SAnil Veerabhadrappa
37261d85773SSeth Howell nvmf_fc_handle_ls_rqst(&ls_rqst);
373ed56a3d4SAnil Veerabhadrappa poll_thread(0);
374ed56a3d4SAnil Veerabhadrappa }
375ed56a3d4SAnil Veerabhadrappa
376ed56a3d4SAnil Veerabhadrappa static int
handle_ca_rsp(struct spdk_nvmf_fc_ls_rqst * ls_rqst,bool max_assoc_test)377ed56a3d4SAnil Veerabhadrappa handle_ca_rsp(struct spdk_nvmf_fc_ls_rqst *ls_rqst, bool max_assoc_test)
378ed56a3d4SAnil Veerabhadrappa {
379ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_acc_hdr *acc_hdr =
380ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_acc_hdr *) ls_rqst->rspbuf.virt;
381ed56a3d4SAnil Veerabhadrappa
382ed56a3d4SAnil Veerabhadrappa
383ed56a3d4SAnil Veerabhadrappa if (acc_hdr->rqst.w0.ls_cmd == FCNVME_LS_CREATE_ASSOCIATION) {
384ed56a3d4SAnil Veerabhadrappa if (acc_hdr->w0.ls_cmd == FCNVME_LS_ACC) {
385ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_cr_assoc_acc *acc =
386ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_cr_assoc_acc *)ls_rqst->rspbuf.virt;
387ed56a3d4SAnil Veerabhadrappa
388ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->desc_list_len) ==
389ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_cr_assoc_acc) - 8);
390ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->rqst.desc_len) ==
391ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_rqst) - 8);
392ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->rqst.desc_tag) ==
393ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_RQST);
394ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc->assoc_id.desc_tag) ==
395ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_ASSOC_ID);
396ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc->assoc_id.desc_len) ==
397ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_assoc_id) - 8);
398ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc->conn_id.desc_tag) ==
399ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_CONN_ID);
400ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc->conn_id.desc_len) ==
401ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_conn_id) - 8);
402ed56a3d4SAnil Veerabhadrappa
403ed56a3d4SAnil Veerabhadrappa g_curr_assoc_id = acc->assoc_id.association_id;
404ed56a3d4SAnil Veerabhadrappa g_create_conn_test_cnt++;
405ed56a3d4SAnil Veerabhadrappa return 0;
406ed56a3d4SAnil Veerabhadrappa } else if (max_assoc_test) {
407ed56a3d4SAnil Veerabhadrappa /* reject reason code should be insufficient resources */
408ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_rjt *rjt =
409ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_rjt *)ls_rqst->rspbuf.virt;
410ed56a3d4SAnil Veerabhadrappa if (rjt->rjt.reason_code == FCNVME_RJT_RC_INSUFF_RES) {
411ed56a3d4SAnil Veerabhadrappa return LAST_RSLT_STOP_TEST;
412ed56a3d4SAnil Veerabhadrappa }
413ed56a3d4SAnil Veerabhadrappa }
414ed56a3d4SAnil Veerabhadrappa CU_FAIL("Unexpected reject response for create association");
415ed56a3d4SAnil Veerabhadrappa } else {
416ed56a3d4SAnil Veerabhadrappa CU_FAIL("Response not for create association");
417ed56a3d4SAnil Veerabhadrappa }
418ed56a3d4SAnil Veerabhadrappa
419ed56a3d4SAnil Veerabhadrappa return -EINVAL;
420ed56a3d4SAnil Veerabhadrappa }
421ed56a3d4SAnil Veerabhadrappa
422ed56a3d4SAnil Veerabhadrappa static int
handle_cc_rsp(struct spdk_nvmf_fc_ls_rqst * ls_rqst)423ed56a3d4SAnil Veerabhadrappa handle_cc_rsp(struct spdk_nvmf_fc_ls_rqst *ls_rqst)
424ed56a3d4SAnil Veerabhadrappa {
425ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_acc_hdr *acc_hdr =
426ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_acc_hdr *) ls_rqst->rspbuf.virt;
427ed56a3d4SAnil Veerabhadrappa
428ed56a3d4SAnil Veerabhadrappa if (acc_hdr->rqst.w0.ls_cmd == FCNVME_LS_CREATE_CONNECTION) {
429ed56a3d4SAnil Veerabhadrappa if (acc_hdr->w0.ls_cmd == FCNVME_LS_ACC) {
430ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_cr_conn_acc *acc =
431ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_cr_conn_acc *)ls_rqst->rspbuf.virt;
432ed56a3d4SAnil Veerabhadrappa
433ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->desc_list_len) ==
434ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_cr_conn_acc) - 8);
435ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->rqst.desc_len) ==
436ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_rqst) - 8);
437ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->rqst.desc_tag) ==
438ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_RQST);
439ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc->conn_id.desc_tag) ==
440ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_CONN_ID);
441ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc->conn_id.desc_len) ==
442ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_conn_id) - 8);
443ed56a3d4SAnil Veerabhadrappa g_create_conn_test_cnt++;
444ed56a3d4SAnil Veerabhadrappa return 0;
445ed56a3d4SAnil Veerabhadrappa }
446ed56a3d4SAnil Veerabhadrappa
447ed56a3d4SAnil Veerabhadrappa if (acc_hdr->w0.ls_cmd == FCNVME_LS_RJT) {
448ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_rjt *rjt =
449ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_rjt *)ls_rqst->rspbuf.virt;
450ed56a3d4SAnil Veerabhadrappa if (g_create_conn_test_cnt == g_nvmf_transport.opts.max_qpairs_per_ctrlr) {
451ed56a3d4SAnil Veerabhadrappa /* expected to get reject for too many connections */
452ed56a3d4SAnil Veerabhadrappa CU_ASSERT(rjt->rjt.reason_code ==
453ed56a3d4SAnil Veerabhadrappa FCNVME_RJT_RC_INV_PARAM);
454ed56a3d4SAnil Veerabhadrappa CU_ASSERT(rjt->rjt.reason_explanation ==
455ed56a3d4SAnil Veerabhadrappa FCNVME_RJT_EXP_INV_Q_ID);
456ed56a3d4SAnil Veerabhadrappa }
457ed56a3d4SAnil Veerabhadrappa } else {
458ed56a3d4SAnil Veerabhadrappa CU_FAIL("Unexpected response code for create connection");
459ed56a3d4SAnil Veerabhadrappa }
460ed56a3d4SAnil Veerabhadrappa } else {
461ed56a3d4SAnil Veerabhadrappa CU_FAIL("Response not for create connection");
462ed56a3d4SAnil Veerabhadrappa }
463ed56a3d4SAnil Veerabhadrappa
464ed56a3d4SAnil Veerabhadrappa return -EINVAL;
465ed56a3d4SAnil Veerabhadrappa }
466ed56a3d4SAnil Veerabhadrappa
467ed56a3d4SAnil Veerabhadrappa static int
handle_disconn_rsp(struct spdk_nvmf_fc_ls_rqst * ls_rqst)468ed56a3d4SAnil Veerabhadrappa handle_disconn_rsp(struct spdk_nvmf_fc_ls_rqst *ls_rqst)
469ed56a3d4SAnil Veerabhadrappa {
470ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_acc_hdr *acc_hdr =
471ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_acc_hdr *) ls_rqst->rspbuf.virt;
472ed56a3d4SAnil Veerabhadrappa
473ed56a3d4SAnil Veerabhadrappa if (acc_hdr->rqst.w0.ls_cmd == FCNVME_LS_DISCONNECT) {
474ed56a3d4SAnil Veerabhadrappa if (acc_hdr->w0.ls_cmd == FCNVME_LS_ACC) {
475ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->desc_list_len) ==
476ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_disconnect_acc) - 8);
477ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->rqst.desc_len) ==
478ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_rqst) - 8);
479ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&acc_hdr->rqst.desc_tag) ==
480ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_RQST);
481ed56a3d4SAnil Veerabhadrappa return 0;
482ed56a3d4SAnil Veerabhadrappa } else {
483ed56a3d4SAnil Veerabhadrappa CU_FAIL("Unexpected reject response for disconnect");
484ed56a3d4SAnil Veerabhadrappa }
485ed56a3d4SAnil Veerabhadrappa } else {
486ed56a3d4SAnil Veerabhadrappa CU_FAIL("Response not for create connection");
487ed56a3d4SAnil Veerabhadrappa }
488ed56a3d4SAnil Veerabhadrappa
489ed56a3d4SAnil Veerabhadrappa return -EINVAL;
490ed56a3d4SAnil Veerabhadrappa }
491ed56a3d4SAnil Veerabhadrappa
492ed56a3d4SAnil Veerabhadrappa static int
handle_conn_bad_assoc_rsp(struct spdk_nvmf_fc_ls_rqst * ls_rqst)493ed56a3d4SAnil Veerabhadrappa handle_conn_bad_assoc_rsp(struct spdk_nvmf_fc_ls_rqst *ls_rqst)
494ed56a3d4SAnil Veerabhadrappa {
495ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_acc_hdr *acc_hdr =
496ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_acc_hdr *) ls_rqst->rspbuf.virt;
497ed56a3d4SAnil Veerabhadrappa
498ed56a3d4SAnil Veerabhadrappa if (acc_hdr->rqst.w0.ls_cmd == FCNVME_LS_CREATE_CONNECTION) {
499ed56a3d4SAnil Veerabhadrappa if (acc_hdr->w0.ls_cmd == FCNVME_LS_RJT) {
500ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_rjt *rjt =
501ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_rjt *)ls_rqst->rspbuf.virt;
502ed56a3d4SAnil Veerabhadrappa
503ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&rjt->desc_list_len) ==
504ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_rjt) - 8);
505ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&rjt->rqst.desc_tag) ==
506ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_RQST);
507ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&rjt->rjt.desc_len) ==
508ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_rjt) - 8);
509ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&rjt->rjt.desc_tag) ==
510ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_RJT);
511ed56a3d4SAnil Veerabhadrappa CU_ASSERT(rjt->rjt.reason_code ==
512ed56a3d4SAnil Veerabhadrappa FCNVME_RJT_RC_INV_ASSOC);
513ed56a3d4SAnil Veerabhadrappa CU_ASSERT(rjt->rjt.reason_explanation ==
514ed56a3d4SAnil Veerabhadrappa FCNVME_RJT_EXP_NONE);
515ed56a3d4SAnil Veerabhadrappa /* make sure reserved fields are 0 */
516ed56a3d4SAnil Veerabhadrappa CU_ASSERT(rjt->rjt.rsvd8 == 0);
517ed56a3d4SAnil Veerabhadrappa CU_ASSERT(rjt->rjt.rsvd12 == 0);
518ed56a3d4SAnil Veerabhadrappa return 0;
519ed56a3d4SAnil Veerabhadrappa } else {
520ed56a3d4SAnil Veerabhadrappa CU_FAIL("Unexpected accept response for create conn. on bad assoc_id");
521ed56a3d4SAnil Veerabhadrappa }
522ed56a3d4SAnil Veerabhadrappa } else {
523ed56a3d4SAnil Veerabhadrappa CU_FAIL("Response not for create connection on bad assoc_id");
524ed56a3d4SAnil Veerabhadrappa }
525ed56a3d4SAnil Veerabhadrappa
526ed56a3d4SAnil Veerabhadrappa return -EINVAL;
527ed56a3d4SAnil Veerabhadrappa }
528ed56a3d4SAnil Veerabhadrappa
529ed56a3d4SAnil Veerabhadrappa static int
handle_disconn_bad_assoc_rsp(struct spdk_nvmf_fc_ls_rqst * ls_rqst)530ed56a3d4SAnil Veerabhadrappa handle_disconn_bad_assoc_rsp(struct spdk_nvmf_fc_ls_rqst *ls_rqst)
531ed56a3d4SAnil Veerabhadrappa {
532ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_acc_hdr *acc_hdr =
533ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_acc_hdr *) ls_rqst->rspbuf.virt;
534ed56a3d4SAnil Veerabhadrappa
535ed56a3d4SAnil Veerabhadrappa if (acc_hdr->rqst.w0.ls_cmd == FCNVME_LS_DISCONNECT) {
536ed56a3d4SAnil Veerabhadrappa if (acc_hdr->w0.ls_cmd == FCNVME_LS_RJT) {
537ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_rjt *rjt =
538ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_rjt *)ls_rqst->rspbuf.virt;
539ed56a3d4SAnil Veerabhadrappa
540ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&rjt->desc_list_len) ==
541ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_rjt) - 8);
542ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&rjt->rqst.desc_tag) ==
543ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_RQST);
544ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&rjt->rjt.desc_len) ==
545ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_rjt) - 8);
546ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&rjt->rjt.desc_tag) ==
547ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_RJT);
548ed56a3d4SAnil Veerabhadrappa CU_ASSERT(rjt->rjt.reason_code ==
549ed56a3d4SAnil Veerabhadrappa FCNVME_RJT_RC_INV_ASSOC);
550ed56a3d4SAnil Veerabhadrappa CU_ASSERT(rjt->rjt.reason_explanation ==
551ed56a3d4SAnil Veerabhadrappa FCNVME_RJT_EXP_NONE);
552ed56a3d4SAnil Veerabhadrappa return 0;
553ed56a3d4SAnil Veerabhadrappa } else {
554ed56a3d4SAnil Veerabhadrappa CU_FAIL("Unexpected accept response for disconnect on bad assoc_id");
555ed56a3d4SAnil Veerabhadrappa }
556ed56a3d4SAnil Veerabhadrappa } else {
557ed56a3d4SAnil Veerabhadrappa CU_FAIL("Response not for dsconnect on bad assoc_id");
558ed56a3d4SAnil Veerabhadrappa }
559ed56a3d4SAnil Veerabhadrappa
560ed56a3d4SAnil Veerabhadrappa return -EINVAL;
561ed56a3d4SAnil Veerabhadrappa }
562ed56a3d4SAnil Veerabhadrappa
563ed56a3d4SAnil Veerabhadrappa
564ed56a3d4SAnil Veerabhadrappa static struct spdk_nvmf_fc_port g_fc_port = {
565ed56a3d4SAnil Veerabhadrappa .num_io_queues = 16,
566ed56a3d4SAnil Veerabhadrappa };
567ed56a3d4SAnil Veerabhadrappa
568ed56a3d4SAnil Veerabhadrappa static struct spdk_nvmf_fc_nport g_tgt_port;
569ed56a3d4SAnil Veerabhadrappa
570ed56a3d4SAnil Veerabhadrappa #define FC_LS_UT_MAX_IO_QUEUES 16
571ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hwqp g_fc_hwqp[FC_LS_UT_MAX_IO_QUEUES];
57299ea1d36SShuhei Matsumoto struct spdk_nvmf_fc_poll_group g_fgroup[FC_LS_UT_MAX_IO_QUEUES];
573ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_poll_group g_poll_group[FC_LS_UT_MAX_IO_QUEUES];
574ed56a3d4SAnil Veerabhadrappa static bool threads_allocated = false;
575ed56a3d4SAnil Veerabhadrappa
576ed56a3d4SAnil Veerabhadrappa static void
ls_assign_hwqp_threads(void)577ed56a3d4SAnil Veerabhadrappa ls_assign_hwqp_threads(void)
578ed56a3d4SAnil Veerabhadrappa {
579ed56a3d4SAnil Veerabhadrappa uint32_t i;
580ed56a3d4SAnil Veerabhadrappa
581ed56a3d4SAnil Veerabhadrappa for (i = 0; i < g_fc_port.num_io_queues; i++) {
582ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hwqp *hwqp = &g_fc_port.io_queues[i];
583ed56a3d4SAnil Veerabhadrappa if (hwqp->thread == NULL) {
584ed56a3d4SAnil Veerabhadrappa hwqp->thread = spdk_get_thread();
585ed56a3d4SAnil Veerabhadrappa }
586ed56a3d4SAnil Veerabhadrappa }
587ed56a3d4SAnil Veerabhadrappa }
588ed56a3d4SAnil Veerabhadrappa
589ed56a3d4SAnil Veerabhadrappa static void
ls_prepare_threads(void)590ed56a3d4SAnil Veerabhadrappa ls_prepare_threads(void)
591ed56a3d4SAnil Veerabhadrappa {
592ed56a3d4SAnil Veerabhadrappa if (threads_allocated == false) {
593ed56a3d4SAnil Veerabhadrappa allocate_threads(8);
594ed56a3d4SAnil Veerabhadrappa set_thread(0);
595ed56a3d4SAnil Veerabhadrappa }
596ed56a3d4SAnil Veerabhadrappa threads_allocated = true;
597ed56a3d4SAnil Veerabhadrappa }
598ed56a3d4SAnil Veerabhadrappa
599ed56a3d4SAnil Veerabhadrappa static void
setup_polling_threads(void)600ed56a3d4SAnil Veerabhadrappa setup_polling_threads(void)
601ed56a3d4SAnil Veerabhadrappa {
602ed56a3d4SAnil Veerabhadrappa ls_prepare_threads();
603ed56a3d4SAnil Veerabhadrappa set_thread(0);
604ed56a3d4SAnil Veerabhadrappa ls_assign_hwqp_threads();
605ed56a3d4SAnil Veerabhadrappa }
606ed56a3d4SAnil Veerabhadrappa
607ed56a3d4SAnil Veerabhadrappa static int
ls_tests_init(void)608ed56a3d4SAnil Veerabhadrappa ls_tests_init(void)
609ed56a3d4SAnil Veerabhadrappa {
610ed56a3d4SAnil Veerabhadrappa uint16_t i;
611ed56a3d4SAnil Veerabhadrappa
612ed56a3d4SAnil Veerabhadrappa bzero(&g_nvmf_tgt, sizeof(g_nvmf_tgt));
613ed56a3d4SAnil Veerabhadrappa
614ed56a3d4SAnil Veerabhadrappa g_nvmf_transport.opts = g_nvmf_transport_opts;
615ed56a3d4SAnil Veerabhadrappa
616ed56a3d4SAnil Veerabhadrappa snprintf(g_nvmf_subsystem.subnqn, sizeof(g_nvmf_subsystem.subnqn), "%s", fc_ut_subsystem_nqn);
617ed56a3d4SAnil Veerabhadrappa g_fc_port.hw_port_status = SPDK_FC_PORT_ONLINE;
618ed56a3d4SAnil Veerabhadrappa g_fc_port.io_queues = g_fc_hwqp;
619ed56a3d4SAnil Veerabhadrappa for (i = 0; i < g_fc_port.num_io_queues; i++) {
620ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hwqp *hwqp = &g_fc_port.io_queues[i];
621ed56a3d4SAnil Veerabhadrappa hwqp->lcore_id = i;
622ed56a3d4SAnil Veerabhadrappa hwqp->hwqp_id = i;
623ed56a3d4SAnil Veerabhadrappa hwqp->thread = NULL;
624ed56a3d4SAnil Veerabhadrappa hwqp->fc_port = &g_fc_port;
625ed56a3d4SAnil Veerabhadrappa hwqp->num_conns = 0;
626ed56a3d4SAnil Veerabhadrappa TAILQ_INIT(&hwqp->in_use_reqs);
627ed56a3d4SAnil Veerabhadrappa
628ed56a3d4SAnil Veerabhadrappa bzero(&g_poll_group[i], sizeof(struct spdk_nvmf_poll_group));
62999ea1d36SShuhei Matsumoto bzero(&g_fgroup[i], sizeof(struct spdk_nvmf_fc_poll_group));
630ed56a3d4SAnil Veerabhadrappa TAILQ_INIT(&g_poll_group[i].tgroups);
631ed56a3d4SAnil Veerabhadrappa TAILQ_INIT(&g_poll_group[i].qpairs);
632b9dc11f9SShuhei Matsumoto g_fgroup[i].group.transport = &g_nvmf_transport;
633b9dc11f9SShuhei Matsumoto g_fgroup[i].group.group = &g_poll_group[i];
63499ea1d36SShuhei Matsumoto hwqp->fgroup = &g_fgroup[i];
635ed56a3d4SAnil Veerabhadrappa }
636ed56a3d4SAnil Veerabhadrappa
63761d85773SSeth Howell nvmf_fc_ls_init(&g_fc_port);
638ed56a3d4SAnil Veerabhadrappa bzero(&g_tgt_port, sizeof(struct spdk_nvmf_fc_nport));
639ed56a3d4SAnil Veerabhadrappa g_tgt_port.fc_port = &g_fc_port;
640ed56a3d4SAnil Veerabhadrappa TAILQ_INIT(&g_tgt_port.rem_port_list);
641ed56a3d4SAnil Veerabhadrappa TAILQ_INIT(&g_tgt_port.fc_associations);
642ed56a3d4SAnil Veerabhadrappa
643ed56a3d4SAnil Veerabhadrappa bzero(&g_rem_port, sizeof(struct spdk_nvmf_fc_remote_port_info));
644ed56a3d4SAnil Veerabhadrappa TAILQ_INSERT_TAIL(&g_tgt_port.rem_port_list, &g_rem_port, link);
645ed56a3d4SAnil Veerabhadrappa
646ed56a3d4SAnil Veerabhadrappa return 0;
647ed56a3d4SAnil Veerabhadrappa }
648ed56a3d4SAnil Veerabhadrappa
649ed56a3d4SAnil Veerabhadrappa static int
ls_tests_fini(void)650ed56a3d4SAnil Veerabhadrappa ls_tests_fini(void)
651ed56a3d4SAnil Veerabhadrappa {
65261d85773SSeth Howell nvmf_fc_ls_fini(&g_fc_port);
653ed56a3d4SAnil Veerabhadrappa free_threads();
654ed56a3d4SAnil Veerabhadrappa return 0;
655ed56a3d4SAnil Veerabhadrappa }
656ed56a3d4SAnil Veerabhadrappa
657ed56a3d4SAnil Veerabhadrappa static void
create_single_assoc_test(void)658ed56a3d4SAnil Veerabhadrappa create_single_assoc_test(void)
659ed56a3d4SAnil Veerabhadrappa {
660ed56a3d4SAnil Veerabhadrappa setup_polling_threads();
661ed56a3d4SAnil Veerabhadrappa /* main test driver */
662ed56a3d4SAnil Veerabhadrappa g_test_run_type = TEST_RUN_TYPE_CREATE_ASSOC;
663ed56a3d4SAnil Veerabhadrappa run_create_assoc_test(fc_ut_subsystem_nqn, fc_ut_host, &g_tgt_port);
664ed56a3d4SAnil Veerabhadrappa
665ed56a3d4SAnil Veerabhadrappa if (g_last_rslt == 0) {
666ed56a3d4SAnil Veerabhadrappa /* disconnect the association */
667ed56a3d4SAnil Veerabhadrappa g_test_run_type = TEST_RUN_TYPE_DISCONNECT;
668ed56a3d4SAnil Veerabhadrappa run_disconn_test(&g_tgt_port, g_curr_assoc_id);
669ed56a3d4SAnil Veerabhadrappa g_create_conn_test_cnt = 0;
670ed56a3d4SAnil Veerabhadrappa }
671ed56a3d4SAnil Veerabhadrappa }
672ed56a3d4SAnil Veerabhadrappa
673ed56a3d4SAnil Veerabhadrappa static void
create_max_conns_test(void)674ed56a3d4SAnil Veerabhadrappa create_max_conns_test(void)
675ed56a3d4SAnil Veerabhadrappa {
676ed56a3d4SAnil Veerabhadrappa uint16_t qid = 1;
677ed56a3d4SAnil Veerabhadrappa
678ed56a3d4SAnil Veerabhadrappa setup_polling_threads();
679ed56a3d4SAnil Veerabhadrappa /* main test driver */
680ed56a3d4SAnil Veerabhadrappa g_test_run_type = TEST_RUN_TYPE_CREATE_ASSOC;
681ed56a3d4SAnil Veerabhadrappa run_create_assoc_test(fc_ut_subsystem_nqn, fc_ut_host, &g_tgt_port);
682ed56a3d4SAnil Veerabhadrappa
683ed56a3d4SAnil Veerabhadrappa if (g_last_rslt == 0) {
684ed56a3d4SAnil Veerabhadrappa g_test_run_type = TEST_RUN_TYPE_CREATE_CONN;
685ed56a3d4SAnil Veerabhadrappa /* create connections until we get too many connections error */
686ed56a3d4SAnil Veerabhadrappa while (g_last_rslt == 0) {
687ed56a3d4SAnil Veerabhadrappa if (g_create_conn_test_cnt > g_nvmf_transport.opts.max_qpairs_per_ctrlr) {
688ed56a3d4SAnil Veerabhadrappa CU_FAIL("Did not get CIOC failure for too many connections");
689ed56a3d4SAnil Veerabhadrappa break;
690ed56a3d4SAnil Veerabhadrappa }
691ed56a3d4SAnil Veerabhadrappa run_create_conn_test(fc_ut_host, &g_tgt_port, g_curr_assoc_id, qid++);
692ed56a3d4SAnil Veerabhadrappa }
693ed56a3d4SAnil Veerabhadrappa
694ed56a3d4SAnil Veerabhadrappa /* disconnect the association */
695ed56a3d4SAnil Veerabhadrappa g_last_rslt = 0;
696ed56a3d4SAnil Veerabhadrappa g_test_run_type = TEST_RUN_TYPE_DISCONNECT;
697ed56a3d4SAnil Veerabhadrappa run_disconn_test(&g_tgt_port, g_curr_assoc_id);
698ed56a3d4SAnil Veerabhadrappa g_create_conn_test_cnt = 0;
699ed56a3d4SAnil Veerabhadrappa }
700ed56a3d4SAnil Veerabhadrappa }
701ed56a3d4SAnil Veerabhadrappa
702ed56a3d4SAnil Veerabhadrappa static void
invalid_connection_test(void)703ed56a3d4SAnil Veerabhadrappa invalid_connection_test(void)
704ed56a3d4SAnil Veerabhadrappa {
705ed56a3d4SAnil Veerabhadrappa setup_polling_threads();
706ed56a3d4SAnil Veerabhadrappa /* run test to create connection to invalid association */
707ed56a3d4SAnil Veerabhadrappa g_test_run_type = TEST_RUN_TYPE_CONN_BAD_ASSOC;
708ed56a3d4SAnil Veerabhadrappa run_create_conn_test(fc_ut_host, &g_tgt_port, g_curr_assoc_id, 1);
709ed56a3d4SAnil Veerabhadrappa }
710ed56a3d4SAnil Veerabhadrappa
711ed56a3d4SAnil Veerabhadrappa static void
xmt_ls_rsp_failure_test(void)712ed56a3d4SAnil Veerabhadrappa xmt_ls_rsp_failure_test(void)
713ed56a3d4SAnil Veerabhadrappa {
714ed56a3d4SAnil Veerabhadrappa setup_polling_threads();
715ed56a3d4SAnil Veerabhadrappa g_test_run_type = TEST_RUN_TYPE_FAIL_LS_RSP;
716ed56a3d4SAnil Veerabhadrappa run_create_assoc_test(fc_ut_subsystem_nqn, fc_ut_host, &g_tgt_port);
717ed56a3d4SAnil Veerabhadrappa if (g_last_rslt == 0) {
718ed56a3d4SAnil Veerabhadrappa /* check target port for associations */
719ed56a3d4SAnil Veerabhadrappa CU_ASSERT(g_tgt_port.assoc_count == 0);
720ed56a3d4SAnil Veerabhadrappa }
721ed56a3d4SAnil Veerabhadrappa }
722ed56a3d4SAnil Veerabhadrappa
723ed56a3d4SAnil Veerabhadrappa static void
disconnect_bad_assoc_test(void)724ed56a3d4SAnil Veerabhadrappa disconnect_bad_assoc_test(void)
725ed56a3d4SAnil Veerabhadrappa {
726ed56a3d4SAnil Veerabhadrappa setup_polling_threads();
727ed56a3d4SAnil Veerabhadrappa g_test_run_type = TEST_RUN_TYPE_DISCONNECT_BAD_ASSOC;
728ed56a3d4SAnil Veerabhadrappa run_disconn_test(&g_tgt_port, 0xffff);
729ed56a3d4SAnil Veerabhadrappa }
730ed56a3d4SAnil Veerabhadrappa
731ed56a3d4SAnil Veerabhadrappa /*
732ed56a3d4SAnil Veerabhadrappa * SPDK functions that are called by LS processing
733ed56a3d4SAnil Veerabhadrappa */
734ed56a3d4SAnil Veerabhadrappa
735ed56a3d4SAnil Veerabhadrappa int
nvmf_fc_xmt_ls_rsp(struct spdk_nvmf_fc_nport * g_tgt_port,struct spdk_nvmf_fc_ls_rqst * ls_rqst)73661d85773SSeth Howell nvmf_fc_xmt_ls_rsp(struct spdk_nvmf_fc_nport *g_tgt_port,
737ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_rqst *ls_rqst)
738ed56a3d4SAnil Veerabhadrappa {
739ed56a3d4SAnil Veerabhadrappa switch (g_test_run_type) {
740ed56a3d4SAnil Veerabhadrappa case TEST_RUN_TYPE_CREATE_ASSOC:
741ed56a3d4SAnil Veerabhadrappa g_last_rslt = handle_ca_rsp(ls_rqst, false);
742ed56a3d4SAnil Veerabhadrappa break;
743ed56a3d4SAnil Veerabhadrappa case TEST_RUN_TYPE_CREATE_CONN:
744ed56a3d4SAnil Veerabhadrappa g_last_rslt = handle_cc_rsp(ls_rqst);
745ed56a3d4SAnil Veerabhadrappa break;
746ed56a3d4SAnil Veerabhadrappa case TEST_RUN_TYPE_DISCONNECT:
747ed56a3d4SAnil Veerabhadrappa g_last_rslt = handle_disconn_rsp(ls_rqst);
748ed56a3d4SAnil Veerabhadrappa break;
749ed56a3d4SAnil Veerabhadrappa case TEST_RUN_TYPE_CONN_BAD_ASSOC:
750ed56a3d4SAnil Veerabhadrappa g_last_rslt = handle_conn_bad_assoc_rsp(ls_rqst);
751ed56a3d4SAnil Veerabhadrappa break;
752ed56a3d4SAnil Veerabhadrappa case TEST_RUN_TYPE_FAIL_LS_RSP:
753ed56a3d4SAnil Veerabhadrappa g_last_rslt = handle_ca_rsp(ls_rqst, false);
754ed56a3d4SAnil Veerabhadrappa return 1;
755ed56a3d4SAnil Veerabhadrappa case TEST_RUN_TYPE_DISCONNECT_BAD_ASSOC:
756ed56a3d4SAnil Veerabhadrappa g_last_rslt = handle_disconn_bad_assoc_rsp(ls_rqst);
757ed56a3d4SAnil Veerabhadrappa break;
758ed56a3d4SAnil Veerabhadrappa case TEST_RUN_TYPE_CREATE_MAX_ASSOC:
759ed56a3d4SAnil Veerabhadrappa g_last_rslt = handle_ca_rsp(ls_rqst, true);
760ed56a3d4SAnil Veerabhadrappa break;
761ed56a3d4SAnil Veerabhadrappa
762ed56a3d4SAnil Veerabhadrappa default:
763ed56a3d4SAnil Veerabhadrappa CU_FAIL("LS Response for Invalid Test Type");
764ed56a3d4SAnil Veerabhadrappa g_last_rslt = 1;
765ed56a3d4SAnil Veerabhadrappa }
766ed56a3d4SAnil Veerabhadrappa
767ed56a3d4SAnil Veerabhadrappa return 0;
768ed56a3d4SAnil Veerabhadrappa }
769ed56a3d4SAnil Veerabhadrappa
770ed56a3d4SAnil Veerabhadrappa int
nvmf_fc_xmt_srsr_req(struct spdk_nvmf_fc_hwqp * hwqp,struct spdk_nvmf_fc_srsr_bufs * srsr_bufs,spdk_nvmf_fc_caller_cb cb,void * cb_args)77161d85773SSeth Howell nvmf_fc_xmt_srsr_req(struct spdk_nvmf_fc_hwqp *hwqp,
772ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_srsr_bufs *srsr_bufs,
773ed56a3d4SAnil Veerabhadrappa spdk_nvmf_fc_caller_cb cb, void *cb_args)
774ed56a3d4SAnil Veerabhadrappa {
775ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_disconnect_rqst *dc_rqst =
776ed56a3d4SAnil Veerabhadrappa (struct spdk_nvmf_fc_ls_disconnect_rqst *)
777ed56a3d4SAnil Veerabhadrappa srsr_bufs->rqst;
778ed56a3d4SAnil Veerabhadrappa
779ed56a3d4SAnil Veerabhadrappa CU_ASSERT(dc_rqst->w0.ls_cmd == FCNVME_LS_DISCONNECT);
780ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&dc_rqst->desc_list_len) ==
781ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_ls_disconnect_rqst) -
782ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
783ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&dc_rqst->assoc_id.desc_tag) ==
784ed56a3d4SAnil Veerabhadrappa FCNVME_LSDESC_ASSOC_ID);
785ed56a3d4SAnil Veerabhadrappa CU_ASSERT(from_be32(&dc_rqst->assoc_id.desc_len) ==
786ed56a3d4SAnil Veerabhadrappa sizeof(struct spdk_nvmf_fc_lsdesc_assoc_id) -
787ed56a3d4SAnil Veerabhadrappa (2 * sizeof(uint32_t)));
788ed56a3d4SAnil Veerabhadrappa
789ed56a3d4SAnil Veerabhadrappa g_spdk_nvmf_fc_xmt_srsr_req = true;
790ed56a3d4SAnil Veerabhadrappa
791ed56a3d4SAnil Veerabhadrappa if (cb) {
792ed56a3d4SAnil Veerabhadrappa cb(hwqp, 0, cb_args);
793ed56a3d4SAnil Veerabhadrappa }
794ed56a3d4SAnil Veerabhadrappa
795ed56a3d4SAnil Veerabhadrappa return 0;
796ed56a3d4SAnil Veerabhadrappa }
797ed56a3d4SAnil Veerabhadrappa
79861d85773SSeth Howell DEFINE_STUB_V(nvmf_fc_request_abort, (struct spdk_nvmf_fc_request *fc_req,
799ed56a3d4SAnil Veerabhadrappa bool send_abts, spdk_nvmf_fc_caller_cb cb, void *cb_args));
800ed56a3d4SAnil Veerabhadrappa DEFINE_STUB_V(spdk_bdev_io_abort, (struct spdk_bdev_io *bdev_io, void *ctx));
80161d85773SSeth Howell DEFINE_STUB_V(nvmf_fc_request_abort_complete, (void *arg1));
802ed56a3d4SAnil Veerabhadrappa
803ed56a3d4SAnil Veerabhadrappa static void
usage(const char * program_name)804ed56a3d4SAnil Veerabhadrappa usage(const char *program_name)
805ed56a3d4SAnil Veerabhadrappa {
806ed56a3d4SAnil Veerabhadrappa printf("%s [options]\n", program_name);
807ed56a3d4SAnil Veerabhadrappa printf("options:\n");
808ed56a3d4SAnil Veerabhadrappa spdk_log_usage(stdout, "-t");
809ed56a3d4SAnil Veerabhadrappa printf(" -i value - Number of IO Queues (default: %u)\n",
810ed56a3d4SAnil Veerabhadrappa g_fc_port.num_io_queues);
811ed56a3d4SAnil Veerabhadrappa printf(" -q value - SQ size (default: %u)\n",
812ed56a3d4SAnil Veerabhadrappa g_nvmf_transport_opts.max_queue_depth);
813ed56a3d4SAnil Veerabhadrappa printf(" -c value - Connection count (default: %u)\n",
814ed56a3d4SAnil Veerabhadrappa g_nvmf_transport_opts.max_qpairs_per_ctrlr);
815ed56a3d4SAnil Veerabhadrappa printf(" -u test# - Unit test# to run\n");
816ed56a3d4SAnil Veerabhadrappa printf(" 0 : Run all tests (default)\n");
817ed56a3d4SAnil Veerabhadrappa printf(" 1 : CASS/DISC create single assoc test\n");
818ed56a3d4SAnil Veerabhadrappa printf(" 2 : Max. conns. test\n");
819ed56a3d4SAnil Veerabhadrappa printf(" 3 : CIOC to invalid assoc_id connection test\n");
820ed56a3d4SAnil Veerabhadrappa printf(" 4 : Create/delete max assoc conns test\n");
821ed56a3d4SAnil Veerabhadrappa printf(" 5 : LS response failure test\n");
822ed56a3d4SAnil Veerabhadrappa printf(" 6 : Disconnect bad assoc_id test\n");
823ed56a3d4SAnil Veerabhadrappa }
824ed56a3d4SAnil Veerabhadrappa
8258dd1cd21SBen Walker int
main(int argc,char ** argv)8268dd1cd21SBen Walker main(int argc, char **argv)
827ed56a3d4SAnil Veerabhadrappa {
828ed56a3d4SAnil Veerabhadrappa unsigned int num_failures = 0;
829ed56a3d4SAnil Veerabhadrappa CU_pSuite suite = NULL;
830ed56a3d4SAnil Veerabhadrappa int test = 0;
831ed56a3d4SAnil Veerabhadrappa long int val;
832ed56a3d4SAnil Veerabhadrappa int op;
833ed56a3d4SAnil Veerabhadrappa
834ed56a3d4SAnil Veerabhadrappa while ((op = getopt(argc, argv, "a:q:c:t:u:d:i:")) != -1) {
835ed56a3d4SAnil Veerabhadrappa switch (op) {
836ed56a3d4SAnil Veerabhadrappa case 'q':
837ed56a3d4SAnil Veerabhadrappa val = spdk_strtol(optarg, 10);
838ed56a3d4SAnil Veerabhadrappa if (val < 16) {
839ed56a3d4SAnil Veerabhadrappa fprintf(stderr, "SQ size must be at least 16\n");
840ed56a3d4SAnil Veerabhadrappa return -EINVAL;
841ed56a3d4SAnil Veerabhadrappa }
842ed56a3d4SAnil Veerabhadrappa g_nvmf_transport_opts.max_queue_depth = (uint16_t)val;
843ed56a3d4SAnil Veerabhadrappa break;
844ed56a3d4SAnil Veerabhadrappa case 'c':
845ed56a3d4SAnil Veerabhadrappa val = spdk_strtol(optarg, 10);
846ed56a3d4SAnil Veerabhadrappa if (val < 2) {
847ed56a3d4SAnil Veerabhadrappa fprintf(stderr, "Connection count must be at least 2\n");
848ed56a3d4SAnil Veerabhadrappa return -EINVAL;
849ed56a3d4SAnil Veerabhadrappa }
850ed56a3d4SAnil Veerabhadrappa g_nvmf_transport_opts.max_qpairs_per_ctrlr = (uint16_t)val;
851ed56a3d4SAnil Veerabhadrappa break;
852ed56a3d4SAnil Veerabhadrappa case 't':
853ed56a3d4SAnil Veerabhadrappa if (spdk_log_set_flag(optarg) < 0) {
854ed56a3d4SAnil Veerabhadrappa fprintf(stderr, "Unknown trace flag '%s'\n", optarg);
855ed56a3d4SAnil Veerabhadrappa usage(argv[0]);
856ed56a3d4SAnil Veerabhadrappa return -EINVAL;
857ed56a3d4SAnil Veerabhadrappa }
858ed56a3d4SAnil Veerabhadrappa break;
859ed56a3d4SAnil Veerabhadrappa case 'u':
860ed56a3d4SAnil Veerabhadrappa test = (int)spdk_strtol(optarg, 10);
861ed56a3d4SAnil Veerabhadrappa break;
862ed56a3d4SAnil Veerabhadrappa case 'i':
863ed56a3d4SAnil Veerabhadrappa val = spdk_strtol(optarg, 10);
864ed56a3d4SAnil Veerabhadrappa if (val < 2) {
865ed56a3d4SAnil Veerabhadrappa fprintf(stderr, "Number of io queues must be at least 2\n");
866ed56a3d4SAnil Veerabhadrappa return -EINVAL;
867ed56a3d4SAnil Veerabhadrappa }
868ed56a3d4SAnil Veerabhadrappa if (val > FC_LS_UT_MAX_IO_QUEUES) {
869ed56a3d4SAnil Veerabhadrappa fprintf(stderr, "Number of io queues can't be greater than %d\n",
870ed56a3d4SAnil Veerabhadrappa FC_LS_UT_MAX_IO_QUEUES);
871ed56a3d4SAnil Veerabhadrappa return -EINVAL;
872ed56a3d4SAnil Veerabhadrappa }
873ed56a3d4SAnil Veerabhadrappa g_fc_port.num_io_queues = (uint32_t)val;
874ed56a3d4SAnil Veerabhadrappa break;
875ed56a3d4SAnil Veerabhadrappa
876ed56a3d4SAnil Veerabhadrappa
877ed56a3d4SAnil Veerabhadrappa default:
878ed56a3d4SAnil Veerabhadrappa usage(argv[0]);
879ed56a3d4SAnil Veerabhadrappa return -EINVAL;
880ed56a3d4SAnil Veerabhadrappa }
881ed56a3d4SAnil Veerabhadrappa }
882ed56a3d4SAnil Veerabhadrappa
88378b696bcSVitaliy Mysak CU_initialize_registry();
884ed56a3d4SAnil Veerabhadrappa
885ed56a3d4SAnil Veerabhadrappa suite = CU_add_suite("FC-NVMe LS", ls_tests_init, ls_tests_fini);
886ed56a3d4SAnil Veerabhadrappa
887ed56a3d4SAnil Veerabhadrappa if (test == 0) {
888ed56a3d4SAnil Veerabhadrappa
889dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, create_single_assoc_test);
890ed56a3d4SAnil Veerabhadrappa
891dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, create_max_conns_test);
892dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, invalid_connection_test);
893dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, disconnect_bad_assoc_test);
894ed56a3d4SAnil Veerabhadrappa
895dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, xmt_ls_rsp_failure_test);
896ed56a3d4SAnil Veerabhadrappa
897ed56a3d4SAnil Veerabhadrappa } else {
898ed56a3d4SAnil Veerabhadrappa
899ed56a3d4SAnil Veerabhadrappa switch (test) {
900ed56a3d4SAnil Veerabhadrappa case 1:
901dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, create_single_assoc_test);
902ed56a3d4SAnil Veerabhadrappa break;
903ed56a3d4SAnil Veerabhadrappa case 2:
904dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, create_max_conns_test);
905ed56a3d4SAnil Veerabhadrappa break;
906ed56a3d4SAnil Veerabhadrappa case 3:
907dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, invalid_connection_test);
908ed56a3d4SAnil Veerabhadrappa break;
909ed56a3d4SAnil Veerabhadrappa case 5:
910dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, xmt_ls_rsp_failure_test);
911ed56a3d4SAnil Veerabhadrappa break;
912ed56a3d4SAnil Veerabhadrappa case 6:
913dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, disconnect_bad_assoc_test);
914ed56a3d4SAnil Veerabhadrappa break;
915ed56a3d4SAnil Veerabhadrappa
916ed56a3d4SAnil Veerabhadrappa default:
917ed56a3d4SAnil Veerabhadrappa fprintf(stderr, "Invalid test number\n");
918ed56a3d4SAnil Veerabhadrappa usage(argv[0]);
919ed56a3d4SAnil Veerabhadrappa CU_cleanup_registry();
920ed56a3d4SAnil Veerabhadrappa return -EINVAL;
921ed56a3d4SAnil Veerabhadrappa }
922ed56a3d4SAnil Veerabhadrappa }
923ed56a3d4SAnil Veerabhadrappa
924ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL);
925ed56a3d4SAnil Veerabhadrappa CU_cleanup_registry();
926ed56a3d4SAnil Veerabhadrappa
927ed56a3d4SAnil Veerabhadrappa return num_failures;
928ed56a3d4SAnil Veerabhadrappa }
929