42 typedef struct ocs_xport_gen_arg_s {
65 xport = ocs_malloc(ocs,
sizeof(*xport), OCS_M_ZERO);
110 iscsi = &xport->ocs->iscsi;
116 uint32_t remote_port = 0;
117 ocs_cxn_t *cxn = NULL;
118 ocs_cxn_t **cxn_arg = NULL;
125 remote_port = va_arg(argp, uint32_t);
126 cxn_arg = va_arg(argp, ocs_cxn_t **);
133 ip_str,
sizeof(ip_str));
135 ocs_log_debug(iscsi->
os,
"CONNECT %s:%d\n", ip_str, remote_port);
141 if (!ocs->enable_ini) {
142 ocs_log_test(iscsi->
os,
"Reject connection request, no initiator functionality enabled\n");
146 arg = ocs_malloc(iscsi->
os,
sizeof(*arg), OCS_M_NOWAIT);
148 ocs_log_err(ocs,
"out of memory\n");
159 ocs_log_err(iscsi->
os,
"Failed allocating a connection\n");
160 ocs_free(ocs, arg,
sizeof(*arg));
164 ocs_sem_init(&arg->
sem, 0,
"connect");
165 ocs_snprintf(cxn->display_name,
166 sizeof(cxn->display_name),
171 cxn->no_idle_timer = TRUE;
178 ocs->tcp_window_size,
179 ocs->tcp_window_scale,
184 ocs_log_test(ocs,
"connect failed, no resources\n");
185 ocs_sem_v(&arg->
sem);
186 ocs_free(ocs, arg,
sizeof(*arg));
189 ocs_log_test(ocs,
"connect failed, status=%d\n", rc);
190 ocs_sem_v(&arg->
sem);
191 ocs_free(ocs, arg,
sizeof(*arg));
194 rc = ocs_sem_p(&arg->
sem, 10000000);
196 ocs_log_test(ocs,
"failed to connect within timeout\n");
201 ocs_log_test(ocs,
"done waiting connect, status=0x%x ext=0x%x\n",
205 ocs_free(ocs, arg,
sizeof(*arg));
219 ocs_cxn_t *cxn = NULL;
222 ocs_io_t *io, *abort_io = NULL;
227 cxn = va_arg(argp, ocs_cxn_t*);
228 reset = va_arg(argp, uint32_t);
232 ocs_log_debug(iscsi->
os,
"DISCONNECT %s\n", cxn->display_name);
242 if (io->hio != NULL) {
248 if (abort_io != NULL) {
249 ocs_log_debug(ocs,
"Active IOs found, Issue abort on cxn\n");
256 ocs_log_test(ocs,
"received rc %d aborting IOs\n", hal_rc);
258 uint32_t inters = 100;
259 int32_t io_list_empty = FALSE;
263 ocs_delay_usec(10000);
268 }
while(inters && !io_list_empty);
269 ocs_log_debug(ocs,
"Active IOs list is %sEmpty\n",
270 (io_list_empty ?
"" :
"non-"));
273 ocs_log_debug(ocs,
"No Active IOs found\n");
278 ocs_log_test(ocs,
"received rc %d for login cleanup\n", hal_rc);
283 arg = ocs_malloc(ocs,
sizeof(*arg), OCS_M_NOWAIT);
285 ocs_log_err(ocs,
"out of memory\n");
289 ocs_sem_init(&arg->
sem, 0,
"disconnect");
299 ocs_log_test(ocs,
"disconnect failed, no resources\n");
300 ocs_sem_v(&arg->
sem);
301 ocs_free(ocs, arg,
sizeof(*arg));
304 ocs_log_test(ocs,
"disconnect failed, status=%d\n", rc);
305 ocs_sem_v(&arg->
sem);
306 ocs_free(ocs, arg,
sizeof(*arg));
309 rc = ocs_sem_p(&arg->
sem, 10000000);
311 ocs_log_test(ocs,
"failed to disconnect within timeout\n");
316 ocs_log_test(ocs,
"done waiting for disconnect, status=0x%x ext=0x%x\n",
319 ocs_free(ocs, arg,
sizeof(*arg));
325 ocs_cxn_t *cxn = NULL;
331 cxn = va_arg(argp, ocs_cxn_t*);
332 reset = va_arg(argp, uint32_t);
336 ocs_log_debug(iscsi->
os,
"UPLOAD %s\n", cxn->display_name);
338 arg = ocs_malloc(ocs,
sizeof(*arg), OCS_M_NOWAIT);
340 ocs_log_err(ocs,
"out of memory\n");
344 ocs_sem_init(&arg->
sem, 0,
"upload");
354 ocs_log_test(ocs,
"upload failed, no resources\n");
355 ocs_sem_v(&arg->
sem);
356 ocs_free(ocs, arg,
sizeof(*arg));
359 ocs_log_test(ocs,
"upload failed, status=%d\n", rc);
360 ocs_sem_v(&arg->
sem);
361 ocs_free(ocs, arg,
sizeof(*arg));
364 rc = ocs_sem_p(&arg->
sem, 10000000);
366 ocs_log_test(ocs,
"failed to upload connection within timeout\n");
371 ocs_log_test(ocs,
"done waiting for upload, status=0x%x ext=0x%x\n",
375 ocs_free(ocs, arg,
sizeof(*arg));
390 ocs_log_debug(iscsi->
os,
"REG_UNSOL_INI_CB\n");
396 if (!ocs->enable_ini) {
397 ocs_log_test(iscsi->
os,
"Reject function registration request, no initiator functionality enabled\n");
447 if (value.
value == 0) {
474 ocs_free(xport->ocs, xport,
sizeof(*xport));
ocs_hal_rtn_e ocs_hal_cxn_connect(ocs_hal_t *hal, ocs_cxn_t *cxn, ocs_hal_ip_address_t *ipaddr, uint32_t tcp_port, uint16_t window_size, uint8_t window_scale, cxn_cb_t cxn_cb, void *ul_arg)
Establish a TCP connection from an initiator to a target.
ocs_hal_rtn_e ocs_hal_cxn_close(ocs_hal_t *hal, ocs_cxn_t *cxn, uint8_t sendRst, cxn_cb_t cxn_cb, void *ul_arg)
Invalidates a connection and optionally sends a TCP Reset.
static int32_t ocs_list_empty(ocs_list_t *list)
Test if a list is empty.
ocs_cxn_t * ocs_cxn_alloc(ocs_iscsi_t *iscsi, uint32_t conn_hdl)
Allocates a connection and initializes the fields as required.
ocs_hal_rtn_e
defines common HAL return statuses.
int32_t ocs_xport_control(ocs_xport_t *xport, ocs_xport_ctrl_e cmd,...)
Perform transport attach function.
ocs_ip_type_e ocs_iscsi_convert_to_ip_type(ocs_hal_ip_type_e ip_type)
Convert an HAL IP type to the iSCSI API value.
ocs_hal_rtn_e ocs_hal_io_abort(ocs_hal_t *hal, ocs_hal_io_t *io, ocs_hal_abort_scope_e abort_scope, ocs_hal_abort_type_e abort_type)
Abort a currently running IO.
int32_t(* ocs_hal_unsol_cb_t)(void *, ocs_cxn_t *, ocs_hal_rq_buffer_t *, uint32_t, ocs_hal_rq_buffer_t *, uint32_t, uint8_t)
HAL unsolicited callback.
ocs_hal_rtn_e ocs_hal_get(ocs_hal_t *hal, ocs_hal_property_e prop, uint32_t *value)
ocs_hal_ip_type_e ip_type
ocs_hal_rtn_e ocs_hal_cxn_free(ocs_hal_t *hal, ocs_cxn_t *cxn)
Frees a connection object for re-use.
static void ocs_xport_cxn_cb(void *ul_arg, int32_t status, uint32_t ext_status, void *params)
void format_ip_address(ocs_ip_type_e ip_type, uint8_t *address, char *buffer, int size)
Format an IP address into a string.
structure wrapping an IP address together with it's type.
static void ocs_node_lock(ocs_node_t *node)
ocs_hal_unsol_cb_t unsol_ini
static void ocs_node_unlock(ocs_node_t *node)
void ocs_xport_free(ocs_xport_t *xport)
free a transport object
#define ocs_assert(cond,...)
int32_t ocs_xport_status(ocs_xport_t *xport, ocs_xport_status_e cmd, ocs_xport_stats_t *result)
Return status on a link.
#define ocs_list_foreach(list, item)
Iterate a linked list.
ocs_xport_t * ocs_xport_alloc(ocs_t *ocs)
allocate a transport object
ocs_hal_rtn_e ocs_iscsi_login_cxn_cleanup(ocs_cxn_t *cxn)
Frees any retry objects for the connection.
ocs_hal_rtn_e ocs_hal_cxn_upload(ocs_hal_t *hal, ocs_cxn_t *cxn, uint8_t graceful, cxn_cb_t cxn_cb, void *ul_arg)
uploads an incoming connection on a target.