[SRP] Handle both SRP I/O Classes, 0xFF from SRP spec r10, and
[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 /* setSrpLoginRequestITNexus */\r
150 /*!\r
151 Sets the I_T nexus value\r
152 \r
153 @param p_information_unit  - pointer to the IU structure\r
154 @param p_initiator_port_id - initiator's port id value\r
155 @param p_target_port_id    - target's port id value\r
156 \r
157 @return - none\r
158 */\r
159 static inline\r
160 void\r
161 set_srp_login_request_it_nexus(\r
162         IN OUT  srp_login_req_t         *p_information_unit,\r
163         IN      srp_ib_port_id_t                *p_initiator_port_id,\r
164         IN      srp_ib_port_id_t                *p_target_port_id )\r
165 {\r
166         RtlCopyMemory( &p_information_unit->initiator_port_id,\r
167                 p_initiator_port_id, sizeof(srp_ib_port_id_t) );\r
168         RtlCopyMemory( &p_information_unit->target_port_id,\r
169                 p_target_port_id, sizeof(srp_ib_port_id_t) );\r
170 }\r
171 \r
172 /* setup_srp_login_request */\r
173 /*!\r
174 Initializes and sets the Srp Login Request IU to the values supplied\r
175 \r
176 @param p_information_unit             - pointer to the IU structure\r
177 @param iu_tag                         - tag value to be used for the req/rsp pair\r
178 @param req_max_init_to_targ_iu        - max initiator to target IU size (64 or greater)\r
179 @param data_buffer_descriptor_formats - usage indicator values\r
180 @param multi_channel_action           - value indicating action to be applied to existing RDMA channels\r
181 @param p_initiator_port_id            - initiator's port id value (for I_T nexus)\r
182 @param p_target_port_id               - target's port id value (for I_T nexus)\r
183 \r
184 @return - none\r
185 */\r
186 static inline\r
187 void\r
188 setup_srp_login_request(\r
189         IN OUT  srp_login_req_t                 *p_information_unit,\r
190         IN      uint64_t                        iu_tag,\r
191         IN      uint32_t                        req_max_init_to_targ_iu,\r
192         IN      DATA_BUFFER_DESCRIPTOR_FORMAT   data_buffer_descriptor_formats,\r
193         IN      MULTI_CHANNEL_ACTION            multi_channel_action,\r
194         IN      srp_ib_port_id_t                                *p_initiator_port_id,\r
195         IN      srp_ib_port_id_t                                *p_target_port_id )\r
196 {\r
197         init_srp_login_request( p_information_unit, iu_tag );\r
198         set_srp_login_request_req_max_init_to_targ_iu( p_information_unit, req_max_init_to_targ_iu );\r
199         set_srp_login_request_required_data_buffer_formats( p_information_unit, data_buffer_descriptor_formats );\r
200         set_srp_login_request_multi_channel_action( p_information_unit, multi_channel_action );\r
201         set_srp_login_request_it_nexus( p_information_unit, p_initiator_port_id, p_target_port_id );\r
202 }\r
203 \r
204 /* get_srp_login_request_tag */\r
205 /*!\r
206 Returns the value of the tag field of a login request\r
207 \r
208 @param p_information_unit - pointer to the IU structure\r
209 \r
210 @return - tag value\r
211 */\r
212 static inline\r
213 uint64_t\r
214 get_srp_login_request_tag(\r
215         IN  srp_login_req_t *p_information_unit )\r
216 {\r
217         return( get_srp_information_unit_tag( ( srp_information_unit_t* ) p_information_unit ) );\r
218 }\r
219 \r
220 /* get_srp_login_request_req_max_init_to_targ_iu */\r
221 /*!\r
222 Returns the requested max initiator to target information unit size\r
223 \r
224 @param p_information_unit - pointer to the IU structure\r
225 \r
226 @return - requested max initiator to target information unit size value\r
227 */\r
228 static inline\r
229 uint32_t\r
230 get_srp_login_request_req_max_init_to_targ_iu(\r
231         IN  srp_login_req_t *p_information_unit )\r
232 {\r
233         return( p_information_unit->req_max_init_to_targ_iu );\r
234 }\r
235 \r
236 /* get_srp_login_request_required_data_buffer_formats */\r
237 /*!\r
238 Returns the required data buffer formats to be used on the channel\r
239 \r
240 @param p_information_unit - pointer to the IU structure\r
241 \r
242 @return - required data buffer formats settings\r
243 */\r
244 static inline\r
245 DATA_BUFFER_DESCRIPTOR_FORMAT\r
246 get_srp_login_request_required_data_buffer_formats(\r
247         IN  srp_login_req_t *p_information_unit )\r
248 {\r
249         switch ( p_information_unit->req_buffer_fmts.flags & DATA_BUFFER_DESCRIPTOR_FORMAT_MASK )\r
250         {\r
251                 case DIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED:\r
252                         return( DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR );\r
253 \r
254                 case INDIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED:\r
255                         return( DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS );\r
256 \r
257                 case DIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED | INDIRECT_DATA_BUFFER_DESCRIPTOR_REQUESTED:\r
258                         return( ( DATA_BUFFER_DESCRIPTOR_FORMAT ) ( DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR | DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS ) );\r
259 \r
260                 default:\r
261                         return( DBDF_NO_DATA_BUFFER_DESCRIPTOR_PRESENT );\r
262         }\r
263 }\r
264 \r
265 /* get_srp_login_request_multi_channel_action */\r
266 /*!\r
267 Returns the multi channel action setting\r
268 \r
269 @param p_information_unit - pointer to the IU structure\r
270 \r
271 @return - multi channel action setting\r
272 */\r
273 static inline\r
274 MULTI_CHANNEL_ACTION\r
275 get_srp_login_request_multi_channel_action(\r
276         IN  srp_login_req_t *p_information_unit )\r
277 {\r
278         return( ( MULTI_CHANNEL_ACTION ) ( p_information_unit->flags & MULTI_CHANNEL_ACTION_MASK ) );\r
279 }\r
280 \r
281 /* get_srp_login_request_initiator_port_id */\r
282 /*!\r
283 Returns the initiator port identifier\r
284 \r
285 @param p_information_unit - pointer to the IU structure\r
286 \r
287 @return - pointer to initiator port id value\r
288 */\r
289 static inline\r
290 srp_ib_port_id_t*\r
291 get_srp_login_request_initiator_port_id(\r
292         IN  srp_login_req_t *p_information_unit )\r
293 {\r
294         return( &p_information_unit->initiator_port_id );\r
295 }\r
296 \r
297 /* get_srp_login_request_target_port_id */\r
298 /*!\r
299 Returns the target port identifier\r
300 \r
301 @param p_information_unit - pointer to the IU structure\r
302 \r
303 @return - pointer to target port id value\r
304 */\r
305 static inline\r
306 srp_ib_port_id_t*\r
307 get_srp_login_request_target_port_id(\r
308         IN  srp_login_req_t *p_information_unit )\r
309 {\r
310         return( &p_information_unit->target_port_id );\r
311 }\r
312 \r
313 /* get_srp_login_request_length */\r
314 /*!\r
315 Returns the size in bytes of the Srp Login Request IU\r
316 \r
317 @param p_information_unit - pointer to the IU structure\r
318 \r
319 @return - tag value\r
320 */\r
321 static inline\r
322 uint32_t\r
323 get_srp_login_request_length(\r
324         IN  srp_login_req_t *p_information_unit )\r
325 {\r
326         return( sizeof( *p_information_unit ) );\r
327 }\r
328 \r
329 /* set_srp_login_request_from_host_to_network */\r
330 /*!\r
331 Swaps the IU fields from Host to Network ordering\r
332 \r
333 @param p_information_unit - pointer to the IU structure\r
334 \r
335 @return - none\r
336 */\r
337 \r
338 static inline\r
339 void\r
340 set_srp_login_request_from_host_to_network(\r
341         IN OUT  srp_login_req_t *p_information_unit )\r
342 {\r
343         set_srp_information_unit_from_host_to_network( ( srp_information_unit_t* ) p_information_unit );\r
344         p_information_unit->req_max_init_to_targ_iu        = cl_hton32( p_information_unit->req_max_init_to_targ_iu );\r
345 }\r
346 \r
347 /* set_srp_login_request_from_network_to_host */\r
348 /*!\r
349 Swaps the IU fields from Network to Host ordering\r
350 \r
351 @param p_information_unit - pointer to the IU structure\r
352 \r
353 @return - none\r
354 */\r
355 \r
356 static inline\r
357 void\r
358 set_srp_login_request_from_network_to_host(\r
359         IN OUT  srp_login_req_t *p_information_unit )\r
360 {\r
361         set_srp_login_request_from_host_to_network ( p_information_unit );\r
362 }\r
363 \r
364 #endif /* SRP_LOGIN_REQ_H_INCLUDED */\r