Blame include/opensm/osm_sm.h

Packit 13e616
/*
Packit 13e616
 * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
Packit 13e616
 * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved.
Packit 13e616
 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
Packit 13e616
 *
Packit 13e616
 * This software is available to you under a choice of one of two
Packit 13e616
 * licenses.  You may choose to be licensed under the terms of the GNU
Packit 13e616
 * General Public License (GPL) Version 2, available from the file
Packit 13e616
 * COPYING in the main directory of this source tree, or the
Packit 13e616
 * OpenIB.org BSD license below:
Packit 13e616
 *
Packit 13e616
 *     Redistribution and use in source and binary forms, with or
Packit 13e616
 *     without modification, are permitted provided that the following
Packit 13e616
 *     conditions are met:
Packit 13e616
 *
Packit 13e616
 *      - Redistributions of source code must retain the above
Packit 13e616
 *        copyright notice, this list of conditions and the following
Packit 13e616
 *        disclaimer.
Packit 13e616
 *
Packit 13e616
 *      - Redistributions in binary form must reproduce the above
Packit 13e616
 *        copyright notice, this list of conditions and the following
Packit 13e616
 *        disclaimer in the documentation and/or other materials
Packit 13e616
 *        provided with the distribution.
Packit 13e616
 *
Packit 13e616
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit 13e616
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit 13e616
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Packit 13e616
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Packit 13e616
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Packit 13e616
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit 13e616
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit 13e616
 * SOFTWARE.
Packit 13e616
 *
Packit 13e616
 */
Packit 13e616
Packit 13e616
/*
Packit 13e616
 * Abstract:
Packit 13e616
 * 	Declaration of osm_sm_t.
Packit 13e616
 *	This object represents an IBA subnet.
Packit 13e616
 *	This object is part of the OpenSM family of objects.
Packit 13e616
 */
