d6aea73c16a014a328b879d6277d69cafb7db362
[mirror/winof/.git] / ulp / ipoib_NDIS6_CM / kernel / ipoib_endpoint.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
4  * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
5  *\r
6  * This software is available to you under the OpenIB.org BSD license\r
7  * below:\r
8  *\r
9  *     Redistribution and use in source and binary forms, with or\r
10  *     without modification, are permitted provided that the following\r
11  *     conditions are met:\r
12  *\r
13  *      - Redistributions of source code must retain the above\r
14  *        copyright notice, this list of conditions and the following\r
15  *        disclaimer.\r
16  *\r
17  *      - Redistributions in binary form must reproduce the above\r
18  *        copyright notice, this list of conditions and the following\r
19  *        disclaimer in the documentation and/or other materials\r
20  *        provided with the distribution.\r
21  *\r
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
23  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
24  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
25  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
26  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
27  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
28  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
29  * SOFTWARE.\r
30  *\r
31  * $Id: ipoib_endpoint.h 4226 2009-04-06 06:01:03Z xalex $\r
32  */\r
33 \r
34 \r
35 #ifndef _IPOIB_ENDPOINT_H_\r
36 #define _IPOIB_ENDPOINT_H_\r
37 \r
38 \r
39 #include <iba/ib_al.h>\r
40 #include <complib/cl_qlist.h>\r
41 #include <complib/cl_qmap.h>\r
42 #include <complib/cl_fleximap.h>\r
43 #include <complib/cl_obj.h>\r
44 #include "iba/ipoib_ifc.h"\r
45 #include <ip_packet.h>\r
46 #include "ipoib_debug.h"\r
47 \r
48 \r
49 typedef struct _endpt_buf_mgr\r
50 {\r
51         cl_qpool_t                      recv_pool;\r
52         NDIS_HANDLE                     h_packet_pool;\r
53         NDIS_HANDLE                     h_buffer_pool;\r
54         cl_qlist_t                      posted_list;\r
55         boolean_t                       pool_init;\r
56 } endpt_buf_mgr_t;\r
57 \r
58 typedef struct _endpt_recv_mgr\r
59 {\r
60         int32_t                 depth;\r
61         int32_t                 rq_depth;\r
62         //NDIS60\r
63         //NDIS_PACKET           **recv_NBL_array;\r
64         NET_BUFFER_LIST *recv_lst_array;\r
65 \r
66 }       endpt_recv_mgr_t;\r
67 \r
68 \r
69 typedef enum _cm_state \r
70 {\r
71         IPOIB_CM_DISCONNECTED,\r
72         IPOIB_CM_INIT,\r
73         IPOIB_CM_CONNECT,\r
74         IPOIB_CM_CONNECTED,\r
75         IPOIB_CM_LISTEN,\r
76         IPOIB_CM_DREP_SENT,\r
77         IPOIB_CM_DREQ_SENT,\r
78         IPOIB_CM_REJ_RECVD,\r
79         IPOIB_CM_DESTROY\r
80 } cm_state_t;\r
81 \r
82 typedef struct _cm_private_data \r
83 {\r
84         ib_net32_t              ud_qpn;\r
85         ib_net32_t              recv_mtu;\r
86 } cm_private_data_t;\r
87 \r
88 typedef struct _endpt_conn \r
89 {\r
90         ib_net64_t                      service_id;\r
91         cm_private_data_t       private_data;\r
92         ib_qp_handle_t          h_send_qp;\r
93         ib_qp_handle_t          h_recv_qp;\r
94         ib_qp_handle_t          h_work_qp;\r
95         ib_cq_handle_t          h_send_cq;\r
96         ib_cq_handle_t          h_recv_cq;\r
97         ib_listen_handle_t  h_cm_listen;\r
98         cm_state_t                      state;\r
99 \r
100 } endpt_conn_t;\r
101 \r
102 typedef struct _ipoib_endpt\r
103 {\r
104         cl_obj_t                                obj;\r
105         cl_obj_rel_t                    rel;\r
106         cl_map_item_t                   mac_item;\r
107         cl_fmap_item_t                  gid_item;\r
108         cl_map_item_t                   lid_item;\r
109         cl_fmap_item_t                  conn_item;\r
110         LIST_ENTRY                              list_item;\r
111         ib_query_handle_t               h_query;\r
112         ib_mcast_handle_t               h_mcast;\r
113         mac_addr_t                              mac;\r
114         ib_gid_t                                dgid;\r
115         net16_t                                 dlid;\r
116         net32_t                                 qpn;\r
117         uint8_t                                 cm_flag;\r
118         ib_av_handle_t                  h_av;\r
119         endpt_conn_t                    conn;\r
120 \r
121         ib_al_ifc_t                             *p_ifc;\r
122         boolean_t                       is_in_use;\r
123         boolean_t                               is_mcast_listener;\r
124 }       ipoib_endpt_t;\r
125 /*\r
126 * FIELDS\r
127 *       mac_item\r
128 *               Map item for storing the endpoint in a map.  The key is the\r
129 *               destination MAC address.\r
130 *\r
131 *       lid_item\r
132 *               Map item for storing the endpoint in a map.  The key is the\r
133 *               destination LID.\r
134 *\r
135 *       gid_item\r
136 *               Map item for storing the endpoint in a map.  The key is the\r
137 *               destination GID.\r
138 *\r
139 *       h_query\r
140 *               Query handle for cancelling SA queries.\r
141 *\r
142 *       h_mcast\r
143 *               For multicast endpoints, the multicast handle.\r
144 *\r
145 *       mac\r
146 *               MAC address.\r
147 *\r
148 *       dgid\r
149 *               Destination GID.\r
150 *\r
151 *       dlid\r
152 *               Destination LID.  The destination LID is only set for endpoints\r
153 *               that are on the same subnet.  It is used as key in the LID map.\r
154 *\r
155 *       qpn\r
156 *               Destination queue pair number.\r
157 *\r
158 *       h_av\r
159 *               Address vector for sending data.\r
160 *\r
161 *       expired\r
162 *               Flag to indicate that the endpoint should be flushed.\r
163 *\r
164 *       connection\r
165 *               for connected mode endpoints\r
166 *\r
167 *       p_ifc\r
168 *               Reference to transport functions, can be used\r
169 *               while endpoint is not attached to port yet.\r
170 *\r
171 * NOTES\r
172 *       If the h_mcast member is set, the endpoint is never expired.\r
173 *********/\r
174 \r
175 \r
176 ipoib_endpt_t*\r
177 ipoib_endpt_create(\r
178         IN              const   ib_gid_t* const                         p_dgid,\r
179         IN              const   net16_t                                         dlid,\r
180         IN              const   net32_t                                         qpn );\r
181 \r
182 \r
183 ib_api_status_t\r
184 ipoib_endpt_set_mcast(\r
185         IN                              ipoib_endpt_t* const            p_endpt,\r
186         IN                              ib_pd_handle_t                          h_pd,\r
187         IN                              uint8_t                                         port_num,\r
188         IN                              ib_mcast_rec_t* const           p_mcast_rec );\r
189 \r
190 \r
191 static inline void\r
192 ipoib_endpt_ref(\r
193         IN                              ipoib_endpt_t* const            p_endpt )\r
194 {\r
195         CL_ASSERT( p_endpt );\r
196 \r
197         cl_obj_ref( &p_endpt->obj );\r
198         /*\r
199          * Anytime we reference the endpoint, we're either receiving data\r
200          * or trying to send data to that endpoint.  Clear the expired flag\r
201          * to prevent the AV from being flushed.\r
202          */\r
203 }\r
204 \r
205 \r
206 static inline void\r
207 ipoib_endpt_deref(\r
208         IN                              ipoib_endpt_t* const            p_endpt )\r
209 {\r
210         cl_obj_deref( &p_endpt->obj );\r
211 }\r
212 \r
213 \r
214 NDIS_STATUS\r
215 ipoib_endpt_queue(\r
216         IN                              ipoib_endpt_t* const            p_endpt );\r
217 \r
218 struct _ipoib_port *\r
219 ipoib_endpt_parent(\r
220         IN              ipoib_endpt_t* const            p_endpt );\r
221 \r
222 inline cm_state_t\r
223 endpt_cm_set_state(\r
224         IN              ipoib_endpt_t* const            p_endpt,\r
225         IN              cm_state_t                                      state )\r
226 {\r
227         return(cm_state_t)InterlockedExchange( \r
228                                 (volatile LONG *)&p_endpt->conn.state, \r
229                                 (LONG)state );\r
230 }\r
231 \r
232 inline cm_state_t\r
233 endpt_cm_get_state(\r
234         IN              ipoib_endpt_t* const            p_endpt )\r
235 {\r
236         return( cm_state_t )InterlockedCompareExchange( \r
237                                 (volatile LONG *)&p_endpt->conn.state, \r
238                                 IPOIB_CM_DISCONNECTED, IPOIB_CM_DISCONNECTED );\r
239 }\r
240 \r
241 ib_api_status_t\r
242 endpt_cm_create_qp( \r
243         IN              ipoib_endpt_t*  const   p_endpt,\r
244         IN              ib_qp_handle_t* const   p_h_qp );\r
245 \r
246 ib_api_status_t\r
247 ipoib_endpt_connect(\r
248         IN              ipoib_endpt_t* const            p_endpt );\r
249 \r
250 int32_t\r
251 endpt_cm_recv_mgr_filter(\r
252         IN              ipoib_endpt_t* const            p_endpt,\r
253         IN              ib_wc_t* const                          p_done_wc_list,\r
254         OUT             cl_qlist_t* const                       p_done_list,\r
255         OUT             cl_qlist_t* const                       p_bad_list );\r
256 \r
257 #endif  /* _IPOIB_ENDPOINT_H_ */\r