1/*
2 * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
3 * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
4 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5 * Copyright (c) 2008 Xsigo Systems Inc.  All rights reserved.
6 *
7 * This software is available to you under a choice of one of two
8 * licenses.  You may choose to be licensed under the terms of the GNU
9 * General Public License (GPL) Version 2, available from the file
10 * COPYING in the main directory of this source tree, or the
11 * OpenIB.org BSD license below:
12 *
13 *     Redistribution and use in source and binary forms, with or
14 *     without modification, are permitted provided that the following
15 *     conditions are met:
16 *
17 *      - Redistributions of source code must retain the above
18 *        copyright notice, this list of conditions and the following
19 *        disclaimer.
20 *
21 *      - Redistributions in binary form must reproduce the above
22 *        copyright notice, this list of conditions and the following
23 *        disclaimer in the documentation and/or other materials
24 *        provided with the distribution.
25 *
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33 * SOFTWARE.
34 *
35 */
36
37/*
38 * Abstract:
39 *	Declaration of osm_subn_t.
40 *	This object represents an IBA subnet.
41 *	This object is part of the OpenSM family of objects.
42 */
43
44#ifndef _OSM_SUBNET_H_
45#define _OSM_SUBNET_H_
46
47#include <iba/ib_types.h>
48#include <complib/cl_qmap.h>
49#include <complib/cl_map.h>
50#include <complib/cl_ptr_vector.h>
51#include <complib/cl_list.h>
52#include <opensm/osm_base.h>
53#include <opensm/osm_prefix_route.h>
54#include <stdio.h>
55
56#ifdef __cplusplus
57#  define BEGIN_C_DECLS extern "C" {
58#  define END_C_DECLS   }
59#else				/* !__cplusplus */
60#  define BEGIN_C_DECLS
61#  define END_C_DECLS
62#endif				/* __cplusplus */
63
64BEGIN_C_DECLS
65#define OSM_SUBNET_VECTOR_MIN_SIZE			0
66#define OSM_SUBNET_VECTOR_GROW_SIZE			1
67#define OSM_SUBNET_VECTOR_CAPACITY			256
68struct osm_opensm;
69struct osm_qos_policy;
70
71/****h* OpenSM/Subnet
72* NAME
73*	Subnet
74*
75* DESCRIPTION
76*	The Subnet object encapsulates the information needed by the
77*	OpenSM to manage a subnet.  The OpenSM allocates one Subnet object
78*	per IBA subnet.
79*
80*	The Subnet object is not thread safe, thus callers must provide
81*	serialization.
82*
83*	This object is essentially a container for the various components
84*	of a subnet.  Callers may directly access the member variables.
85*
86* AUTHOR
87*	Steve King, Intel
88*
89*********/
90
91/****s* OpenSM: Subnet/osm_qos_options_t
92* NAME
93*	osm_qos_options_t
94*
95* DESCRIPTION
96*	Subnet QoS options structure.  This structure contains the various
97*	QoS specific configuration parameters for the subnet.
98*
99* SYNOPSIS
100*/
101typedef struct osm_qos_options {
102	unsigned max_vls;
103	int high_limit;
104	char *vlarb_high;
105	char *vlarb_low;
106	char *sl2vl;
107} osm_qos_options_t;
108/*
109* FIELDS
110*
111*	max_vls
112*		The number of maximum VLs on the Subnet (0 == use default)
113*
114*	high_limit
115*		The limit of High Priority component of VL Arbitration
116*		table (IBA 7.6.9) (-1 == use default)
117*
118*	vlarb_high
119*		High priority VL Arbitration table template. (NULL == use default)
120*
121*	vlarb_low
122*		Low priority VL Arbitration table template. (NULL == use default)
123*
124*	sl2vl
125*		SL2VL Mapping table (IBA 7.6.6) template. (NULL == use default)
126*
127*********/
128
129/****s* OpenSM: Subnet/osm_subn_opt_t
130* NAME
131*	osm_subn_opt_t
132*
133* DESCRIPTION
134*	Subnet options structure.  This structure contains the various
135*	site specific configuration parameters for the subnet.
136*
137* SYNOPSIS
138*/
139typedef struct osm_subn_opt {
140	char *config_file;
141	ib_net64_t guid;
142	ib_net64_t m_key;
143	ib_net64_t sm_key;
144	ib_net64_t sa_key;
145	ib_net64_t subnet_prefix;
146	ib_net16_t m_key_lease_period;
147	uint32_t sweep_interval;
148	uint32_t max_wire_smps;
149	uint32_t transaction_timeout;
150	uint8_t sm_priority;
151	uint8_t lmc;
152	boolean_t lmc_esp0;
153	uint8_t max_op_vls;
154	uint8_t force_link_speed;
155	boolean_t reassign_lids;
156	boolean_t ignore_other_sm;
157	boolean_t single_thread;
158	boolean_t disable_multicast;
159	boolean_t force_log_flush;
160	uint8_t subnet_timeout;
161	uint8_t packet_life_time;
162	uint8_t vl_stall_count;
163	uint8_t leaf_vl_stall_count;
164	uint8_t head_of_queue_lifetime;
165	uint8_t leaf_head_of_queue_lifetime;
166	uint8_t local_phy_errors_threshold;
167	uint8_t overrun_errors_threshold;
168	uint32_t sminfo_polling_timeout;
169	uint32_t polling_retry_number;
170	uint32_t max_msg_fifo_timeout;
171	boolean_t force_heavy_sweep;
172	uint8_t log_flags;
173	char *dump_files_dir;
174	char *log_file;
175	unsigned long log_max_size;
176	char *partition_config_file;
177	boolean_t no_partition_enforcement;
178	boolean_t qos;
179	char *qos_policy_file;
180	boolean_t accum_log_file;
181	char *console;
182	uint16_t console_port;
183	char *port_prof_ignore_file;
184	boolean_t port_profile_switch_nodes;
185	boolean_t sweep_on_trap;
186	char *routing_engine_names;
187	boolean_t use_ucast_cache;
188	boolean_t connect_roots;
189	char *lid_matrix_dump_file;
190	char *lfts_file;
191	char *root_guid_file;
192	char *cn_guid_file;
193	char *ids_guid_file;
194	char *guid_routing_order_file;
195	char *sa_db_file;
196	boolean_t exit_on_fatal;
197	boolean_t honor_guid2lid_file;
198	boolean_t daemon;
199	boolean_t sm_inactive;
200	boolean_t babbling_port_policy;
201	osm_qos_options_t qos_options;
202	osm_qos_options_t qos_ca_options;
203	osm_qos_options_t qos_sw0_options;
204	osm_qos_options_t qos_swe_options;
205	osm_qos_options_t qos_rtr_options;
206	boolean_t enable_quirks;
207	boolean_t no_clients_rereg;
208#ifdef ENABLE_OSM_PERF_MGR
209	boolean_t perfmgr;
210	boolean_t perfmgr_redir;
211	uint16_t perfmgr_sweep_time_s;
212	uint32_t perfmgr_max_outstanding_queries;
213	char *event_db_dump_file;
214#endif				/* ENABLE_OSM_PERF_MGR */
215	char *event_plugin_name;
216	char *node_name_map_name;
217	char *prefix_routes_file;
218	boolean_t consolidate_ipv6_snm_req;
219} osm_subn_opt_t;
220/*
221* FIELDS
222*
223*	config_file
224*		The name of the config file.
225*
226*	guid
227*		The port guid that the SM is binding to.
228*
229*	m_key
230*		M_Key value sent to all ports qualifying all Set(PortInfo).
231*
232*	sm_key
233*		SM_Key value of the SM used for SM authentication.
234*
235*	sa_key
236*		SM_Key value to qualify rcv SA queries as "trusted".
237*
238*	subnet_prefix
239*		Subnet prefix used on this subnet.
240*
241*	m_key_lease_period
242*		The lease period used for the M_Key on this subnet.
243*
244*	sweep_interval
245*		The number of seconds between subnet sweeps.  A value of 0
246*		disables sweeping.
247*
248*	max_wire_smps
249*		The maximum number of SMPs sent in parallel.  Default is 4.
250*
251*	transaction_timeout
252*		The maximum time in milliseconds allowed for a transaction
253*		to complete.  Default is 200.
254*
255*	sm_priority
256*		The priority of this SM as specified by the user.  This
257*		value is made available in the SMInfo attribute.
258*
259*	lmc
260*		The LMC value used on this subnet.
261*
262*	lmc_esp0
263*		Whether LMC value used on subnet should be used for
264*		enhanced switch port 0 or not.  If TRUE, it is used.
265*		Otherwise (the default), LMC is set to 0 for ESP0.
266*
267*	max_op_vls
268*		Limit the maximal operational VLs. default is 1.
269*
270*	reassign_lids
271*		If TRUE cause all lids to be re-assigend.
272*		Otherwise (the default),
273*		OpenSM always tries to preserve as LIDs as much as possible.
274*
275*	ignore_other_sm_option
276*		This flag is TRUE if other SMs on the subnet should be ignored.
277*
278*	disable_multicast
279*		This flag is TRUE if OpenSM should disable multicast support.
280*
281*	max_msg_fifo_timeout
282*		The maximal time a message can stay in the incoming message
283*		queue. If there is more than one message in the queue and the
284*		last message stayed in the queue more than this value the SA
285*		request will be immediately returned with a BUSY status.
286*
287*	subnet_timeout
288*		The subnet_timeout that will be set for all the ports in the
289*		design SubnSet(PortInfo.vl_stall_life))
290*
291*	vl_stall_count
292*		The number of sequential packets dropped that cause the port
293*		to enter the VLStalled state.
294*
295*	leaf_vl_stall_count
296*		The number of sequential packets dropped that cause the port
297*		to enter the VLStalled state. This is for switch ports driving
298*		a CA or router port.
299*
300*	head_of_queue_lifetime
301*		The maximal time a packet can live at the head of a VL queue
302*		on any port not driving a CA or router port.
303*
304*	leaf_head_of_queue_lifetime
305*		The maximal time a packet can live at the head of a VL queue
306*		on switch ports driving a CA or router.
307*
308*	local_phy_errors_threshold
309*		Threshold of local phy errors for sending Trap 129
310*
311*	overrun_errors_threshold
312*		Threshold of credits overrun errors for sending Trap 129
313*
314*	sminfo_polling_timeout
315*		Specifies the polling timeout (in milliseconds) - the timeout
316*		between one poll to another.
317*
318*	packet_life_time
319*		The maximal time a packet can stay in a switch.
320*		The value is send to all switches as
321*		SubnSet(SwitchInfo.life_state)
322*
323*	dump_files_dir
324*		The directory to be used for opensm-subnet.lst, opensm.fdbs,
325*		opensm.mcfdbs, and default log file (the latter for Windows,
326*		not Linux).
327*
328*	log_file
329*		Name of the log file (or NULL) for stdout.
330*
331*	log_max_size
332*		This option defines maximal log file size in MB. When
333*		specified the log file will be truncated upon reaching
334*		this limit.
335*
336*	qos
337*		Boolean that specifies whether the OpenSM QoS functionality
338*		should be off or on.
339*
340*	qos_policy_file
341*		Name of the QoS policy file.
342*
343*	accum_log_file
344*		If TRUE (default) - the log file will be accumulated.
345*		If FALSE - the log file will be erased before starting
346*		current opensm run.
347*
348*	port_prof_ignore_file
349*		Name of file with port guids to be ignored by port profiling.
350*
351*	port_profile_switch_nodes
352*		If TRUE will count the number of switch nodes routed through
353*		the link. If FALSE - only CA/RT nodes are counted.
354*
355*	sweep_on_trap
356*		Received traps will initiate a new sweep.
357*
358*	routing_engine_names
359*		Name of routing engine(s) to use.
360*
361*	connect_roots
362*		The option which will enforce root to root connectivity with
363*		up/down routing engine (even if this violates "pure" deadlock
364*		free up/down algorithm)
365*
366*	use_ucast_cache
367*		When TRUE enables unicast routing cache.
368*
369*	lid_matrix_dump_file
370*		Name of the lid matrix dump file from where switch
371*		lid matrices (min hops tables) will be loaded
372*
373*	lfts_file
374*		Name of the unicast LFTs routing file from where switch
375*		forwarding tables will be loaded
376*
377*	root_guid_file
378*		Name of the file that contains list of root guids that
379*		will be used by fat-tree or up/dn routing (provided by User)
380*
381*	cn_guid_file
382*		Name of the file that contains list of compute node guids that
383*		will be used by fat-tree routing (provided by User)
384*
385*	ids_guid_file
386*		Name of the file that contains list of ids which should be
387*		used by Up/Down algorithm instead of node GUIDs
388*
389*	guid_routing_order_file
390*		Name of the file that contains list of guids for routing order
391*		that will be used by minhop and up/dn routing (provided by User).
392*
393*	sa_db_file
394*		Name of the SA database file.
395*
396*	exit_on_fatal
397*		If TRUE (default) - SM will exit on fatal subnet initialization
398*		issues.
399*		If FALSE - SM will not exit.
400*		Fatal initialization issues:
401*		a. SM recognizes 2 different nodes with the same guid, or
402*		   12x link with lane reversal badly configured.
403*
404*	honor_guid2lid_file
405*		Always honor the guid2lid file if it exists and is valid. This
406*		means that the file will be honored when SM is coming out of
407*		STANDBY. By default this is FALSE.
408*
409*	daemon
410*		OpenSM will run in daemon mode.
411*
412*	sm_inactive
413*		OpenSM will start with SM in not active state.
414*
415*	babbling_port_policy
416*		OpenSM will enforce its "babbling" port policy.
417*
418*	perfmgr
419*		Enable or disable the performance manager
420*
421*	perfmgr_redir
422*		Enable or disable the saving of redirection by PerfMgr
423*
424*	perfmgr_sweep_time_s
425*		Define the period (in seconds) of PerfMgr sweeps
426*
427*       event_db_dump_file
428*               File to dump the event database to
429*
430*       event_db_plugin
431*               Specify the name of the event plugin
432*
433*	qos_options
434*		Default set of QoS options
435*
436*	qos_ca_options
437*		QoS options for CA ports
438*
439*	qos_sw0_options
440*		QoS options for switches' port 0
441*
442*	qos_swe_options
443*		QoS options for switches' external ports
444*
445*	qos_rtr_options
446*		QoS options for router ports
447*
448*	enable_quirks
449*		Enable high risk new features and not fully qualified
450*		hardware specific work arounds
451*
452*	no_clients_rereg
453*		When TRUE disables clients reregistration request.
454*
455* SEE ALSO
456*	Subnet object
457*********/
458
459/****s* OpenSM: Subnet/osm_subn_t
460* NAME
461*	osm_subn_t
462*
463* DESCRIPTION
464*	Subnet structure.  Callers may directly access member components,
465*	after grabbing a lock.
466*
467* TO DO
468*	This structure should probably be volatile.
469*
470* SYNOPSIS
471*/
472typedef struct osm_subn {
473	struct osm_opensm *p_osm;
474	cl_qmap_t sw_guid_tbl;
475	cl_qmap_t node_guid_tbl;
476	cl_qmap_t port_guid_tbl;
477	cl_qmap_t rtr_guid_tbl;
478	cl_qlist_t prefix_routes_list;
479	cl_qmap_t prtn_pkey_tbl;
480	cl_qmap_t sm_guid_tbl;
481	cl_qlist_t sa_sr_list;
482	cl_qlist_t sa_infr_list;
483	cl_ptr_vector_t port_lid_tbl;
484	ib_net16_t master_sm_base_lid;
485	ib_net16_t sm_base_lid;
486	ib_net64_t sm_port_guid;
487	uint8_t sm_state;
488	osm_subn_opt_t opt;
489	struct osm_qos_policy *p_qos_policy;
490	uint16_t max_ucast_lid_ho;
491	uint16_t max_mcast_lid_ho;
492	uint8_t min_ca_mtu;
493	uint8_t min_ca_rate;
494	boolean_t ignore_existing_lfts;
495	boolean_t subnet_initialization_error;
496	boolean_t force_heavy_sweep;
497	boolean_t force_reroute;
498	boolean_t in_sweep_hop_0;
499	boolean_t first_time_master_sweep;
500	boolean_t coming_out_of_standby;
501	unsigned need_update;
502	void *mgroups[IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + 1];
503} osm_subn_t;
504/*
505* FIELDS
506*	sw_guid_tbl
507*		Container of pointers to all Switch objects in the subent.
508*		Indexed by node GUID.
509*
510*	node_guid_tbl
511*		Container of pointers to all Node objects in the subent.
512*		Indexed by node GUID.
513*
514*	port_guid_tbl
515*		Container of pointers to all Port objects in the subent.
516*		Indexed by port GUID - network order!
517*
518*	rtr_guid_tbl
519*		Container of pointers to all Router objects in the subent.
520*		Indexed by node GUID.
521*
522*	prtn_pkey_tbl
523*		Container of pointers to all Partition objects in the subnet.
524*		Indexed by P_KEY.
525*
526*	sm_guid_tbl
527*		Container of pointers to SM objects representing other SMs
528*		on the subnet.
529*
530*	port_lid_tbl
531*		Container of pointers to all Port objects in the subent.
532*		Indexed by port LID.
533*
534*	master_sm_base_lid
535*		The base LID owned by the subnet's master SM.
536*
537*	sm_base_lid
538*		The base LID of the local port where the SM is.
539*
540*	sm_port_guid
541*		This SM's own port GUID.
542*
543*	sm_state
544*		The high-level state of the SM.  This value is made available
545*		in the SMInfo attribute.
546*
547*	opt
548*		Subnet options structure contains site specific configuration.
549*
550*	p_qos_policy
551*		Subnet QoS policy structure.
552*
553*	max_ucast_lid_ho
554*		The minimal max unicast lid reported by all switches
555*
556*	max_mcast_lid_ho
557*		The minimal max multicast lid reported by all switches
558*
559*	min_ca_mtu
560*		The minimal MTU reported by all CAs ports on the subnet
561*
562*	min_ca_rate
563*		The minimal rate reported by all CA ports on the subnet
564*
565*	ignore_existing_lfts
566*		This flag is a dynamic flag to instruct the LFT assignment to
567*		ignore existing legal LFT settings.
568*		The value will be set according to :
569*		- Any change to the list of switches will set it to high
570*		- Coming out of STANDBY it will be cleared (other SM worked)
571*		- Set to FALSE upon end of all lft assignments.
572*
573*	subnet_initalization_error
574*		Similar to the force_heavy_sweep flag. If TRUE - means that
575*		we had errors during initialization (due to SubnSet requests
576*		that failed). We want to declare the subnet as unhealthy, and
577*		force another heavy sweep.
578*
579*	force_heavy_sweep
580*		If TRUE - we want to force a heavy sweep. This can be done
581*		either due to receiving of trap - meaning there is some change
582*		on the subnet, or we received a handover from a remote sm.
583*		In this case we want to sweep and reconfigure the entire
584*		subnet. This will cause another heavy sweep to occure when
585*		the current sweep is done.
586*
587*	force_reroute
588*		If TRUE - we want to force switches in the fabric to be
589*		rerouted.
590*
591*	in_sweep_hop_0
592*		When in_sweep_hop_0 flag is set to TRUE - this means we are
593*		in sweep_hop_0 - meaning we do not want to continue beyond
594*		the current node.
595*		This is relevant for the case of SM on switch, since in the
596*		switch info we need to signal somehow not to continue
597*		the sweeping.
598*
599*	first_time_master_sweep
600*		This flag is used for the PortInfo setting. On the first
601*		sweep as master (meaning after moving from Standby|Discovering
602*		state), the SM must send a PortInfoSet to all ports. After
603*		that - we want to minimize the number of PortInfoSet requests
604*		sent, and to send only requests that change the value from
605*		what is updated in the port (or send a first request if this
606*		is a new port). We will set this flag to TRUE when entering
607*		the master state, and set it back to FALSE at the end of the
608*		drop manager. This is done since at the end of the drop manager
609*		we have updated all the ports that are reachable, and from now
610*		on these are the only ports we have data of. We don't want
611*		to send extra set requests to these ports anymore.
612*
613*	coming_out_of_standby
614*		TRUE on the first sweep after the SM was in standby.
615*		Used for nulling any cache of LID and Routing.
616*		The flag is set true if the SM state was standby and now
617*		changed to MASTER it is reset at the end of the sweep.
618*
619*	need_update
620*		This flag should be on during first non-master heavy
621*		(including pre-master discovery stage)
622*
623*	mgroups
624*		Array of pointers to all Multicast Group objects in the subnet.
625*		Indexed by MLID offset from base MLID.
626*
627* SEE ALSO
628*	Subnet object
629*********/
630
631/****f* OpenSM: Subnet/osm_subn_construct
632* NAME
633*	osm_subn_construct
634*
635* DESCRIPTION
636*	This function constructs a Subnet object.
637*
638* SYNOPSIS
639*/
640void osm_subn_construct(IN osm_subn_t * const p_subn);
641/*
642* PARAMETERS
643*	p_subn
644*		[in] Pointer to a Subnet object to construct.
645*
646* RETURN VALUE
647*	This function does not return a value.
648*
649* NOTES
650*	Allows calling osm_subn_init, and osm_subn_destroy.
651*
652*	Calling osm_subn_construct is a prerequisite to calling any other
653*	method except osm_subn_init.
654*
655* SEE ALSO
656*	Subnet object, osm_subn_init, osm_subn_destroy
657*********/
658
659/****f* OpenSM: Subnet/osm_subn_destroy
660* NAME
661*	osm_subn_destroy
662*
663* DESCRIPTION
664*	The osm_subn_destroy function destroys a subnet, releasing
665*	all resources.
666*
667* SYNOPSIS
668*/
669void osm_subn_destroy(IN osm_subn_t * const p_subn);
670/*
671* PARAMETERS
672*	p_subn
673*		[in] Pointer to a Subnet object to destroy.
674*
675* RETURN VALUE
676*	This function does not return a value.
677*
678* NOTES
679*	Performs any necessary cleanup of the specified Subnet object.
680*	Further operations should not be attempted on the destroyed object.
681*	This function should only be called after a call to osm_subn_construct
682*	or osm_subn_init.
683*
684* SEE ALSO
685*	Subnet object, osm_subn_construct, osm_subn_init
686*********/
687
688/****f* OpenSM: Subnet/osm_subn_init
689* NAME
690*	osm_subn_init
691*
692* DESCRIPTION
693*	The osm_subn_init function initializes a Subnet object for use.
694*
695* SYNOPSIS
696*/
697ib_api_status_t
698osm_subn_init(IN osm_subn_t * const p_subn,
699	      IN struct osm_opensm *const p_osm,
700	      IN const osm_subn_opt_t * const p_opt);
701/*
702* PARAMETERS
703*	p_subn
704*		[in] Pointer to an osm_subn_t object to initialize.
705*
706*	p_opt
707*		[in] Pointer to the subnet options structure.
708*
709* RETURN VALUES
710*	IB_SUCCESS if the Subnet object was initialized successfully.
711*
712* NOTES
713*	Allows calling other Subnet methods.
714*
715* SEE ALSO
716*	Subnet object, osm_subn_construct, osm_subn_destroy
717*********/
718
719/*
720  Forward references.
721*/
722struct osm_mad_addr;
723struct osm_log;
724struct osm_switch;
725struct osm_physp;
726struct osm_port;
727struct osm_mgrp;
728
729/****f* OpenSM: Helper/osm_get_gid_by_mad_addr
730* NAME
731*	osm_get_gid_by_mad_addr
732*
733* DESCRIPTION
734*	Looks for the requester gid in the mad address.
735*
736* Note: This code is not thread safe. Need to grab the lock before
737* calling it.
738*
739* SYNOPSIS
740*/
741ib_api_status_t
742osm_get_gid_by_mad_addr(IN struct osm_log *p_log,
743			IN const osm_subn_t * p_subn,
744			IN const struct osm_mad_addr *p_mad_addr,
745			OUT ib_gid_t * p_gid);
746/*
747* PARAMETERS
748*	p_log
749*		[in] Pointer to a log object.
750*
751*	p_subn
752*		[in] Pointer to subnet object.
753*
754*	p_mad_addr
755*		[in] Pointer to mad address object.
756*
757*	p_gid
758*		[out] Pointer to the GID structure to fill in.
759*
760* RETURN VALUES
761*     IB_SUCCESS if able to find the GID by address given.
762*
763* NOTES
764*
765* SEE ALSO
766*********/
767
768/****f* OpenSM: Helper/osm_get_physp_by_mad_addr
769* NAME
770*	osm_get_physp_by_mad_addr
771*
772* DESCRIPTION
773*	Looks for the requester physical port in the mad address.
774*
775* Note: This code is not thread safe. Need to grab the lock before
776* calling it.
777*
778* SYNOPSIS
779*/
780struct osm_physp *osm_get_physp_by_mad_addr(IN struct osm_log *p_log,
781					     IN const osm_subn_t * p_subn,
782					     IN struct osm_mad_addr
783					     *p_mad_addr);
784/*
785* PARAMETERS
786*	p_log
787*		[in] Pointer to a log object.
788*
789*	p_subn
790*		[in] Pointer to subnet object.
791*
792*	p_mad_addr
793*		[in] Pointer to mad address object.
794*
795* RETURN VALUES
796*	Pointer to requester physical port object if found. Null otherwise.
797*
798* NOTES
799*
800* SEE ALSO
801*********/
802
803/****f* OpenSM: Helper/osm_get_port_by_mad_addr
804* NAME
805*	osm_get_port_by_mad_addr
806*
807* DESCRIPTION
808*	Looks for the requester port in the mad address.
809*
810* Note: This code is not thread safe. Need to grab the lock before
811* calling it.
812*
813* SYNOPSIS
814*/
815struct osm_port *osm_get_port_by_mad_addr(IN struct osm_log *p_log,
816					   IN const osm_subn_t * p_subn,
817					   IN struct osm_mad_addr *p_mad_addr);
818/*
819* PARAMETERS
820*	p_log
821*		[in] Pointer to a log object.
822*
823*	p_subn
824*		[in] Pointer to subnet object.
825*
826*	p_mad_addr
827*		[in] Pointer to mad address object.
828*
829* RETURN VALUES
830*	Pointer to requester port object if found. Null otherwise.
831*
832* NOTES
833*
834* SEE ALSO
835*********/
836
837/****f* OpenSM: Subnet/osm_get_switch_by_guid
838* NAME
839*	osm_get_switch_by_guid
840*
841* DESCRIPTION
842*	Looks for the given switch guid in the subnet table of switches by guid.
843*  NOTE: this code is not thread safe. Need to grab the lock before
844*  calling it.
845*
846* SYNOPSIS
847*/
848struct osm_switch *osm_get_switch_by_guid(IN const osm_subn_t * p_subn,
849					   IN uint64_t guid);
850/*
851* PARAMETERS
852*	p_subn
853*		[in] Pointer to an osm_subn_t object
854*
855*	guid
856*		[in] The node guid in host order
857*
858* RETURN VALUES
859*	The switch structure pointer if found. NULL otherwise.
860*
861* SEE ALSO
862*	Subnet object, osm_subn_construct, osm_subn_destroy,
863*	osm_switch_t
864*********/
865
866/****f* OpenSM: Subnet/osm_get_node_by_guid
867* NAME
868*	osm_get_node_by_guid
869*
870* DESCRIPTION
871*	The looks for the given node giud in the subnet table of nodes by guid.
872*  NOTE: this code is not thread safe. Need to grab the lock before
873*  calling it.
874*
875* SYNOPSIS
876*/
877struct osm_node *osm_get_node_by_guid(IN osm_subn_t const *p_subn,
878				       IN uint64_t guid);
879/*
880* PARAMETERS
881*	p_subn
882*		[in] Pointer to an osm_subn_t object
883*
884*	guid
885*		[in] The node guid in host order
886*
887* RETURN VALUES
888*	The node structure pointer if found. NULL otherwise.
889*
890* SEE ALSO
891*	Subnet object, osm_subn_construct, osm_subn_destroy,
892*	osm_node_t
893*********/
894
895/****f* OpenSM: Subnet/osm_get_port_by_guid
896* NAME
897*	osm_get_port_by_guid
898*
899* DESCRIPTION
900*	The looks for the given port guid in the subnet table of ports by guid.
901*  NOTE: this code is not thread safe. Need to grab the lock before
902*  calling it.
903*
904* SYNOPSIS
905*/
906struct osm_port *osm_get_port_by_guid(IN osm_subn_t const *p_subn,
907				       IN ib_net64_t guid);
908/*
909* PARAMETERS
910*	p_subn
911*		[in] Pointer to an osm_subn_t object
912*
913*	guid
914*		[in] The port guid in network order
915*
916* RETURN VALUES
917*	The port structure pointer if found. NULL otherwise.
918*
919* SEE ALSO
920*	Subnet object, osm_subn_construct, osm_subn_destroy,
921*	osm_port_t
922*********/
923
924/****f* OpenSM: Subnet/osm_get_mgrp_by_mlid
925* NAME
926*	osm_get_mgrp_by_mlid
927*
928* DESCRIPTION
929*	The looks for the given multicast group in the subnet table by mlid.
930*	NOTE: this code is not thread safe. Need to grab the lock before
931*	calling it.
932*
933* SYNOPSIS
934*/
935static inline
936struct osm_mgrp *osm_get_mgrp_by_mlid(osm_subn_t const *p_subn, ib_net16_t mlid)
937{
938	return p_subn->mgroups[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO];
939}
940/*
941* PARAMETERS
942*	p_subn
943*		[in] Pointer to an osm_subn_t object
944*
945*	mlid
946*		[in] The multicast group mlid in network order
947*
948* RETURN VALUES
949*	The multicast group structure pointer if found. NULL otherwise.
950*********/
951
952/****f* OpenSM: Helper/osm_get_physp_by_mad_addr
953* NAME
954*	osm_get_physp_by_mad_addr
955*
956* DESCRIPTION
957*	Looks for the requester physical port in the mad address.
958*
959* Note: This code is not thread safe. Need to grab the lock before
960* calling it.
961*
962* SYNOPSIS
963*/
964struct osm_physp *osm_get_physp_by_mad_addr(IN struct osm_log *p_log,
965					     IN const osm_subn_t * p_subn,
966					     IN struct osm_mad_addr
967					     *p_mad_addr);
968/*
969* PARAMETERS
970*	p_log
971*		[in] Pointer to a log object.
972*
973*	p_subn
974*		[in] Pointer to subnet object.
975*
976*	p_mad_addr
977*		[in] Pointer to mad address object.
978*
979* RETURN VALUES
980*	Pointer to requester physical port object if found. Null otherwise.
981*
982* NOTES
983*
984* SEE ALSO
985*********/
986
987/****f* OpenSM: Subnet/osm_subn_set_default_opt
988* NAME
989*	osm_subn_set_default_opt
990*
991* DESCRIPTION
992*	The osm_subn_set_default_opt function sets the default options.
993*
994* SYNOPSIS
995*/
996void osm_subn_set_default_opt(IN osm_subn_opt_t * const p_opt);
997/*
998* PARAMETERS
999*
1000*	p_opt
1001*		[in] Pointer to the subnet options structure.
1002*
1003* RETURN VALUES
1004*	None
1005*
1006* NOTES
1007*
1008* SEE ALSO
1009*	Subnet object, osm_subn_construct, osm_subn_destroy
1010*********/
1011
1012/****f* OpenSM: Subnet/osm_subn_parse_conf_file
1013* NAME
1014*	osm_subn_parse_conf_file
1015*
1016* DESCRIPTION
1017*	The osm_subn_parse_conf_file function parses the configuration file
1018*	and sets the defaults accordingly.
1019*
1020* SYNOPSIS
1021*/
1022int osm_subn_parse_conf_file(char *conf_file, osm_subn_opt_t * const p_opt);
1023/*
1024* PARAMETERS
1025*
1026*	p_opt
1027*		[in] Pointer to the subnet options structure.
1028*
1029* RETURN VALUES
1030*	0 on success, positive value if file doesn't exist,
1031*	negative value otherwise
1032*********/
1033
1034/****f* OpenSM: Subnet/osm_subn_rescan_conf_files
1035* NAME
1036*	osm_subn_rescan_conf_files
1037*
1038* DESCRIPTION
1039*	The osm_subn_rescan_conf_files function parses the configuration
1040*	files and update selected subnet options
1041*
1042* SYNOPSIS
1043*/
1044int osm_subn_rescan_conf_files(IN osm_subn_t * const p_subn);
1045/*
1046* PARAMETERS
1047*
1048*	p_subn
1049*		[in] Pointer to the subnet structure.
1050*
1051* RETURN VALUES
1052*	0 on success, positive value if file doesn't exist,
1053*	negative value otherwise
1054*
1055*********/
1056
1057/****f* OpenSM: Subnet/osm_subn_output_conf
1058* NAME
1059*	osm_subn_output_conf
1060*
1061* DESCRIPTION
1062*	Output configuration info
1063*
1064* SYNOPSIS
1065*/
1066int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * const p_opt);
1067/*
1068* PARAMETERS
1069*
1070*	out
1071*		[in] File stream to output to.
1072*
1073*	p_opt
1074*		[in] Pointer to the subnet options structure.
1075*
1076* RETURN VALUES
1077*	0 on success, negative value otherwise
1078*********/
1079
1080/****f* OpenSM: Subnet/osm_subn_write_conf_file
1081* NAME
1082*	osm_subn_write_conf_file
1083*
1084* DESCRIPTION
1085*	Write the configuration file into the cache
1086*
1087* SYNOPSIS
1088*/
1089int osm_subn_write_conf_file(char *file_name, IN osm_subn_opt_t * const p_opt);
1090/*
1091* PARAMETERS
1092*
1093*	p_opt
1094*		[in] Pointer to the subnet options structure.
1095*
1096* RETURN VALUES
1097*	0 on success, negative value otherwise
1098*
1099* NOTES
1100*	Assumes the conf file is part of the cache dir which defaults to
1101*	OSM_DEFAULT_CACHE_DIR or OSM_CACHE_DIR the name is opensm.opts
1102*********/
1103int osm_subn_verify_config(osm_subn_opt_t * const p_opt);
1104
1105END_C_DECLS
1106#endif				/* _OSM_SUBNET_H_ */
1107