1d6b92ffaSHans Petter Selasky /*
2d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
3d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved.
4d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5d6b92ffaSHans Petter Selasky  * Copyright (c) 2009 HNR Consulting. All rights reserved.
6d6b92ffaSHans Petter Selasky  * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
7d6b92ffaSHans Petter Selasky  *
8d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
9d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
10d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
11d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
12d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
13d6b92ffaSHans Petter Selasky  *
14d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
15d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
16d6b92ffaSHans Petter Selasky  *     conditions are met:
17d6b92ffaSHans Petter Selasky  *
18d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
19d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
20d6b92ffaSHans Petter Selasky  *        disclaimer.
21d6b92ffaSHans Petter Selasky  *
22d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
23d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
24d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
25d6b92ffaSHans Petter Selasky  *        provided with the distribution.
26d6b92ffaSHans Petter Selasky  *
27d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34d6b92ffaSHans Petter Selasky  * SOFTWARE.
35d6b92ffaSHans Petter Selasky  *
36d6b92ffaSHans Petter Selasky  */
37d6b92ffaSHans Petter Selasky 
38d6b92ffaSHans Petter Selasky /*
39d6b92ffaSHans Petter Selasky  * Abstract:
40d6b92ffaSHans Petter Selasky  *    Implementation of osm_sm_mad_ctrl_t.
41d6b92ffaSHans Petter Selasky  * This object represents the SM MAD request controller object.
42d6b92ffaSHans Petter Selasky  * This object is part of the opensm family of objects.
43d6b92ffaSHans Petter Selasky  */
44d6b92ffaSHans Petter Selasky 
45d6b92ffaSHans Petter Selasky #if HAVE_CONFIG_H
46d6b92ffaSHans Petter Selasky #  include <config.h>
47d6b92ffaSHans Petter Selasky #endif				/* HAVE_CONFIG_H */
48d6b92ffaSHans Petter Selasky 
49d6b92ffaSHans Petter Selasky #include <string.h>
50d6b92ffaSHans Petter Selasky #include <complib/cl_debug.h>
51d6b92ffaSHans Petter Selasky #include <iba/ib_types.h>
52d6b92ffaSHans Petter Selasky #include <opensm/osm_file_ids.h>
53d6b92ffaSHans Petter Selasky #define FILE_ID OSM_FILE_SM_MAD_CTRL_C
54d6b92ffaSHans Petter Selasky #include <opensm/osm_sm_mad_ctrl.h>
55d6b92ffaSHans Petter Selasky #include <vendor/osm_vendor_api.h>
56d6b92ffaSHans Petter Selasky #include <opensm/osm_madw.h>
57d6b92ffaSHans Petter Selasky #include <opensm/osm_msgdef.h>
58d6b92ffaSHans Petter Selasky #include <opensm/osm_helper.h>
59d6b92ffaSHans Petter Selasky #include <opensm/osm_opensm.h>
60d6b92ffaSHans Petter Selasky 
61d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_retire_trans_mad
62d6b92ffaSHans Petter Selasky  * NAME
63d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_retire_trans_mad
64d6b92ffaSHans Petter Selasky  *
65d6b92ffaSHans Petter Selasky  * DESCRIPTION
66d6b92ffaSHans Petter Selasky  * This function handles clean-up of MADs associated with the SM's
67d6b92ffaSHans Petter Selasky  * outstanding transactions on the wire.
68d6b92ffaSHans Petter Selasky  *
69d6b92ffaSHans Petter Selasky  * SYNOPSIS
70d6b92ffaSHans Petter Selasky  */
71d6b92ffaSHans Petter Selasky 
sm_mad_ctrl_retire_trans_mad(IN osm_sm_mad_ctrl_t * p_ctrl,IN osm_madw_t * p_madw)72d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_retire_trans_mad(IN osm_sm_mad_ctrl_t * p_ctrl,
73d6b92ffaSHans Petter Selasky 					 IN osm_madw_t * p_madw)
74d6b92ffaSHans Petter Selasky {
75d6b92ffaSHans Petter Selasky 	uint32_t outstanding;
76d6b92ffaSHans Petter Selasky 
77d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
78d6b92ffaSHans Petter Selasky 
79d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_madw);
80d6b92ffaSHans Petter Selasky 	/*
81d6b92ffaSHans Petter Selasky 	   Return the MAD & wrapper to the pool.
82d6b92ffaSHans Petter Selasky 	 */
83d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG,
84d6b92ffaSHans Petter Selasky 		"Retiring MAD with TID 0x%" PRIx64 "\n",
85d6b92ffaSHans Petter Selasky 		cl_ntoh64(osm_madw_get_smp_ptr(p_madw)->trans_id));
86d6b92ffaSHans Petter Selasky 
87d6b92ffaSHans Petter Selasky 	osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
88d6b92ffaSHans Petter Selasky 
89d6b92ffaSHans Petter Selasky 	outstanding = osm_stats_dec_qp0_outstanding(p_ctrl->p_stats);
90d6b92ffaSHans Petter Selasky 
91d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "%u QP0 MADs outstanding%s\n",
92d6b92ffaSHans Petter Selasky 		p_ctrl->p_stats->qp0_mads_outstanding,
93d6b92ffaSHans Petter Selasky 		outstanding ? "" : ": wire is clean.");
94d6b92ffaSHans Petter Selasky 
95d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
96d6b92ffaSHans Petter Selasky }
97d6b92ffaSHans Petter Selasky 
98d6b92ffaSHans Petter Selasky /************/
99d6b92ffaSHans Petter Selasky 
100d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_disp_done_callback
101d6b92ffaSHans Petter Selasky  * NAME
102d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_disp_done_callback
103d6b92ffaSHans Petter Selasky  *
104d6b92ffaSHans Petter Selasky  * DESCRIPTION
105d6b92ffaSHans Petter Selasky  * This function is the Dispatcher callback that indicates
106d6b92ffaSHans Petter Selasky  * a received MAD has been processed by the recipient.
107d6b92ffaSHans Petter Selasky  *
108d6b92ffaSHans Petter Selasky  * SYNOPSIS
109d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_disp_done_callback(IN void * context,IN void * p_data)110d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_disp_done_callback(IN void *context, IN void *p_data)
111d6b92ffaSHans Petter Selasky {
112d6b92ffaSHans Petter Selasky 	osm_sm_mad_ctrl_t *p_ctrl = context;
113d6b92ffaSHans Petter Selasky 	osm_madw_t *p_madw = p_data;
114d6b92ffaSHans Petter Selasky 	ib_smp_t *p_smp;
115d6b92ffaSHans Petter Selasky 
116d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
117d6b92ffaSHans Petter Selasky 
118d6b92ffaSHans Petter Selasky 	/*
119d6b92ffaSHans Petter Selasky 	   If the MAD that just finished processing was a response,
120d6b92ffaSHans Petter Selasky 	   then retire the transaction, since we must have generated
121d6b92ffaSHans Petter Selasky 	   the request.
122d6b92ffaSHans Petter Selasky 
123d6b92ffaSHans Petter Selasky 	   Otherwise, retire the transaction if a response was expected,
124d6b92ffaSHans Petter Selasky 	   as in the case of a send failure. If a response was not expected,
125d6b92ffaSHans Petter Selasky 	   just put the MAD back in the pool, because the MAD was a query
126d6b92ffaSHans Petter Selasky 	   from some outside agent, e.g. Get(SMInfo) from another SM.
127d6b92ffaSHans Petter Selasky 	 */
128d6b92ffaSHans Petter Selasky 	p_smp = osm_madw_get_smp_ptr(p_madw);
129d6b92ffaSHans Petter Selasky 	if (ib_smp_is_response(p_smp)) {
130d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_madw->resp_expected == FALSE);
131d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw);
132d6b92ffaSHans Petter Selasky 	} else if (p_madw->resp_expected == TRUE)
133d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw);
134d6b92ffaSHans Petter Selasky 	else
135d6b92ffaSHans Petter Selasky 		osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
136d6b92ffaSHans Petter Selasky 
137d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
138d6b92ffaSHans Petter Selasky }
139d6b92ffaSHans Petter Selasky 
140d6b92ffaSHans Petter Selasky /************/
141d6b92ffaSHans Petter Selasky 
142d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_update_wire_stats
143d6b92ffaSHans Petter Selasky  * NAME
144d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_update_wire_stats
145d6b92ffaSHans Petter Selasky  *
146d6b92ffaSHans Petter Selasky  * DESCRIPTION
147d6b92ffaSHans Petter Selasky  * Updates wire stats for outstanding MADs and calls the VL15 poller.
148d6b92ffaSHans Petter Selasky  *
149d6b92ffaSHans Petter Selasky  * SYNOPSIS
150d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_update_wire_stats(IN osm_sm_mad_ctrl_t * p_ctrl)151d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_update_wire_stats(IN osm_sm_mad_ctrl_t * p_ctrl)
152d6b92ffaSHans Petter Selasky {
153d6b92ffaSHans Petter Selasky 	uint32_t mads_on_wire;
154d6b92ffaSHans Petter Selasky 
155d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
156d6b92ffaSHans Petter Selasky 
157d6b92ffaSHans Petter Selasky 	mads_on_wire =
158d6b92ffaSHans Petter Selasky 	    cl_atomic_dec(&p_ctrl->p_stats->qp0_mads_outstanding_on_wire);
159d6b92ffaSHans Petter Selasky 
160d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG,
161d6b92ffaSHans Petter Selasky 		"%u SMPs on the wire, %u outstanding\n", mads_on_wire,
162d6b92ffaSHans Petter Selasky 		p_ctrl->p_stats->qp0_mads_outstanding);
163d6b92ffaSHans Petter Selasky 
164d6b92ffaSHans Petter Selasky 	/*
165d6b92ffaSHans Petter Selasky 	   We can signal the VL15 controller to send another MAD
166d6b92ffaSHans Petter Selasky 	   if any are waiting for transmission.
167d6b92ffaSHans Petter Selasky 	 */
168d6b92ffaSHans Petter Selasky 	osm_vl15_poll(p_ctrl->p_vl15);
169d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
170d6b92ffaSHans Petter Selasky }
171d6b92ffaSHans Petter Selasky 
172d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_process_get_resp
173d6b92ffaSHans Petter Selasky  * NAME
174d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_process_get_resp
175d6b92ffaSHans Petter Selasky  *
176d6b92ffaSHans Petter Selasky  * DESCRIPTION
177d6b92ffaSHans Petter Selasky  * This function handles method GetResp() for received MADs.
178d6b92ffaSHans Petter Selasky  * This is the most common path for QP0 MADs.
179d6b92ffaSHans Petter Selasky  *
180d6b92ffaSHans Petter Selasky  * SYNOPSIS
181d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_process_get_resp(IN osm_sm_mad_ctrl_t * p_ctrl,IN osm_madw_t * p_madw,IN void * transaction_context)182d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_process_get_resp(IN osm_sm_mad_ctrl_t * p_ctrl,
183d6b92ffaSHans Petter Selasky 					 IN osm_madw_t * p_madw,
184d6b92ffaSHans Petter Selasky 					 IN void *transaction_context)
185d6b92ffaSHans Petter Selasky {
186d6b92ffaSHans Petter Selasky 	ib_smp_t *p_smp;
187d6b92ffaSHans Petter Selasky 	cl_status_t status;
188d6b92ffaSHans Petter Selasky 	osm_madw_t *p_old_madw;
189d6b92ffaSHans Petter Selasky 	cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE;
190d6b92ffaSHans Petter Selasky 
191d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
192d6b92ffaSHans Petter Selasky 
193d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_madw);
194d6b92ffaSHans Petter Selasky 	CL_ASSERT(transaction_context);
195d6b92ffaSHans Petter Selasky 
196d6b92ffaSHans Petter Selasky 	p_smp = osm_madw_get_smp_ptr(p_madw);
197d6b92ffaSHans Petter Selasky 
198d6b92ffaSHans Petter Selasky 	if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR && !ib_smp_is_d(p_smp)) {
199d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3102: "
200d6b92ffaSHans Petter Selasky 			"'D' bit not set in returned SMP\n");
201d6b92ffaSHans Petter Selasky 		osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_ERROR);
202d6b92ffaSHans Petter Selasky 	}
203d6b92ffaSHans Petter Selasky 
204d6b92ffaSHans Petter Selasky 	p_old_madw = transaction_context;
205d6b92ffaSHans Petter Selasky 
206d6b92ffaSHans Petter Selasky 	sm_mad_ctrl_update_wire_stats(p_ctrl);
207d6b92ffaSHans Petter Selasky 
208d6b92ffaSHans Petter Selasky 	/*
209d6b92ffaSHans Petter Selasky 	   Copy the MAD Wrapper context from the requesting MAD
210d6b92ffaSHans Petter Selasky 	   to the new MAD.  This mechanism allows the recipient
211d6b92ffaSHans Petter Selasky 	   controller to recover its own context regarding this
212d6b92ffaSHans Petter Selasky 	   MAD transaction.  Once we've copied the context, we
213d6b92ffaSHans Petter Selasky 	   can return the original MAD to the pool.
214d6b92ffaSHans Petter Selasky 	 */
215d6b92ffaSHans Petter Selasky 	osm_madw_copy_context(p_madw, p_old_madw);
216d6b92ffaSHans Petter Selasky 	osm_mad_pool_put(p_ctrl->p_mad_pool, p_old_madw);
217d6b92ffaSHans Petter Selasky 
218d6b92ffaSHans Petter Selasky 	/*
219d6b92ffaSHans Petter Selasky 	   Note that attr_id (like the rest of the MAD) is in
220d6b92ffaSHans Petter Selasky 	   network byte order.
221d6b92ffaSHans Petter Selasky 	 */
222d6b92ffaSHans Petter Selasky 	switch (p_smp->attr_id) {
223d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_NODE_DESC:
224d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_NODE_DESC;
225d6b92ffaSHans Petter Selasky 		break;
226d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_NODE_INFO:
227d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_NODE_INFO;
228d6b92ffaSHans Petter Selasky 		break;
229d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_GUID_INFO:
230d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_GUID_INFO;
231d6b92ffaSHans Petter Selasky 		break;
232d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_SWITCH_INFO:
233d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_SWITCH_INFO;
234d6b92ffaSHans Petter Selasky 		break;
235d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_PORT_INFO:
236d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_PORT_INFO;
237d6b92ffaSHans Petter Selasky 		break;
238d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_LIN_FWD_TBL:
239d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_LFT;
240d6b92ffaSHans Petter Selasky 		break;
241d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_MCAST_FWD_TBL:
242d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_MFT;
243d6b92ffaSHans Petter Selasky 		break;
244d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_SM_INFO:
245d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_SM_INFO;
246d6b92ffaSHans Petter Selasky 		break;
247d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_SLVL_TABLE:
248d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_SLVL;
249d6b92ffaSHans Petter Selasky 		break;
250d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_VL_ARBITRATION:
251d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_VL_ARB;
252d6b92ffaSHans Petter Selasky 		break;
253d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_P_KEY_TABLE:
254d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_PKEY;
255d6b92ffaSHans Petter Selasky 		break;
256d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_MLNX_EXTENDED_PORT_INFO:
257d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_MLNX_EXT_PORT_INFO;
258d6b92ffaSHans Petter Selasky 		break;
259d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_CLASS_PORT_INFO:
260d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_NOTICE:
261d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_INFORM_INFO:
262d6b92ffaSHans Petter Selasky 	default:
263d6b92ffaSHans Petter Selasky 		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
264d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3103: "
265d6b92ffaSHans Petter Selasky 			"Unsupported attribute 0x%X (%s)\n",
266d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_smp->attr_id),
267d6b92ffaSHans Petter Selasky 			ib_get_sm_attr_str(p_smp->attr_id));
268d6b92ffaSHans Petter Selasky 		osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_ERROR);
269d6b92ffaSHans Petter Selasky 		osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
270d6b92ffaSHans Petter Selasky 		goto Exit;
271d6b92ffaSHans Petter Selasky 	}
272d6b92ffaSHans Petter Selasky 
273d6b92ffaSHans Petter Selasky 	/*
274d6b92ffaSHans Petter Selasky 	   Post this MAD to the dispatcher for asynchronous
275d6b92ffaSHans Petter Selasky 	   processing by the appropriate controller.
276d6b92ffaSHans Petter Selasky 	 */
277d6b92ffaSHans Petter Selasky 
278d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "Posting Dispatcher message %s\n",
279d6b92ffaSHans Petter Selasky 		osm_get_disp_msg_str(msg_id));
280d6b92ffaSHans Petter Selasky 
281d6b92ffaSHans Petter Selasky 	status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw,
282d6b92ffaSHans Petter Selasky 			      sm_mad_ctrl_disp_done_callback, p_ctrl);
283d6b92ffaSHans Petter Selasky 
284d6b92ffaSHans Petter Selasky 	if (status != CL_SUCCESS) {
285d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3104: "
286d6b92ffaSHans Petter Selasky 			"Dispatcher post message failed (%s) for attribute 0x%X (%s)\n",
287d6b92ffaSHans Petter Selasky 			CL_STATUS_MSG(status), cl_ntoh16(p_smp->attr_id),
288d6b92ffaSHans Petter Selasky 			ib_get_sm_attr_str(p_smp->attr_id));
289d6b92ffaSHans Petter Selasky 		goto Exit;
290d6b92ffaSHans Petter Selasky 	}
291d6b92ffaSHans Petter Selasky 
292d6b92ffaSHans Petter Selasky Exit:
293d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
294d6b92ffaSHans Petter Selasky }
295d6b92ffaSHans Petter Selasky 
296d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_process_get
297d6b92ffaSHans Petter Selasky  * NAME
298d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_process_get
299d6b92ffaSHans Petter Selasky  *
300d6b92ffaSHans Petter Selasky  * DESCRIPTION
301d6b92ffaSHans Petter Selasky  * This function handles method Get() for received MADs.
302d6b92ffaSHans Petter Selasky  *
303d6b92ffaSHans Petter Selasky  * SYNOPSIS
304d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_process_get(IN osm_sm_mad_ctrl_t * p_ctrl,IN osm_madw_t * p_madw)305d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_process_get(IN osm_sm_mad_ctrl_t * p_ctrl,
306d6b92ffaSHans Petter Selasky 				    IN osm_madw_t * p_madw)
307d6b92ffaSHans Petter Selasky {
308d6b92ffaSHans Petter Selasky 	ib_smp_t *p_smp;
309d6b92ffaSHans Petter Selasky 	cl_status_t status;
310d6b92ffaSHans Petter Selasky 	cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE;
311d6b92ffaSHans Petter Selasky 
312d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
313d6b92ffaSHans Petter Selasky 
314d6b92ffaSHans Petter Selasky 	p_smp = osm_madw_get_smp_ptr(p_madw);
315d6b92ffaSHans Petter Selasky 
316d6b92ffaSHans Petter Selasky 	/*
317d6b92ffaSHans Petter Selasky 	   Note that attr_id (like the rest of the MAD) is in
318d6b92ffaSHans Petter Selasky 	   network byte order.
319d6b92ffaSHans Petter Selasky 	 */
320d6b92ffaSHans Petter Selasky 	switch (p_smp->attr_id) {
321d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_SM_INFO:
322d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_SM_INFO;
323d6b92ffaSHans Petter Selasky 		break;
324d6b92ffaSHans Petter Selasky 	default:
325d6b92ffaSHans Petter Selasky 		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
326d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_VERBOSE,
327d6b92ffaSHans Petter Selasky 			"Ignoring SubnGet MAD - unsupported attribute 0x%X\n",
328d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_smp->attr_id));
329d6b92ffaSHans Petter Selasky 		osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
330d6b92ffaSHans Petter Selasky 		goto Exit;
331d6b92ffaSHans Petter Selasky 	}
332d6b92ffaSHans Petter Selasky 
333d6b92ffaSHans Petter Selasky 	/*
334d6b92ffaSHans Petter Selasky 	   Post this MAD to the dispatcher for asynchronous
335d6b92ffaSHans Petter Selasky 	   processing by the appropriate controller.
336d6b92ffaSHans Petter Selasky 	 */
337d6b92ffaSHans Petter Selasky 
338d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "Posting Dispatcher message %s\n",
339d6b92ffaSHans Petter Selasky 		osm_get_disp_msg_str(msg_id));
340d6b92ffaSHans Petter Selasky 
341d6b92ffaSHans Petter Selasky 	status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw,
342d6b92ffaSHans Petter Selasky 			      sm_mad_ctrl_disp_done_callback, p_ctrl);
343d6b92ffaSHans Petter Selasky 
344d6b92ffaSHans Petter Selasky 	if (status != CL_SUCCESS) {
345d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3106: "
346d6b92ffaSHans Petter Selasky 			"Dispatcher post message failed (%s)\n",
347d6b92ffaSHans Petter Selasky 			CL_STATUS_MSG(status));
348d6b92ffaSHans Petter Selasky 		goto Exit;
349d6b92ffaSHans Petter Selasky 	}
350d6b92ffaSHans Petter Selasky 
351d6b92ffaSHans Petter Selasky Exit:
352d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
353d6b92ffaSHans Petter Selasky }
354d6b92ffaSHans Petter Selasky 
355d6b92ffaSHans Petter Selasky /*
356d6b92ffaSHans Petter Selasky  * PARAMETERS
357d6b92ffaSHans Petter Selasky  *
358d6b92ffaSHans Petter Selasky  * RETURN VALUES
359d6b92ffaSHans Petter Selasky  *
360d6b92ffaSHans Petter Selasky  * NOTES
361d6b92ffaSHans Petter Selasky  *
362d6b92ffaSHans Petter Selasky  * SEE ALSO
363d6b92ffaSHans Petter Selasky  *********/
364d6b92ffaSHans Petter Selasky 
365d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_process_set
366d6b92ffaSHans Petter Selasky  * NAME
367d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_process_set
368d6b92ffaSHans Petter Selasky  *
369d6b92ffaSHans Petter Selasky  * DESCRIPTION
370d6b92ffaSHans Petter Selasky  * This function handles method Set() for received MADs.
371d6b92ffaSHans Petter Selasky  *
372d6b92ffaSHans Petter Selasky  * SYNOPSIS
373d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_process_set(IN osm_sm_mad_ctrl_t * p_ctrl,IN osm_madw_t * p_madw)374d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_process_set(IN osm_sm_mad_ctrl_t * p_ctrl,
375d6b92ffaSHans Petter Selasky 				    IN osm_madw_t * p_madw)
376d6b92ffaSHans Petter Selasky {
377d6b92ffaSHans Petter Selasky 	ib_smp_t *p_smp;
378d6b92ffaSHans Petter Selasky 	cl_status_t status;
379d6b92ffaSHans Petter Selasky 	cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE;
380d6b92ffaSHans Petter Selasky 
381d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
382d6b92ffaSHans Petter Selasky 
383d6b92ffaSHans Petter Selasky 	p_smp = osm_madw_get_smp_ptr(p_madw);
384d6b92ffaSHans Petter Selasky 
385d6b92ffaSHans Petter Selasky 	/*
386d6b92ffaSHans Petter Selasky 	   Note that attr_id (like the rest of the MAD) is in
387d6b92ffaSHans Petter Selasky 	   network byte order.
388d6b92ffaSHans Petter Selasky 	 */
389d6b92ffaSHans Petter Selasky 	switch (p_smp->attr_id) {
390d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_SM_INFO:
391d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_SM_INFO;
392d6b92ffaSHans Petter Selasky 		break;
393d6b92ffaSHans Petter Selasky 	default:
394d6b92ffaSHans Petter Selasky 		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
395d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3107: "
396d6b92ffaSHans Petter Selasky 			"Unsupported attribute 0x%X (%s)\n",
397d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_smp->attr_id),
398d6b92ffaSHans Petter Selasky 			ib_get_sm_attr_str(p_smp->attr_id));
399d6b92ffaSHans Petter Selasky 		osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_ERROR);
400d6b92ffaSHans Petter Selasky 		osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
401d6b92ffaSHans Petter Selasky 		goto Exit;
402d6b92ffaSHans Petter Selasky 	}
403d6b92ffaSHans Petter Selasky 
404d6b92ffaSHans Petter Selasky 	/*
405d6b92ffaSHans Petter Selasky 	   Post this MAD to the dispatcher for asynchronous
406d6b92ffaSHans Petter Selasky 	   processing by the appropriate controller.
407d6b92ffaSHans Petter Selasky 	 */
408d6b92ffaSHans Petter Selasky 
409d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "Posting Dispatcher message %s\n",
410d6b92ffaSHans Petter Selasky 		osm_get_disp_msg_str(msg_id));
411d6b92ffaSHans Petter Selasky 
412d6b92ffaSHans Petter Selasky 	status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw,
413d6b92ffaSHans Petter Selasky 			      sm_mad_ctrl_disp_done_callback, p_ctrl);
414d6b92ffaSHans Petter Selasky 
415d6b92ffaSHans Petter Selasky 	if (status != CL_SUCCESS) {
416d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3108: "
417d6b92ffaSHans Petter Selasky 			"Dispatcher post message failed (%s)\n",
418d6b92ffaSHans Petter Selasky 			CL_STATUS_MSG(status));
419d6b92ffaSHans Petter Selasky 		goto Exit;
420d6b92ffaSHans Petter Selasky 	}
421d6b92ffaSHans Petter Selasky 
422d6b92ffaSHans Petter Selasky Exit:
423d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
424d6b92ffaSHans Petter Selasky }
425d6b92ffaSHans Petter Selasky 
426d6b92ffaSHans Petter Selasky /*
427d6b92ffaSHans Petter Selasky  * PARAMETERS
428d6b92ffaSHans Petter Selasky  *
429d6b92ffaSHans Petter Selasky  * RETURN VALUES
430d6b92ffaSHans Petter Selasky  *
431d6b92ffaSHans Petter Selasky  * NOTES
432d6b92ffaSHans Petter Selasky  *
433d6b92ffaSHans Petter Selasky  * SEE ALSO
434d6b92ffaSHans Petter Selasky  *********/
435d6b92ffaSHans Petter Selasky 
436d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_process_trap
437d6b92ffaSHans Petter Selasky  * NAME
438d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_process_trap
439d6b92ffaSHans Petter Selasky  *
440d6b92ffaSHans Petter Selasky  * DESCRIPTION
441d6b92ffaSHans Petter Selasky  * This function handles method Trap() for received MADs.
442d6b92ffaSHans Petter Selasky  *
443d6b92ffaSHans Petter Selasky  * SYNOPSIS
444d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_process_trap(IN osm_sm_mad_ctrl_t * p_ctrl,IN osm_madw_t * p_madw)445d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_process_trap(IN osm_sm_mad_ctrl_t * p_ctrl,
446d6b92ffaSHans Petter Selasky 				     IN osm_madw_t * p_madw)
447d6b92ffaSHans Petter Selasky {
448d6b92ffaSHans Petter Selasky 	ib_smp_t *p_smp;
449d6b92ffaSHans Petter Selasky 	cl_status_t status;
450d6b92ffaSHans Petter Selasky 	cl_disp_msgid_t msg_id = CL_DISP_MSGID_NONE;
451d6b92ffaSHans Petter Selasky 
452d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
453d6b92ffaSHans Petter Selasky 
454d6b92ffaSHans Petter Selasky 	p_smp = osm_madw_get_smp_ptr(p_madw);
455d6b92ffaSHans Petter Selasky 
456d6b92ffaSHans Petter Selasky 	/* Make sure OpenSM is master. If not - then we should not process the trap */
457d6b92ffaSHans Petter Selasky 	if (p_ctrl->p_subn->sm_state != IB_SMINFO_STATE_MASTER) {
458d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG,
459d6b92ffaSHans Petter Selasky 			"Received trap but OpenSM is not in MASTER state. "
460d6b92ffaSHans Petter Selasky 			"Dropping mad\n");
461d6b92ffaSHans Petter Selasky 		osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
462d6b92ffaSHans Petter Selasky 		goto Exit;
463d6b92ffaSHans Petter Selasky 	}
464d6b92ffaSHans Petter Selasky 
465d6b92ffaSHans Petter Selasky 	/*
466d6b92ffaSHans Petter Selasky 	   Note that attr_id (like the rest of the MAD) is in
467d6b92ffaSHans Petter Selasky 	   network byte order.
468d6b92ffaSHans Petter Selasky 	 */
469d6b92ffaSHans Petter Selasky 	switch (p_smp->attr_id) {
470d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_NOTICE:
471d6b92ffaSHans Petter Selasky 		msg_id = OSM_MSG_MAD_NOTICE;
472d6b92ffaSHans Petter Selasky 		break;
473d6b92ffaSHans Petter Selasky 	default:
474d6b92ffaSHans Petter Selasky 		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
475d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3109: "
476d6b92ffaSHans Petter Selasky 			"Unsupported attribute 0x%X (%s)\n",
477d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_smp->attr_id),
478d6b92ffaSHans Petter Selasky 			ib_get_sm_attr_str(p_smp->attr_id));
479d6b92ffaSHans Petter Selasky 		osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_ERROR);
480d6b92ffaSHans Petter Selasky 		osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
481d6b92ffaSHans Petter Selasky 		goto Exit;
482d6b92ffaSHans Petter Selasky 	}
483d6b92ffaSHans Petter Selasky 
484d6b92ffaSHans Petter Selasky 	/*
485d6b92ffaSHans Petter Selasky 	   Post this MAD to the dispatcher for asynchronous
486d6b92ffaSHans Petter Selasky 	   processing by the appropriate controller.
487d6b92ffaSHans Petter Selasky 	 */
488d6b92ffaSHans Petter Selasky 
489d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "Posting Dispatcher message %s\n",
490d6b92ffaSHans Petter Selasky 		osm_get_disp_msg_str(msg_id));
491d6b92ffaSHans Petter Selasky 
492d6b92ffaSHans Petter Selasky 	status = cl_disp_post(p_ctrl->h_disp, msg_id, p_madw,
493d6b92ffaSHans Petter Selasky 			      sm_mad_ctrl_disp_done_callback, p_ctrl);
494d6b92ffaSHans Petter Selasky 
495d6b92ffaSHans Petter Selasky 	if (status != CL_SUCCESS) {
496d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3110: "
497d6b92ffaSHans Petter Selasky 			"Dispatcher post message failed (%s)\n",
498d6b92ffaSHans Petter Selasky 			CL_STATUS_MSG(status));
499d6b92ffaSHans Petter Selasky 		goto Exit;
500d6b92ffaSHans Petter Selasky 	}
501d6b92ffaSHans Petter Selasky 
502d6b92ffaSHans Petter Selasky Exit:
503d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
504d6b92ffaSHans Petter Selasky }
505d6b92ffaSHans Petter Selasky 
506d6b92ffaSHans Petter Selasky /*
507d6b92ffaSHans Petter Selasky  * PARAMETERS
508d6b92ffaSHans Petter Selasky  *
509d6b92ffaSHans Petter Selasky  * RETURN VALUES
510d6b92ffaSHans Petter Selasky  *
511d6b92ffaSHans Petter Selasky  * NOTES
512d6b92ffaSHans Petter Selasky  *
513d6b92ffaSHans Petter Selasky  * SEE ALSO
514d6b92ffaSHans Petter Selasky  *********/
515d6b92ffaSHans Petter Selasky 
516d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_process_trap_repress
517d6b92ffaSHans Petter Selasky  * NAME
518d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_process_trap_repress
519d6b92ffaSHans Petter Selasky  *
520d6b92ffaSHans Petter Selasky  * DESCRIPTION
521d6b92ffaSHans Petter Selasky  * This function handles method TrapRepress() for received MADs.
522d6b92ffaSHans Petter Selasky  *
523d6b92ffaSHans Petter Selasky  * SYNOPSIS
524d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_process_trap_repress(IN osm_sm_mad_ctrl_t * p_ctrl,IN osm_madw_t * p_madw)525d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_process_trap_repress(IN osm_sm_mad_ctrl_t * p_ctrl,
526d6b92ffaSHans Petter Selasky 					     IN osm_madw_t * p_madw)
527d6b92ffaSHans Petter Selasky {
528d6b92ffaSHans Petter Selasky 	ib_smp_t *p_smp;
529d6b92ffaSHans Petter Selasky 
530d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
531d6b92ffaSHans Petter Selasky 
532d6b92ffaSHans Petter Selasky 	p_smp = osm_madw_get_smp_ptr(p_madw);
533d6b92ffaSHans Petter Selasky 
534d6b92ffaSHans Petter Selasky 	/*
535d6b92ffaSHans Petter Selasky 	   Note that attr_id (like the rest of the MAD) is in
536d6b92ffaSHans Petter Selasky 	   network byte order.
537d6b92ffaSHans Petter Selasky 	 */
538d6b92ffaSHans Petter Selasky 	switch (p_smp->attr_id) {
539d6b92ffaSHans Petter Selasky 	case IB_MAD_ATTR_NOTICE:
540d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_update_wire_stats(p_ctrl);
541d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw);
542d6b92ffaSHans Petter Selasky 		break;
543d6b92ffaSHans Petter Selasky 	default:
544d6b92ffaSHans Petter Selasky 		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
545d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3105: "
546d6b92ffaSHans Petter Selasky 			"Unsupported attribute 0x%X (%s)\n",
547d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_smp->attr_id),
548d6b92ffaSHans Petter Selasky 			ib_get_sm_attr_str(p_smp->attr_id));
549d6b92ffaSHans Petter Selasky 		osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_ERROR);
550d6b92ffaSHans Petter Selasky 		osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
551d6b92ffaSHans Petter Selasky 		break;
552d6b92ffaSHans Petter Selasky 	}
553d6b92ffaSHans Petter Selasky 
554d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
555d6b92ffaSHans Petter Selasky }
556d6b92ffaSHans Petter Selasky 
log_rcv_cb_error(osm_log_t * p_log,ib_smp_t * p_smp,ib_net16_t status)557d6b92ffaSHans Petter Selasky static void log_rcv_cb_error(osm_log_t *p_log, ib_smp_t *p_smp, ib_net16_t status)
558d6b92ffaSHans Petter Selasky {
559d6b92ffaSHans Petter Selasky 	char buf[BUF_SIZE];
560d6b92ffaSHans Petter Selasky 	uint32_t i;
561d6b92ffaSHans Petter Selasky 
562d6b92ffaSHans Petter Selasky 	if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR) {
563d6b92ffaSHans Petter Selasky 		char ipath[BUF_SIZE], rpath[BUF_SIZE];
564d6b92ffaSHans Petter Selasky 		int ni = sprintf(ipath, "%d", p_smp->initial_path[0]);
565d6b92ffaSHans Petter Selasky 		int nr = sprintf(rpath, "%d", p_smp->return_path[0]);
566d6b92ffaSHans Petter Selasky 		for (i = 1; i <= p_smp->hop_count; i++) {
567d6b92ffaSHans Petter Selasky 			ni += sprintf(ipath + ni, ",%d", p_smp->initial_path[i]);
568d6b92ffaSHans Petter Selasky 			nr += sprintf(rpath + nr, ",%d", p_smp->return_path[i]);
569d6b92ffaSHans Petter Selasky 		}
570d6b92ffaSHans Petter Selasky 		snprintf(buf, sizeof(buf),
571d6b92ffaSHans Petter Selasky 			 "\n\t\t\tInitial path: %s Return path: %s",
572d6b92ffaSHans Petter Selasky 			 ipath, rpath);
573d6b92ffaSHans Petter Selasky 	}
574d6b92ffaSHans Petter Selasky 
575d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 3111: "
576d6b92ffaSHans Petter Selasky 		"Received MAD with error status = 0x%X\n"
577d6b92ffaSHans Petter Selasky 		"\t\t\t%s(%s), attr_mod 0x%x, TID 0x%" PRIx64 "%s\n",
578d6b92ffaSHans Petter Selasky 		cl_ntoh16(status), ib_get_sm_method_str(p_smp->method),
579d6b92ffaSHans Petter Selasky 		ib_get_sm_attr_str(p_smp->attr_id), cl_ntoh32(p_smp->attr_mod),
580d6b92ffaSHans Petter Selasky 		cl_ntoh64(p_smp->trans_id),
581d6b92ffaSHans Petter Selasky 		p_smp->mgmt_class == IB_MCLASS_SUBN_DIR ? buf : "");
582d6b92ffaSHans Petter Selasky 
583d6b92ffaSHans Petter Selasky 	osm_dump_dr_smp_v2(p_log, p_smp, FILE_ID, OSM_LOG_VERBOSE);
584d6b92ffaSHans Petter Selasky }
585d6b92ffaSHans Petter Selasky 
586d6b92ffaSHans Petter Selasky /*
587d6b92ffaSHans Petter Selasky  * PARAMETERS
588d6b92ffaSHans Petter Selasky  *
589d6b92ffaSHans Petter Selasky  * RETURN VALUES
590d6b92ffaSHans Petter Selasky  *
591d6b92ffaSHans Petter Selasky  * NOTES
592d6b92ffaSHans Petter Selasky  *
593d6b92ffaSHans Petter Selasky  * SEE ALSO
594d6b92ffaSHans Petter Selasky  *********/
595d6b92ffaSHans Petter Selasky 
596d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_rcv_callback
597d6b92ffaSHans Petter Selasky  * NAME
598d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_rcv_callback
599d6b92ffaSHans Petter Selasky  *
600d6b92ffaSHans Petter Selasky  * DESCRIPTION
601d6b92ffaSHans Petter Selasky  * This is the callback from the transport layer for received MADs.
602d6b92ffaSHans Petter Selasky  *
603d6b92ffaSHans Petter Selasky  * SYNOPSIS
604d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_rcv_callback(IN osm_madw_t * p_madw,IN void * bind_context,IN osm_madw_t * p_req_madw)605d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_rcv_callback(IN osm_madw_t * p_madw,
606d6b92ffaSHans Petter Selasky 				     IN void *bind_context,
607d6b92ffaSHans Petter Selasky 				     IN osm_madw_t * p_req_madw)
608d6b92ffaSHans Petter Selasky {
609d6b92ffaSHans Petter Selasky 	osm_sm_mad_ctrl_t *p_ctrl = bind_context;
610d6b92ffaSHans Petter Selasky 	ib_smp_t *p_smp;
611d6b92ffaSHans Petter Selasky 	ib_net16_t status;
612d6b92ffaSHans Petter Selasky 
613d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
614d6b92ffaSHans Petter Selasky 
615d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_madw);
616d6b92ffaSHans Petter Selasky 
617d6b92ffaSHans Petter Selasky 	/*
618d6b92ffaSHans Petter Selasky 	   A MAD was received from the wire, possibly in response to a request.
619d6b92ffaSHans Petter Selasky 	 */
620d6b92ffaSHans Petter Selasky 	cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd);
621d6b92ffaSHans Petter Selasky 
622d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG, "%u QP0 MADs received\n",
623d6b92ffaSHans Petter Selasky 		p_ctrl->p_stats->qp0_mads_rcvd);
624d6b92ffaSHans Petter Selasky 
625d6b92ffaSHans Petter Selasky 	p_smp = osm_madw_get_smp_ptr(p_madw);
626d6b92ffaSHans Petter Selasky 
627d6b92ffaSHans Petter Selasky 	/* if we are closing down simply do nothing */
628d6b92ffaSHans Petter Selasky 	if (osm_exit_flag) {
629d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR,
630d6b92ffaSHans Petter Selasky 			"Ignoring received mad - since we are exiting\n");
631d6b92ffaSHans Petter Selasky 
632d6b92ffaSHans Petter Selasky 		osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_DEBUG);
633d6b92ffaSHans Petter Selasky 
634d6b92ffaSHans Petter Selasky 		/* retire the mad or put it back */
635d6b92ffaSHans Petter Selasky 		if (ib_smp_is_response(p_smp)) {
636d6b92ffaSHans Petter Selasky 			CL_ASSERT(p_madw->resp_expected == FALSE);
637d6b92ffaSHans Petter Selasky 			sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw);
638d6b92ffaSHans Petter Selasky 		} else if (p_madw->resp_expected == TRUE)
639d6b92ffaSHans Petter Selasky 			sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw);
640d6b92ffaSHans Petter Selasky 		else
641d6b92ffaSHans Petter Selasky 			osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
642d6b92ffaSHans Petter Selasky 
643d6b92ffaSHans Petter Selasky 		goto Exit;
644d6b92ffaSHans Petter Selasky 	}
645d6b92ffaSHans Petter Selasky 
646d6b92ffaSHans Petter Selasky 	if (OSM_LOG_IS_ACTIVE_V2(p_ctrl->p_log, OSM_LOG_FRAMES))
647d6b92ffaSHans Petter Selasky 		osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_FRAMES);
648d6b92ffaSHans Petter Selasky 
649d6b92ffaSHans Petter Selasky 	if (p_smp->mgmt_class == IB_MCLASS_SUBN_DIR)
650d6b92ffaSHans Petter Selasky 		status = ib_smp_get_status(p_smp);
651d6b92ffaSHans Petter Selasky 	else
652d6b92ffaSHans Petter Selasky 		status = p_smp->status;
653d6b92ffaSHans Petter Selasky 
654d6b92ffaSHans Petter Selasky 	if (status != 0)
655d6b92ffaSHans Petter Selasky 		log_rcv_cb_error(p_ctrl->p_log, p_smp, status);
656d6b92ffaSHans Petter Selasky 
657d6b92ffaSHans Petter Selasky 	switch (p_smp->method) {
658d6b92ffaSHans Petter Selasky 	case IB_MAD_METHOD_GET_RESP:
659d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_req_madw != NULL);
660d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_process_get_resp(p_ctrl, p_madw, p_req_madw);
661d6b92ffaSHans Petter Selasky 		break;
662d6b92ffaSHans Petter Selasky 	case IB_MAD_METHOD_GET:
663d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_req_madw == NULL);
664d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_process_get(p_ctrl, p_madw);
665d6b92ffaSHans Petter Selasky 		break;
666d6b92ffaSHans Petter Selasky 	case IB_MAD_METHOD_TRAP:
667d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_req_madw == NULL);
668d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_process_trap(p_ctrl, p_madw);
669d6b92ffaSHans Petter Selasky 		break;
670d6b92ffaSHans Petter Selasky 	case IB_MAD_METHOD_SET:
671d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_req_madw == NULL);
672d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_process_set(p_ctrl, p_madw);
673d6b92ffaSHans Petter Selasky 		break;
674d6b92ffaSHans Petter Selasky 	case IB_MAD_METHOD_TRAP_REPRESS:
675d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_req_madw != NULL);
676d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_process_trap_repress(p_ctrl, p_madw);
677d6b92ffaSHans Petter Selasky 		break;
678d6b92ffaSHans Petter Selasky 	case IB_MAD_METHOD_SEND:
679d6b92ffaSHans Petter Selasky 	case IB_MAD_METHOD_REPORT:
680d6b92ffaSHans Petter Selasky 	case IB_MAD_METHOD_REPORT_RESP:
681d6b92ffaSHans Petter Selasky 	default:
682d6b92ffaSHans Petter Selasky 		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
683d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3112: "
684d6b92ffaSHans Petter Selasky 			"Unsupported method = 0x%X\n", p_smp->method);
685d6b92ffaSHans Petter Selasky 		osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_ERROR);
686d6b92ffaSHans Petter Selasky 		osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
687d6b92ffaSHans Petter Selasky 		goto Exit;
688d6b92ffaSHans Petter Selasky 	}
689d6b92ffaSHans Petter Selasky 
690d6b92ffaSHans Petter Selasky Exit:
691d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
692d6b92ffaSHans Petter Selasky }
693d6b92ffaSHans Petter Selasky 
694d6b92ffaSHans Petter Selasky /*
695d6b92ffaSHans Petter Selasky  * PARAMETERS
696d6b92ffaSHans Petter Selasky  *
697d6b92ffaSHans Petter Selasky  * RETURN VALUES
698d6b92ffaSHans Petter Selasky  *
699d6b92ffaSHans Petter Selasky  * NOTES
700d6b92ffaSHans Petter Selasky  *
701d6b92ffaSHans Petter Selasky  * SEE ALSO
702d6b92ffaSHans Petter Selasky  *********/
703d6b92ffaSHans Petter Selasky 
704d6b92ffaSHans Petter Selasky /****f* opensm: SM/sm_mad_ctrl_send_err_cb
705d6b92ffaSHans Petter Selasky  * NAME
706d6b92ffaSHans Petter Selasky  * sm_mad_ctrl_send_err_cb
707d6b92ffaSHans Petter Selasky  *
708d6b92ffaSHans Petter Selasky  * DESCRIPTION
709d6b92ffaSHans Petter Selasky  * This is the callback from the transport layer for send errors
710d6b92ffaSHans Petter Selasky  * on MADs that were expecting a response.
711d6b92ffaSHans Petter Selasky  *
712d6b92ffaSHans Petter Selasky  * SYNOPSIS
713d6b92ffaSHans Petter Selasky  */
sm_mad_ctrl_send_err_cb(IN void * context,IN osm_madw_t * p_madw)714d6b92ffaSHans Petter Selasky static void sm_mad_ctrl_send_err_cb(IN void *context, IN osm_madw_t * p_madw)
715d6b92ffaSHans Petter Selasky {
716d6b92ffaSHans Petter Selasky 	osm_sm_mad_ctrl_t *p_ctrl = context;
717d6b92ffaSHans Petter Selasky 	ib_api_status_t status;
718d6b92ffaSHans Petter Selasky 	ib_smp_t *p_smp;
719d6b92ffaSHans Petter Selasky 
720d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
721d6b92ffaSHans Petter Selasky 
722d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_madw);
723d6b92ffaSHans Petter Selasky 
724d6b92ffaSHans Petter Selasky 	p_smp = osm_madw_get_smp_ptr(p_madw);
725d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3113: "
726d6b92ffaSHans Petter Selasky 		"MAD completed in error (%s): "
727d6b92ffaSHans Petter Selasky 		"%s(%s), attr_mod 0x%x, TID 0x%" PRIx64 "\n",
728d6b92ffaSHans Petter Selasky 		ib_get_err_str(p_madw->status),
729d6b92ffaSHans Petter Selasky 		ib_get_sm_method_str(p_smp->method),
730d6b92ffaSHans Petter Selasky 		ib_get_sm_attr_str(p_smp->attr_id), cl_ntoh32(p_smp->attr_mod),
731d6b92ffaSHans Petter Selasky 		cl_ntoh64(p_smp->trans_id));
732d6b92ffaSHans Petter Selasky 
733d6b92ffaSHans Petter Selasky 	/*
734d6b92ffaSHans Petter Selasky 	   If this was a SubnSet MAD, then this error might indicate a problem
735d6b92ffaSHans Petter Selasky 	   in configuring the subnet. In this case - need to mark that there was
736d6b92ffaSHans Petter Selasky 	   such a problem. The subnet will not be up, and the next sweep should
737d6b92ffaSHans Petter Selasky 	   be a heavy sweep as well.
738d6b92ffaSHans Petter Selasky 	 */
739d6b92ffaSHans Petter Selasky 	if (p_smp->method == IB_MAD_METHOD_SET &&
740d6b92ffaSHans Petter Selasky 	    (p_smp->attr_id == IB_MAD_ATTR_PORT_INFO ||
741d6b92ffaSHans Petter Selasky 	     p_smp->attr_id == IB_MAD_ATTR_MLNX_EXTENDED_PORT_INFO ||
742d6b92ffaSHans Petter Selasky 	     p_smp->attr_id == IB_MAD_ATTR_MCAST_FWD_TBL ||
743d6b92ffaSHans Petter Selasky 	     p_smp->attr_id == IB_MAD_ATTR_SWITCH_INFO ||
744d6b92ffaSHans Petter Selasky 	     p_smp->attr_id == IB_MAD_ATTR_LIN_FWD_TBL ||
745d6b92ffaSHans Petter Selasky 	     p_smp->attr_id == IB_MAD_ATTR_P_KEY_TABLE)) {
746d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3119: "
747d6b92ffaSHans Petter Selasky 			"Set method failed for attribute 0x%X (%s)\n",
748d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_smp->attr_id),
749d6b92ffaSHans Petter Selasky 			ib_get_sm_attr_str(p_smp->attr_id));
750d6b92ffaSHans Petter Selasky 		p_ctrl->p_subn->subnet_initialization_error = TRUE;
751d6b92ffaSHans Petter Selasky 	} else if (p_madw->status == IB_TIMEOUT &&
752d6b92ffaSHans Petter Selasky 		   p_smp->method == IB_MAD_METHOD_GET) {
753d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3120: "
754d6b92ffaSHans Petter Selasky 			"Timeout while getting attribute 0x%X (%s); "
755d6b92ffaSHans Petter Selasky 			"Possible mis-set mkey?\n",
756d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_smp->attr_id),
757d6b92ffaSHans Petter Selasky 			ib_get_sm_attr_str(p_smp->attr_id));
758d6b92ffaSHans Petter Selasky 	}
759d6b92ffaSHans Petter Selasky 
760d6b92ffaSHans Petter Selasky 	osm_dump_dr_smp_v2(p_ctrl->p_log, p_smp, FILE_ID, OSM_LOG_VERBOSE);
761d6b92ffaSHans Petter Selasky 
762d6b92ffaSHans Petter Selasky 	/*
763d6b92ffaSHans Petter Selasky 	   Since we did not get any response we suspect the DR path
764d6b92ffaSHans Petter Selasky 	   used for the target port.
765d6b92ffaSHans Petter Selasky 	   Find it and replace it with an alternate path.
766d6b92ffaSHans Petter Selasky 	   This is true only if the destination lid is not 0xFFFF, since
767d6b92ffaSHans Petter Selasky 	   then we are aiming for a specific path and not specific destination
768d6b92ffaSHans Petter Selasky 	   lid.
769d6b92ffaSHans Petter Selasky 	 */
770d6b92ffaSHans Petter Selasky 	/* For now - do not add the alternate dr path to the release */
771d6b92ffaSHans Petter Selasky #if 0
772d6b92ffaSHans Petter Selasky 	if (p_madw->mad_addr.dest_lid != 0xFFFF) {
773d6b92ffaSHans Petter Selasky 		osm_physp_t *p_physp = osm_get_physp_by_mad_addr(p_ctrl->p_log,
774d6b92ffaSHans Petter Selasky 								 p_ctrl->p_subn,
775d6b92ffaSHans Petter Selasky 								 &(p_madw->
776d6b92ffaSHans Petter Selasky 								   mad_addr));
777d6b92ffaSHans Petter Selasky 		if (!p_physp) {
778d6b92ffaSHans Petter Selasky 			OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3114: "
779d6b92ffaSHans Petter Selasky 				"Failed to find the corresponding phys port\n");
780d6b92ffaSHans Petter Selasky 		} else {
781d6b92ffaSHans Petter Selasky 			osm_physp_replace_dr_path_with_alternate_dr_path
782d6b92ffaSHans Petter Selasky 			    (p_ctrl->p_log, p_ctrl->p_subn, p_physp,
783d6b92ffaSHans Petter Selasky 			     p_madw->h_bind);
784d6b92ffaSHans Petter Selasky 		}
785d6b92ffaSHans Petter Selasky 	}
786d6b92ffaSHans Petter Selasky #endif
787d6b92ffaSHans Petter Selasky 
788d6b92ffaSHans Petter Selasky 	/*
789d6b92ffaSHans Petter Selasky 	   An error occurred.  No response was received to a request MAD.
790d6b92ffaSHans Petter Selasky 	   Retire the original request MAD.
791d6b92ffaSHans Petter Selasky 	 */
792d6b92ffaSHans Petter Selasky 	sm_mad_ctrl_update_wire_stats(p_ctrl);
793d6b92ffaSHans Petter Selasky 
794d6b92ffaSHans Petter Selasky 	if (osm_madw_get_err_msg(p_madw) != CL_DISP_MSGID_NONE) {
795d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_DEBUG,
796d6b92ffaSHans Petter Selasky 			"Posting Dispatcher message %s\n",
797d6b92ffaSHans Petter Selasky 			osm_get_disp_msg_str(osm_madw_get_err_msg(p_madw)));
798d6b92ffaSHans Petter Selasky 
799d6b92ffaSHans Petter Selasky 		status = cl_disp_post(p_ctrl->h_disp,
800d6b92ffaSHans Petter Selasky 				      osm_madw_get_err_msg(p_madw), p_madw,
801d6b92ffaSHans Petter Selasky 				      sm_mad_ctrl_disp_done_callback, p_ctrl);
802d6b92ffaSHans Petter Selasky 		if (status != CL_SUCCESS)
803d6b92ffaSHans Petter Selasky 			OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3115: "
804d6b92ffaSHans Petter Selasky 				"Dispatcher post message failed (%s)\n",
805d6b92ffaSHans Petter Selasky 				CL_STATUS_MSG(status));
806d6b92ffaSHans Petter Selasky 	} else
807d6b92ffaSHans Petter Selasky 		/*
808d6b92ffaSHans Petter Selasky 		   No error message was provided, just retire the MAD.
809d6b92ffaSHans Petter Selasky 		 */
810d6b92ffaSHans Petter Selasky 		sm_mad_ctrl_retire_trans_mad(p_ctrl, p_madw);
811d6b92ffaSHans Petter Selasky 
812d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
813d6b92ffaSHans Petter Selasky }
814d6b92ffaSHans Petter Selasky 
815d6b92ffaSHans Petter Selasky /*
816d6b92ffaSHans Petter Selasky  * PARAMETERS
817d6b92ffaSHans Petter Selasky  *
818d6b92ffaSHans Petter Selasky  * RETURN VALUES
819d6b92ffaSHans Petter Selasky  *
820d6b92ffaSHans Petter Selasky  * NOTES
821d6b92ffaSHans Petter Selasky  *
822d6b92ffaSHans Petter Selasky  * SEE ALSO
823d6b92ffaSHans Petter Selasky  *********/
824d6b92ffaSHans Petter Selasky 
osm_sm_mad_ctrl_construct(IN osm_sm_mad_ctrl_t * p_ctrl)825d6b92ffaSHans Petter Selasky void osm_sm_mad_ctrl_construct(IN osm_sm_mad_ctrl_t * p_ctrl)
826d6b92ffaSHans Petter Selasky {
827d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_ctrl);
828d6b92ffaSHans Petter Selasky 	memset(p_ctrl, 0, sizeof(*p_ctrl));
829d6b92ffaSHans Petter Selasky 	p_ctrl->h_disp = CL_DISP_INVALID_HANDLE;
830d6b92ffaSHans Petter Selasky }
831d6b92ffaSHans Petter Selasky 
osm_sm_mad_ctrl_destroy(IN osm_sm_mad_ctrl_t * p_ctrl)832d6b92ffaSHans Petter Selasky void osm_sm_mad_ctrl_destroy(IN osm_sm_mad_ctrl_t * p_ctrl)
833d6b92ffaSHans Petter Selasky {
834d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_ctrl);
835d6b92ffaSHans Petter Selasky 
836d6b92ffaSHans Petter Selasky 	if (p_ctrl->h_bind != CL_DISP_INVALID_HANDLE)
837d6b92ffaSHans Petter Selasky 		osm_vendor_unbind(p_ctrl->h_bind);
838d6b92ffaSHans Petter Selasky 	cl_disp_unregister(p_ctrl->h_disp);
839d6b92ffaSHans Petter Selasky }
840d6b92ffaSHans Petter Selasky 
osm_sm_mad_ctrl_init(IN osm_sm_mad_ctrl_t * p_ctrl,IN osm_subn_t * p_subn,IN osm_mad_pool_t * p_mad_pool,IN osm_vl15_t * p_vl15,IN osm_vendor_t * p_vendor,IN osm_log_t * p_log,IN osm_stats_t * p_stats,IN cl_plock_t * p_lock,IN cl_dispatcher_t * p_disp)841d6b92ffaSHans Petter Selasky ib_api_status_t osm_sm_mad_ctrl_init(IN osm_sm_mad_ctrl_t * p_ctrl,
842d6b92ffaSHans Petter Selasky 				     IN osm_subn_t * p_subn,
843d6b92ffaSHans Petter Selasky 				     IN osm_mad_pool_t * p_mad_pool,
844d6b92ffaSHans Petter Selasky 				     IN osm_vl15_t * p_vl15,
845d6b92ffaSHans Petter Selasky 				     IN osm_vendor_t * p_vendor,
846d6b92ffaSHans Petter Selasky 				     IN osm_log_t * p_log,
847d6b92ffaSHans Petter Selasky 				     IN osm_stats_t * p_stats,
848d6b92ffaSHans Petter Selasky 				     IN cl_plock_t * p_lock,
849d6b92ffaSHans Petter Selasky 				     IN cl_dispatcher_t * p_disp)
850d6b92ffaSHans Petter Selasky {
851d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_SUCCESS;
852d6b92ffaSHans Petter Selasky 
853d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
854d6b92ffaSHans Petter Selasky 
855d6b92ffaSHans Petter Selasky 	osm_sm_mad_ctrl_construct(p_ctrl);
856d6b92ffaSHans Petter Selasky 
857d6b92ffaSHans Petter Selasky 	p_ctrl->p_subn = p_subn;
858d6b92ffaSHans Petter Selasky 	p_ctrl->p_log = p_log;
859d6b92ffaSHans Petter Selasky 	p_ctrl->p_disp = p_disp;
860d6b92ffaSHans Petter Selasky 	p_ctrl->p_mad_pool = p_mad_pool;
861d6b92ffaSHans Petter Selasky 	p_ctrl->p_vendor = p_vendor;
862d6b92ffaSHans Petter Selasky 	p_ctrl->p_stats = p_stats;
863d6b92ffaSHans Petter Selasky 	p_ctrl->p_lock = p_lock;
864d6b92ffaSHans Petter Selasky 	p_ctrl->p_vl15 = p_vl15;
865d6b92ffaSHans Petter Selasky 
866d6b92ffaSHans Petter Selasky 	p_ctrl->h_disp = cl_disp_register(p_disp, CL_DISP_MSGID_NONE, NULL,
867d6b92ffaSHans Petter Selasky 					  NULL);
868d6b92ffaSHans Petter Selasky 
869d6b92ffaSHans Petter Selasky 	if (p_ctrl->h_disp == CL_DISP_INVALID_HANDLE) {
870d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 3116: "
871d6b92ffaSHans Petter Selasky 			"Dispatcher registration failed\n");
872d6b92ffaSHans Petter Selasky 		status = IB_INSUFFICIENT_RESOURCES;
873d6b92ffaSHans Petter Selasky 		goto Exit;
874d6b92ffaSHans Petter Selasky 	}
875d6b92ffaSHans Petter Selasky 
876d6b92ffaSHans Petter Selasky Exit:
877d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
878d6b92ffaSHans Petter Selasky 	return status;
879d6b92ffaSHans Petter Selasky }
880d6b92ffaSHans Petter Selasky 
osm_sm_mad_ctrl_bind(IN osm_sm_mad_ctrl_t * p_ctrl,IN ib_net64_t port_guid)881d6b92ffaSHans Petter Selasky ib_api_status_t osm_sm_mad_ctrl_bind(IN osm_sm_mad_ctrl_t * p_ctrl,
882d6b92ffaSHans Petter Selasky 				     IN ib_net64_t port_guid)
883d6b92ffaSHans Petter Selasky {
884d6b92ffaSHans Petter Selasky 	osm_bind_info_t bind_info;
885d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_SUCCESS;
886d6b92ffaSHans Petter Selasky 
887d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_ctrl->p_log);
888d6b92ffaSHans Petter Selasky 
889d6b92ffaSHans Petter Selasky 	if (p_ctrl->h_bind != OSM_BIND_INVALID_HANDLE) {
890d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3117: "
891d6b92ffaSHans Petter Selasky 			"Multiple binds not allowed\n");
892d6b92ffaSHans Petter Selasky 		status = IB_ERROR;
893d6b92ffaSHans Petter Selasky 		goto Exit;
894d6b92ffaSHans Petter Selasky 	}
895d6b92ffaSHans Petter Selasky 
896d6b92ffaSHans Petter Selasky 	bind_info.class_version = 1;
897d6b92ffaSHans Petter Selasky 	bind_info.is_report_processor = FALSE;
898d6b92ffaSHans Petter Selasky 	bind_info.is_responder = TRUE;
899d6b92ffaSHans Petter Selasky 	bind_info.is_trap_processor = TRUE;
900d6b92ffaSHans Petter Selasky 	bind_info.mad_class = IB_MCLASS_SUBN_DIR;
901d6b92ffaSHans Petter Selasky 	bind_info.port_guid = port_guid;
902d6b92ffaSHans Petter Selasky 	bind_info.recv_q_size = OSM_SM_DEFAULT_QP0_RCV_SIZE;
903d6b92ffaSHans Petter Selasky 	bind_info.send_q_size = OSM_SM_DEFAULT_QP0_SEND_SIZE;
904d6b92ffaSHans Petter Selasky 	bind_info.timeout = p_ctrl->p_subn->opt.transaction_timeout;
905d6b92ffaSHans Petter Selasky 	bind_info.retries = p_ctrl->p_subn->opt.transaction_retries;
906d6b92ffaSHans Petter Selasky 
907d6b92ffaSHans Petter Selasky 	OSM_LOG(p_ctrl->p_log, OSM_LOG_VERBOSE,
908d6b92ffaSHans Petter Selasky 		"Binding to port 0x%" PRIx64 "\n", cl_ntoh64(port_guid));
909d6b92ffaSHans Petter Selasky 
910d6b92ffaSHans Petter Selasky 	p_ctrl->h_bind = osm_vendor_bind(p_ctrl->p_vendor, &bind_info,
911d6b92ffaSHans Petter Selasky 					 p_ctrl->p_mad_pool,
912d6b92ffaSHans Petter Selasky 					 sm_mad_ctrl_rcv_callback,
913d6b92ffaSHans Petter Selasky 					 sm_mad_ctrl_send_err_cb, p_ctrl);
914d6b92ffaSHans Petter Selasky 
915d6b92ffaSHans Petter Selasky 	if (p_ctrl->h_bind == OSM_BIND_INVALID_HANDLE) {
916d6b92ffaSHans Petter Selasky 		status = IB_ERROR;
917d6b92ffaSHans Petter Selasky 		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3118: "
918d6b92ffaSHans Petter Selasky 			"Vendor specific bind failed\n");
919d6b92ffaSHans Petter Selasky 		goto Exit;
920d6b92ffaSHans Petter Selasky 	}
921d6b92ffaSHans Petter Selasky 
922d6b92ffaSHans Petter Selasky Exit:
923d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_ctrl->p_log);
924d6b92ffaSHans Petter Selasky 	return status;
925d6b92ffaSHans Petter Selasky }
926