Packit 13e616
Packit 13e616
#ifndef _OSM_SM_H_
Packit 13e616
#define _OSM_SM_H_
Packit 13e616
Packit 13e616
#include <iba/ib_types.h>
Packit 13e616
#include <complib/cl_passivelock.h>
Packit 13e616
#include <complib/cl_event.h>
Packit 13e616
#include <complib/cl_thread.h>
Packit 13e616
#include <complib/cl_dispatcher.h>
Packit 13e616
#include <complib/cl_event_wheel.h>
Packit 13e616
#include <vendor/osm_vendor_api.h>
Packit 13e616
#include <opensm/osm_stats.h>
Packit 13e616
#include <opensm/osm_subnet.h>
Packit 13e616
#include <opensm/osm_vl15intf.h>
Packit 13e616
#include <opensm/osm_mad_pool.h>
Packit 13e616
#include <opensm/osm_log.h>
Packit 13e616
#include <opensm/osm_sm_mad_ctrl.h>
Packit 13e616
#include <opensm/osm_lid_mgr.h>
Packit 13e616
#include <opensm/osm_ucast_mgr.h>
Packit 13e616
#include <opensm/osm_port.h>
Packit 13e616
#include <opensm/osm_db.h>
Packit 13e616
#include <opensm/osm_remote_sm.h>
Packit 13e616
Packit 13e616
#ifdef __cplusplus
Packit 13e616
#  define BEGIN_C_DECLS extern "C" {
Packit 13e616
#  define END_C_DECLS   }
Packit 13e616
#else				/* !__cplusplus */
Packit 13e616
#  define BEGIN_C_DECLS
Packit 13e616
#  define END_C_DECLS
Packit 13e616
#endif				/* __cplusplus */
Packit 13e616
Packit 13e616
BEGIN_C_DECLS
Packit 13e616
/****h* OpenSM/SM
Packit 13e616
* NAME
Packit 13e616
*	SM
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	The SM object encapsulates the information needed by the
Packit 13e616
*	OpenSM to instantiate a subnet manager.  The OpenSM allocates
Packit 13e616
*	one SM object per subnet manager.
Packit 13e616
*
Packit 13e616
*	The SM object is thread safe.
Packit 13e616
*
Packit 13e616
*	This object should be treated as opaque and should
Packit 13e616
*	be manipulated only through the provided functions.
Packit 13e616
*
Packit 13e616
* AUTHOR
Packit 13e616
*	Steve King, Intel
Packit 13e616
*
Packit 13e616
*********/
Packit 13e616
/****s* OpenSM: SM/osm_sm_t
Packit 13e616
* NAME
Packit 13e616
*  osm_sm_t
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*  Subnet Manager structure.
Packit 13e616
*
Packit 13e616
*  This object should be treated as opaque and should
Packit 13e616
*  be manipulated only through the provided functions.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
typedef struct osm_sm {
Packit 13e616
	osm_thread_state_t thread_state;
Packit 13e616
	unsigned signal_mask;
Packit 13e616
	cl_spinlock_t signal_lock;
Packit 13e616
	cl_spinlock_t state_lock;
Packit 13e616
	cl_event_t signal_event;
Packit 13e616
	cl_event_t subnet_up_event;
Packit 13e616
	cl_timer_t sweep_timer;
Packit 13e616
	cl_timer_t polling_timer;
Packit 13e616
	cl_event_wheel_t trap_aging_tracker;
Packit 13e616
	cl_thread_t sweeper;
Packit 13e616
	unsigned master_sm_found;
Packit 13e616
	uint32_t retry_number;
Packit 13e616
	ib_net64_t master_sm_guid;
Packit 13e616
	ib_net64_t polling_sm_guid;
Packit 13e616
	osm_subn_t *p_subn;
Packit 13e616
	osm_db_t *p_db;
Packit 13e616
	osm_vendor_t *p_vendor;
Packit 13e616
	osm_log_t *p_log;
Packit 13e616
	osm_mad_pool_t *p_mad_pool;
Packit 13e616
	osm_vl15_t *p_vl15;
Packit 13e616
	cl_dispatcher_t *p_disp;
Packit 13e616
	cl_plock_t *p_lock;
Packit 13e616
	atomic32_t sm_trans_id;
Packit 13e616
	uint16_t mlids_init_max;
Packit 13e616
	unsigned mlids_req_max;
Packit 13e616
	uint8_t *mlids_req;
Packit 13e616
	osm_sm_mad_ctrl_t mad_ctrl;
Packit 13e616
	osm_lid_mgr_t lid_mgr;
Packit 13e616
	osm_ucast_mgr_t ucast_mgr;
Packit 13e616
	cl_disp_reg_handle_t sweep_fail_disp_h;
Packit 13e616
	cl_disp_reg_handle_t ni_disp_h;
Packit 13e616
	cl_disp_reg_handle_t pi_disp_h;
Packit 13e616
	cl_disp_reg_handle_t gi_disp_h;
Packit 13e616
	cl_disp_reg_handle_t nd_disp_h;
Packit 13e616
	cl_disp_reg_handle_t si_disp_h;
Packit 13e616
	cl_disp_reg_handle_t lft_disp_h;
Packit 13e616
	cl_disp_reg_handle_t mft_disp_h;
Packit 13e616
	cl_disp_reg_handle_t sm_info_disp_h;
Packit 13e616
	cl_disp_reg_handle_t trap_disp_h;
Packit 13e616
	cl_disp_reg_handle_t slvl_disp_h;
Packit 13e616
	cl_disp_reg_handle_t vla_disp_h;
Packit 13e616
	cl_disp_reg_handle_t pkey_disp_h;
Packit 13e616
	cl_disp_reg_handle_t mlnx_epi_disp_h;
Packit 13e616
} osm_sm_t;
Packit 13e616
/*
Packit 13e616
* FIELDS
Packit 13e616
*	p_subn
Packit 13e616
*		Pointer to the Subnet object for this subnet.
Packit 13e616
*
Packit 13e616
*	p_db
Packit 13e616
*		Pointer to the database (persistency) object
Packit 13e616
*
Packit 13e616
*	p_vendor
Packit 13e616
*		Pointer to the vendor specific interfaces object.
Packit 13e616
*
Packit 13e616
*	p_log
Packit 13e616
*		Pointer to the log object.
Packit 13e616
*
Packit 13e616
*	p_mad_pool
Packit 13e616
*		Pointer to the MAD pool.
Packit 13e616
*
Packit 13e616
*	p_vl15
Packit 13e616
*		Pointer to the VL15 interface.
Packit 13e616
*
Packit 13e616
*	mad_ctrl
Packit 13e616
*		MAD Controller.
Packit 13e616
*
Packit 13e616
*	p_disp
Packit 13e616
*		Pointer to the Dispatcher.
Packit 13e616
*
Packit 13e616
*	p_lock
Packit 13e616
*		Pointer to the serializing lock.
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	SM object
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_sm_construct
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_construct
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	This function constructs an SM object.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
void osm_sm_construct(IN osm_sm_t * p_sm);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_sm
Packit 13e616
*		[in] Pointer to a SM object to construct.
Packit 13e616
*
Packit 13e616
* RETURN VALUE
Packit 13e616
*	This function does not return a value.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*	Allows calling osm_sm_init, osm_sm_destroy
Packit 13e616
*
Packit 13e616
*	Calling osm_sm_construct is a prerequisite to calling any other
Packit 13e616
*	method except osm_sm_init.
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	SM object, osm_sm_init, osm_sm_destroy
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_sm_shutdown
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_shutdown
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	The osm_sm_shutdown function shutdowns an SM, stopping the sweeper
Packit 13e616
*	and unregistering all messages from the dispatcher
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
void osm_sm_shutdown(IN osm_sm_t * p_sm);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_sm
Packit 13e616
*		[in] Pointer to a SM object to shutdown.
Packit 13e616
*
Packit 13e616
* RETURN VALUE
Packit 13e616
*	This function does not return a value.
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	SM object, osm_sm_construct, osm_sm_init
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_sm_destroy
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_destroy
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	The osm_sm_destroy function destroys an SM, releasing
Packit 13e616
*	all resources.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
void osm_sm_destroy(IN osm_sm_t * p_sm);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_sm
Packit 13e616
*		[in] Pointer to a SM object to destroy.
Packit 13e616
*
Packit 13e616
* RETURN VALUE
Packit 13e616
*	This function does not return a value.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*	Performs any necessary cleanup of the specified SM object.
Packit 13e616
*	Further operations should not be attempted on the destroyed object.
Packit 13e616
*	This function should only be called after a call to osm_sm_construct or
Packit 13e616
*	osm_sm_init.
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	SM object, osm_sm_construct, osm_sm_init
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_sm_init
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_init
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	The osm_sm_init function initializes a SM object for use.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
ib_api_status_t osm_sm_init(IN osm_sm_t * p_sm, IN osm_subn_t * p_subn,
Packit 13e616
			    IN osm_db_t * p_db, IN osm_vendor_t * p_vendor,
Packit 13e616
			    IN osm_mad_pool_t * p_mad_pool,
Packit 13e616
			    IN osm_vl15_t * p_vl15, IN osm_log_t * p_log,
Packit 13e616
			    IN osm_stats_t * p_stats,
Packit 13e616
			    IN cl_dispatcher_t * p_disp, IN cl_plock_t * p_lock);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object to initialize.
Packit 13e616
*
Packit 13e616
*	p_subn
Packit 13e616
*		[in] Pointer to the Subnet object for this subnet.
Packit 13e616
*
Packit 13e616
*	p_vendor
Packit 13e616
*		[in] Pointer to the vendor specific interfaces object.
Packit 13e616
*
Packit 13e616
*	p_mad_pool
Packit 13e616
*		[in] Pointer to the MAD pool.
Packit 13e616
*
Packit 13e616
*	p_vl15
Packit 13e616
*		[in] Pointer to the VL15 interface.
Packit 13e616
*
Packit 13e616
*	p_log
Packit 13e616
*		[in] Pointer to the log object.
Packit 13e616
*
Packit 13e616
*	p_stats
Packit 13e616
*		[in] Pointer to the statistics object.
Packit 13e616
*
Packit 13e616
*	p_disp
Packit 13e616
*		[in] Pointer to the OpenSM central Dispatcher.
Packit 13e616
*
Packit 13e616
*	p_lock
Packit 13e616
*		[in] Pointer to the OpenSM serializing lock.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	IB_SUCCESS if the SM object was initialized successfully.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*	Allows calling other SM methods.
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	SM object, osm_sm_construct, osm_sm_destroy
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_sm_signal
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_signal
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Signal event to SM
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
void osm_sm_signal(IN osm_sm_t * p_sm, osm_signal_t signal);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	signal
Packit 13e616
*		[in] sm signal number.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	SM object
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_sm_sweep
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_sweep
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Initiates a subnet sweep.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
void osm_sm_sweep(IN osm_sm_t * p_sm);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	IB_SUCCESS if the sweep completed successfully.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	SM object
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_sm_bind
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_bind
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Binds the sm object to a port guid.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
ib_api_status_t osm_sm_bind(IN osm_sm_t * p_sm, IN ib_net64_t port_guid);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object to bind.
Packit 13e616
*
Packit 13e616
*	port_guid
Packit 13e616
*		[in] Local port GUID with which to bind.
Packit 13e616
*
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	None
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*	A given SM object can only be bound to one port at a time.
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_req_get
Packit 13e616
* NAME
Packit 13e616
*	osm_req_get
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Starts the process to transmit a directed route request for
Packit 13e616
*	the attribute.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
ib_api_status_t osm_req_get(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
Packit 13e616
			    IN ib_net16_t attr_id, IN ib_net32_t attr_mod,
Packit 13e616
			    IN boolean_t find_mkey, IN ib_net64_t m_key,
Packit 13e616
			    IN uint32_t timeout, IN cl_disp_msgid_t err_msg,
Packit 13e616
			    IN const osm_madw_context_t * p_context);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	p_path
Packit 13e616
*		[in] Pointer to the directed route path to the node
Packit 13e616
*		from which to retrieve the attribute.
Packit 13e616
*
Packit 13e616
*	attr_id
Packit 13e616
*		[in] Attribute ID to request.
Packit 13e616
*
Packit 13e616
*	attr_mod
Packit 13e616
*		[in] Attribute modifier for this request.
Packit 13e616
*
Packit 13e616
*	find_mkey
Packit 13e616
*		[in] Flag to indicate whether the M_Key should be looked up for
Packit 13e616
*		     this MAD.
Packit 13e616
* 	m_key
Packit 13e616
* 		[in] M_Key value to be send with this MAD. Applied, only when
Packit 13e616
* 		     find_mkey is FALSE.
Packit 13e616
*
Packit 13e616
*	timeout
Packit 13e616
*		[in] Transaction timeout in msec.
Packit 13e616
*
Packit 13e616
*	err_msg
Packit 13e616
*		[in] Message id with which to post this MAD if an error occurs.
Packit 13e616
*
Packit 13e616
*	p_context
Packit 13e616
*		[in] Mad wrapper context structure to be copied into the wrapper
Packit 13e616
*		context, and thus visible to the recipient of the response.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	IB_SUCCESS if the request was successful.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*	This function asynchronously requests the specified attribute.
Packit 13e616
*	The response from the node will be routed through the Dispatcher
Packit 13e616
*	to the appropriate receive controller object.
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_send_req_mad
Packit 13e616
* NAME
Packit 13e616
*       osm_send_req_mad
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Starts the process to transmit a preallocated/predefined directed route
Packit 13e616
*	Set() request.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
void osm_send_req_mad(IN osm_sm_t * sm, IN osm_madw_t *p_madw);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*	p_madw
Packit 13e616
*		[in] Pointer to a preallocated MAD buffer
Packit 13e616
*
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/***f* OpenSM: SM/osm_prepare_req_set
Packit 13e616
* NAME
Packit 13e616
*	osm_prepare_req_set
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Preallocate and fill a directed route Set() MAD w/o sending it.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
osm_madw_t *osm_prepare_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
Packit 13e616
				IN const uint8_t * p_payload,
Packit 13e616
				IN size_t payload_size, IN ib_net16_t attr_id,
Packit 13e616
				IN ib_net32_t attr_mod, IN boolean_t find_mkey,
Packit 13e616
				IN ib_net64_t m_key, IN uint32_t timeout,
Packit 13e616
				IN cl_disp_msgid_t err_msg,
Packit 13e616
				IN const osm_madw_context_t * p_context);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	p_path
Packit 13e616
*		[in] Pointer to the directed route path of the recipient.
Packit 13e616
*
Packit 13e616
*	p_payload
Packit 13e616
*		[in] Pointer to the SMP payload to send.
Packit 13e616
*
Packit 13e616
*	payload_size
Packit 13e616
*		[in] The size of the payload to be copied to the SMP data field.
Packit 13e616
*
Packit 13e616
*	attr_id
Packit 13e616
*		[in] Attribute ID to request.
Packit 13e616
*
Packit 13e616
*	attr_mod
Packit 13e616
*		[in] Attribute modifier for this request.
Packit 13e616
*
Packit 13e616
*	find_mkey
Packit 13e616
*		[in] Flag to indicate whether the M_Key should be looked up for
Packit 13e616
*		     this MAD.
Packit 13e616
* 	m_key
Packit 13e616
* 		[in] M_Key value to be send with this MAD. Applied, only when
Packit 13e616
* 		     find_mkey is FALSE.
Packit 13e616
*
Packit 13e616
*	timeout
Packit 13e616
*		[in] Transaction timeout in msec.
Packit 13e616
*
Packit 13e616
*	err_msg
Packit 13e616
*		[in] Message id with which to post this MAD if an error occurs.
Packit 13e616
*
Packit 13e616
*	p_context
Packit 13e616
*		[in] Mad wrapper context structure to be copied into the wrapper
Packit 13e616
*		     context, and thus visible to the recipient of the response.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	Pointer the MAD buffer in case of success and NULL in case of failure.
Packit 13e616
*
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_req_set
Packit 13e616
* NAME
Packit 13e616
*	osm_req_set
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Starts the process to transmit a directed route Set() request.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
ib_api_status_t osm_req_set(IN osm_sm_t * sm, IN const osm_dr_path_t * p_path,
Packit 13e616
			    IN const uint8_t * p_payload,
Packit 13e616
			    IN size_t payload_size, IN ib_net16_t attr_id,
Packit 13e616
			    IN ib_net32_t attr_mod, IN boolean_t find_mkey,
Packit 13e616
			    IN ib_net64_t m_key, IN uint32_t timeout,
Packit 13e616
			    IN cl_disp_msgid_t err_msg,
Packit 13e616
			    IN const osm_madw_context_t * p_context);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	p_path
Packit 13e616
*		[in] Pointer to the directed route path of the recipient.
Packit 13e616
*
Packit 13e616
*	p_payload
Packit 13e616
*		[in] Pointer to the SMP payload to send.
Packit 13e616
*
Packit 13e616
*	payload_size
Packit 13e616
*		[in] The size of the payload to be copied to the SMP data field.
Packit 13e616
*
Packit 13e616
*	attr_id
Packit 13e616
*		[in] Attribute ID to request.
Packit 13e616
*
Packit 13e616
*	attr_mod
Packit 13e616
*		[in] Attribute modifier for this request.
Packit 13e616
*
Packit 13e616
*	find_mkey
Packit 13e616
*		[in] Flag to indicate whether the M_Key should be looked up for
Packit 13e616
*		     this MAD.
Packit 13e616
*
Packit 13e616
* 	m_key
Packit 13e616
* 		[in] M_Key value to be send with this MAD. Applied, only when
Packit 13e616
* 		     find_mkey is FALSE.
Packit 13e616
*
Packit 13e616
*	timeout
Packit 13e616
*		[in] Transaction timeout in msec.
Packit 13e616
*
Packit 13e616
*	err_msg
Packit 13e616
*		[in] Message id with which to post this MAD if an error occurs.
Packit 13e616
*
Packit 13e616
*	p_context
Packit 13e616
*		[in] Mad wrapper context structure to be copied into the wrapper
Packit 13e616
*		context, and thus visible to the recipient of the response.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	IB_SUCCESS if the request was successful.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*	This function asynchronously requests the specified attribute.
Packit 13e616
*	The response from the node will be routed through the Dispatcher
Packit 13e616
*	to the appropriate receive controller object.
Packit 13e616
*********/
Packit 13e616
/****f* OpenSM: SM/osm_resp_send
Packit 13e616
* NAME
Packit 13e616
*	osm_resp_send
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Starts the process to transmit a directed route response.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
ib_api_status_t osm_resp_send(IN osm_sm_t * sm,
Packit 13e616
			      IN const osm_madw_t * p_req_madw,
Packit 13e616
			      IN ib_net16_t status,
Packit 13e616
			      IN const uint8_t * p_payload);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_resp
Packit 13e616
*		[in] Pointer to an osm_resp_t object.
Packit 13e616
*
Packit 13e616
*	p_madw
Packit 13e616
*		[in] Pointer to the MAD Wrapper object for the requesting MAD
Packit 13e616
*		to which this response is generated.
Packit 13e616
*
Packit 13e616
*	status
Packit 13e616
*		[in] Status for this response.
Packit 13e616
*
Packit 13e616
*	p_payload
Packit 13e616
*		[in] Pointer to the payload of the response MAD.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	IB_SUCCESS if the response was successful.
Packit 13e616
*
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM/osm_sm_reroute_mlid
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_reroute_mlid
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Requests (schedules) MLID rerouting
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
void osm_sm_reroute_mlid(osm_sm_t * sm, ib_net16_t mlid);
Packit 13e616
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	mlid
Packit 13e616
*		[in] MLID value
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	None
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: OpenSM/osm_sm_wait_for_subnet_up
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_wait_for_subnet_up
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Blocks the calling thread until the subnet is up.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
static inline cl_status_t osm_sm_wait_for_subnet_up(IN osm_sm_t * p_sm,
Packit 13e616
						    IN uint32_t wait_us,
Packit 13e616
						    IN boolean_t interruptible)
Packit 13e616
{
Packit 13e616
	return cl_event_wait_on(&p_sm->subnet_up_event, wait_us, interruptible);
Packit 13e616
}
Packit 13e616
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	p_sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	wait_us
Packit 13e616
*		[in] Number of microseconds to wait.
Packit 13e616
*
Packit 13e616
*	interruptible
Packit 13e616
*		[in] Indicates whether the wait operation can be interrupted
Packit 13e616
*		by external signals.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	CL_SUCCESS if the wait operation succeeded in response to the event
Packit 13e616
*	being set.
Packit 13e616
*
Packit 13e616
*	CL_TIMEOUT if the specified time period elapses.
Packit 13e616
*
Packit 13e616
*	CL_NOT_DONE if the wait was interrupted by an external signal.
Packit 13e616
*
Packit 13e616
*	CL_ERROR if the wait operation failed.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: State Manager/osm_sm_is_greater_than
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_is_greater_than
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Compares two SM's (14.4.1.2)
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
static inline boolean_t osm_sm_is_greater_than(IN uint8_t l_priority,
Packit 13e616
					       IN ib_net64_t l_guid,
Packit 13e616
					       IN uint8_t r_priority,
Packit 13e616
					       IN ib_net64_t r_guid)
Packit 13e616
{
Packit 13e616
	return (l_priority > r_priority
Packit 13e616
		|| (l_priority == r_priority
Packit 13e616
		    && cl_ntoh64(l_guid) < cl_ntoh64(r_guid)));
Packit 13e616
}
Packit 13e616
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	l_priority
Packit 13e616
*		[in] Priority of the SM on the "left"
Packit 13e616
*
Packit 13e616
*	l_guid
Packit 13e616
*		[in] GUID of the SM on the "left"
Packit 13e616
*
Packit 13e616
*	r_priority
Packit 13e616
*		[in] Priority of the SM on the "right"
Packit 13e616
*
Packit 13e616
*	r_guid
Packit 13e616
*		[in] GUID of the SM on the "right"
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	Return TRUE if an sm with l_priority and l_guid is higher than an sm
Packit 13e616
*	with r_priority and r_guid, return FALSE otherwise.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	State Manager
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM State Manager/osm_sm_state_mgr_process
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_state_mgr_process
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Processes and maintains the states of the SM.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
ib_api_status_t osm_sm_state_mgr_process(IN osm_sm_t *sm,
Packit 13e616
					 IN osm_sm_signal_t signal);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	signal
Packit 13e616
*		[in] Signal to the state SM engine.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	None.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	State Manager
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM State Manager/osm_sm_state_mgr_signal_master_is_alive
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_state_mgr_signal_master_is_alive
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Signals that the remote Master SM is alive.
Packit 13e616
*	Need to clear the retry_number variable.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
void osm_sm_state_mgr_signal_master_is_alive(IN osm_sm_t *sm);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	None.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	State Manager
Packit 13e616
*********/
Packit 13e616
Packit 13e616
/****f* OpenSM: SM State Manager/osm_sm_state_mgr_check_legality
Packit 13e616
* NAME
Packit 13e616
*	osm_sm_state_mgr_check_legality
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Checks the legality of the signal received, according to the
Packit 13e616
*  current state of the SM state machine.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
ib_api_status_t osm_sm_state_mgr_check_legality(IN osm_sm_t *sm,
Packit 13e616
						IN osm_sm_signal_t signal);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	signal
Packit 13e616
*		[in] Signal to the state SM engine.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	None.
Packit 13e616
*
Packit 13e616
* NOTES
Packit 13e616
*
Packit 13e616
* SEE ALSO
Packit 13e616
*	State Manager
Packit 13e616
*********/
Packit 13e616
Packit 13e616
void osm_report_sm_state(osm_sm_t *sm);
Packit 13e616
Packit 13e616
/****f* OpenSM: SM State Manager/osm_send_trap144
Packit 13e616
* NAME
Packit 13e616
*	osm_send_trap144
Packit 13e616
*
Packit 13e616
* DESCRIPTION
Packit 13e616
*	Send trap 144 to the master SM.
Packit 13e616
*
Packit 13e616
* SYNOPSIS
Packit 13e616
*/
Packit 13e616
int osm_send_trap144(osm_sm_t *sm, ib_net16_t local);
Packit 13e616
/*
Packit 13e616
* PARAMETERS
Packit 13e616
*	sm
Packit 13e616
*		[in] Pointer to an osm_sm_t object.
Packit 13e616
*
Packit 13e616
*	local
Packit 13e616
*		[in] OtherLocalChanges mask in network byte order.
Packit 13e616
*
Packit 13e616
* RETURN VALUES
Packit 13e616
*	0 on success, non-zero value otherwise.
Packit 13e616
*
Packit 13e616
*********/
Packit 13e616
Packit 13e616
void osm_set_sm_priority(osm_sm_t *sm, uint8_t priority);
Packit 13e616
Packit 13e616
END_C_DECLS
Packit 13e616
#endif				/* _OSM_SM_H_ */