871b5d945a32fb618f789e3981fa946ec192db7c
[mirror/winof/.git] / ulp / srp / kernel / srp_login_req.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 \r
33 #ifndef SRP_LOGIN_REQ_H_INCLUDED\r
34 #define SRP_LOGIN_REQ_H_INCLUDED\r
35 \r
36 #include "srp.h"\r
37 #include "srp_iu_buffer.h"\r
38 #include "srp_information_unit.h"\r
39 #include <complib/cl_byteswap.h>\r
40 \r
41 /* set_srp_login_request_tag */\r
42 /*!\r
43 Sets the tag field of the login request IU to the supplied value\r
44 \r
45 @param p_information_unit - pointer to the IU structure\r
46 @param iu_tag            - tag value to be used for the req/rsp pair\r
47 \r
48 @return - none\r
49 */\r
50 static inline\r
51 void\r
52 set_srp_login_request_tag(\r
53         IN OUT  srp_login_req_t *p_information_unit,\r
54         IN      uint64_t        iu_tag )\r
55 {\r
56         set_srp_information_unit_tag( ( srp_information_unit_t* ) p_information_unit, iu_tag );\r
57 }\r
58 \r
59 /* init_srp_login_request */\r
60 /*!\r
61 Initializes the login request IU to zeroes\r
62 and sets the IU type to Srp Login Request\r
63 and set the tag to the value supplied\r
64 \r
65 @param p_information_unit - pointer to the IU structure\r
66 @param iu_tag            - tag value to be used for the req/rsp pair\r
67 \r
68 @return - none\r
69 */\r
70 static inline\r
71 void\r
72 init_srp_login_request(\r
73         IN OUT  srp_login_req_t *p_information_unit,\r
74         IN      uint64_t        iu_tag )\r
75 {\r
76         init_srp_iu_buffer( ( srp_iu_buffer_t* ) p_information_unit, SRP_LOGIN_REQ ) ;\r
77         set_srp_login_request_tag( p_information_unit, iu_tag );\r
78 }\r
79 \r
80 /* set_srp_login_request_req_max_init_to_targ_iu */\r
81 /*!\r
82 Sets the maximum sized IU to be sent on this channel from initiator to target\r
83 \r
84 @param p_information_unit   - pointer to the IU structure\r
85 @param req_max_init_to_targ_iu - max initiator to target IU size (64 or greater)\r
86 \r
87 @return - none\r
88 */\r
89 static inline\r
90 void\r
91 set_srp_login_request_req_max_init_to_targ_iu(\r
92         IN OUT  srp_login_req_t *p_information_unit,\r
93         IN      uint32_t        req_max_init_to_targ_iu )\r
94 {\r
95         p_information_unit->req_max_init_to_targ_iu = req_max_init_to_targ_iu;\r
96 }\r
97 \r
98 /* set_srp_login_request_required_data_buffer_formats */\r
99 /*!\r
100 Sets the flags indicating whether or not the initiator will use\r
101 target support of direct/indirect data buffer descriptors on this channel\r
102 \r
103 @param p_information_unit             - pointer to the IU structure\r
104 @param data_buffer_descriptor_formats - usage indicator values\r
105 \r
106 @return - none\r
107 */\r
108 static inline\r
109 void\r
110 set_srp_login_request_required_data_buffer_formats(\r
111         IN OUT  srp_login_req_t                 *p_information_unit,\r
112         IN      DATA_BUFFER_DESCRIPTOR_FORMAT   data_buffer_descriptor_formats )\r
113 {\r
114         p_information_unit->req_buffer_fmts.flags = 0;\r
115 \r
116         if ( data_buffer_descriptor_formats & DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR )\r
117         {\r
118                 p_information_unit->req_buffer_fmts.flags |= DIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED;\r
119         }\r
120 \r
121         if ( data_buffer_descriptor_formats & DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS )\r
122         {\r
123                 p_information_unit->req_buffer_fmts.flags |= INDIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED;\r
124         }\r
125 }\r
126 \r
127 /* set_srp_login_request_multi_channel_action */\r
128 /*!\r
129 Sets the value indicating how existing RDMA channels associated with the\r
130 same I_T nexus specified by the Initiator Port Identifier and Target Port\r
131 Identifier fields are to be treated. They can either be terminated or allowed\r
132 to continue processing.\r
133 \r
134 @param p_information_unit   - pointer to the IU structure\r
135 @param multi_channel_action - value indicating action to be applied to\r
136                                                           existing RDMA channels\r
137 \r
138 @return - none\r
139 */\r
140 static inline\r
141 void\r
142 set_srp_login_request_multi_channel_action(\r
143         IN OUT  srp_login_req_t         *p_information_unit,\r
144         IN      MULTI_CHANNEL_ACTION    multi_channel_action )\r
145 {\r
146         p_information_unit->flags |= multi_channel_action;\r
147 }\r
148 \r
149 /* set_Srp_login_request_initiator_port_id */\r
150 /*!\r
151 Sets the initiator's port id value portion of the I_T nexus value\r
152 \r
153 @param p_information_unit - pointer to the IU structure\r
154 @param pinitiatorPortId - initiator's port id value\r
155 \r
156 @return - none\r
157 */\r
158 static inline\r
159 void\r
160 set_Srp_login_request_initiator_port_id(\r
161         IN OUT  srp_login_req_t         *p_information_unit,\r
162         IN      srp_ib_init_port_id_t   *p_initiator_port_id )\r
163 {\r
164         p_information_unit->initiator_port_id.guid         = p_initiator_port_id->guid;\r
165         p_information_unit->initiator_port_id.id_extension = p_initiator_port_id->id_extension;\r
166 }\r
167 \r
168 /* set_srp_login_request_target_port_id */\r
169 /*!\r
170 Sets the target's port id value portion of the I_T nexus value\r
171 \r
172 @param p_information_unit - pointer to the IU structure\r
173 @param p_target_port_id   - target's port id value\r
174 \r
175 @return - none\r
176 */\r
177 static inline\r
178 void\r
179 set_srp_login_request_target_port_id(\r
180         IN OUT  srp_login_req_t         *p_information_unit,\r
181         IN      srp_ib_targ_port_id_t   *p_target_port_id )\r
182 {\r
183         p_information_unit->target_port_id.io_ctrl_guid = p_target_port_id->io_ctrl_guid;\r
184         p_information_unit->target_port_id.id_extension = p_target_port_id->id_extension;\r
185 }\r
186 \r
187 /* setSrpLoginRequestITNexus */\r
188 /*!\r
189 Sets the I_T nexus value\r
190 \r
191 @param p_information_unit  - pointer to the IU structure\r
192 @param p_initiator_port_id - initiator's port id value\r
193 @param p_target_port_id    - target's port id value\r
194 \r
195 @return - none\r
196 */\r
197 static inline\r
198 void\r
199 set_srp_login_request_it_nexus(\r
200         IN OUT  srp_login_req_t         *p_information_unit,\r
201         IN      srp_ib_init_port_id_t   *p_initiator_port_id,\r
202         IN      srp_ib_targ_port_id_t   *p_target_port_id )\r
203 {\r
204         set_Srp_login_request_initiator_port_id( p_information_unit, p_initiator_port_id );\r
205         set_srp_login_request_target_port_id( p_information_unit, p_target_port_id );\r
206 }\r
207 \r
208 /* setup_srp_login_request */\r
209 /*!\r
210 Initializes and sets the Srp Login Request IU to the values supplied\r
211 \r
212 @param p_information_unit             - pointer to the IU structure\r
213 @param iu_tag                         - tag value to be used for the req/rsp pair\r
214 @param req_max_init_to_targ_iu        - max initiator to target IU size (64 or greater)\r
215 @param data_buffer_descriptor_formats - usage indicator values\r
216 @param multi_channel_action           - value indicating action to be applied to existing RDMA channels\r
217 @param p_initiator_port_id            - initiator's port id value (for I_T nexus)\r
218 @param p_target_port_id               - target's port id value (for I_T nexus)\r
219 \r
220 @return - none\r
221 */\r
222 static inline\r
223 void\r
224 setup_srp_login_request(\r
225         IN OUT  srp_login_req_t                 *p_information_unit,\r
226         IN      uint64_t                        iu_tag,\r
227         IN      uint32_t                        req_max_init_to_targ_iu,\r
228         IN      DATA_BUFFER_DESCRIPTOR_FORMAT   data_buffer_descriptor_formats,\r
229         IN      MULTI_CHANNEL_ACTION            multi_channel_action,\r
230         IN      srp_ib_init_port_id_t           *p_initiator_port_id,\r
231         IN      srp_ib_targ_port_id_t           *p_target_port_id )\r
232 {\r
233         init_srp_login_request( p_information_unit, iu_tag );\r
234         set_srp_login_request_req_max_init_to_targ_iu( p_information_unit, req_max_init_to_targ_iu );\r
235         set_srp_login_request_required_data_buffer_formats( p_information_unit, data_buffer_descriptor_formats );\r
236         set_srp_login_request_multi_channel_action( p_information_unit, multi_channel_action );\r
237         set_srp_login_request_it_nexus( p_information_unit, p_initiator_port_id, p_target_port_id );\r
238 }\r
239 \r
240 /* get_srp_login_request_tag */\r
241 /*!\r
242 Returns the value of the tag field of a login request\r
243 \r
244 @param p_information_unit - pointer to the IU structure\r
245 \r
246 @return - tag value\r
247 */\r
248 static inline\r
249 uint64_t\r
250 get_srp_login_request_tag(\r
251         IN  srp_login_req_t *p_information_unit )\r
252 {\r
253         return( get_srp_information_unit_tag( ( srp_information_unit_t* ) p_information_unit ) );\r
254 }\r
255 \r
256 /* get_srp_login_request_req_max_init_to_targ_iu */\r
257 /*!\r
258 Returns the requested max initiator to target information unit size\r
259 \r
260 @param p_information_unit - pointer to the IU structure\r
261 \r
262 @return - requested max initiator to target information unit size value\r
263 */\r
264 static inline\r
265 uint32_t\r
266 get_srp_login_request_req_max_init_to_targ_iu(\r
267         IN  srp_login_req_t *p_information_unit )\r
268 {\r
269         return( p_information_unit->req_max_init_to_targ_iu );\r
270 }\r
271 \r
272 /* get_srp_login_request_required_data_buffer_formats */\r
273 /*!\r
274 Returns the required data buffer formats to be used on the channel\r
275 \r
276 @param p_information_unit - pointer to the IU structure\r
277 \r
278 @return - required data buffer formats settings\r
279 */\r
280 static inline\r
281 DATA_BUFFER_DESCRIPTOR_FORMAT\r
282 get_srp_login_request_required_data_buffer_formats(\r
283         IN  srp_login_req_t *p_information_unit )\r
284 {\r
285         switch ( p_information_unit->req_buffer_fmts.flags & DATA_BUFFER_DESCRIPTOR_FORMAT_MASK )\r
286         {\r
287                 case DIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED:\r
288                         return( DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR );\r
289 \r
290                 case INDIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED:\r
291                         return( DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS );\r
292 \r
293                 case DIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED | INDIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED:\r
294                         return( ( DATA_BUFFER_DESCRIPTOR_FORMAT ) ( DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR | DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS ) );\r
295 \r
296                 default:\r
297                         return( DBDF_NO_DATA_BUFFER_DESCRIPTOR_PRESENT );\r
298         }\r
299 }\r
300 \r
301 /* get_srp_login_request_multi_channel_action */\r
302 /*!\r
303 Returns the multi channel action setting\r
304 \r
305 @param p_information_unit - pointer to the IU structure\r
306 \r
307 @return - multi channel action setting\r
308 */\r
309 static inline\r
310 MULTI_CHANNEL_ACTION\r
311 get_srp_login_request_multi_channel_action(\r
312         IN  srp_login_req_t *p_information_unit )\r
313 {\r
314         return( ( MULTI_CHANNEL_ACTION ) ( p_information_unit->flags & MULTI_CHANNEL_ACTION_MASK ) );\r
315 }\r
316 \r
317 /* get_srp_login_request_initiator_port_id */\r
318 /*!\r
319 Returns the initiator port identifier\r
320 \r
321 @param p_information_unit - pointer to the IU structure\r
322 \r
323 @return - pointer to initiator port id value\r
324 */\r
325 static inline\r
326 srp_ib_init_port_id_t*\r
327 get_srp_login_request_initiator_port_id(\r
328         IN  srp_login_req_t *p_information_unit )\r
329 {\r
330         return( &p_information_unit->initiator_port_id );\r
331 }\r
332 \r
333 /* get_srp_login_request_target_port_id */\r
334 /*!\r
335 Returns the target port identifier\r
336 \r
337 @param p_information_unit - pointer to the IU structure\r
338 \r
339 @return - pointer to target port id value\r
340 */\r
341 static inline\r
342 srp_ib_targ_port_id_t*\r
343 get_srp_login_request_target_port_id(\r
344         IN  srp_login_req_t *p_information_unit )\r
345 {\r
346         return( &p_information_unit->target_port_id );\r
347 }\r
348 \r
349 /* get_srp_login_request_length */\r
350 /*!\r
351 Returns the size in bytes of the Srp Login Request IU\r
352 \r
353 @param p_information_unit - pointer to the IU structure\r
354 \r
355 @return - tag value\r
356 */\r
357 static inline\r
358 uint32_t\r
359 get_srp_login_request_length(\r
360         IN  srp_login_req_t *p_information_unit )\r
361 {\r
362         return( sizeof( *p_information_unit ) );\r
363 }\r
364 \r
365 /* set_srp_login_request_from_host_to_network */\r
366 /*!\r
367 Swaps the IU fields from Host to Network ordering\r
368 \r
369 @param p_information_unit - pointer to the IU structure\r
370 \r
371 @return - none\r
372 */\r
373 \r
374 static inline\r
375 void\r
376 set_srp_login_request_from_host_to_network(\r
377         IN OUT  srp_login_req_t *p_information_unit )\r
378 {\r
379         set_srp_information_unit_from_host_to_network( ( srp_information_unit_t* ) p_information_unit );\r
380         p_information_unit->req_max_init_to_targ_iu        = cl_hton32( p_information_unit->req_max_init_to_targ_iu );\r
381         p_information_unit->initiator_port_id.id_extension = cl_hton64( p_information_unit->initiator_port_id.id_extension );\r
382         p_information_unit->target_port_id.id_extension    = cl_hton64( p_information_unit->target_port_id.id_extension );\r
383 }\r
384 \r
385 /* set_srp_login_request_from_network_to_host */\r
386 /*!\r
387 Swaps the IU fields from Network to Host ordering\r
388 \r
389 @param p_information_unit - pointer to the IU structure\r
390 \r
391 @return - none\r
392 */\r
393 \r
394 static inline\r
395 void\r
396 set_srp_login_request_from_network_to_host(\r
397         IN OUT  srp_login_req_t *p_information_unit )\r
398 {\r
399         set_srp_login_request_from_host_to_network ( p_information_unit );\r
400 }\r
401 \r
402 #endif /* SRP_LOGIN_REQ_H_INCLUDED */\r