70 ocs_node_t *node = io->node;
74 node_printf(node,
"NVME: PRLI rejected by target-server\n");
82 if (ocs->fc_type != node->fc_type) {
83 node_printf(node,
"PRLI rejected by target-server, fc-type not supported\n");
93 node_printf(node,
"PRLI rejected by target-server\n");
134 if (ocs->enable_nvme_tgt && node->nvme_init) {
138 if (node->init && !node->targ) {
139 ocs_log_info(node->ocs,
"[%s] delete (initiator) WWPN %s WWNN %s\n", node->display_name,
140 node->wwpn, node->wwnn);
142 if (node->sport->enable_tgt) {
148 }
else if (node->targ && !node->init) {
149 ocs_log_info(node->ocs,
"[%s] delete (target) WWPN %s WWNN %s\n", node->display_name,
150 node->wwpn, node->wwnn);
152 if (node->sport->enable_ini) {
158 }
else if (node->init && node->targ) {
159 ocs_log_info(node->ocs,
"[%s] delete (initiator+target) WWPN %s WWNN %s\n",
160 node->display_name, node->wwpn, node->wwnn);
162 if (node->sport->enable_tgt) {
169 if (node->sport->enable_ini) {
185 if (node->attached) {
191 if (node->rnode.free_group) {
193 node->node_group = NULL;
194 node->rnode.free_group = FALSE;
197 node_printf(node,
"Failed freeing HAL node, rc=%d\n", rc);
202 if (!node->init && !node->targ){
239 ocs_node_t *node = NULL;
251 ocs_log_debug(ocs,
"[%s] %-20s %-20s\n", node->display_name, funcname,
ocs_sm_event_name(evt));
256 ocs_log_debug(ocs,
"[%s] %-20s %-20s\n", node->display_name, funcname,
ocs_sm_event_name(evt));
261 ocs_log_debug(ocs,
"[%s] %-20s %-20s\n", node->display_name, funcname,
ocs_sm_event_name(evt));
477 ocs_node_t *node = io->node;
478 uint16_t ox_id = ocs_be16toh(hdr->
ox_id);
482 node->ls_acc_oxid = ox_id;
483 node->send_ls_acc = ls;
484 node->ls_acc_io = io;
488 #if defined(OCS_ENABLE_FIRST_BURST)
496 int32_t ocs_first_burst_enabled(ocs_t *ocs)
498 ocs_hal_t *hal = &ocs->hal;
531 node->fc_type = prli->
type;
552 ocs_node_t *node = io->node;
553 ocs_t *ocs = node->ocs;
554 uint16_t ox_id = ocs_be16toh(hdr->
ox_id);
555 uint16_t rx_id = ocs_be16toh(hdr->
rx_id);
561 if (abortio != NULL && (ocs_ref_get_unless_zero(&abortio->ref) != 0)) {
564 node_printf(node,
"Abort request: ox_id [%04x] rx_id [%04x]\n",
571 io->display_name =
"abts";
572 io->init_task_tag = ox_id;
579 io->abort_rx_id = rx_id;
589 ocs_ref_put(&abortio->ref);
595 node_printf(node,
"Abort request: ox_id [%04x], IO not found (exists=%d)\n",
596 ox_id, (abortio != NULL));
597 if (ocs->enable_nvme_tgt) {
637 node->els_cmpl_cnt--;
644 node->els_cmpl_cnt--;
670 ocs_node_t *node = ctx->app;
671 ocs_t *ocs = node->ocs;
672 ocs_sport_t *sport = node->sport;
706 if (sport->unreg_rpi_all)
783 node->send_plogi = send_plogi;
814 ocs_node_cb_t *cbdata = arg;
822 if (node->send_plogi) {
824 if (node->sport->enable_ini && node->sport->domain->attached) {
829 node_printf(node,
"not sending plogi sport.ini=%d, domain attached=%d\n",
830 node->sport->enable_ini, node->sport->domain->attached);
843 if (node->sport->domain->attached) {
853 switch (node->sport->topology) {
876 node_printf(node,
"received PLOGI, with unknown topology did=0x%x\n", d_id);
880 node_printf(node,
"received PLOGI, with unexpectd topology %d\n",
881 node->sport->topology);
889 #if defined(ENABLE_FABRIC_EMULATION)
893 if (node->sport->domain->femul_enable) {
894 ocs_femul_process_fdisc(cbdata->io, hdr, cbdata->payload->dma.virt, cbdata->payload->dma.len);
911 #if defined(ENABLE_FABRIC_EMULATION)
912 if (node->sport->domain->femul_enable) {
914 ocs_femul_process_flogi(cbdata->io, hdr, cbdata->payload->dma.virt, cbdata->payload->dma.len);
922 node_printf(node,
"p2p setup failed, shutting down node\n");
934 if (!node->sport->domain->attached) {
952 if (!node->sport->domain->attached) {
969 if (!node->sport->domain->attached) {
977 ocs_log_info(node->ocs,
"[%s] FCP_CMND received before port login, send LOGO\n",
981 ocs_log_err(node->ocs,
"[%s] Failed to send LOGO, cleanup node context\n",
993 #if defined(ENABLE_FABRIC_EMULATION)
995 if (node->sport->domain->femul_enable) {
997 void *payload = cbdata->payload->dma.virt;
998 uint32_t payload_len = cbdata->payload->dma.len;
999 rc = ocs_femul_process_scr(cbdata->io, hdr, payload, payload_len);
1034 ocs_node_cb_t *cbdata = arg;
1068 if (ocs->fc_type == node->fc_type) {
1099 node->els_req_cnt--;
1103 ((uint8_t*)cbdata->els->els_rsp.virt) + 4);
1117 node->els_req_cnt--;
1126 node->els_req_cnt--;
1167 ocs_node_cb_t *cbdata = arg;
1197 node->els_req_cnt--;
1201 ((uint8_t*)cbdata->els->els_rsp.virt) + 4);
1216 node->els_req_cnt--;
1260 ocs_assert(node->sport->domain->attached, NULL);
1311 ocs_assert(!node->sport->domain->attached, NULL);
1313 node_printf(node,
"topology notification, topology=%d\n", topology);
1335 ocs_assert(node->sport->domain->attached, NULL);
1380 node->attached = TRUE;
1381 switch (node->send_ls_acc) {
1388 node->ls_acc_io = NULL;
1394 node->ls_acc_io = NULL;
1408 node->attached = FALSE;
1468 node->attached = TRUE;
1475 node->attached = FALSE;
1514 ocs_node_cb_t *cbdata = arg;
1525 && !node->sent_prli) {
1528 node->sent_prli = TRUE;
1535 if (node->sport->enable_tgt) {
1561 node->els_req_cnt--;
1574 node->els_req_cnt--;
1587 node->els_req_cnt--;
1597 node->els_cmpl_cnt--;
1627 #if defined(ENABLE_FABRIC_EMULATION)
1646 if (node->sport->domain->femul_enable) {
1649 uint32_t payload_len;
1654 hdr = cbdata->header->dma.virt;
1655 payload = cbdata->payload->dma.virt;
1656 payload_len = cbdata->payload->dma.len;
1658 ocs_femul_process_fc_gs(__func__, cbdata->io, evt, hdr, payload, payload_len);
1705 node->els_cmpl_cnt--;
1730 ocs_node_cb_t *cbdata = arg;
1739 node->fcp_enabled = TRUE;
1741 ocs_log_info(ocs,
"[%s] found (initiator) WWPN %s WWNN %s\n", node->display_name,
1742 node->wwpn, node->wwnn);
1743 if (node->sport->enable_tgt)
1747 ocs_log_info(ocs,
"[%s] found (target) WWPN %s WWNN %s\n", node->display_name,
1748 node->wwpn, node->wwnn);
1749 if (node->sport->enable_ini)
1755 node->fcp_enabled = FALSE;
1786 }
else if (ocs->fc_type == node->fc_type)
1801 }
else if (ocs->fc_type == prlo->
type)
1845 if (node->sport->enable_rscn) {
1853 node->els_cmpl_cnt--;
1859 node->els_cmpl_cnt--;
1860 node_printf(node,
"Failed to send PRLI LS_ACC\n");
1890 ocs_node_cb_t *cbdata = arg;
1897 const char *labels[] = {
"none",
"initiator",
"target",
"initiator+target"};
1899 ocs_log_info(ocs,
"[%s] missing (%s) WWPN %s WWNN %s\n", node->display_name,
1900 labels[(node->targ << 1) | (node->init)], node->wwpn, node->wwnn);
2004 ocs_node_cb_t *cbdata = arg;
2015 node->els_req_cnt--;
2027 node->els_req_cnt--;
int ocs_nvme_process_prlo(ocs_io_t *io, uint16_t ox_id)
#define OCS_TOW_FEATURE_TFB
int32_t ocs_scsi_recv_tmf(ocs_io_t *tmfio, uint32_t lun, ocs_scsi_tmf_cmd_e cmd, ocs_io_t *abortio, uint32_t flags)
Receive a TMF command IO.
#define OCS_NODEDB_PAUSE_NEW_NODES
int32_t ocs_scsi_del_target(ocs_node_t *node, ocs_scsi_del_target_reason_e reason)
Delete a SCSI target node.
void * __ocs_node_paused(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Paused node state.
static int32_t ocs_process_abts(ocs_io_t *io, fc_header_t *hdr)
Process the ABTS.
void * __ocs_d_wait_prlo_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for the PRLO response.
#define FC_PRLI_TARGET_FUNCTION
ocs_hal_rtn_e ocs_hal_unreg_rpi_all(ocs_hal_t *hal, ocs_sport_t *sport)
Free all remote node objects.
void ocs_remote_node_group_free(ocs_remote_node_group_t *node_group)
Free a remote node group object.
void ocs_node_post_event(ocs_node_t *node, ocs_sm_event_t evt, void *arg)
Post event to node state machine context.
int32_t ocs_rnode_is_nport(fc_plogi_payload_t *remote_sparms)
Return TRUE if the remote node is an NPORT.
ocs_io_t * ocs_send_plogi_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a PLOGI accept response.
static void ocs_node_accept_frames(ocs_node_t *node)
accept frames
ocs_io_t * ocs_send_prli(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a PRLI ELS command.
void ocs_node_transition(ocs_node_t *node, ocs_sm_function_t state, void *data)
transition state of a node
ocs_io_t * ocs_send_ls_rjt(ocs_io_t *io, uint32_t ox_id, uint32_t reason_code, uint32_t reason_code_expl, uint32_t vendor_unique, els_cb_t cb, void *cbarg)
Send an LS_RJT ELS response.
ocs_io_t * ocs_send_prli_acc(ocs_io_t *io, uint32_t ox_id, uint8_t fc_type, els_cb_t cb, void *cbarg)
Send a PRLI accept response.
void * __ocs_d_wait_plogi_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait on a response for a sent PLOGI.
int32_t ocs_node_attach(ocs_node_t *node)
Perform HAL call to attach a remote node.
ocs_io_t * ocs_send_plogi(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, void(*cb)(ocs_node_t *node, ocs_node_cb_t *cbdata, void *arg), void *cbarg)
Format and send a PLOGI ELS command.
ocs_io_t * ocs_bls_send_rjt_hdr(ocs_io_t *io, fc_header_t *hdr)
Send a BA_RJT given the request's FC heade.
void ocs_display_sparams(const char *prelabel, const char *reqlabel, int dest, void *textbuf, void *sparams)
Display service parameters.
void * __ocs_d_wait_logo_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for the LOGO response.
int32_t ocs_scsi_del_initiator(ocs_node_t *node, ocs_scsi_del_initiator_reason_e reason)
Delete a SCSI initiator node.
void ocs_scsi_io_free(ocs_io_t *io)
Free a SCSI IO context.
void * __ocs_d_wait_topology_notify(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for topology notification.
void * __ocs_d_wait_adisc_rsp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for the ADISC response.
void ocs_node_init_device(ocs_node_t *node, int send_plogi)
Initialize device node.
#define FC_EXPL_NPORT_LOGIN_REQUIRED
static ocs_node_enable_e ocs_node_get_enable(ocs_node_t *node)
void ocs_scsi_io_alloc_disable(ocs_node_t *node)
Disable IO allocation.
const char * ocs_sm_event_name(ocs_sm_event_t evt)
int32_t ocs_scsi_new_target(ocs_node_t *node)
receive notification of a new SCSI target node
ocs_hal_rtn_e ocs_hal_node_detach(ocs_hal_t *hal, ocs_remote_node_t *rnode)
Free a remote node object.
#define FC_ADDR_IS_DOMAIN_CTRL(x)
int ocs_nvme_process_prli(ocs_io_t *io, uint16_t ox_id)
void ocs_d_send_prli_rsp(ocs_io_t *io, uint16_t ox_id, uint8_t fc_type)
Send response to PRLI.
static void * __ocs_d_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Common device event handler.
#define FC_PRLI_WRITE_XRDY_DISABLED
void * __ocs_d_device_gone(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Node is gone (absent from GID_PT).
void * __ocs_d_wait_plogi_acc_cmpl(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for the PLOGI accept to complete.
void ocs_node_initiate_cleanup(ocs_node_t *node)
Initiate node IO cleanup.
int32_t ocs_scsi_new_initiator(ocs_node_t *node)
Receive notification of a new SCSI initiator node.
int ocs_nvme_node_lost(ocs_node_t *node)
void * __ocs_p2p_wait_flogi_acc_cmpl(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Point-to-point node state machine: Wait for the FLOGI accept completion.
#define FC_REASON_UNABLE_TO_PERFORM
void ocs_domain_attach(ocs_domain_t *domain, uint32_t s_id)
Initiator domain attach.
ocs_io_t * ocs_send_ls_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a generic LS_ACC response without a payload.
#define FC_EXPL_REQUEST_NOT_SUPPORTED
void * __ocs_d_wait_domain_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for a domain attach.
#define node_sm_prologue()
void * __ocs_d_wait_logo_acc_cmpl(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for a LOGO accept.
void * __ocs_d_wait_loop(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for a domain-attach completion in loop topology.
#define OCS_FC_ELS_DEFAULT_RETRIES
void * __ocs_d_wait_attach_evt_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for a node/domain attach then shutdown node.
void * __ocs_d_initiate_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Initiate node shutdown.
ocs_io_t * ocs_send_adisc_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send an ADISC accept response.
ocs_io_t * ocs_send_adisc(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send an ADISC ELS command.
void * __ocs_node_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
state: common node event handler
#define std_node_state_decl(...)
void * __ocs_d_port_logged_in(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Port is logged in.
static void ocs_node_hold_frames(ocs_node_t *node)
hold frames in pending frame list
void ocs_fabric_set_topology(ocs_node_t *node, ocs_sport_topology_e topology)
Set sport topology.
ocs_io_t * ocs_send_prlo_acc(ocs_io_t *io, uint32_t ox_id, uint8_t fc_type, els_cb_t cb, void *cbarg)
Send a PRLO accept response.
int ocs_nvme_process_abts(ocs_t *ocs, uint16_t oxid, uint16_t rxid, uint32_t rpi)
void * __ocs_d_device_ready(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Device is ready.
int32_t ocs_scsi_validate_initiator(ocs_node_t *node)
Validate a new initiator.
#define node_printf(node, fmt,...)
void * __ocs_d_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Initial node state for an initiator or a target.
void * __ocs_d_wait_node_attach(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Wait for a node attach when found by a remote node.
void ocs_domain_save_sparms(ocs_domain_t *domain, void *payload)
Save the port's service parameters.
#define ocs_assert(cond,...)
ocs_io_t * ocs_send_prlo(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a PRLO ELS command.
static uint32_t fc_be24toh(uint32_t x)
void * __ocs_d_wait_plogi_rsp_recvd_prli(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Waiting on a response for a sent PLOGI.
ocs_io_t * ocs_send_logo(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a LOGO ELS command.
#define OCS_SCSI_CALL_COMPLETE
ocs_io_t * ocs_io_find_tgt_io(ocs_t *ocs, ocs_node_t *node, uint16_t ox_id, uint16_t rx_id)
Find an I/O given it's node and ox_id.
void ocs_process_prli_payload(ocs_node_t *node, fc_prli_payload_t *prli)
Process the PRLI payload.
int32_t node_check_els_req(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg, uint8_t cmd, ocs_node_common_func_t node_common_func, const char *funcname)
check ELS request completion
#define FC_EXPL_NO_ADDITIONAL
ocs_io_t * ocs_send_flogi_p2p_acc(ocs_io_t *io, uint32_t ox_id, uint32_t s_id, els_cb_t cb, void *cbarg)
Send an FLOGI accept response for point-to-point negotiation.
ocs_io_t * ocs_send_logo_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a LOGO accept response.
void ocs_node_save_sparms(ocs_node_t *node, void *payload)
save node service parameters
#define FC_PRLI_INITIATOR_FUNCTION
static void * __ocs_d_wait_del_ini_tgt(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
state: wait for node resume event
static void * __ocs_d_wait_del_node(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
state: Wait for node resume event.
#define OCS_FC_ELS_SEND_DEFAULT_TIMEOUT
int32_t ocs_p2p_setup(ocs_sport_t *sport)
Set up the domain point-to-point parameters.
void ocs_send_ls_acc_after_attach(ocs_io_t *io, fc_header_t *hdr, ocs_node_send_ls_acc_e ls)
Save the OX_ID for sending LS_ACC sometime later.