[OpenSM] - cosmetic changes
[mirror/winof/.git] / ulp / opensm / user / opensm / osm_sa_class_port_info.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_cpi_rcv_t.
38  * This object represents the ClassPortInfo Receiver object.
39  * This object is part of the opensm family of objects.
40  *
41  * Environment:
42  *    Linux User Mode
43  *
44  * $Revision: 1.8 $
45  */
46
47 /*
48   Next available error code: 0x403
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_qmap.h>
58 #include <complib/cl_passivelock.h>
59 #include <complib/cl_debug.h>
60 #include <complib/cl_qlist.h>
61 #include <opensm/osm_sa_class_port_info.h>
62 #include <vendor/osm_vendor.h>
63 #include <vendor/osm_vendor_api.h>
64 #include <opensm/osm_helper.h>
65
66 /**********************************************************************
67  **********************************************************************/
68 void
69 osm_cpi_rcv_construct(
70   IN osm_cpi_rcv_t* const p_rcv )
71 {
72   cl_memclr( p_rcv, sizeof(*p_rcv) );
73 }
74
75 /**********************************************************************
76  **********************************************************************/
77 void
78 osm_cpi_rcv_destroy(
79   IN osm_cpi_rcv_t* const p_rcv )
80 {
81   OSM_LOG_ENTER( p_rcv->p_log, osm_cpi_rcv_destroy );
82   OSM_LOG_EXIT( p_rcv->p_log );
83 }
84
85 /**********************************************************************
86  **********************************************************************/
87 ib_api_status_t
88 osm_cpi_rcv_init(
89   IN osm_cpi_rcv_t*     const p_rcv,
90   IN osm_sa_resp_t*     const p_resp,
91   IN osm_mad_pool_t*    const p_mad_pool,
92   IN osm_subn_t*        const p_subn,
93   IN osm_log_t*         const p_log,
94   IN cl_plock_t*        const p_lock )
95 {
96   ib_api_status_t status = IB_SUCCESS;
97
98   OSM_LOG_ENTER( p_log, osm_cpi_rcv_init );
99
100   osm_cpi_rcv_construct( p_rcv );
101
102   p_rcv->p_log = p_log;
103   p_rcv->p_subn = p_subn;
104   p_rcv->p_lock = p_lock;
105   p_rcv->p_resp = p_resp;
106   p_rcv->p_mad_pool = p_mad_pool;
107
108   OSM_LOG_EXIT( p_rcv->p_log );
109   return( status );
110 }
111
112 /**********************************************************************
113  **********************************************************************/
114 static void
115 __osm_cpi_rcv_respond(
116   IN osm_cpi_rcv_t*        const p_rcv,
117   IN const osm_madw_t*     const p_madw)
118 {
119   osm_madw_t*              p_resp_madw;
120   const ib_sa_mad_t*    p_sa_mad;
121   ib_sa_mad_t*          p_resp_sa_mad;
122   ib_class_port_info_t    *p_resp_cpi;
123   ib_api_status_t       status;
124   ib_gid_t                zero_gid;
125
126   OSM_LOG_ENTER( p_rcv->p_log, __osm_cpi_rcv_respond );
127
128   cl_memclr(&zero_gid, sizeof(ib_gid_t));
129
130   /*
131     Get a MAD to reply. Address of Mad is in the received mad_wrapper
132   */
133   p_resp_madw = osm_mad_pool_get( p_rcv->p_mad_pool, 
134                                   p_madw->h_bind,
135                                   MAD_BLOCK_SIZE,
136                                   &p_madw->mad_addr );
137   if( !p_resp_madw )
138   {
139     osm_log( p_rcv->p_log, OSM_LOG_ERROR,
140              "__osm_cpi_rcv_respond: ERR 1408: "
141              "Unable to allocate MAD\n" );
142     goto Exit;
143   }
144
145   p_sa_mad = osm_madw_get_sa_mad_ptr( p_madw );
146   p_resp_sa_mad = osm_madw_get_sa_mad_ptr( p_resp_madw );
147
148   cl_memcpy( p_resp_sa_mad, p_sa_mad, IB_SA_MAD_HDR_SIZE );
149   p_resp_sa_mad->method |= IB_MAD_METHOD_RESP_MASK;
150   /* C15-0.1.5 - always return SM_Key = 0 (table 151 p 782) */
151   p_resp_sa_mad->sm_key = 0;
152   p_resp_sa_mad->paylen_newwin = 0;
153
154   p_resp_cpi = (ib_class_port_info_t*)ib_sa_mad_get_payload_ptr( p_resp_sa_mad );
155
156   /* finally do it (the job) man ! */
157   p_resp_cpi->base_ver = 1;
158   p_resp_cpi->class_ver = 2;
159   p_resp_cpi->resp_time_val = p_rcv->p_subn->opt.transaction_timeout;
160   p_resp_cpi->redir_gid = zero_gid;
161   p_resp_cpi->redir_tc_sl_fl = 0;
162   p_resp_cpi->redir_lid = 0;
163   p_resp_cpi->redir_pkey = 0;
164   p_resp_cpi->redir_qp = CL_NTOH32(1);
165   p_resp_cpi->redir_qkey = IB_QP1_WELL_KNOWN_Q_KEY;
166   p_resp_cpi->trap_gid = zero_gid;
167   p_resp_cpi->trap_tc_sl_fl = 0;
168   p_resp_cpi->trap_lid = 0;
169   p_resp_cpi->trap_pkey = 0;
170   p_resp_cpi->trap_hop_qp = 0;
171   p_resp_cpi->trap_qkey = IB_QP1_WELL_KNOWN_Q_KEY;
172
173   /* set specific capability mask bits */
174   /* we do not support the optionals:
175      OSM_CAP_IS_SUBN_OPT_RECS_SUP :
176      SwitchInfoRecord,
177      LinearForwardingTableRecord, (we do support it under the table)
178      RandomForwardingTableRecord,
179      MulticastForwardingTableRecord,
180      SMInfoRecord, (we do support it under the table)
181      InformInfoRecord,
182      LinkRecord, (we do support it under the table)
183      ServiceAssociationRecord
184
185      OSM_CAP_IS_SUBN_OPT_MULTI_PATH_SUP:
186      MultiPathRecord,
187      TraceRecord
188
189      OSM_CAP_IS_SUBN_OPT_REINIT_SUP:
190      For reinitialization functionality.
191
192      So not sending traps, but supporting Get(Notice) and Set(Notice):
193   */
194   p_resp_cpi->cap_mask = 0x2; /* Note host notation replaced later */
195   if (p_rcv->p_subn->opt.no_multicast_option != TRUE)
196     p_resp_cpi->cap_mask |= OSM_CAP_IS_UD_MCAST_SUP;
197
198   p_resp_cpi->cap_mask = cl_hton16(p_resp_cpi->cap_mask);
199
200   if( osm_log_is_active( p_rcv->p_log, OSM_LOG_FRAMES ) )
201     osm_dump_sa_mad( p_rcv->p_log, p_resp_sa_mad, OSM_LOG_FRAMES );
202
203   status = osm_vendor_send( p_resp_madw->h_bind, p_resp_madw,  FALSE );
204   if( status != IB_SUCCESS )
205   {
206     osm_log( p_rcv->p_log, OSM_LOG_ERROR,
207              "__osm_cpi_rcv_respond: ERR 1409: "
208              "Unable to send MAD (%s)\n", ib_get_err_str( status ) );
209     /*  osm_mad_pool_put( p_rcv->p_mad_pool, p_resp_madw ); */
210     goto Exit;
211   }
212
213  Exit:
214   OSM_LOG_EXIT( p_rcv->p_log );
215 }
216
217 /**********************************************************************
218  * This code actually handles the call
219  **********************************************************************/
220 void
221 osm_cpi_rcv_process(
222   IN osm_cpi_rcv_t*        const p_rcv,
223   IN const osm_madw_t*     const p_madw )
224 {
225   const ib_path_rec_t*     p_pr;
226   const ib_sa_mad_t*    p_sa_mad;
227
228   OSM_LOG_ENTER( p_rcv->p_log, osm_cpi_rcv_process );
229
230   CL_ASSERT( p_madw );
231
232   p_sa_mad = osm_madw_get_sa_mad_ptr( p_madw );
233
234   /* we only supports GET */
235   if (p_sa_mad->method != IB_MAD_METHOD_GET)
236   {
237     osm_log( p_rcv->p_log, OSM_LOG_ERROR,
238              "osm_cpi_rcv_process: ERR 1403: "
239              "Unsupported Method (%s)\n",
240              ib_get_sa_method_str( p_sa_mad->method ) );
241     osm_sa_send_error( p_rcv->p_resp, p_madw, IB_SA_MAD_STATUS_REQ_INVALID);
242     goto Exit;
243   }
244
245   p_pr = (ib_path_rec_t*)ib_sa_mad_get_payload_ptr( p_sa_mad );
246
247   CL_ASSERT( p_sa_mad->attr_id == IB_MAD_ATTR_CLASS_PORT_INFO );
248
249   /*
250     CLASS PORT INFO does not really look on the SMDB - no lock required.
251   */
252
253   __osm_cpi_rcv_respond( p_rcv, p_madw);
254
255  Exit:
256   OSM_LOG_EXIT( p_rcv->p_log );
257 }