[WSD] Rename some structures to make the code more readable.
[mirror/winof/.git] / ulp / wsd / user / ibspstruct.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  *\r
29  * $Id$\r
30  */\r
31 \r
32 #include <complib/cl_qlist.h>\r
33 #include <complib/cl_fleximap.h>\r
34 #include <complib/cl_rbmap.h>\r
35 #include <complib/cl_spinlock.h>\r
36 #include <complib/cl_debug.h>\r
37 \r
38 \r
39 \r
40 enum ibsp_socket_state\r
41 {\r
42         IBSP_CREATE = 0,\r
43         IBSP_BIND,\r
44         IBSP_CONNECT,\r
45         IBSP_LISTEN,\r
46         IBSP_CONNECTED,\r
47         IBSP_DUPLICATING_OLD,           /* duplicating socket on the original controlling process */\r
48         IBSP_DUPLICATING_NEW,           /* duplicating socket on the new controlling process */\r
49         IBSP_DUPLICATING_REMOTE,        /* duplicating socket on the remote side */\r
50         IBSP_DISCONNECTED,\r
51         IBSP_CLOSED,\r
52         IBSP_NUM_STATES\r
53 };\r
54 \r
55 extern char *ibsp_socket_state_str[IBSP_NUM_STATES];\r
56 \r
57 #define IBSP_SOCKET_STATE_STR(state) \\r
58         (state < IBSP_NUM_STATES)?ibsp_socket_state_str[state]:"INVALID"\r
59 \r
60 /* Socket Options structure */\r
61 struct ibsp_socket_options\r
62 {\r
63         BOOL debug;                                     /* SO_DEBUG */\r
64         GROUP group_id;                         /* SO_GROUP_ID */\r
65         int group_priority;                     /* SO_GROUP_PRIORITY */\r
66         unsigned int max_msg_size;      /* SO_MAX_MSG_SIZE */\r
67         int max_rdma_size;                      /* SO_MAX_RDMA_SIZE */\r
68         int rdma_threshold_size;        /* SO_RDMA_THRESHOLD_SIZE */\r
69 };\r
70 \r
71 /* Used to discriminate between various listen on the same ports. \r
72  * We need this for socket duplication. \r
73  * { 0, 0 } is a standard connection request. */\r
74 struct listen_req_param\r
75 {\r
76         DWORD dwProcessId;\r
77         GUID identifier;\r
78 };\r
79 \r
80 /* Parameters given to establish a connection */\r
81 struct cm_req_params\r
82 {\r
83         struct listen_req_param listen_req_param;\r
84         struct sockaddr_in dest;\r
85         struct sockaddr_in source;      /* Source of connect() */\r
86 };\r
87 \r
88 /* Listen structure.\r
89  * Used to remember an incoming connection. */\r
90 struct listen_incoming\r
91 {\r
92         cl_list_item_t                  item;\r
93 \r
94         ib_cm_req_rec_t                 cm_req_received;\r
95         struct cm_req_params    params;\r
96 };\r
97 \r
98 \r
99 /* Keeps track of the posted WR */\r
100 struct _wr\r
101 {\r
102         LPWSAOVERLAPPED                         lpOverlapped;\r
103         struct ibsp_socket_info         *socket_info;\r
104 };\r
105 \r
106 \r
107 /* Keeps track of the posted WR */\r
108 struct _recv_wr\r
109 {\r
110         struct _wr              wr;\r
111         ib_recv_wr_t    recv;\r
112         ib_local_ds_t   ds_array[QP_ATTRIB_RQ_SGE];\r
113 #ifdef IBSP_LOGGING\r
114         LONG                    idx;\r
115 #endif\r
116 };\r
117 \r
118 \r
119 /* Keeps track of the registered MRs */\r
120 struct mr_list\r
121 {\r
122         cl_qlist_t list;                        /* Regions registered through IBSPRegisterMemory */\r
123         cl_spinlock_t mutex;            /* Protects the list */\r
124 };\r
125 \r
126 /* Information necessary to duplicate sockets */\r
127 struct ibsp_duplicate_info\r
128 {\r
129         GUID identifier;\r
130         struct ibsp_socket_options socket_options;\r
131         struct sockaddr_in local_addr;\r
132         struct sockaddr_in peer_addr;\r
133         DWORD dwProcessId;\r
134 };\r
135 \r
136 /* Give the reason for disconnections */\r
137 struct disconnect_reason\r
138 {\r
139         enum\r
140         {\r
141                 DISC_INVALID,\r
142                 DISC_SHUTDOWN,                  /* normal shutdown */\r
143                 DISC_DUPLICATING                /* socket duplication */\r
144         } type;\r
145 \r
146         struct _disconnect_reason_dup\r
147         {\r
148                 GUID identifier;\r
149                 DWORD dwProcessId;\r
150 \r
151         }       duplicating;\r
152 };\r
153 \r
154 \r
155 /* Internal node describing a registered region. */\r
156 struct memory_reg\r
157 {\r
158         cl_list_item_t  item;\r
159         /*\r
160          * List count serves as reference count.  The memory registration\r
161          * can be released when the list is empty.\r
162          */\r
163         cl_qlist_t              node_list;\r
164 \r
165 #ifdef _DEBUG_\r
166 #define MR_NODE_MAGIC 0x7fba43ce\r
167         int magic;\r
168 #endif\r
169 \r
170         /* Characteristics of that region. */\r
171         ib_mr_create_t  type;\r
172 \r
173         /* Memory registration parameters, returned by ib_reg_mem. */\r
174         uint32_t                lkey;\r
175         uint32_t                rkey;\r
176         ib_mr_handle_t  mr_handle;\r
177 };\r
178 \r
179 \r
180 struct memory_node\r
181 {\r
182         /* List item to track within a socket structure. */\r
183         cl_list_item_t                  socket_item;\r
184         struct ibsp_socket_info *s;\r
185         /* List item to track within the registration structure. */\r
186         cl_list_item_t                  mr_item;\r
187         struct memory_reg               *p_reg1;\r
188 };\r
189 \r
190 \r
191 \r
192 /* Descriptor given back to WSPRegisterRdmaMemory */\r
193 struct rdma_memory_desc\r
194 {\r
195         uint64_t iova;\r
196         uint32_t lkey;\r
197         uint32_t rkey;\r
198         struct memory_node *node1;      /* valid only on registering node */\r
199 };\r
200 \r
201 struct cq_thread_info\r
202 {\r
203         cl_list_item_t          list_item;\r
204 \r
205         cl_waitobj_handle_t cq_waitobj;\r
206         ib_cq_handle_t cq;\r
207 \r
208         /* Number of qp's using this cq */\r
209         atomic32_t qp_count;\r
210 \r
211         /* Current cqe size */\r
212         uint32_t cqe_size;\r
213 \r
214         HANDLE ib_cq_thread;\r
215         DWORD   ib_cq_thread_id;\r
216         BOOL ib_cq_thread_exit_wanted;\r
217 \r
218         struct ibsp_hca *hca;           /* HCA to which this cq belongs. */\r
219 };\r
220 \r
221 /* Structure representing the context information stored for each\r
222  * socket created */\r
223 struct ibsp_socket_info\r
224 {\r
225         cl_list_item_t item;            /* Link to next SOCKET_INFO in the global list */\r
226         cl_rbmap_item_t conn_item;\r
227         cl_spinlock_t mutex1;           /* protect this structure */\r
228 \r
229         /* Switch socket handle created by WPUCreateSocketHandle. */\r
230         SOCKET switch_socket;\r
231 \r
232         /* IP address and port this socket is bound to. Set by WSPBind */\r
233         struct sockaddr_in local_addr;\r
234 \r
235         /* Remote address of peer entity after connect/accept is complete */\r
236         struct sockaddr_in peer_addr;\r
237 \r
238         /* Back pointer to the port to which this socket is\r
239          * bound. It is NULL until the socket is bound, except if the listen\r
240          * binds to INADDR_ANY. */\r
241         struct ibsp_port *port;\r
242 \r
243         enum ibsp_socket_state socket_state;    /* represents current socket state */\r
244 \r
245         struct\r
246         {\r
247                 /* Listening socket */\r
248                 unsigned int backlog;   /* Maximum number of pending connections */\r
249                 cl_qlist_t list;        /* list of pending connections */\r
250                 ib_listen_handle_t handle;\r
251                 struct listen_req_param listen_req_param;\r
252         } listen;\r
253 \r
254         /* Event for blocking accept, and connect */\r
255         HANDLE  h_event;\r
256 \r
257         /* Variables associated with IBSPSelectEvent */\r
258         WSAEVENT event_select;          /* Handle to Event Object */\r
259         long event_mask;                        /* Events we care about */\r
260         long network_events;            /* Events that happenned */\r
261         int errno_connect;                      /* errno code (if any) returned by connect */\r
262 \r
263         struct ibsp_socket_options socket_options;      /* Socket Options */\r
264 \r
265         /* Infiniband ressources */\r
266         ib_pd_handle_t hca_pd;          /* Copy of the HCA PD, for faster access. */\r
267 \r
268         /* Pointer to completion queue and thread assigned to this socket */\r
269         struct cq_thread_info *cq_tinfo;\r
270 \r
271         ib_qp_handle_t          qp;\r
272         uint32_t                        max_inline;\r
273 \r
274         /* State on the QP. This is only valid when the socket state is IBSP_CONNECTED.\r
275          *   0  : good\r
276          *   <0 : an error occurred, contains a windoes error *ie WSAExxxx\r
277          *   -1 : disconected, for duplication process.\r
278          */\r
279         int qp_error;\r
280 \r
281         /* Send request processing. */\r
282         cl_spinlock_t   send_lock;\r
283         ib_send_opt_t   send_opt;\r
284         struct _wr              send_wr[QP_ATTRIB_SQ_DEPTH];\r
285         uint8_t                 send_idx;\r
286         atomic32_t              send_cnt; /* Used to limit access to send_wr array. */\r
287 \r
288         /* Receive request processing. */\r
289         cl_spinlock_t   recv_lock;\r
290         struct _recv_wr recv_wr[QP_ATTRIB_RQ_DEPTH];\r
291         uint8_t                 recv_idx;\r
292         atomic32_t              recv_cnt; /* Used to limit access to recv_wr array. */\r
293 \r
294         /*\r
295          * Used to stall destruction of switch socket until all completion\r
296          * upcalls have unwound.\r
297          */\r
298         atomic32_t              ref_cnt1;\r
299 \r
300 #ifdef _DEBUG_\r
301         atomic32_t              send_comp;\r
302         atomic32_t              recv_comp;\r
303 #endif\r
304 \r
305         struct _recv_wr dup_wr[QP_ATTRIB_RQ_DEPTH];\r
306         uint8_t                 dup_idx;\r
307         atomic32_t              dup_cnt;\r
308 \r
309         /*\r
310          * The switch will register local and RDMA memory for use in RDMA\r
311          * transfers.  All RDMA registrations are cached in the HCA structure,\r
312          * and have memory_node structures referencing them stored here in the\r
313          * socket structures.\r
314          */\r
315         cl_qlist_t              mr_list;\r
316 \r
317         /* Stuff for socket duplication */\r
318         struct\r
319         {\r
320                 GUID identifier;                /* Unique identifier */\r
321                 DWORD dwProcessId;\r
322         } duplicate;\r
323 \r
324 #ifdef IBSP_LOGGING\r
325         DataLogger              SendDataLogger;\r
326         DataLogger              RecvDataLogger;\r
327         long                    recv_log_idx;\r
328         long                    send_log_idx;\r
329 #endif\r
330 };\r
331 \r
332 \r
333 inline void\r
334 ibsp_css(\r
335                                         char                                            *calling_func,\r
336                                         int                                                     line,\r
337                                         struct ibsp_socket_info         *s,\r
338                                         enum ibsp_socket_state          new_state )\r
339 {\r
340         enum ibsp_socket_state old_state;\r
341 \r
342         UNUSED_PARAM( calling_func );\r
343         UNUSED_PARAM( line );\r
344 \r
345         old_state = s->socket_state;\r
346 \r
347         if( old_state == new_state )\r
348         {\r
349                 /* Nothing to change */\r
350                 return;\r
351         }\r
352 \r
353         /* IBSP_CLOSED is a dead end state */\r
354         if( old_state == IBSP_CLOSED )\r
355         {\r
356                 return;\r
357         }\r
358 \r
359 \r
360         s->socket_state = new_state;\r
361 }\r
362 \r
363 #define IBSP_CHANGE_SOCKET_STATE(socket_info, new_state) \\r
364         ibsp_css(__FUNCTION__, __LINE__, socket_info, new_state)\r
365 \r
366 \r
367 /*--------------------------------------------------------------------------*/\r
368 \r
369 /* Describes an IP address */\r
370 struct ibsp_ip_addr\r
371 {\r
372         cl_fmap_item_t          item;                   /* next IP for that port */\r
373 \r
374         struct ibsp_port        *p_port;                /* port that owns this IP address */\r
375         struct in_addr          ip_addr;                /* IPv4 address */\r
376 };\r
377 \r
378 /* describes a port */\r
379 struct ibsp_port\r
380 {\r
381         cl_list_item_t item;\r
382 \r
383         struct ibsp_hca *hca;           /* HCA to which this port belong. */\r
384 \r
385         ib_net64_t guid;\r
386         uint8_t port_num;\r
387 };\r
388 \r
389 /* Describes a hca */\r
390 struct ibsp_hca\r
391 {\r
392         cl_list_item_t item;\r
393 \r
394         ib_net64_t guid;\r
395         uint16_t        dev_id; /* Device ID to selectively cap MTU to 1K for Tavor. */\r
396         ib_ca_handle_t hca_handle;\r
397 \r
398         ib_pd_handle_t pd;\r
399 \r
400         /* Memory management */\r
401         struct mr_list rdma_mem_list;   /* Regions registered through IBSPRegisterRdmaMemory */\r
402 \r
403         cl_spinlock_t   port_lock;\r
404         cl_qlist_t              port_list;\r
405 \r
406         /*\r
407          * The CQ list is a circular list without an end.  The pointer here\r
408          * points to the entry that should be used for the next allocation.\r
409          */\r
410         cl_spinlock_t   cq_lock;\r
411         struct cq_thread_info *cq_tinfo;\r
412 };\r
413 \r
414 /* There is only one instance of that structure. */\r
415 struct ibspdll_globals\r
416 {\r
417         /* Special values. Keep first and in this order. These are not reset\r
418          * between WSAStartupEx and WSACleanup calls. */\r
419         cl_spinlock_t mutex;\r
420         UINT entry_count;\r
421 \r
422         /* Provider */\r
423         WSPUPCALLTABLEEX up_call_table; /* MUST keep afetr entry_count */\r
424         HANDLE heap;\r
425         cl_qlist_t socket_info_list;    /* List of all the created sockets */\r
426         cl_rbmap_t conn_map;    /* rb tree of all connections to ensure unique 4-tuple */\r
427         cl_spinlock_t socket_info_mutex;\r
428 \r
429         WSAPROTOCOL_INFOW protocol_info;\r
430 \r
431         /* Infiniband */\r
432         ib_al_handle_t al_handle;\r
433         ib_pnp_handle_t pnp_handle_ca;\r
434         ib_pnp_handle_t pnp_handle_port;\r
435 \r
436         cl_qlist_t hca_list;\r
437         cl_spinlock_t hca_mutex;\r
438 \r
439         HANDLE                  h_ibat_dev;\r
440         cl_fmap_t               ip_map;                 /* list of all IP addresses supported by all the ports. */\r
441         cl_spinlock_t   ip_mutex;\r
442 \r
443 #ifdef _DEBUG_\r
444         /* Statistics */\r
445         atomic32_t qp_num;\r
446         atomic32_t cq_num;\r
447         atomic32_t pd_num;\r
448         atomic32_t al_num;\r
449         atomic32_t mr_num;\r
450         atomic32_t ca_num;\r
451         atomic32_t listen_num;\r
452         atomic32_t pnp_num;\r
453         atomic32_t thread_num;\r
454         atomic32_t wpusocket_num;\r
455 \r
456         atomic32_t overlap_h0_count;\r
457         atomic32_t overlap_h1_comp_count;\r
458         atomic32_t overlap_h1_count;\r
459         atomic32_t max_comp_count;\r
460         atomic32_t send_count;\r
461         atomic32_t recv_count;\r
462         atomic32_t total_send_count;\r
463         atomic32_t total_recv_count;\r
464         atomic32_t total_recv_compleated;\r
465         atomic32_t CloseSocket_count;\r
466 #endif\r
467 };\r