Emulex Logo
OneCoreā„¢ Storage SDK Release 11.2
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ocs_node.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2015, Emulex
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors
16  * may be used to endorse or promote products derived from this software
17  * without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  */
32 
33 /**
34  * @file
35  * OCS linux driver remote node callback declarations
36  */
37 
38 #if !defined(__OCS_NODE_H__)
39 #define __OCS_NODE_H__
40 
41 
42 #define node_sm_trace() \
43  do { \
44  if (OCS_LOG_ENABLE_SM_TRACE(node->ocs)) \
45  ocs_log_info(node->ocs, "[%s] %-20s\n", node->display_name, ocs_sm_event_name(evt)); \
46  } while (0)
47 
48 #define node_printf(node, fmt, ...) ocs_log_info(node->ocs, "[%s] " fmt, node->display_name, ##__VA_ARGS__)
49 #define node_printf_test(node, fmt, ...) ocs_log_test(node->ocs, "[%s] " fmt, node->display_name, ##__VA_ARGS__)
50 #define node_printf_err(node, fmt, ...) ocs_log_err(node->ocs, "[%s] " fmt, node->display_name, ##__VA_ARGS__)
51 
52 #define node_sm_prologue() \
53  if (evt == OCS_EVT_ENTER) { \
54  ocs_strncpy(node->current_state_name, __func__, sizeof(node->current_state_name)); \
55  } else if (evt == OCS_EVT_EXIT) { \
56  ocs_strncpy(node->prev_state_name, node->current_state_name, sizeof(node->prev_state_name)); \
57  ocs_strncpy(node->current_state_name, "invalid", sizeof(node->current_state_name)); \
58  } \
59  node->prev_evt = node->current_evt; \
60  node->current_evt = evt;
61 
62 #define std_node_state_decl(...) \
63  ocs_node_t *node = NULL; \
64  ocs_t *ocs = NULL; \
65  node = ctx->app; \
66  ocs_assert(node, NULL); \
67  ocs = node->ocs; \
68  ocs_assert(ocs, NULL); \
69  node_sm_prologue();
70 
71 #define OCS_NODEDB_PAUSE_FABRIC_LOGIN (1U << 0)
72 #define OCS_NODEDB_PAUSE_NAMESERVER (1U << 1)
73 #define OCS_NODEDB_PAUSE_NEW_NODES (1U << 2)
74 
75 /**
76  * @brief Node SM IO Context Callback structure
77  *
78  * Structure used as callback argument
79  */
80 
81 struct ocs_node_cb_s {
82  ocs_io_t *io; /**< SCSI IO for sending response */
83  int32_t status; /**< completion status */
84  int32_t ext_status; /**< extended completion status */
85  ocs_hal_rq_buffer_t *header; /**< completion header buffer */
86  ocs_hal_rq_buffer_t *payload; /**< completion payload buffers */
87  ocs_io_t *els; /**< ELS IO object */
88 };
89 
90 /**
91  * @brief hold frames in pending frame list
92  *
93  * Unsolicited recieve frames are held on the node pending frame list, rather than
94  * being processed.
95  *
96  * @param node pointer to node structure
97  *
98  * @return none
99  */
100 
101 static inline void
102 ocs_node_hold_frames(ocs_node_t *node)
103 {
104  ocs_assert(node);
105  node->hold_frames = TRUE;
106 }
107 
108 /**
109  * @brief accept frames
110  *
111  * Unsolicited recieve frames processed rather than being held on the node
112  * pending frame list.
113  *
114  * @param node pointer to node structure
115  *
116  * @return none
117  */
118 
119 static inline void
120 ocs_node_accept_frames(ocs_node_t *node)
121 {
122  ocs_assert(node);
123  node->hold_frames = FALSE;
124 }
125 
126 extern int32_t ocs_node_create_pool(ocs_t *ocs, uint32_t node_count);
127 extern void ocs_node_free_pool(ocs_t *ocs);
128 extern ocs_node_t *ocs_node_get_instance(ocs_t *ocs, uint32_t index);
129 
130 static inline void
131 ocs_node_lock_init(ocs_node_t *node)
132 {
133  ocs_rlock_init(node->ocs, &node->lock, "node rlock");
134 }
135 
136 static inline void
137 ocs_node_lock_free(ocs_node_t *node)
138 {
139  ocs_rlock_free(&node->lock);
140 }
141 
142 static inline int32_t
143 ocs_node_lock_try(ocs_node_t *node)
144 {
145  return ocs_rlock_try(&node->lock);
146 }
147 
148 static inline void
149 ocs_node_lock(ocs_node_t *node)
150 {
151  ocs_rlock_acquire(&node->lock);
152 }
153 static inline void
154 ocs_node_unlock(ocs_node_t *node)
155 {
156  ocs_rlock_release(&node->lock);
157 }
158 
159 /**
160  * @brief Node initiator/target enable defines
161  *
162  * All combinations of the SLI port (sport) initiator/target enable, and remote
163  * node initiator/target enable are enumerated.
164  *
165  */
166 
167 typedef enum {
185 
186 static inline ocs_node_enable_e ocs_node_get_enable(ocs_node_t *node)
187 {
188  uint32_t retval = 0;
189 
190  if (node->sport->enable_ini) retval |= (1U << 3);
191  if (node->sport->enable_tgt) retval |= (1U << 2);
192  if (node->init) retval |= (1U << 1);
193  if (node->targ) retval |= (1U << 0);
194  return (ocs_node_enable_e) retval;
195 }
196 
197 typedef void* (*ocs_node_common_func_t)(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg);
198 
199 extern 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);
200 extern int32_t node_check_ct_req(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg, uint32_t cmd, ocs_node_common_func_t node_common_func, const char *funcname);
201 extern int32_t node_check_ct_resp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg);
202 extern int32_t ocs_remote_node_cb(void *arg, ocs_hal_remote_node_event_e event, void *data);
203 extern int32_t ocs_node_attach(ocs_node_t *node);
204 extern ocs_node_t *ocs_node_find(ocs_sport_t *sport, uint32_t port_id);
205 extern ocs_node_t *ocs_node_find_wwpn(ocs_sport_t *sport, uint64_t wwpn);
206 extern ocs_node_t * ocs_node_find_wwnn(ocs_sport_t *sport, uint64_t wwnn);
207 extern void ocs_node_dump(ocs_t *ocs);
208 extern ocs_node_t *ocs_node_alloc(ocs_sport_t *sport, uint32_t port_id, uint8_t init, uint8_t targ);
209 extern int32_t ocs_node_free(ocs_node_t *node);
210 extern void ocs_node_force_free(ocs_node_t *node);
211 extern void ocs_node_fcid_display(uint32_t fc_id, char *buffer, uint32_t buffer_length);
212 extern void ocs_node_update_display_name(ocs_node_t *node);
213 
214 extern void *__ocs_node_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg);
215 extern void * __ocs_node_wait_node_free(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg);
216 extern void *__ocs_node_wait_els_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg);
217 extern void *__ocs_node_wait_ios_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg);
218 extern void ocs_node_save_sparms(ocs_node_t *node, void *payload);
219 extern void ocs_node_post_event(ocs_node_t *node, ocs_sm_event_t evt, void *arg);
220 extern void ocs_node_transition(ocs_node_t *node, ocs_sm_function_t state, void *data);
221 extern void *__ocs_node_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg);
222 
223 
224 extern void ocs_node_initiate_cleanup(ocs_node_t *node);
225 extern int ocs_ddump_node(ocs_textbuf_t *textbuf, ocs_node_t *node);
226 
227 extern void ocs_node_build_eui_name(char *buffer, uint32_t buffer_len, uint64_t eui_name);
228 extern uint64_t ocs_node_get_wwpn(ocs_node_t *node);
229 extern uint64_t ocs_node_get_wwnn(ocs_node_t *node);
230 extern void ocs_node_abort_all_els(ocs_node_t *node);
231 
232 extern void ocs_node_pause(ocs_node_t *node, ocs_sm_function_t state);
233 extern int32_t ocs_node_resume(ocs_node_t *node);
234 extern void *__ocs_node_paused(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg);
235 
236 extern int ocs_node_active_ios_empty(ocs_node_t *node);
237 extern void ocs_node_send_ls_io_cleanup(ocs_node_t *node);
238 
239 extern int32_t ocs_node_recv_link_services_frame(ocs_node_t *node, ocs_hal_sequence_t *seq);
240 extern int32_t ocs_node_recv_abts_frame(ocs_node_t *node, ocs_hal_sequence_t *seq);
241 extern int32_t ocs_node_recv_els_frame(ocs_node_t *node, ocs_hal_sequence_t *seq);
242 extern int32_t ocs_node_recv_ct_frame(ocs_node_t *node, ocs_hal_sequence_t *seq);
243 extern int32_t ocs_node_recv_fcp_cmd(ocs_node_t *node, ocs_hal_sequence_t *seq);
244 extern int32_t ocs_node_recv_bls_no_sit(ocs_node_t *node, ocs_hal_sequence_t *seq);
245 
246 int32_t ocs_node_is_remote_node(ocs_remote_node_t *rnode);
247 extern int32_t ocs_node_suppress_resp(ocs_remote_node_t *rnode);
248 
249 #endif // __OCS_NODE_H__
int32_t ocs_node_suppress_resp(ocs_remote_node_t *rnode)
Return node suppress_rsp state.
Definition: ocs_node.c:2584
int32_t ocs_node_recv_bls_no_sit(ocs_node_t *node, ocs_hal_sequence_t *seq)
Stub handler for non-ABTS BLS frames.
Definition: ocs_node.c:2549
int32_t ocs_node_recv_abts_frame(ocs_node_t *node, ocs_hal_sequence_t *seq)
Dispatch a ABTS frame (RQ Pair/sequence coalescing).
Definition: ocs_node.c:2342
void * __ocs_node_paused(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Paused node state.
Definition: ocs_node.c:2160
ocs_io_t * io
Definition: ocs_node.h:82
static void ocs_node_lock_free(ocs_node_t *node)
Definition: ocs_node.h:137
int32_t ocs_node_recv_ct_frame(ocs_node_t *node, ocs_hal_sequence_t *seq)
Dispatch a CT frame.
Definition: ocs_node.c:2420
int32_t node_check_ct_req(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg, uint32_t cmd, ocs_node_common_func_t node_common_func, const char *funcname)
check CT request completion
Definition: ocs_node.c:1788
void ocs_node_force_free(ocs_node_t *node)
free memory resources of a node object
Definition: ocs_node.c:608
void * __ocs_node_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
state: shutdown a node
Definition: ocs_node.c:841
void ocs_node_post_event(ocs_node_t *node, ocs_sm_event_t evt, void *arg)
Post event to node state machine context.
Definition: ocs_node.c:1498
static void ocs_node_accept_frames(ocs_node_t *node)
accept frames
Definition: ocs_node.h:120
void ocs_node_transition(ocs_node_t *node, ocs_sm_function_t state, void *data)
transition state of a node
Definition: ocs_node.c:1547
ocs_hal_rq_buffer_t * header
Definition: ocs_node.h:85
int32_t ocs_node_attach(ocs_node_t *node)
Perform HAL call to attach a remote node.
Definition: ocs_node.c:671
ocs_node_t * ocs_node_find(ocs_sport_t *sport, uint32_t port_id)
Find an FC node structure given the FC port ID.
Definition: ocs_node.c:202
void ocs_node_fcid_display(uint32_t fc_id, char *buffer, uint32_t buffer_length)
Generate text for a node&#39;s fc_id.
Definition: ocs_node.c:719
ocs_node_t * ocs_node_get_instance(ocs_t *ocs, uint32_t index)
return pointer to node object given instance index
Definition: ocs_node.c:389
int ocs_node_active_ios_empty(ocs_node_t *node)
Return TRUE if active ios list is empty.
Definition: ocs_node.c:2117
void *(* ocs_node_common_func_t)(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Definition: ocs_node.h:197
static int32_t ocs_node_lock_try(ocs_node_t *node)
Definition: ocs_node.h:143
void ocs_node_send_ls_io_cleanup(ocs_node_t *node)
cleans up an XRI for the pending link services accept by aborting the XRI if required.
Definition: ocs_node.c:779
static ocs_node_enable_e ocs_node_get_enable(ocs_node_t *node)
Definition: ocs_node.h:186
static void ocs_node_lock_init(ocs_node_t *node)
Definition: ocs_node.h:131
ocs_node_enable_e
Node initiator/target enable defines.
Definition: ocs_node.h:167
void ocs_node_update_display_name(ocs_node_t *node)
update the node&#39;s display name
Definition: ocs_node.c:755
int32_t ocs_node_free(ocs_node_t *node)
free a node structure
Definition: ocs_node.c:510
int32_t status
Definition: ocs_node.h:83
void *(* ocs_sm_function_t)(ocs_sm_ctx_t *, ocs_sm_event_t, void *)
Definition: ocs_sm.h:188
int32_t ocs_node_create_pool(ocs_t *ocs, uint32_t node_count)
allocate node object pool
Definition: ocs_node.c:281
int32_t ocs_remote_node_cb(void *arg, ocs_hal_remote_node_event_e event, void *data)
Handle remote node events from HAL.
Definition: ocs_node.c:115
ocs_node_t * ocs_node_find_wwnn(ocs_sport_t *sport, uint64_t wwnn)
Find an FC node structure given the WWNN.
Definition: ocs_node.c:250
void ocs_node_initiate_cleanup(ocs_node_t *node)
Initiate node IO cleanup.
Definition: ocs_node.c:1025
Defines a wrapper for the RQ payload buffers so that we can place it back on the proper queue...
Definition: ocs_hal.h:326
ocs_node_t * ocs_node_find_wwpn(ocs_sport_t *sport, uint64_t wwpn)
Find an FC node structure given the WWPN.
Definition: ocs_node.c:223
uint64_t ocs_node_get_wwnn(ocs_node_t *node)
return nodes&#39; WWNN as a uint64_t
Definition: ocs_node.c:1617
ocs_node_t * ocs_node_alloc(ocs_sport_t *sport, uint32_t port_id, uint8_t init, uint8_t targ)
Allocate an fc node structure and add to node list.
Definition: ocs_node.c:415
void ocs_node_pause(ocs_node_t *node, ocs_sm_function_t state)
Pause a node.
Definition: ocs_node.c:2140
void ocs_node_build_eui_name(char *buffer, uint32_t buffer_len, uint64_t eui_name)
build EUI formatted WWN
Definition: ocs_node.c:1577
int32_t ocs_node_recv_els_frame(ocs_node_t *node, ocs_hal_sequence_t *seq)
Dispatch a ELS frame.
Definition: ocs_node.c:2231
void * __ocs_node_wait_ios_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
state: initiate node shutdown
Definition: ocs_node.c:1252
int32_t ext_status
Definition: ocs_node.h:84
void ocs_node_dump(ocs_t *ocs)
static void ocs_node_lock(ocs_node_t *node)
Definition: ocs_node.h:149
int32_t ocs_node_recv_link_services_frame(ocs_node_t *node, ocs_hal_sequence_t *seq)
int32_t node_check_ct_resp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Definition: ocs_node.c:1821
ocs_io_t * els
Definition: ocs_node.h:87
int32_t ocs_node_resume(ocs_node_t *node)
Resume a paused state.
Definition: ocs_node.c:2204
int32_t ocs_node_is_remote_node(ocs_remote_node_t *rnode)
Definition: ocs_node.c:2564
int ocs_ddump_node(ocs_textbuf_t *textbuf, ocs_node_t *node)
Generate node ddump data.
Definition: ocs_node.c:1636
Defines a general FC sequence object, consisting of a header, payload buffers and a HAL IO in the cas...
Definition: ocs_hal.h:784
void * __ocs_node_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
state: common node event handler
Definition: ocs_node.c:1317
static void ocs_node_hold_frames(ocs_node_t *node)
hold frames in pending frame list
Definition: ocs_node.h:102
ocs_hal_rq_buffer_t * payload
Definition: ocs_node.h:86
Node SM IO Context Callback structure.
Definition: ocs_node.h:81
void ocs_node_free_pool(ocs_t *ocs)
free node object pool
Definition: ocs_node.c:350
ocs_hal_remote_node_event_e
Definition: ocs_hal.h:685
#define ocs_assert(cond,...)
Definition: ocs_debug.h:176
void * __ocs_node_wait_node_free(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Node state machine: Wait for a HAL node free event to complete.
Definition: ocs_node.c:1189
void * __ocs_node_wait_els_shutdown(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Node state machine: Wait for all ELSs to complete.
Definition: ocs_node.c:1102
ocs_sm_event_t
Definition: ocs_sm.h:60
void ocs_node_abort_all_els(ocs_node_t *node)
Device node state machine wait for all ELS&#39;s to complete.
Definition: ocs_node.c:83
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
Definition: ocs_node.c:1738
int32_t ocs_node_recv_fcp_cmd(ocs_node_t *node, ocs_hal_sequence_t *seq)
Dispatch a FCP command frame when the node is not ready.
Definition: ocs_node.c:2522
static void ocs_node_unlock(ocs_node_t *node)
Definition: ocs_node.h:154
void ocs_node_save_sparms(ocs_node_t *node, void *payload)
save node service parameters
Definition: ocs_node.c:1467
uint64_t ocs_node_get_wwpn(ocs_node_t *node)
return nodes&#39; WWPN as a uint64_t
Definition: ocs_node.c:1597