908bb9f80939f1a2fb3fd13d2f5e197f05032514
[mirror/winof/.git] / ulp / opensm / user / opensm / osm_req.c
1 /*
2  * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5  *
6  * This software is available to you under the OpenIB.org BSD license
7  * below:
8  *
9  *     Redistribution and use in source and binary forms, with or
10  *     without modification, are permitted provided that the following
11  *     conditions are met:
12  *
13  *      - Redistributions of source code must retain the above
14  *        copyright notice, this list of conditions and the following
15  *        disclaimer.
16  *
17  *      - Redistributions in binary form must reproduce the above
18  *        copyright notice, this list of conditions and the following
19  *        disclaimer in the documentation and/or other materials
20  *        provided with the distribution.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
26  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
28  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29  * SOFTWARE.
30  *
31  * $Id$
32  */
33
34
35 /*
36  * Abstract:
37  *    Implementation of osm_req_t.
38  * This object represents the generic attribute requester.
39  * This object is part of the opensm family of objects.
40  *
41  * Environment:
42  *    Linux User Mode
43  *
44  * $Revision: 1.6 $
45  */
46
47 /*
48   Next available error code: 0x300
49 */
50
51 #if HAVE_CONFIG_H
52 #  include <config.h>
53 #endif /* HAVE_CONFIG_H */
54
55 #include <iba/ib_types.h>
56 #include <complib/cl_memory.h>
57 #include <complib/cl_debug.h>
58 #include <opensm/osm_req.h>
59 #include <opensm/osm_madw.h>
60 #include <opensm/osm_attrib_req.h>
61 #include <opensm/osm_log.h>
62 #include <opensm/osm_helper.h>
63 #include <opensm/osm_mad_pool.h>
64 #include <opensm/osm_vl15intf.h>
65 #include <opensm/osm_msgdef.h>
66 #include <opensm/osm_opensm.h>
67
68 /**********************************************************************
69  **********************************************************************/
70 void
71 osm_req_construct(
72   IN osm_req_t* const p_req )
73 {
74   cl_memclr( p_req, sizeof(*p_req) );
75 }
76
77 /**********************************************************************
78  **********************************************************************/
79 void
80 osm_req_destroy(
81   IN osm_req_t* const p_req )
82 {
83   CL_ASSERT( p_req );
84 }
85
86
87 /**********************************************************************
88  **********************************************************************/
89 ib_api_status_t
90 osm_req_init(
91   IN osm_req_t*            const p_req,
92   IN osm_mad_pool_t*       const p_pool,
93   IN osm_vl15_t*           const p_vl15,
94   IN osm_subn_t*           const p_subn,
95   IN osm_log_t*            const p_log,
96   IN atomic32_t*           const p_sm_trans_id )
97 {
98   ib_api_status_t status = IB_SUCCESS;
99   OSM_LOG_ENTER( p_log, osm_req_init );
100
101   osm_req_construct( p_req );
102   p_req->p_log = p_log;
103
104
105   p_req->p_pool = p_pool;
106   p_req->p_vl15 = p_vl15;
107   p_req->p_subn = p_subn;
108   p_req->p_sm_trans_id = p_sm_trans_id;
109
110   OSM_LOG_EXIT( p_log );
111   return( status );
112 }
113
114 /**********************************************************************
115   The plock MAY or MAY NOT be held before calling this function.
116 **********************************************************************/
117 ib_api_status_t
118 osm_req_get(
119   IN const osm_req_t* const p_req,
120   IN const osm_dr_path_t* const p_path,
121   IN const uint16_t attr_id,
122   IN const uint32_t attr_mod,
123   IN const cl_disp_msgid_t err_msg,
124   IN const osm_madw_context_t* const p_context )
125 {
126   osm_madw_t *p_madw;
127   ib_api_status_t status = IB_SUCCESS;
128   ib_net64_t tid;
129
130   OSM_LOG_ENTER( p_req->p_log, osm_req_get );
131
132   CL_ASSERT( p_req );
133   CL_ASSERT( p_path );
134   CL_ASSERT( attr_id );
135
136   /* do nothing if we are exiting ... */
137   if (osm_exit_flag) goto Exit;
138
139   /* p_context may be NULL. */
140
141   p_madw = osm_mad_pool_get(
142     p_req->p_pool,
143     p_path->h_bind,
144     MAD_BLOCK_SIZE,
145     NULL );
146
147   if( p_madw == NULL )
148   {
149     osm_log( p_req->p_log, OSM_LOG_ERROR,
150              "osm_req_get: ERR 1101: "
151              "Unable to acquire MAD.\n" );
152     status = IB_INSUFFICIENT_RESOURCES;
153     goto Exit;
154   }
155
156   tid = cl_hton64( (uint64_t)cl_atomic_inc( p_req->p_sm_trans_id ) );
157
158   if( osm_log_is_active( p_req->p_log, OSM_LOG_DEBUG ) )
159   {
160     osm_log( p_req->p_log, OSM_LOG_DEBUG,
161              "osm_req_get: "
162              "Getting %s (0x%X), modifier = 0x%X, TID = 0x%" PRIx64 ".\n",
163              ib_get_sm_attr_str( attr_id ),
164              cl_ntoh16( attr_id ),
165              cl_ntoh32( attr_mod ),
166              cl_ntoh64( tid ) );
167   }
168
169   ib_smp_init_new(
170     osm_madw_get_smp_ptr( p_madw ),
171     IB_MAD_METHOD_GET,
172     tid,
173     attr_id,
174     attr_mod,
175     p_path->hop_count,
176     p_req->p_subn->opt.m_key,
177     p_path->path,
178     IB_LID_PERMISSIVE,
179     IB_LID_PERMISSIVE );
180
181   p_madw->mad_addr.dest_lid = IB_LID_PERMISSIVE;
182   p_madw->mad_addr.addr_type.smi.source_lid = IB_LID_PERMISSIVE;
183   p_madw->resp_expected = TRUE;
184   p_madw->fail_msg = err_msg;
185
186   /*
187     Fill in the mad wrapper context for the recipient.
188     In this case, the only thing the recipient needs is the
189     guid value.
190   */
191
192   if( p_context )
193     p_madw->context = *p_context;
194
195   osm_vl15_post( p_req->p_vl15, p_madw );
196
197  Exit:
198   OSM_LOG_EXIT( p_req->p_log );
199   return( status );
200 }
201
202 /**********************************************************************
203   The plock MAY or MAY NOT be held before calling this function.
204 **********************************************************************/
205 ib_api_status_t
206 osm_req_set(
207   IN const osm_req_t* const p_req,
208   IN const osm_dr_path_t* const p_path,
209   IN const uint8_t* const p_payload,
210   IN const uint16_t attr_id,
211   IN const uint32_t attr_mod,
212   IN const cl_disp_msgid_t err_msg,
213   IN const osm_madw_context_t* const p_context )
214 {
215   osm_madw_t *p_madw;
216   ib_api_status_t status = IB_SUCCESS;
217   ib_net64_t tid;
218
219   OSM_LOG_ENTER( p_req->p_log, osm_req_set );
220
221   CL_ASSERT( p_req );
222   CL_ASSERT( p_path );
223   CL_ASSERT( attr_id );
224   CL_ASSERT( p_payload );
225
226   /* do nothing if we are exiting ... */
227   if (osm_exit_flag) goto Exit;
228
229   /* p_context may be NULL. */
230
231   p_madw = osm_mad_pool_get(
232     p_req->p_pool,
233     p_path->h_bind,
234     MAD_BLOCK_SIZE,
235     NULL );
236
237   if( p_madw == NULL )
238   {
239     osm_log( p_req->p_log, OSM_LOG_ERROR,
240              "osm_req_set: ERR 1102: "
241              "Unable to acquire MAD.\n" );
242     status = IB_INSUFFICIENT_RESOURCES;
243     goto Exit;
244   }
245
246   tid = cl_hton64( (uint64_t)cl_atomic_inc( p_req->p_sm_trans_id ) );
247
248   if( osm_log_is_active( p_req->p_log, OSM_LOG_DEBUG ) )
249   {
250     osm_log( p_req->p_log, OSM_LOG_DEBUG,
251              "osm_req_set: "
252              "Setting %s (0x%X), modifier = 0x%X, TID = 0x%" PRIx64 ".\n",
253              ib_get_sm_attr_str( attr_id ),
254              cl_ntoh16( attr_id ),
255              cl_ntoh32( attr_mod ),
256              cl_ntoh64( tid ) );
257   }
258
259   ib_smp_init_new(
260     osm_madw_get_smp_ptr( p_madw ),
261     IB_MAD_METHOD_SET,
262     tid,
263     attr_id,
264     attr_mod,
265     p_path->hop_count,
266     p_req->p_subn->opt.m_key,
267     p_path->path,
268     IB_LID_PERMISSIVE,
269     IB_LID_PERMISSIVE );
270
271   p_madw->mad_addr.dest_lid = IB_LID_PERMISSIVE;
272   p_madw->mad_addr.addr_type.smi.source_lid = IB_LID_PERMISSIVE;
273   p_madw->resp_expected = TRUE;
274   p_madw->fail_msg = err_msg;
275
276   /*
277     Fill in the mad wrapper context for the recipient.
278     In this case, the only thing the recipient needs is the
279     guid value.
280   */
281
282   if( p_context )
283     p_madw->context = *p_context;
284
285   cl_memcpy( osm_madw_get_smp_ptr( p_madw )->data,
286              p_payload, IB_SMP_DATA_SIZE );
287
288   osm_vl15_post( p_req->p_vl15, p_madw );
289
290  Exit:
291   OSM_LOG_EXIT( p_req->p_log );
292   return( status );
293 }
294
295
296
297
298